]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge branch 'pull/1765'
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2 var version = "4.13.0";
3
4 function d3_ascending(a, b) {
5   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6 }
7
8 function d3_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 d3_ascending(f(d), x);
37   };
38 }
39
40 var ascendingBisect = d3_bisector(d3_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 d3_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 = d3_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 threshold(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(d3_ascending);
325   return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(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 threshold(numbers.sort(d3_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 = d3_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;
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(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 d3_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 d3_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 d3_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 = d3_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 = d3_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 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), d3_mouse, this, arguments);
1883     if (!gesture) return;
1884     d3_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     d3_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 d3_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] = d3_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 d3_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] = d3_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: d3_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 d3_interpolate(a, b) {
2737   var t = typeof b, c;
2738   return b == null || t === "boolean" ? constant$3(b)
2739       : (t === "number" ? d3_interpolateNumber
2740       : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
2741       : b instanceof color ? d3_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       : d3_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: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_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: d3_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: d3_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: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_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 d3_timeout(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 d3_timeout(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     d3_timeout(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(a, b) {
3412   var c;
3413   return (typeof b === "number" ? d3_interpolateNumber
3414       : b instanceof color ? d3_interpolateRgb
3415       : (c = color(b)) ? (b = c, d3_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;
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) {
3655   var name = this._name,
3656       id = this._id;
3657
3658   if (typeof select !== "function") select = selector(select);
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.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) {
3674   var name = this._name,
3675       id = this._id;
3676
3677   if (typeof select !== "function") select = selectorAll(select);
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.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;
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           d3_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 = d3_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 = d3_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 = d3_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 = d3_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 = d3_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 = d3_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 = d3_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(d3_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 d3_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   d3_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;
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[0] = lambda0$1, range[1] = lambda1;
7029   }
7030 };
7031
7032 function boundsPoint(lambda, phi) {
7033   ranges.push(range = [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 = [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[0] = lambda0$1, range[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[0] = lambda0$1, range[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   d3_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 = 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   d3_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 d3_geoLength(object) {
8341   lengthSum.reset();
8342   d3_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 d3_geoLength(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 = d3_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 = d3_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 d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
8459         .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8460         .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8461         .concat(d3_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$1(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       d3_geoStream(object, projectionStream(contextStream));
8897     }
8898     return contextStream.result();
8899   }
8900
8901   path.area = function(object) {
8902     d3_geoStream(object, projectionStream(areaStream$1));
8903     return areaStream$1.result();
8904   };
8905
8906   path.measure = function(object) {
8907     d3_geoStream(object, projectionStream(lengthStream$1));
8908     return lengthStream$1.result();
8909   };
8910
8911   path.bounds = function(object) {
8912     d3_geoStream(object, projectionStream(boundsStream$1));
8913     return boundsStream$1.result();
8914   };
8915
8916   path.centroid = function(object) {
8917     d3_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   d3_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, (lower48Point.point(x, y), point)
9326         || (alaskaPoint.point(x, y), point)
9327         || (hawaiiPoint.point(x, y), point);
9328   }
9329
9330   albersUsa.invert = function(coordinates) {
9331     var k = lower48.scale(),
9332         t = lower48.translate(),
9333         x = (coordinates[0] - t[0]) / k,
9334         y = (coordinates[1] - t[1]) / k;
9335     return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9336         : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9337         : lower48).invert(coordinates);
9338   };
9339
9340   albersUsa.stream = function(stream) {
9341     return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9342   };
9343
9344   albersUsa.precision = function(_) {
9345     if (!arguments.length) return lower48.precision();
9346     lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9347     return reset();
9348   };
9349
9350   albersUsa.scale = function(_) {
9351     if (!arguments.length) return lower48.scale();
9352     lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9353     return albersUsa.translate(lower48.translate());
9354   };
9355
9356   albersUsa.translate = function(_) {
9357     if (!arguments.length) return lower48.translate();
9358     var k = lower48.scale(), x = +_[0], y = +_[1];
9359
9360     lower48Point = lower48
9361         .translate(_)
9362         .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9363         .stream(pointStream);
9364
9365     alaskaPoint = alaska
9366         .translate([x - 0.307 * k, y + 0.201 * k])
9367         .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]])
9368         .stream(pointStream);
9369
9370     hawaiiPoint = hawaii
9371         .translate([x - 0.205 * k, y + 0.212 * k])
9372         .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]])
9373         .stream(pointStream);
9374
9375     return reset();
9376   };
9377
9378   albersUsa.fitExtent = function(extent, object) {
9379     return fitExtent(albersUsa, extent, object);
9380   };
9381
9382   albersUsa.fitSize = function(size, object) {
9383     return fitSize(albersUsa, size, object);
9384   };
9385
9386   albersUsa.fitWidth = function(width, object) {
9387     return fitWidth(albersUsa, width, object);
9388   };
9389
9390   albersUsa.fitHeight = function(height, object) {
9391     return fitHeight(albersUsa, height, object);
9392   };
9393
9394   function reset() {
9395     cache = cacheStream = null;
9396     return albersUsa;
9397   }
9398
9399   return albersUsa.scale(1070);
9400 }
9401
9402 function azimuthalRaw(scale) {
9403   return function(x, y) {
9404     var cx = cos$1(x),
9405         cy = cos$1(y),
9406         k = scale(cx * cy);
9407     return [
9408       k * cy * sin$1(x),
9409       k * sin$1(y)
9410     ];
9411   }
9412 }
9413
9414 function azimuthalInvert(angle) {
9415   return function(x, y) {
9416     var z = sqrt(x * x + y * y),
9417         c = angle(z),
9418         sc = sin$1(c),
9419         cc = cos$1(c);
9420     return [
9421       atan2(x * sc, z * cc),
9422       asin(z && y * sc / z)
9423     ];
9424   }
9425 }
9426
9427 var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9428   return sqrt(2 / (1 + cxcy));
9429 });
9430
9431 azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9432   return 2 * asin(z / 2);
9433 });
9434
9435 function azimuthalEqualArea() {
9436   return projection(azimuthalEqualAreaRaw)
9437       .scale(124.75)
9438       .clipAngle(180 - 1e-3);
9439 }
9440
9441 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9442   return (c = acos(c)) && c / sin$1(c);
9443 });
9444
9445 azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9446   return z;
9447 });
9448
9449 function azimuthalEquidistant() {
9450   return projection(azimuthalEquidistantRaw)
9451       .scale(79.4188)
9452       .clipAngle(180 - 1e-3);
9453 }
9454
9455 function mercatorRaw(lambda, phi) {
9456   return [lambda, log(tan((halfPi$2 + phi) / 2))];
9457 }
9458
9459 mercatorRaw.invert = function(x, y) {
9460   return [x, 2 * atan(exp(y)) - halfPi$2];
9461 };
9462
9463 function mercator() {
9464   return mercatorProjection(mercatorRaw)
9465       .scale(961 / tau$3);
9466 }
9467
9468 function mercatorProjection(project) {
9469   var m = projection(project),
9470       center = m.center,
9471       scale = m.scale,
9472       translate = m.translate,
9473       clipExtent = m.clipExtent,
9474       x0 = null, y0, x1, y1; // clip extent
9475
9476   m.scale = function(_) {
9477     return arguments.length ? (scale(_), reclip()) : scale();
9478   };
9479
9480   m.translate = function(_) {
9481     return arguments.length ? (translate(_), reclip()) : translate();
9482   };
9483
9484   m.center = function(_) {
9485     return arguments.length ? (center(_), reclip()) : center();
9486   };
9487
9488   m.clipExtent = function(_) {
9489     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]];
9490   };
9491
9492   function reclip() {
9493     var k = pi$3 * scale(),
9494         t = m(rotation(m.rotate()).invert([0, 0]));
9495     return clipExtent(x0 == null
9496         ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9497         ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9498         : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9499   }
9500
9501   return reclip();
9502 }
9503
9504 function tany(y) {
9505   return tan((halfPi$2 + y) / 2);
9506 }
9507
9508 function conicConformalRaw(y0, y1) {
9509   var cy0 = cos$1(y0),
9510       n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9511       f = cy0 * pow(tany(y0), n) / n;
9512
9513   if (!n) return mercatorRaw;
9514
9515   function project(x, y) {
9516     if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9517     else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9518     var r = f / pow(tany(y), n);
9519     return [r * sin$1(n * x), f - r * cos$1(n * x)];
9520   }
9521
9522   project.invert = function(x, y) {
9523     var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9524     return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9525   };
9526
9527   return project;
9528 }
9529
9530 function conicConformal() {
9531   return conicProjection(conicConformalRaw)
9532       .scale(109.5)
9533       .parallels([30, 30]);
9534 }
9535
9536 function equirectangularRaw(lambda, phi) {
9537   return [lambda, phi];
9538 }
9539
9540 equirectangularRaw.invert = equirectangularRaw;
9541
9542 function equirectangular() {
9543   return projection(equirectangularRaw)
9544       .scale(152.63);
9545 }
9546
9547 function conicEquidistantRaw(y0, y1) {
9548   var cy0 = cos$1(y0),
9549       n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9550       g = cy0 / n + y0;
9551
9552   if (abs(n) < epsilon$2) return equirectangularRaw;
9553
9554   function project(x, y) {
9555     var gy = g - y, nx = n * x;
9556     return [gy * sin$1(nx), g - gy * cos$1(nx)];
9557   }
9558
9559   project.invert = function(x, y) {
9560     var gy = g - y;
9561     return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9562   };
9563
9564   return project;
9565 }
9566
9567 function conicEquidistant() {
9568   return conicProjection(conicEquidistantRaw)
9569       .scale(131.154)
9570       .center([0, 13.9389]);
9571 }
9572
9573 function gnomonicRaw(x, y) {
9574   var cy = cos$1(y), k = cos$1(x) * cy;
9575   return [cy * sin$1(x) / k, sin$1(y) / k];
9576 }
9577
9578 gnomonicRaw.invert = azimuthalInvert(atan);
9579
9580 function gnomonic() {
9581   return projection(gnomonicRaw)
9582       .scale(144.049)
9583       .clipAngle(60);
9584 }
9585
9586 function scaleTranslate(kx, ky, tx, ty) {
9587   return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9588     point: function(x, y) {
9589       this.stream.point(x * kx + tx, y * ky + ty);
9590     }
9591   });
9592 }
9593
9594 function d3_geoIdentity() {
9595   var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9596       x0 = null, y0, x1, y1, // clip extent
9597       postclip = identity$4,
9598       cache,
9599       cacheStream,
9600       projection;
9601
9602   function reset() {
9603     cache = cacheStream = null;
9604     return projection;
9605   }
9606
9607   return projection = {
9608     stream: function(stream) {
9609       return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9610     },
9611     postclip: function(_) {
9612       return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9613     },
9614     clipExtent: function(_) {
9615       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]];
9616     },
9617     scale: function(_) {
9618       return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9619     },
9620     translate: function(_) {
9621       return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9622     },
9623     reflectX: function(_) {
9624       return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9625     },
9626     reflectY: function(_) {
9627       return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9628     },
9629     fitExtent: function(extent, object) {
9630       return fitExtent(projection, extent, object);
9631     },
9632     fitSize: function(size, object) {
9633       return fitSize(projection, size, object);
9634     },
9635     fitWidth: function(width, object) {
9636       return fitWidth(projection, width, object);
9637     },
9638     fitHeight: function(height, object) {
9639       return fitHeight(projection, height, object);
9640     }
9641   };
9642 }
9643
9644 function naturalEarth1Raw(lambda, phi) {
9645   var phi2 = phi * phi, phi4 = phi2 * phi2;
9646   return [
9647     lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9648     phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9649   ];
9650 }
9651
9652 naturalEarth1Raw.invert = function(x, y) {
9653   var phi = y, i = 25, delta;
9654   do {
9655     var phi2 = phi * phi, phi4 = phi2 * phi2;
9656     phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9657         (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9658   } while (abs(delta) > epsilon$2 && --i > 0);
9659   return [
9660     x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9661     phi
9662   ];
9663 };
9664
9665 function naturalEarth1() {
9666   return projection(naturalEarth1Raw)
9667       .scale(175.295);
9668 }
9669
9670 function orthographicRaw(x, y) {
9671   return [cos$1(y) * sin$1(x), sin$1(y)];
9672 }
9673
9674 orthographicRaw.invert = azimuthalInvert(asin);
9675
9676 function orthographic() {
9677   return projection(orthographicRaw)
9678       .scale(249.5)
9679       .clipAngle(90 + epsilon$2);
9680 }
9681
9682 function stereographicRaw(x, y) {
9683   var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9684   return [cy * sin$1(x) / k, sin$1(y) / k];
9685 }
9686
9687 stereographicRaw.invert = azimuthalInvert(function(z) {
9688   return 2 * atan(z);
9689 });
9690
9691 function stereographic() {
9692   return projection(stereographicRaw)
9693       .scale(250)
9694       .clipAngle(142);
9695 }
9696
9697 function transverseMercatorRaw(lambda, phi) {
9698   return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9699 }
9700
9701 transverseMercatorRaw.invert = function(x, y) {
9702   return [-y, 2 * atan(exp(x)) - halfPi$2];
9703 };
9704
9705 function transverseMercator() {
9706   var m = mercatorProjection(transverseMercatorRaw),
9707       center = m.center,
9708       rotate = m.rotate;
9709
9710   m.center = function(_) {
9711     return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9712   };
9713
9714   m.rotate = function(_) {
9715     return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9716   };
9717
9718   return rotate([0, 0, 90])
9719       .scale(159.155);
9720 }
9721
9722 function defaultSeparation(a, b) {
9723   return a.parent === b.parent ? 1 : 2;
9724 }
9725
9726 function meanX(children) {
9727   return children.reduce(meanXReduce, 0) / children.length;
9728 }
9729
9730 function meanXReduce(x, c) {
9731   return x + c.x;
9732 }
9733
9734 function maxY(children) {
9735   return 1 + children.reduce(maxYReduce, 0);
9736 }
9737
9738 function maxYReduce(y, c) {
9739   return Math.max(y, c.y);
9740 }
9741
9742 function leafLeft(node) {
9743   var children;
9744   while (children = node.children) node = children[0];
9745   return node;
9746 }
9747
9748 function leafRight(node) {
9749   var children;
9750   while (children = node.children) node = children[children.length - 1];
9751   return node;
9752 }
9753
9754 function cluster() {
9755   var separation = defaultSeparation,
9756       dx = 1,
9757       dy = 1,
9758       nodeSize = false;
9759
9760   function cluster(root) {
9761     var previousNode,
9762         x = 0;
9763
9764     // First walk, computing the initial x & y values.
9765     root.eachAfter(function(node) {
9766       var children = node.children;
9767       if (children) {
9768         node.x = meanX(children);
9769         node.y = maxY(children);
9770       } else {
9771         node.x = previousNode ? x += separation(node, previousNode) : 0;
9772         node.y = 0;
9773         previousNode = node;
9774       }
9775     });
9776
9777     var left = leafLeft(root),
9778         right = leafRight(root),
9779         x0 = left.x - separation(left, right) / 2,
9780         x1 = right.x + separation(right, left) / 2;
9781
9782     // Second walk, normalizing x & y to the desired size.
9783     return root.eachAfter(nodeSize ? function(node) {
9784       node.x = (node.x - root.x) * dx;
9785       node.y = (root.y - node.y) * dy;
9786     } : function(node) {
9787       node.x = (node.x - x0) / (x1 - x0) * dx;
9788       node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9789     });
9790   }
9791
9792   cluster.separation = function(x) {
9793     return arguments.length ? (separation = x, cluster) : separation;
9794   };
9795
9796   cluster.size = function(x) {
9797     return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9798   };
9799
9800   cluster.nodeSize = function(x) {
9801     return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9802   };
9803
9804   return cluster;
9805 }
9806
9807 function count(node) {
9808   var sum = 0,
9809       children = node.children,
9810       i = children && children.length;
9811   if (!i) sum = 1;
9812   else while (--i >= 0) sum += children[i].value;
9813   node.value = sum;
9814 }
9815
9816 function node_count() {
9817   return this.eachAfter(count);
9818 }
9819
9820 function node_each(callback) {
9821   var node = this, current, next = [node], children, i, n;
9822   do {
9823     current = next.reverse(), next = [];
9824     while (node = current.pop()) {
9825       callback(node), children = node.children;
9826       if (children) for (i = 0, n = children.length; i < n; ++i) {
9827         next.push(children[i]);
9828       }
9829     }
9830   } while (next.length);
9831   return this;
9832 }
9833
9834 function node_eachBefore(callback) {
9835   var node = this, nodes = [node], children, i;
9836   while (node = nodes.pop()) {
9837     callback(node), children = node.children;
9838     if (children) for (i = children.length - 1; i >= 0; --i) {
9839       nodes.push(children[i]);
9840     }
9841   }
9842   return this;
9843 }
9844
9845 function node_eachAfter(callback) {
9846   var node = this, nodes = [node], next = [], children, i, n;
9847   while (node = nodes.pop()) {
9848     next.push(node), children = node.children;
9849     if (children) for (i = 0, n = children.length; i < n; ++i) {
9850       nodes.push(children[i]);
9851     }
9852   }
9853   while (node = next.pop()) {
9854     callback(node);
9855   }
9856   return this;
9857 }
9858
9859 function node_sum(value) {
9860   return this.eachAfter(function(node) {
9861     var sum = +value(node.data) || 0,
9862         children = node.children,
9863         i = children && children.length;
9864     while (--i >= 0) sum += children[i].value;
9865     node.value = sum;
9866   });
9867 }
9868
9869 function node_sort(compare) {
9870   return this.eachBefore(function(node) {
9871     if (node.children) {
9872       node.children.sort(compare);
9873     }
9874   });
9875 }
9876
9877 function node_path(end) {
9878   var start = this,
9879       ancestor = leastCommonAncestor(start, end),
9880       nodes = [start];
9881   while (start !== ancestor) {
9882     start = start.parent;
9883     nodes.push(start);
9884   }
9885   var k = nodes.length;
9886   while (end !== ancestor) {
9887     nodes.splice(k, 0, end);
9888     end = end.parent;
9889   }
9890   return nodes;
9891 }
9892
9893 function leastCommonAncestor(a, b) {
9894   if (a === b) return a;
9895   var aNodes = a.ancestors(),
9896       bNodes = b.ancestors(),
9897       c = null;
9898   a = aNodes.pop();
9899   b = bNodes.pop();
9900   while (a === b) {
9901     c = a;
9902     a = aNodes.pop();
9903     b = bNodes.pop();
9904   }
9905   return c;
9906 }
9907
9908 function node_ancestors() {
9909   var node = this, nodes = [node];
9910   while (node = node.parent) {
9911     nodes.push(node);
9912   }
9913   return nodes;
9914 }
9915
9916 function node_descendants() {
9917   var nodes = [];
9918   this.each(function(node) {
9919     nodes.push(node);
9920   });
9921   return nodes;
9922 }
9923
9924 function node_leaves() {
9925   var leaves = [];
9926   this.eachBefore(function(node) {
9927     if (!node.children) {
9928       leaves.push(node);
9929     }
9930   });
9931   return leaves;
9932 }
9933
9934 function node_links() {
9935   var root = this, links = [];
9936   root.each(function(node) {
9937     if (node !== root) { // Don’t include the root’s parent, if any.
9938       links.push({source: node.parent, target: node});
9939     }
9940   });
9941   return links;
9942 }
9943
9944 function hierarchy(data, children) {
9945   var root = new Node(data),
9946       valued = +data.value && (root.value = data.value),
9947       node,
9948       nodes = [root],
9949       child,
9950       childs,
9951       i,
9952       n;
9953
9954   if (children == null) children = defaultChildren;
9955
9956   while (node = nodes.pop()) {
9957     if (valued) node.value = +node.data.value;
9958     if ((childs = children(node.data)) && (n = childs.length)) {
9959       node.children = new Array(n);
9960       for (i = n - 1; i >= 0; --i) {
9961         nodes.push(child = node.children[i] = new Node(childs[i]));
9962         child.parent = node;
9963         child.depth = node.depth + 1;
9964       }
9965     }
9966   }
9967
9968   return root.eachBefore(computeHeight);
9969 }
9970
9971 function node_copy() {
9972   return hierarchy(this).eachBefore(copyData);
9973 }
9974
9975 function defaultChildren(d) {
9976   return d.children;
9977 }
9978
9979 function copyData(node) {
9980   node.data = node.data.data;
9981 }
9982
9983 function computeHeight(node) {
9984   var height = 0;
9985   do node.height = height;
9986   while ((node = node.parent) && (node.height < ++height));
9987 }
9988
9989 function Node(data) {
9990   this.data = data;
9991   this.depth =
9992   this.height = 0;
9993   this.parent = null;
9994 }
9995
9996 Node.prototype = hierarchy.prototype = {
9997   constructor: Node,
9998   count: node_count,
9999   each: node_each,
10000   eachAfter: node_eachAfter,
10001   eachBefore: node_eachBefore,
10002   sum: node_sum,
10003   sort: node_sort,
10004   path: node_path,
10005   ancestors: node_ancestors,
10006   descendants: node_descendants,
10007   leaves: node_leaves,
10008   links: node_links,
10009   copy: node_copy
10010 };
10011
10012 var slice$3 = Array.prototype.slice;
10013
10014 function shuffle$1(array) {
10015   var m = array.length,
10016       t,
10017       i;
10018
10019   while (m) {
10020     i = Math.random() * m-- | 0;
10021     t = array[m];
10022     array[m] = array[i];
10023     array[i] = t;
10024   }
10025
10026   return array;
10027 }
10028
10029 function enclose(circles) {
10030   var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10031
10032   while (i < n) {
10033     p = circles[i];
10034     if (e && enclosesWeak(e, p)) ++i;
10035     else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10036   }
10037
10038   return e;
10039 }
10040
10041 function extendBasis(B, p) {
10042   var i, j;
10043
10044   if (enclosesWeakAll(p, B)) return [p];
10045
10046   // If we get here then B must have at least one element.
10047   for (i = 0; i < B.length; ++i) {
10048     if (enclosesNot(p, B[i])
10049         && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10050       return [B[i], p];
10051     }
10052   }
10053
10054   // If we get here then B must have at least two elements.
10055   for (i = 0; i < B.length - 1; ++i) {
10056     for (j = i + 1; j < B.length; ++j) {
10057       if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10058           && enclosesNot(encloseBasis2(B[i], p), B[j])
10059           && enclosesNot(encloseBasis2(B[j], p), B[i])
10060           && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10061         return [B[i], B[j], p];
10062       }
10063     }
10064   }
10065
10066   // If we get here then something is very wrong.
10067   throw new Error;
10068 }
10069
10070 function enclosesNot(a, b) {
10071   var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10072   return dr < 0 || dr * dr < dx * dx + dy * dy;
10073 }
10074
10075 function enclosesWeak(a, b) {
10076   var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10077   return dr > 0 && dr * dr > dx * dx + dy * dy;
10078 }
10079
10080 function enclosesWeakAll(a, B) {
10081   for (var i = 0; i < B.length; ++i) {
10082     if (!enclosesWeak(a, B[i])) {
10083       return false;
10084     }
10085   }
10086   return true;
10087 }
10088
10089 function encloseBasis(B) {
10090   switch (B.length) {
10091     case 1: return encloseBasis1(B[0]);
10092     case 2: return encloseBasis2(B[0], B[1]);
10093     case 3: return encloseBasis3(B[0], B[1], B[2]);
10094   }
10095 }
10096
10097 function encloseBasis1(a) {
10098   return {
10099     x: a.x,
10100     y: a.y,
10101     r: a.r
10102   };
10103 }
10104
10105 function encloseBasis2(a, b) {
10106   var x1 = a.x, y1 = a.y, r1 = a.r,
10107       x2 = b.x, y2 = b.y, r2 = b.r,
10108       x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10109       l = Math.sqrt(x21 * x21 + y21 * y21);
10110   return {
10111     x: (x1 + x2 + x21 / l * r21) / 2,
10112     y: (y1 + y2 + y21 / l * r21) / 2,
10113     r: (l + r1 + r2) / 2
10114   };
10115 }
10116
10117 function encloseBasis3(a, b, c) {
10118   var x1 = a.x, y1 = a.y, r1 = a.r,
10119       x2 = b.x, y2 = b.y, r2 = b.r,
10120       x3 = c.x, y3 = c.y, r3 = c.r,
10121       a2 = x1 - x2,
10122       a3 = x1 - x3,
10123       b2 = y1 - y2,
10124       b3 = y1 - y3,
10125       c2 = r2 - r1,
10126       c3 = r3 - r1,
10127       d1 = x1 * x1 + y1 * y1 - r1 * r1,
10128       d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10129       d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10130       ab = a3 * b2 - a2 * b3,
10131       xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10132       xb = (b3 * c2 - b2 * c3) / ab,
10133       ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10134       yb = (a2 * c3 - a3 * c2) / ab,
10135       A = xb * xb + yb * yb - 1,
10136       B = 2 * (r1 + xa * xb + ya * yb),
10137       C = xa * xa + ya * ya - r1 * r1,
10138       r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10139   return {
10140     x: x1 + xa + xb * r,
10141     y: y1 + ya + yb * r,
10142     r: r
10143   };
10144 }
10145
10146 function place(a, b, c) {
10147   var ax = a.x,
10148       ay = a.y,
10149       da = b.r + c.r,
10150       db = a.r + c.r,
10151       dx = b.x - ax,
10152       dy = b.y - ay,
10153       dc = dx * dx + dy * dy;
10154   if (dc) {
10155     var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10156         y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10157     c.x = ax + x * dx + y * dy;
10158     c.y = ay + x * dy - y * dx;
10159   } else {
10160     c.x = ax + db;
10161     c.y = ay;
10162   }
10163 }
10164
10165 function intersects(a, b) {
10166   var dx = b.x - a.x,
10167       dy = b.y - a.y,
10168       dr = a.r + b.r;
10169   return dr * dr - 1e-6 > dx * dx + dy * dy;
10170 }
10171
10172 function score(node) {
10173   var a = node._,
10174       b = node.next._,
10175       ab = a.r + b.r,
10176       dx = (a.x * b.r + b.x * a.r) / ab,
10177       dy = (a.y * b.r + b.y * a.r) / ab;
10178   return dx * dx + dy * dy;
10179 }
10180
10181 function Node$1(circle) {
10182   this._ = circle;
10183   this.next = null;
10184   this.previous = null;
10185 }
10186
10187 function packEnclose(circles) {
10188   if (!(n = circles.length)) return 0;
10189
10190   var a, b, c, n, aa, ca, i, j, k, sj, sk;
10191
10192   // Place the first circle.
10193   a = circles[0], a.x = 0, a.y = 0;
10194   if (!(n > 1)) return a.r;
10195
10196   // Place the second circle.
10197   b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10198   if (!(n > 2)) return a.r + b.r;
10199
10200   // Place the third circle.
10201   place(b, a, c = circles[2]);
10202
10203   // Initialize the front-chain using the first three circles a, b and c.
10204   a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10205   a.next = c.previous = b;
10206   b.next = a.previous = c;
10207   c.next = b.previous = a;
10208
10209   // Attempt to place each remaining circle…
10210   pack: for (i = 3; i < n; ++i) {
10211     place(a._, b._, c = circles[i]), c = new Node$1(c);
10212
10213     // Find the closest intersecting circle on the front-chain, if any.
10214     // “Closeness” is determined by linear distance along the front-chain.
10215     // “Ahead” or “behind” is likewise determined by linear distance.
10216     j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10217     do {
10218       if (sj <= sk) {
10219         if (intersects(j._, c._)) {
10220           b = j, a.next = b, b.previous = a, --i;
10221           continue pack;
10222         }
10223         sj += j._.r, j = j.next;
10224       } else {
10225         if (intersects(k._, c._)) {
10226           a = k, a.next = b, b.previous = a, --i;
10227           continue pack;
10228         }
10229         sk += k._.r, k = k.previous;
10230       }
10231     } while (j !== k.next);
10232
10233     // Success! Insert the new circle c between a and b.
10234     c.previous = a, c.next = b, a.next = b.previous = b = c;
10235
10236     // Compute the new closest circle pair to the centroid.
10237     aa = score(a);
10238     while ((c = c.next) !== b) {
10239       if ((ca = score(c)) < aa) {
10240         a = c, aa = ca;
10241       }
10242     }
10243     b = a.next;
10244   }
10245
10246   // Compute the enclosing circle of the front chain.
10247   a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10248
10249   // Translate the circles to put the enclosing circle around the origin.
10250   for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10251
10252   return c.r;
10253 }
10254
10255 function siblings(circles) {
10256   packEnclose(circles);
10257   return circles;
10258 }
10259
10260 function optional(f) {
10261   return f == null ? null : required(f);
10262 }
10263
10264 function required(f) {
10265   if (typeof f !== "function") throw new Error;
10266   return f;
10267 }
10268
10269 function constantZero() {
10270   return 0;
10271 }
10272
10273 function constant$8(x) {
10274   return function() {
10275     return x;
10276   };
10277 }
10278
10279 function defaultRadius$1(d) {
10280   return Math.sqrt(d.value);
10281 }
10282
10283 function index$1() {
10284   var radius = null,
10285       dx = 1,
10286       dy = 1,
10287       padding = constantZero;
10288
10289   function pack(root) {
10290     root.x = dx / 2, root.y = dy / 2;
10291     if (radius) {
10292       root.eachBefore(radiusLeaf(radius))
10293           .eachAfter(packChildren(padding, 0.5))
10294           .eachBefore(translateChild(1));
10295     } else {
10296       root.eachBefore(radiusLeaf(defaultRadius$1))
10297           .eachAfter(packChildren(constantZero, 1))
10298           .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10299           .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10300     }
10301     return root;
10302   }
10303
10304   pack.radius = function(x) {
10305     return arguments.length ? (radius = optional(x), pack) : radius;
10306   };
10307
10308   pack.size = function(x) {
10309     return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10310   };
10311
10312   pack.padding = function(x) {
10313     return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10314   };
10315
10316   return pack;
10317 }
10318
10319 function radiusLeaf(radius) {
10320   return function(node) {
10321     if (!node.children) {
10322       node.r = Math.max(0, +radius(node) || 0);
10323     }
10324   };
10325 }
10326
10327 function packChildren(padding, k) {
10328   return function(node) {
10329     if (children = node.children) {
10330       var children,
10331           i,
10332           n = children.length,
10333           r = padding(node) * k || 0,
10334           e;
10335
10336       if (r) for (i = 0; i < n; ++i) children[i].r += r;
10337       e = packEnclose(children);
10338       if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10339       node.r = e + r;
10340     }
10341   };
10342 }
10343
10344 function translateChild(k) {
10345   return function(node) {
10346     var parent = node.parent;
10347     node.r *= k;
10348     if (parent) {
10349       node.x = parent.x + k * node.x;
10350       node.y = parent.y + k * node.y;
10351     }
10352   };
10353 }
10354
10355 function roundNode(node) {
10356   node.x0 = Math.round(node.x0);
10357   node.y0 = Math.round(node.y0);
10358   node.x1 = Math.round(node.x1);
10359   node.y1 = Math.round(node.y1);
10360 }
10361
10362 function treemapDice(parent, x0, y0, x1, y1) {
10363   var nodes = parent.children,
10364       node,
10365       i = -1,
10366       n = nodes.length,
10367       k = parent.value && (x1 - x0) / parent.value;
10368
10369   while (++i < n) {
10370     node = nodes[i], node.y0 = y0, node.y1 = y1;
10371     node.x0 = x0, node.x1 = x0 += node.value * k;
10372   }
10373 }
10374
10375 function partition() {
10376   var dx = 1,
10377       dy = 1,
10378       padding = 0,
10379       round = false;
10380
10381   function partition(root) {
10382     var n = root.height + 1;
10383     root.x0 =
10384     root.y0 = padding;
10385     root.x1 = dx;
10386     root.y1 = dy / n;
10387     root.eachBefore(positionNode(dy, n));
10388     if (round) root.eachBefore(roundNode);
10389     return root;
10390   }
10391
10392   function positionNode(dy, n) {
10393     return function(node) {
10394       if (node.children) {
10395         treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10396       }
10397       var x0 = node.x0,
10398           y0 = node.y0,
10399           x1 = node.x1 - padding,
10400           y1 = node.y1 - padding;
10401       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10402       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10403       node.x0 = x0;
10404       node.y0 = y0;
10405       node.x1 = x1;
10406       node.y1 = y1;
10407     };
10408   }
10409
10410   partition.round = function(x) {
10411     return arguments.length ? (round = !!x, partition) : round;
10412   };
10413
10414   partition.size = function(x) {
10415     return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10416   };
10417
10418   partition.padding = function(x) {
10419     return arguments.length ? (padding = +x, partition) : padding;
10420   };
10421
10422   return partition;
10423 }
10424
10425 var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10426     preroot = {depth: -1},
10427     ambiguous = {};
10428
10429 function defaultId(d) {
10430   return d.id;
10431 }
10432
10433 function defaultParentId(d) {
10434   return d.parentId;
10435 }
10436
10437 function stratify() {
10438   var id = defaultId,
10439       parentId = defaultParentId;
10440
10441   function stratify(data) {
10442     var d,
10443         i,
10444         n = data.length,
10445         root,
10446         parent,
10447         node,
10448         nodes = new Array(n),
10449         nodeId,
10450         nodeKey,
10451         nodeByKey = {};
10452
10453     for (i = 0; i < n; ++i) {
10454       d = data[i], node = nodes[i] = new Node(d);
10455       if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10456         nodeKey = keyPrefix$1 + (node.id = nodeId);
10457         nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10458       }
10459     }
10460
10461     for (i = 0; i < n; ++i) {
10462       node = nodes[i], nodeId = parentId(data[i], i, data);
10463       if (nodeId == null || !(nodeId += "")) {
10464         if (root) throw new Error("multiple roots");
10465         root = node;
10466       } else {
10467         parent = nodeByKey[keyPrefix$1 + nodeId];
10468         if (!parent) throw new Error("missing: " + nodeId);
10469         if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10470         if (parent.children) parent.children.push(node);
10471         else parent.children = [node];
10472         node.parent = parent;
10473       }
10474     }
10475
10476     if (!root) throw new Error("no root");
10477     root.parent = preroot;
10478     root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10479     root.parent = null;
10480     if (n > 0) throw new Error("cycle");
10481
10482     return root;
10483   }
10484
10485   stratify.id = function(x) {
10486     return arguments.length ? (id = required(x), stratify) : id;
10487   };
10488
10489   stratify.parentId = function(x) {
10490     return arguments.length ? (parentId = required(x), stratify) : parentId;
10491   };
10492
10493   return stratify;
10494 }
10495
10496 function defaultSeparation$1(a, b) {
10497   return a.parent === b.parent ? 1 : 2;
10498 }
10499
10500 // function radialSeparation(a, b) {
10501 //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10502 // }
10503
10504 // This function is used to traverse the left contour of a subtree (or
10505 // subforest). It returns the successor of v on this contour. This successor is
10506 // either given by the leftmost child of v or by the thread of v. The function
10507 // returns null if and only if v is on the highest level of its subtree.
10508 function nextLeft(v) {
10509   var children = v.children;
10510   return children ? children[0] : v.t;
10511 }
10512
10513 // This function works analogously to nextLeft.
10514 function nextRight(v) {
10515   var children = v.children;
10516   return children ? children[children.length - 1] : v.t;
10517 }
10518
10519 // Shifts the current subtree rooted at w+. This is done by increasing
10520 // prelim(w+) and mod(w+) by shift.
10521 function moveSubtree(wm, wp, shift) {
10522   var change = shift / (wp.i - wm.i);
10523   wp.c -= change;
10524   wp.s += shift;
10525   wm.c += change;
10526   wp.z += shift;
10527   wp.m += shift;
10528 }
10529
10530 // All other shifts, applied to the smaller subtrees between w- and w+, are
10531 // performed by this function. To prepare the shifts, we have to adjust
10532 // change(w+), shift(w+), and change(w-).
10533 function executeShifts(v) {
10534   var shift = 0,
10535       change = 0,
10536       children = v.children,
10537       i = children.length,
10538       w;
10539   while (--i >= 0) {
10540     w = children[i];
10541     w.z += shift;
10542     w.m += shift;
10543     shift += w.s + (change += w.c);
10544   }
10545 }
10546
10547 // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10548 // returns the specified (default) ancestor.
10549 function nextAncestor(vim, v, ancestor) {
10550   return vim.a.parent === v.parent ? vim.a : ancestor;
10551 }
10552
10553 function TreeNode(node, i) {
10554   this._ = node;
10555   this.parent = null;
10556   this.children = null;
10557   this.A = null; // default ancestor
10558   this.a = this; // ancestor
10559   this.z = 0; // prelim
10560   this.m = 0; // mod
10561   this.c = 0; // change
10562   this.s = 0; // shift
10563   this.t = null; // thread
10564   this.i = i; // number
10565 }
10566
10567 TreeNode.prototype = Object.create(Node.prototype);
10568
10569 function treeRoot(root) {
10570   var tree = new TreeNode(root, 0),
10571       node,
10572       nodes = [tree],
10573       child,
10574       children,
10575       i,
10576       n;
10577
10578   while (node = nodes.pop()) {
10579     if (children = node._.children) {
10580       node.children = new Array(n = children.length);
10581       for (i = n - 1; i >= 0; --i) {
10582         nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10583         child.parent = node;
10584       }
10585     }
10586   }
10587
10588   (tree.parent = new TreeNode(null, 0)).children = [tree];
10589   return tree;
10590 }
10591
10592 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10593 function tree() {
10594   var separation = defaultSeparation$1,
10595       dx = 1,
10596       dy = 1,
10597       nodeSize = null;
10598
10599   function tree(root) {
10600     var t = treeRoot(root);
10601
10602     // Compute the layout using Buchheim et al.’s algorithm.
10603     t.eachAfter(firstWalk), t.parent.m = -t.z;
10604     t.eachBefore(secondWalk);
10605
10606     // If a fixed node size is specified, scale x and y.
10607     if (nodeSize) root.eachBefore(sizeNode);
10608
10609     // If a fixed tree size is specified, scale x and y based on the extent.
10610     // Compute the left-most, right-most, and depth-most nodes for extents.
10611     else {
10612       var left = root,
10613           right = root,
10614           bottom = root;
10615       root.eachBefore(function(node) {
10616         if (node.x < left.x) left = node;
10617         if (node.x > right.x) right = node;
10618         if (node.depth > bottom.depth) bottom = node;
10619       });
10620       var s = left === right ? 1 : separation(left, right) / 2,
10621           tx = s - left.x,
10622           kx = dx / (right.x + s + tx),
10623           ky = dy / (bottom.depth || 1);
10624       root.eachBefore(function(node) {
10625         node.x = (node.x + tx) * kx;
10626         node.y = node.depth * ky;
10627       });
10628     }
10629
10630     return root;
10631   }
10632
10633   // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10634   // applied recursively to the children of v, as well as the function
10635   // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10636   // node v is placed to the midpoint of its outermost children.
10637   function firstWalk(v) {
10638     var children = v.children,
10639         siblings = v.parent.children,
10640         w = v.i ? siblings[v.i - 1] : null;
10641     if (children) {
10642       executeShifts(v);
10643       var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10644       if (w) {
10645         v.z = w.z + separation(v._, w._);
10646         v.m = v.z - midpoint;
10647       } else {
10648         v.z = midpoint;
10649       }
10650     } else if (w) {
10651       v.z = w.z + separation(v._, w._);
10652     }
10653     v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10654   }
10655
10656   // Computes all real x-coordinates by summing up the modifiers recursively.
10657   function secondWalk(v) {
10658     v._.x = v.z + v.parent.m;
10659     v.m += v.parent.m;
10660   }
10661
10662   // The core of the algorithm. Here, a new subtree is combined with the
10663   // previous subtrees. Threads are used to traverse the inside and outside
10664   // contours of the left and right subtree up to the highest common level. The
10665   // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10666   // superscript o means outside and i means inside, the subscript - means left
10667   // subtree and + means right subtree. For summing up the modifiers along the
10668   // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10669   // nodes of the inside contours conflict, we compute the left one of the
10670   // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10671   // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10672   // Finally, we add a new thread (if necessary).
10673   function apportion(v, w, ancestor) {
10674     if (w) {
10675       var vip = v,
10676           vop = v,
10677           vim = w,
10678           vom = vip.parent.children[0],
10679           sip = vip.m,
10680           sop = vop.m,
10681           sim = vim.m,
10682           som = vom.m,
10683           shift;
10684       while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10685         vom = nextLeft(vom);
10686         vop = nextRight(vop);
10687         vop.a = v;
10688         shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10689         if (shift > 0) {
10690           moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10691           sip += shift;
10692           sop += shift;
10693         }
10694         sim += vim.m;
10695         sip += vip.m;
10696         som += vom.m;
10697         sop += vop.m;
10698       }
10699       if (vim && !nextRight(vop)) {
10700         vop.t = vim;
10701         vop.m += sim - sop;
10702       }
10703       if (vip && !nextLeft(vom)) {
10704         vom.t = vip;
10705         vom.m += sip - som;
10706         ancestor = v;
10707       }
10708     }
10709     return ancestor;
10710   }
10711
10712   function sizeNode(node) {
10713     node.x *= dx;
10714     node.y = node.depth * dy;
10715   }
10716
10717   tree.separation = function(x) {
10718     return arguments.length ? (separation = x, tree) : separation;
10719   };
10720
10721   tree.size = function(x) {
10722     return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10723   };
10724
10725   tree.nodeSize = function(x) {
10726     return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10727   };
10728
10729   return tree;
10730 }
10731
10732 function treemapSlice(parent, x0, y0, x1, y1) {
10733   var nodes = parent.children,
10734       node,
10735       i = -1,
10736       n = nodes.length,
10737       k = parent.value && (y1 - y0) / parent.value;
10738
10739   while (++i < n) {
10740     node = nodes[i], node.x0 = x0, node.x1 = x1;
10741     node.y0 = y0, node.y1 = y0 += node.value * k;
10742   }
10743 }
10744
10745 var phi = (1 + Math.sqrt(5)) / 2;
10746
10747 function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10748   var rows = [],
10749       nodes = parent.children,
10750       row,
10751       nodeValue,
10752       i0 = 0,
10753       i1 = 0,
10754       n = nodes.length,
10755       dx, dy,
10756       value = parent.value,
10757       sumValue,
10758       minValue,
10759       maxValue,
10760       newRatio,
10761       minRatio,
10762       alpha,
10763       beta;
10764
10765   while (i0 < n) {
10766     dx = x1 - x0, dy = y1 - y0;
10767
10768     // Find the next non-empty node.
10769     do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10770     minValue = maxValue = sumValue;
10771     alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10772     beta = sumValue * sumValue * alpha;
10773     minRatio = Math.max(maxValue / beta, beta / minValue);
10774
10775     // Keep adding nodes while the aspect ratio maintains or improves.
10776     for (; i1 < n; ++i1) {
10777       sumValue += nodeValue = nodes[i1].value;
10778       if (nodeValue < minValue) minValue = nodeValue;
10779       if (nodeValue > maxValue) maxValue = nodeValue;
10780       beta = sumValue * sumValue * alpha;
10781       newRatio = Math.max(maxValue / beta, beta / minValue);
10782       if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10783       minRatio = newRatio;
10784     }
10785
10786     // Position and record the row orientation.
10787     rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10788     if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10789     else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10790     value -= sumValue, i0 = i1;
10791   }
10792
10793   return rows;
10794 }
10795
10796 var squarify = (function custom(ratio) {
10797
10798   function squarify(parent, x0, y0, x1, y1) {
10799     squarifyRatio(ratio, parent, x0, y0, x1, y1);
10800   }
10801
10802   squarify.ratio = function(x) {
10803     return custom((x = +x) > 1 ? x : 1);
10804   };
10805
10806   return squarify;
10807 })(phi);
10808
10809 function index$2() {
10810   var tile = squarify,
10811       round = false,
10812       dx = 1,
10813       dy = 1,
10814       paddingStack = [0],
10815       paddingInner = constantZero,
10816       paddingTop = constantZero,
10817       paddingRight = constantZero,
10818       paddingBottom = constantZero,
10819       paddingLeft = constantZero;
10820
10821   function treemap(root) {
10822     root.x0 =
10823     root.y0 = 0;
10824     root.x1 = dx;
10825     root.y1 = dy;
10826     root.eachBefore(positionNode);
10827     paddingStack = [0];
10828     if (round) root.eachBefore(roundNode);
10829     return root;
10830   }
10831
10832   function positionNode(node) {
10833     var p = paddingStack[node.depth],
10834         x0 = node.x0 + p,
10835         y0 = node.y0 + p,
10836         x1 = node.x1 - p,
10837         y1 = node.y1 - p;
10838     if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10839     if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10840     node.x0 = x0;
10841     node.y0 = y0;
10842     node.x1 = x1;
10843     node.y1 = y1;
10844     if (node.children) {
10845       p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10846       x0 += paddingLeft(node) - p;
10847       y0 += paddingTop(node) - p;
10848       x1 -= paddingRight(node) - p;
10849       y1 -= paddingBottom(node) - p;
10850       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10851       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10852       tile(node, x0, y0, x1, y1);
10853     }
10854   }
10855
10856   treemap.round = function(x) {
10857     return arguments.length ? (round = !!x, treemap) : round;
10858   };
10859
10860   treemap.size = function(x) {
10861     return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10862   };
10863
10864   treemap.tile = function(x) {
10865     return arguments.length ? (tile = required(x), treemap) : tile;
10866   };
10867
10868   treemap.padding = function(x) {
10869     return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10870   };
10871
10872   treemap.paddingInner = function(x) {
10873     return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10874   };
10875
10876   treemap.paddingOuter = function(x) {
10877     return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10878   };
10879
10880   treemap.paddingTop = function(x) {
10881     return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10882   };
10883
10884   treemap.paddingRight = function(x) {
10885     return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10886   };
10887
10888   treemap.paddingBottom = function(x) {
10889     return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10890   };
10891
10892   treemap.paddingLeft = function(x) {
10893     return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10894   };
10895
10896   return treemap;
10897 }
10898
10899 function binary(parent, x0, y0, x1, y1) {
10900   var nodes = parent.children,
10901       i, n = nodes.length,
10902       sum, sums = new Array(n + 1);
10903
10904   for (sums[0] = sum = i = 0; i < n; ++i) {
10905     sums[i + 1] = sum += nodes[i].value;
10906   }
10907
10908   partition(0, n, parent.value, x0, y0, x1, y1);
10909
10910   function partition(i, j, value, x0, y0, x1, y1) {
10911     if (i >= j - 1) {
10912       var node = nodes[i];
10913       node.x0 = x0, node.y0 = y0;
10914       node.x1 = x1, node.y1 = y1;
10915       return;
10916     }
10917
10918     var valueOffset = sums[i],
10919         valueTarget = (value / 2) + valueOffset,
10920         k = i + 1,
10921         hi = j - 1;
10922
10923     while (k < hi) {
10924       var mid = k + hi >>> 1;
10925       if (sums[mid] < valueTarget) k = mid + 1;
10926       else hi = mid;
10927     }
10928
10929     if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10930
10931     var valueLeft = sums[k] - valueOffset,
10932         valueRight = value - valueLeft;
10933
10934     if ((x1 - x0) > (y1 - y0)) {
10935       var xk = (x0 * valueRight + x1 * valueLeft) / value;
10936       partition(i, k, valueLeft, x0, y0, xk, y1);
10937       partition(k, j, valueRight, xk, y0, x1, y1);
10938     } else {
10939       var yk = (y0 * valueRight + y1 * valueLeft) / value;
10940       partition(i, k, valueLeft, x0, y0, x1, yk);
10941       partition(k, j, valueRight, x0, yk, x1, y1);
10942     }
10943   }
10944 }
10945
10946 function sliceDice(parent, x0, y0, x1, y1) {
10947   (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10948 }
10949
10950 var resquarify = (function custom(ratio) {
10951
10952   function resquarify(parent, x0, y0, x1, y1) {
10953     if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10954       var rows,
10955           row,
10956           nodes,
10957           i,
10958           j = -1,
10959           n,
10960           m = rows.length,
10961           value = parent.value;
10962
10963       while (++j < m) {
10964         row = rows[j], nodes = row.children;
10965         for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10966         if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10967         else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10968         value -= row.value;
10969       }
10970     } else {
10971       parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10972       rows.ratio = ratio;
10973     }
10974   }
10975
10976   resquarify.ratio = function(x) {
10977     return custom((x = +x) > 1 ? x : 1);
10978   };
10979
10980   return resquarify;
10981 })(phi);
10982
10983 function d3_polygonArea(polygon) {
10984   var i = -1,
10985       n = polygon.length,
10986       a,
10987       b = polygon[n - 1],
10988       area = 0;
10989
10990   while (++i < n) {
10991     a = b;
10992     b = polygon[i];
10993     area += a[1] * b[0] - a[0] * b[1];
10994   }
10995
10996   return area / 2;
10997 }
10998
10999 function d3_polygonCentroid(polygon) {
11000   var i = -1,
11001       n = polygon.length,
11002       x = 0,
11003       y = 0,
11004       a,
11005       b = polygon[n - 1],
11006       c,
11007       k = 0;
11008
11009   while (++i < n) {
11010     a = b;
11011     b = polygon[i];
11012     k += c = a[0] * b[1] - b[0] * a[1];
11013     x += (a[0] + b[0]) * c;
11014     y += (a[1] + b[1]) * c;
11015   }
11016
11017   return k *= 3, [x / k, y / k];
11018 }
11019
11020 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
11021 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
11022 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
11023 // negative if clockwise, and zero if the points are collinear.
11024 function cross$1(a, b, c) {
11025   return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
11026 }
11027
11028 function lexicographicOrder(a, b) {
11029   return a[0] - b[0] || a[1] - b[1];
11030 }
11031
11032 // Computes the upper convex hull per the monotone chain algorithm.
11033 // Assumes points.length >= 3, is sorted by x, unique in y.
11034 // Returns an array of indices into points in left-to-right order.
11035 function computeUpperHullIndexes(points) {
11036   var n = points.length,
11037       indexes = [0, 1],
11038       size = 2;
11039
11040   for (var i = 2; i < n; ++i) {
11041     while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11042     indexes[size++] = i;
11043   }
11044
11045   return indexes.slice(0, size); // remove popped points
11046 }
11047
11048 function d3_polygonHull(points) {
11049   if ((n = points.length) < 3) return null;
11050
11051   var i,
11052       n,
11053       sortedPoints = new Array(n),
11054       flippedPoints = new Array(n);
11055
11056   for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11057   sortedPoints.sort(lexicographicOrder);
11058   for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11059
11060   var upperIndexes = computeUpperHullIndexes(sortedPoints),
11061       lowerIndexes = computeUpperHullIndexes(flippedPoints);
11062
11063   // Construct the hull polygon, removing possible duplicate endpoints.
11064   var skipLeft = lowerIndexes[0] === upperIndexes[0],
11065       skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11066       hull = [];
11067
11068   // Add upper hull in right-to-l order.
11069   // Then add lower hull in left-to-right order.
11070   for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11071   for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11072
11073   return hull;
11074 }
11075
11076 function contains$1(polygon, point) {
11077   var n = polygon.length,
11078       p = polygon[n - 1],
11079       x = point[0], y = point[1],
11080       x0 = p[0], y0 = p[1],
11081       x1, y1,
11082       inside = false;
11083
11084   for (var i = 0; i < n; ++i) {
11085     p = polygon[i], x1 = p[0], y1 = p[1];
11086     if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11087     x0 = x1, y0 = y1;
11088   }
11089
11090   return inside;
11091 }
11092
11093 function length$1(polygon) {
11094   var i = -1,
11095       n = polygon.length,
11096       b = polygon[n - 1],
11097       xa,
11098       ya,
11099       xb = b[0],
11100       yb = b[1],
11101       perimeter = 0;
11102
11103   while (++i < n) {
11104     xa = xb;
11105     ya = yb;
11106     b = polygon[i];
11107     xb = b[0];
11108     yb = b[1];
11109     xa -= xb;
11110     ya -= yb;
11111     perimeter += Math.sqrt(xa * xa + ya * ya);
11112   }
11113
11114   return perimeter;
11115 }
11116
11117 var slice$4 = [].slice;
11118
11119 var noabort = {};
11120
11121 function Queue(size) {
11122   this._size = size;
11123   this._call =
11124   this._error = null;
11125   this._tasks = [];
11126   this._data = [];
11127   this._waiting =
11128   this._active =
11129   this._ended =
11130   this._start = 0; // inside a synchronous task callback?
11131 }
11132
11133 Queue.prototype = queue.prototype = {
11134   constructor: Queue,
11135   defer: function(callback) {
11136     if (typeof callback !== "function") throw new Error("invalid callback");
11137     if (this._call) throw new Error("defer after await");
11138     if (this._error != null) return this;
11139     var t = slice$4.call(arguments, 1);
11140     t.push(callback);
11141     ++this._waiting, this._tasks.push(t);
11142     poke$1(this);
11143     return this;
11144   },
11145   abort: function() {
11146     if (this._error == null) abort(this, new Error("abort"));
11147     return this;
11148   },
11149   await: function(callback) {
11150     if (typeof callback !== "function") throw new Error("invalid callback");
11151     if (this._call) throw new Error("multiple await");
11152     this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11153     maybeNotify(this);
11154     return this;
11155   },
11156   awaitAll: function(callback) {
11157     if (typeof callback !== "function") throw new Error("invalid callback");
11158     if (this._call) throw new Error("multiple await");
11159     this._call = callback;
11160     maybeNotify(this);
11161     return this;
11162   }
11163 };
11164
11165 function poke$1(q) {
11166   if (!q._start) {
11167     try { start$1(q); } // let the current task complete
11168     catch (e) {
11169       if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11170       else if (!q._data) throw e; // await callback errored synchronously
11171     }
11172   }
11173 }
11174
11175 function start$1(q) {
11176   while (q._start = q._waiting && q._active < q._size) {
11177     var i = q._ended + q._active,
11178         t = q._tasks[i],
11179         j = t.length - 1,
11180         c = t[j];
11181     t[j] = end(q, i);
11182     --q._waiting, ++q._active;
11183     t = c.apply(null, t);
11184     if (!q._tasks[i]) continue; // task finished synchronously
11185     q._tasks[i] = t || noabort;
11186   }
11187 }
11188
11189 function end(q, i) {
11190   return function(e, r) {
11191     if (!q._tasks[i]) return; // ignore multiple callbacks
11192     --q._active, ++q._ended;
11193     q._tasks[i] = null;
11194     if (q._error != null) return; // ignore secondary errors
11195     if (e != null) {
11196       abort(q, e);
11197     } else {
11198       q._data[i] = r;
11199       if (q._waiting) poke$1(q);
11200       else maybeNotify(q);
11201     }
11202   };
11203 }
11204
11205 function abort(q, e) {
11206   var i = q._tasks.length, t;
11207   q._error = e; // ignore active callbacks
11208   q._data = undefined; // allow gc
11209   q._waiting = NaN; // prevent starting
11210
11211   while (--i >= 0) {
11212     if (t = q._tasks[i]) {
11213       q._tasks[i] = null;
11214       if (t.abort) {
11215         try { t.abort(); }
11216         catch (e) { /* ignore */ }
11217       }
11218     }
11219   }
11220
11221   q._active = NaN; // allow notification
11222   maybeNotify(q);
11223 }
11224
11225 function maybeNotify(q) {
11226   if (!q._active && q._call) {
11227     var d = q._data;
11228     q._data = undefined; // allow gc
11229     q._call(q._error, d);
11230   }
11231 }
11232
11233 function queue(concurrency) {
11234   if (concurrency == null) concurrency = Infinity;
11235   else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11236   return new Queue(concurrency);
11237 }
11238
11239 function defaultSource$1() {
11240   return Math.random();
11241 }
11242
11243 var uniform = (function sourceRandomUniform(source) {
11244   function randomUniform(min, max) {
11245     min = min == null ? 0 : +min;
11246     max = max == null ? 1 : +max;
11247     if (arguments.length === 1) max = min, min = 0;
11248     else max -= min;
11249     return function() {
11250       return source() * max + min;
11251     };
11252   }
11253
11254   randomUniform.source = sourceRandomUniform;
11255
11256   return randomUniform;
11257 })(defaultSource$1);
11258
11259 var normal = (function sourceRandomNormal(source) {
11260   function randomNormal(mu, sigma) {
11261     var x, r;
11262     mu = mu == null ? 0 : +mu;
11263     sigma = sigma == null ? 1 : +sigma;
11264     return function() {
11265       var y;
11266
11267       // If available, use the second previously-generated uniform random.
11268       if (x != null) y = x, x = null;
11269
11270       // Otherwise, generate a new x and y.
11271       else do {
11272         x = source() * 2 - 1;
11273         y = source() * 2 - 1;
11274         r = x * x + y * y;
11275       } while (!r || r > 1);
11276
11277       return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11278     };
11279   }
11280
11281   randomNormal.source = sourceRandomNormal;
11282
11283   return randomNormal;
11284 })(defaultSource$1);
11285
11286 var logNormal = (function sourceRandomLogNormal(source) {
11287   function randomLogNormal() {
11288     var randomNormal = normal.source(source).apply(this, arguments);
11289     return function() {
11290       return Math.exp(randomNormal());
11291     };
11292   }
11293
11294   randomLogNormal.source = sourceRandomLogNormal;
11295
11296   return randomLogNormal;
11297 })(defaultSource$1);
11298
11299 var irwinHall = (function sourceRandomIrwinHall(source) {
11300   function randomIrwinHall(n) {
11301     return function() {
11302       for (var sum = 0, i = 0; i < n; ++i) sum += source();
11303       return sum;
11304     };
11305   }
11306
11307   randomIrwinHall.source = sourceRandomIrwinHall;
11308
11309   return randomIrwinHall;
11310 })(defaultSource$1);
11311
11312 var bates = (function sourceRandomBates(source) {
11313   function randomBates(n) {
11314     var randomIrwinHall = irwinHall.source(source)(n);
11315     return function() {
11316       return randomIrwinHall() / n;
11317     };
11318   }
11319
11320   randomBates.source = sourceRandomBates;
11321
11322   return randomBates;
11323 })(defaultSource$1);
11324
11325 var exponential$1 = (function sourceRandomExponential(source) {
11326   function randomExponential(lambda) {
11327     return function() {
11328       return -Math.log(1 - source()) / lambda;
11329     };
11330   }
11331
11332   randomExponential.source = sourceRandomExponential;
11333
11334   return randomExponential;
11335 })(defaultSource$1);
11336
11337 function d3_request(url, callback) {
11338   var request,
11339       event = dispatch("beforesend", "progress", "load", "error"),
11340       mimeType,
11341       headers = map$1(),
11342       xhr = new XMLHttpRequest,
11343       user = null,
11344       password = null,
11345       response,
11346       responseType,
11347       timeout = 0;
11348
11349   // If IE does not support CORS, use XDomainRequest.
11350   if (typeof XDomainRequest !== "undefined"
11351       && !("withCredentials" in xhr)
11352       && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11353
11354   "onload" in xhr
11355       ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11356       : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11357
11358   function respond(o) {
11359     var status = xhr.status, result;
11360     if (!status && hasResponse(xhr)
11361         || status >= 200 && status < 300
11362         || status === 304) {
11363       if (response) {
11364         try {
11365           result = response.call(request, xhr);
11366         } catch (e) {
11367           event.call("error", request, e);
11368           return;
11369         }
11370       } else {
11371         result = xhr;
11372       }
11373       event.call("load", request, result);
11374     } else {
11375       event.call("error", request, o);
11376     }
11377   }
11378
11379   xhr.onprogress = function(e) {
11380     event.call("progress", request, e);
11381   };
11382
11383   request = {
11384     header: function(name, value) {
11385       name = (name + "").toLowerCase();
11386       if (arguments.length < 2) return headers.get(name);
11387       if (value == null) headers.remove(name);
11388       else headers.set(name, value + "");
11389       return request;
11390     },
11391
11392     // If mimeType is non-null and no Accept header is set, a default is used.
11393     mimeType: function(value) {
11394       if (!arguments.length) return mimeType;
11395       mimeType = value == null ? null : value + "";
11396       return request;
11397     },
11398
11399     // Specifies what type the response value should take;
11400     // for instance, arraybuffer, blob, document, or text.
11401     responseType: function(value) {
11402       if (!arguments.length) return responseType;
11403       responseType = value;
11404       return request;
11405     },
11406
11407     timeout: function(value) {
11408       if (!arguments.length) return timeout;
11409       timeout = +value;
11410       return request;
11411     },
11412
11413     user: function(value) {
11414       return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11415     },
11416
11417     password: function(value) {
11418       return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11419     },
11420
11421     // Specify how to convert the response content to a specific type;
11422     // changes the callback value on "load" events.
11423     response: function(value) {
11424       response = value;
11425       return request;
11426     },
11427
11428     // Alias for send("GET", …).
11429     get: function(data, callback) {
11430       return request.send("GET", data, callback);
11431     },
11432
11433     // Alias for send("POST", …).
11434     post: function(data, callback) {
11435       return request.send("POST", data, callback);
11436     },
11437
11438     // If callback is non-null, it will be used for error and load events.
11439     send: function(method, data, callback) {
11440       xhr.open(method, url, true, user, password);
11441       if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11442       if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11443       if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11444       if (responseType != null) xhr.responseType = responseType;
11445       if (timeout > 0) xhr.timeout = timeout;
11446       if (callback == null && typeof data === "function") callback = data, data = null;
11447       if (callback != null && callback.length === 1) callback = fixCallback(callback);
11448       if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11449       event.call("beforesend", request, xhr);
11450       xhr.send(data == null ? null : data);
11451       return request;
11452     },
11453
11454     abort: function() {
11455       xhr.abort();
11456       return request;
11457     },
11458
11459     on: function() {
11460       var value = event.on.apply(event, arguments);
11461       return value === event ? request : value;
11462     }
11463   };
11464
11465   if (callback != null) {
11466     if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11467     return request.get(callback);
11468   }
11469
11470   return request;
11471 }
11472
11473 function fixCallback(callback) {
11474   return function(error, xhr) {
11475     callback(error == null ? xhr : null);
11476   };
11477 }
11478
11479 function hasResponse(xhr) {
11480   var type = xhr.responseType;
11481   return type && type !== "text"
11482       ? xhr.response // null on error
11483       : xhr.responseText; // "" on error
11484 }
11485
11486 function type$1(defaultMimeType, response) {
11487   return function(url, callback) {
11488     var r = d3_request(url).mimeType(defaultMimeType).response(response);
11489     if (callback != null) {
11490       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11491       return r.get(callback);
11492     }
11493     return r;
11494   };
11495 }
11496
11497 var html = type$1("text/html", function(xhr) {
11498   return document.createRange().createContextualFragment(xhr.responseText);
11499 });
11500
11501 var d3_json = type$1("application/json", function(xhr) {
11502   return JSON.parse(xhr.responseText);
11503 });
11504
11505 var d3_text = type$1("text/plain", function(xhr) {
11506   return xhr.responseText;
11507 });
11508
11509 var d3_xml = type$1("application/xml", function(xhr) {
11510   var xml = xhr.responseXML;
11511   if (!xml) throw new Error("parse error");
11512   return xml;
11513 });
11514
11515 function dsv$1(defaultMimeType, parse) {
11516   return function(url, row, callback) {
11517     if (arguments.length < 3) callback = row, row = null;
11518     var r = d3_request(url).mimeType(defaultMimeType);
11519     r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11520     r.row(row);
11521     return callback ? r.get(callback) : r;
11522   };
11523 }
11524
11525 function responseOf(parse, row) {
11526   return function(request) {
11527     return parse(request.responseText, row);
11528   };
11529 }
11530
11531 var csv$1 = dsv$1("text/csv", csvParse);
11532
11533 var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11534
11535 var array$2 = Array.prototype;
11536
11537 var map$2 = array$2.map;
11538 var slice$5 = array$2.slice;
11539
11540 var implicit = {name: "implicit"};
11541
11542 function ordinal(range) {
11543   var index = map$1(),
11544       domain = [],
11545       unknown = implicit;
11546
11547   range = range == null ? [] : slice$5.call(range);
11548
11549   function scale(d) {
11550     var key = d + "", i = index.get(key);
11551     if (!i) {
11552       if (unknown !== implicit) return unknown;
11553       index.set(key, i = domain.push(d));
11554     }
11555     return range[(i - 1) % range.length];
11556   }
11557
11558   scale.domain = function(_) {
11559     if (!arguments.length) return domain.slice();
11560     domain = [], index = map$1();
11561     var i = -1, n = _.length, d, key;
11562     while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11563     return scale;
11564   };
11565
11566   scale.range = function(_) {
11567     return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11568   };
11569
11570   scale.unknown = function(_) {
11571     return arguments.length ? (unknown = _, scale) : unknown;
11572   };
11573
11574   scale.copy = function() {
11575     return ordinal()
11576         .domain(domain)
11577         .range(range)
11578         .unknown(unknown);
11579   };
11580
11581   return scale;
11582 }
11583
11584 function band() {
11585   var scale = ordinal().unknown(undefined),
11586       domain = scale.domain,
11587       ordinalRange = scale.range,
11588       range$$1 = [0, 1],
11589       step,
11590       bandwidth,
11591       round = false,
11592       paddingInner = 0,
11593       paddingOuter = 0,
11594       align = 0.5;
11595
11596   delete scale.unknown;
11597
11598   function rescale() {
11599     var n = domain().length,
11600         reverse = range$$1[1] < range$$1[0],
11601         start = range$$1[reverse - 0],
11602         stop = range$$1[1 - reverse];
11603     step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11604     if (round) step = Math.floor(step);
11605     start += (stop - start - step * (n - paddingInner)) * align;
11606     bandwidth = step * (1 - paddingInner);
11607     if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11608     var values = d3_range(n).map(function(i) { return start + step * i; });
11609     return ordinalRange(reverse ? values.reverse() : values);
11610   }
11611
11612   scale.domain = function(_) {
11613     return arguments.length ? (domain(_), rescale()) : domain();
11614   };
11615
11616   scale.range = function(_) {
11617     return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11618   };
11619
11620   scale.rangeRound = function(_) {
11621     return range$$1 = [+_[0], +_[1]], round = true, rescale();
11622   };
11623
11624   scale.bandwidth = function() {
11625     return bandwidth;
11626   };
11627
11628   scale.step = function() {
11629     return step;
11630   };
11631
11632   scale.round = function(_) {
11633     return arguments.length ? (round = !!_, rescale()) : round;
11634   };
11635
11636   scale.padding = function(_) {
11637     return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11638   };
11639
11640   scale.paddingInner = function(_) {
11641     return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11642   };
11643
11644   scale.paddingOuter = function(_) {
11645     return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11646   };
11647
11648   scale.align = function(_) {
11649     return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11650   };
11651
11652   scale.copy = function() {
11653     return band()
11654         .domain(domain())
11655         .range(range$$1)
11656         .round(round)
11657         .paddingInner(paddingInner)
11658         .paddingOuter(paddingOuter)
11659         .align(align);
11660   };
11661
11662   return rescale();
11663 }
11664
11665 function pointish(scale) {
11666   var copy = scale.copy;
11667
11668   scale.padding = scale.paddingOuter;
11669   delete scale.paddingInner;
11670   delete scale.paddingOuter;
11671
11672   scale.copy = function() {
11673     return pointish(copy());
11674   };
11675
11676   return scale;
11677 }
11678
11679 function point$1() {
11680   return pointish(band().paddingInner(1));
11681 }
11682
11683 function constant$9(x) {
11684   return function() {
11685     return x;
11686   };
11687 }
11688
11689 function number$2(x) {
11690   return +x;
11691 }
11692
11693 var unit = [0, 1];
11694
11695 function deinterpolateLinear(a, b) {
11696   return (b -= (a = +a))
11697       ? function(x) { return (x - a) / b; }
11698       : constant$9(b);
11699 }
11700
11701 function deinterpolateClamp(deinterpolate) {
11702   return function(a, b) {
11703     var d = deinterpolate(a = +a, b = +b);
11704     return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11705   };
11706 }
11707
11708 function reinterpolateClamp(reinterpolate) {
11709   return function(a, b) {
11710     var r = reinterpolate(a = +a, b = +b);
11711     return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11712   };
11713 }
11714
11715 function bimap(domain, range, deinterpolate, reinterpolate) {
11716   var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
11717   if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11718   else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11719   return function(x) { return r0(d0(x)); };
11720 }
11721
11722 function polymap(domain, range, deinterpolate, reinterpolate) {
11723   var j = Math.min(domain.length, range.length) - 1,
11724       d = new Array(j),
11725       r = new Array(j),
11726       i = -1;
11727
11728   // Reverse descending domains.
11729   if (domain[j] < domain[0]) {
11730     domain = domain.slice().reverse();
11731     range = range.slice().reverse();
11732   }
11733
11734   while (++i < j) {
11735     d[i] = deinterpolate(domain[i], domain[i + 1]);
11736     r[i] = reinterpolate(range[i], range[i + 1]);
11737   }
11738
11739   return function(x) {
11740     var i = bisectRight(domain, x, 1, j) - 1;
11741     return r[i](d[i](x));
11742   };
11743 }
11744
11745 function copy(source, target) {
11746   return target
11747       .domain(source.domain())
11748       .range(source.range())
11749       .interpolate(source.interpolate())
11750       .clamp(source.clamp());
11751 }
11752
11753 // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11754 // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11755 function continuous(deinterpolate, reinterpolate) {
11756   var domain = unit,
11757       range = unit,
11758       interpolate$$1 = d3_interpolate,
11759       clamp = false,
11760       piecewise,
11761       output,
11762       input;
11763
11764   function rescale() {
11765     piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
11766     output = input = null;
11767     return scale;
11768   }
11769
11770   function scale(x) {
11771     return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11772   }
11773
11774   scale.invert = function(y) {
11775     return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11776   };
11777
11778   scale.domain = function(_) {
11779     return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11780   };
11781
11782   scale.range = function(_) {
11783     return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
11784   };
11785
11786   scale.rangeRound = function(_) {
11787     return range = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11788   };
11789
11790   scale.clamp = function(_) {
11791     return arguments.length ? (clamp = !!_, rescale()) : clamp;
11792   };
11793
11794   scale.interpolate = function(_) {
11795     return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11796   };
11797
11798   return rescale();
11799 }
11800
11801 function tickFormat(domain, count, specifier) {
11802   var start = domain[0],
11803       stop = domain[domain.length - 1],
11804       step = tickStep(start, stop, count == null ? 10 : count),
11805       precision;
11806   specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11807   switch (specifier.type) {
11808     case "s": {
11809       var value = Math.max(Math.abs(start), Math.abs(stop));
11810       if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11811       return formatPrefix(specifier, value);
11812     }
11813     case "":
11814     case "e":
11815     case "g":
11816     case "p":
11817     case "r": {
11818       if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11819       break;
11820     }
11821     case "f":
11822     case "%": {
11823       if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11824       break;
11825     }
11826   }
11827   return format(specifier);
11828 }
11829
11830 function linearish(scale) {
11831   var domain = scale.domain;
11832
11833   scale.ticks = function(count) {
11834     var d = domain();
11835     return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11836   };
11837
11838   scale.tickFormat = function(count, specifier) {
11839     return tickFormat(domain(), count, specifier);
11840   };
11841
11842   scale.nice = function(count) {
11843     if (count == null) count = 10;
11844
11845     var d = domain(),
11846         i0 = 0,
11847         i1 = d.length - 1,
11848         start = d[i0],
11849         stop = d[i1],
11850         step;
11851
11852     if (stop < start) {
11853       step = start, start = stop, stop = step;
11854       step = i0, i0 = i1, i1 = step;
11855     }
11856
11857     step = tickIncrement(start, stop, count);
11858
11859     if (step > 0) {
11860       start = Math.floor(start / step) * step;
11861       stop = Math.ceil(stop / step) * step;
11862       step = tickIncrement(start, stop, count);
11863     } else if (step < 0) {
11864       start = Math.ceil(start * step) / step;
11865       stop = Math.floor(stop * step) / step;
11866       step = tickIncrement(start, stop, count);
11867     }
11868
11869     if (step > 0) {
11870       d[i0] = Math.floor(start / step) * step;
11871       d[i1] = Math.ceil(stop / step) * step;
11872       domain(d);
11873     } else if (step < 0) {
11874       d[i0] = Math.ceil(start * step) / step;
11875       d[i1] = Math.floor(stop * step) / step;
11876       domain(d);
11877     }
11878
11879     return scale;
11880   };
11881
11882   return scale;
11883 }
11884
11885 function linear$2() {
11886   var scale = continuous(deinterpolateLinear, d3_interpolateNumber);
11887
11888   scale.copy = function() {
11889     return copy(scale, linear$2());
11890   };
11891
11892   return linearish(scale);
11893 }
11894
11895 function identity$5() {
11896   var domain = [0, 1];
11897
11898   function scale(x) {
11899     return +x;
11900   }
11901
11902   scale.invert = scale;
11903
11904   scale.domain = scale.range = function(_) {
11905     return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11906   };
11907
11908   scale.copy = function() {
11909     return identity$5().domain(domain);
11910   };
11911
11912   return linearish(scale);
11913 }
11914
11915 function nice(domain, interval) {
11916   domain = domain.slice();
11917
11918   var i0 = 0,
11919       i1 = domain.length - 1,
11920       x0 = domain[i0],
11921       x1 = domain[i1],
11922       t;
11923
11924   if (x1 < x0) {
11925     t = i0, i0 = i1, i1 = t;
11926     t = x0, x0 = x1, x1 = t;
11927   }
11928
11929   domain[i0] = interval.floor(x0);
11930   domain[i1] = interval.ceil(x1);
11931   return domain;
11932 }
11933
11934 function deinterpolate(a, b) {
11935   return (b = Math.log(b / a))
11936       ? function(x) { return Math.log(x / a) / b; }
11937       : constant$9(b);
11938 }
11939
11940 function reinterpolate(a, b) {
11941   return a < 0
11942       ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11943       : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11944 }
11945
11946 function pow10(x) {
11947   return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11948 }
11949
11950 function powp(base) {
11951   return base === 10 ? pow10
11952       : base === Math.E ? Math.exp
11953       : function(x) { return Math.pow(base, x); };
11954 }
11955
11956 function logp(base) {
11957   return base === Math.E ? Math.log
11958       : base === 10 && Math.log10
11959       || base === 2 && Math.log2
11960       || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11961 }
11962
11963 function reflect(f) {
11964   return function(x) {
11965     return -f(-x);
11966   };
11967 }
11968
11969 function log$1() {
11970   var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11971       domain = scale.domain,
11972       base = 10,
11973       logs = logp(10),
11974       pows = powp(10);
11975
11976   function rescale() {
11977     logs = logp(base), pows = powp(base);
11978     if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11979     return scale;
11980   }
11981
11982   scale.base = function(_) {
11983     return arguments.length ? (base = +_, rescale()) : base;
11984   };
11985
11986   scale.domain = function(_) {
11987     return arguments.length ? (domain(_), rescale()) : domain();
11988   };
11989
11990   scale.ticks = function(count) {
11991     var d = domain(),
11992         u = d[0],
11993         v = d[d.length - 1],
11994         r;
11995
11996     if (r = v < u) i = u, u = v, v = i;
11997
11998     var i = logs(u),
11999         j = logs(v),
12000         p,
12001         k,
12002         t,
12003         n = count == null ? 10 : +count,
12004         z = [];
12005
12006     if (!(base % 1) && j - i < n) {
12007       i = Math.round(i) - 1, j = Math.round(j) + 1;
12008       if (u > 0) for (; i < j; ++i) {
12009         for (k = 1, p = pows(i); k < base; ++k) {
12010           t = p * k;
12011           if (t < u) continue;
12012           if (t > v) break;
12013           z.push(t);
12014         }
12015       } else for (; i < j; ++i) {
12016         for (k = base - 1, p = pows(i); k >= 1; --k) {
12017           t = p * k;
12018           if (t < u) continue;
12019           if (t > v) break;
12020           z.push(t);
12021         }
12022       }
12023     } else {
12024       z = ticks(i, j, Math.min(j - i, n)).map(pows);
12025     }
12026
12027     return r ? z.reverse() : z;
12028   };
12029
12030   scale.tickFormat = function(count, specifier) {
12031     if (specifier == null) specifier = base === 10 ? ".0e" : ",";
12032     if (typeof specifier !== "function") specifier = format(specifier);
12033     if (count === Infinity) return specifier;
12034     if (count == null) count = 10;
12035     var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
12036     return function(d) {
12037       var i = d / pows(Math.round(logs(d)));
12038       if (i * base < base - 0.5) i *= base;
12039       return i <= k ? specifier(d) : "";
12040     };
12041   };
12042
12043   scale.nice = function() {
12044     return domain(nice(domain(), {
12045       floor: function(x) { return pows(Math.floor(logs(x))); },
12046       ceil: function(x) { return pows(Math.ceil(logs(x))); }
12047     }));
12048   };
12049
12050   scale.copy = function() {
12051     return copy(scale, log$1().base(base));
12052   };
12053
12054   return scale;
12055 }
12056
12057 function raise$1(x, exponent) {
12058   return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12059 }
12060
12061 function pow$1() {
12062   var exponent = 1,
12063       scale = continuous(deinterpolate, reinterpolate),
12064       domain = scale.domain;
12065
12066   function deinterpolate(a, b) {
12067     return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12068         ? function(x) { return (raise$1(x, exponent) - a) / b; }
12069         : constant$9(b);
12070   }
12071
12072   function reinterpolate(a, b) {
12073     b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12074     return function(t) { return raise$1(a + b * t, 1 / exponent); };
12075   }
12076
12077   scale.exponent = function(_) {
12078     return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12079   };
12080
12081   scale.copy = function() {
12082     return copy(scale, pow$1().exponent(exponent));
12083   };
12084
12085   return linearish(scale);
12086 }
12087
12088 function sqrt$1() {
12089   return pow$1().exponent(0.5);
12090 }
12091
12092 function quantile$$1() {
12093   var domain = [],
12094       range = [],
12095       thresholds = [];
12096
12097   function rescale() {
12098     var i = 0, n = Math.max(1, range.length);
12099     thresholds = new Array(n - 1);
12100     while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
12101     return scale;
12102   }
12103
12104   function scale(x) {
12105     if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
12106   }
12107
12108   scale.invertExtent = function(y) {
12109     var i = range.indexOf(y);
12110     return i < 0 ? [NaN, NaN] : [
12111       i > 0 ? thresholds[i - 1] : domain[0],
12112       i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12113     ];
12114   };
12115
12116   scale.domain = function(_) {
12117     if (!arguments.length) return domain.slice();
12118     domain = [];
12119     for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12120     domain.sort(d3_ascending);
12121     return rescale();
12122   };
12123
12124   scale.range = function(_) {
12125     return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
12126   };
12127
12128   scale.quantiles = function() {
12129     return thresholds.slice();
12130   };
12131
12132   scale.copy = function() {
12133     return quantile$$1()
12134         .domain(domain)
12135         .range(range);
12136   };
12137
12138   return scale;
12139 }
12140
12141 function quantize() {
12142   var x0 = 0,
12143       x1 = 1,
12144       n = 1,
12145       domain = [0.5],
12146       range = [0, 1];
12147
12148   function scale(x) {
12149     if (x <= x) return range[bisectRight(domain, x, 0, n)];
12150   }
12151
12152   function rescale() {
12153     var i = -1;
12154     domain = new Array(n);
12155     while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12156     return scale;
12157   }
12158
12159   scale.domain = function(_) {
12160     return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12161   };
12162
12163   scale.range = function(_) {
12164     return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice();
12165   };
12166
12167   scale.invertExtent = function(y) {
12168     var i = range.indexOf(y);
12169     return i < 0 ? [NaN, NaN]
12170         : i < 1 ? [x0, domain[0]]
12171         : i >= n ? [domain[n - 1], x1]
12172         : [domain[i - 1], domain[i]];
12173   };
12174
12175   scale.copy = function() {
12176     return quantize()
12177         .domain([x0, x1])
12178         .range(range);
12179   };
12180
12181   return linearish(scale);
12182 }
12183
12184 function threshold$1() {
12185   var domain = [0.5],
12186       range = [0, 1],
12187       n = 1;
12188
12189   function scale(x) {
12190     if (x <= x) return range[bisectRight(domain, x, 0, n)];
12191   }
12192
12193   scale.domain = function(_) {
12194     return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
12195   };
12196
12197   scale.range = function(_) {
12198     return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
12199   };
12200
12201   scale.invertExtent = function(y) {
12202     var i = range.indexOf(y);
12203     return [domain[i - 1], domain[i]];
12204   };
12205
12206   scale.copy = function() {
12207     return threshold$1()
12208         .domain(domain)
12209         .range(range);
12210   };
12211
12212   return scale;
12213 }
12214
12215 var t0$1 = new Date,
12216     t1$1 = new Date;
12217
12218 function newInterval(floori, offseti, count, field) {
12219
12220   function interval(date) {
12221     return floori(date = new Date(+date)), date;
12222   }
12223
12224   interval.floor = interval;
12225
12226   interval.ceil = function(date) {
12227     return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12228   };
12229
12230   interval.round = function(date) {
12231     var d0 = interval(date),
12232         d1 = interval.ceil(date);
12233     return date - d0 < d1 - date ? d0 : d1;
12234   };
12235
12236   interval.offset = function(date, step) {
12237     return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12238   };
12239
12240   interval.range = function(start, stop, step) {
12241     var range = [], previous;
12242     start = interval.ceil(start);
12243     step = step == null ? 1 : Math.floor(step);
12244     if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12245     do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
12246     while (previous < start && start < stop);
12247     return range;
12248   };
12249
12250   interval.filter = function(test) {
12251     return newInterval(function(date) {
12252       if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12253     }, function(date, step) {
12254       if (date >= date) {
12255         if (step < 0) while (++step <= 0) {
12256           while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12257         } else while (--step >= 0) {
12258           while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12259         }
12260       }
12261     });
12262   };
12263
12264   if (count) {
12265     interval.count = function(start, end) {
12266       t0$1.setTime(+start), t1$1.setTime(+end);
12267       floori(t0$1), floori(t1$1);
12268       return Math.floor(count(t0$1, t1$1));
12269     };
12270
12271     interval.every = function(step) {
12272       step = Math.floor(step);
12273       return !isFinite(step) || !(step > 0) ? null
12274           : !(step > 1) ? interval
12275           : interval.filter(field
12276               ? function(d) { return field(d) % step === 0; }
12277               : function(d) { return interval.count(0, d) % step === 0; });
12278     };
12279   }
12280
12281   return interval;
12282 }
12283
12284 var millisecond = newInterval(function() {
12285   // noop
12286 }, function(date, step) {
12287   date.setTime(+date + step);
12288 }, function(start, end) {
12289   return end - start;
12290 });
12291
12292 // An optimized implementation for this simple case.
12293 millisecond.every = function(k) {
12294   k = Math.floor(k);
12295   if (!isFinite(k) || !(k > 0)) return null;
12296   if (!(k > 1)) return millisecond;
12297   return newInterval(function(date) {
12298     date.setTime(Math.floor(date / k) * k);
12299   }, function(date, step) {
12300     date.setTime(+date + step * k);
12301   }, function(start, end) {
12302     return (end - start) / k;
12303   });
12304 };
12305 var milliseconds = millisecond.range;
12306
12307 var durationSecond = 1e3;
12308 var durationMinute = 6e4;
12309 var durationHour = 36e5;
12310 var durationDay = 864e5;
12311 var durationWeek = 6048e5;
12312
12313 var second = newInterval(function(date) {
12314   date.setTime(Math.floor(date / durationSecond) * durationSecond);
12315 }, function(date, step) {
12316   date.setTime(+date + step * durationSecond);
12317 }, function(start, end) {
12318   return (end - start) / durationSecond;
12319 }, function(date) {
12320   return date.getUTCSeconds();
12321 });
12322 var seconds = second.range;
12323
12324 var minute = newInterval(function(date) {
12325   date.setTime(Math.floor(date / durationMinute) * durationMinute);
12326 }, function(date, step) {
12327   date.setTime(+date + step * durationMinute);
12328 }, function(start, end) {
12329   return (end - start) / durationMinute;
12330 }, function(date) {
12331   return date.getMinutes();
12332 });
12333 var minutes = minute.range;
12334
12335 var hour = newInterval(function(date) {
12336   var offset = date.getTimezoneOffset() * durationMinute % durationHour;
12337   if (offset < 0) offset += durationHour;
12338   date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
12339 }, function(date, step) {
12340   date.setTime(+date + step * durationHour);
12341 }, function(start, end) {
12342   return (end - start) / durationHour;
12343 }, function(date) {
12344   return date.getHours();
12345 });
12346 var hours = hour.range;
12347
12348 var day = newInterval(function(date) {
12349   date.setHours(0, 0, 0, 0);
12350 }, function(date, step) {
12351   date.setDate(date.getDate() + step);
12352 }, function(start, end) {
12353   return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
12354 }, function(date) {
12355   return date.getDate() - 1;
12356 });
12357 var days = day.range;
12358
12359 function weekday(i) {
12360   return newInterval(function(date) {
12361     date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12362     date.setHours(0, 0, 0, 0);
12363   }, function(date, step) {
12364     date.setDate(date.getDate() + step * 7);
12365   }, function(start, end) {
12366     return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
12367   });
12368 }
12369
12370 var sunday = weekday(0);
12371 var monday = weekday(1);
12372 var tuesday = weekday(2);
12373 var wednesday = weekday(3);
12374 var thursday = weekday(4);
12375 var friday = weekday(5);
12376 var saturday = weekday(6);
12377
12378 var sundays = sunday.range;
12379 var mondays = monday.range;
12380 var tuesdays = tuesday.range;
12381 var wednesdays = wednesday.range;
12382 var thursdays = thursday.range;
12383 var fridays = friday.range;
12384 var saturdays = saturday.range;
12385
12386 var month = newInterval(function(date) {
12387   date.setDate(1);
12388   date.setHours(0, 0, 0, 0);
12389 }, function(date, step) {
12390   date.setMonth(date.getMonth() + step);
12391 }, function(start, end) {
12392   return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12393 }, function(date) {
12394   return date.getMonth();
12395 });
12396 var months = month.range;
12397
12398 var year = newInterval(function(date) {
12399   date.setMonth(0, 1);
12400   date.setHours(0, 0, 0, 0);
12401 }, function(date, step) {
12402   date.setFullYear(date.getFullYear() + step);
12403 }, function(start, end) {
12404   return end.getFullYear() - start.getFullYear();
12405 }, function(date) {
12406   return date.getFullYear();
12407 });
12408
12409 // An optimized implementation for this simple case.
12410 year.every = function(k) {
12411   return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12412     date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12413     date.setMonth(0, 1);
12414     date.setHours(0, 0, 0, 0);
12415   }, function(date, step) {
12416     date.setFullYear(date.getFullYear() + step * k);
12417   });
12418 };
12419 var years = year.range;
12420
12421 var utcMinute = newInterval(function(date) {
12422   date.setUTCSeconds(0, 0);
12423 }, function(date, step) {
12424   date.setTime(+date + step * durationMinute);
12425 }, function(start, end) {
12426   return (end - start) / durationMinute;
12427 }, function(date) {
12428   return date.getUTCMinutes();
12429 });
12430 var utcMinutes = utcMinute.range;
12431
12432 var utcHour = newInterval(function(date) {
12433   date.setUTCMinutes(0, 0, 0);
12434 }, function(date, step) {
12435   date.setTime(+date + step * durationHour);
12436 }, function(start, end) {
12437   return (end - start) / durationHour;
12438 }, function(date) {
12439   return date.getUTCHours();
12440 });
12441 var utcHours = utcHour.range;
12442
12443 var utcDay = newInterval(function(date) {
12444   date.setUTCHours(0, 0, 0, 0);
12445 }, function(date, step) {
12446   date.setUTCDate(date.getUTCDate() + step);
12447 }, function(start, end) {
12448   return (end - start) / durationDay;
12449 }, function(date) {
12450   return date.getUTCDate() - 1;
12451 });
12452 var utcDays = utcDay.range;
12453
12454 function utcWeekday(i) {
12455   return newInterval(function(date) {
12456     date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12457     date.setUTCHours(0, 0, 0, 0);
12458   }, function(date, step) {
12459     date.setUTCDate(date.getUTCDate() + step * 7);
12460   }, function(start, end) {
12461     return (end - start) / durationWeek;
12462   });
12463 }
12464
12465 var utcSunday = utcWeekday(0);
12466 var utcMonday = utcWeekday(1);
12467 var utcTuesday = utcWeekday(2);
12468 var utcWednesday = utcWeekday(3);
12469 var utcThursday = utcWeekday(4);
12470 var utcFriday = utcWeekday(5);
12471 var utcSaturday = utcWeekday(6);
12472
12473 var utcSundays = utcSunday.range;
12474 var utcMondays = utcMonday.range;
12475 var utcTuesdays = utcTuesday.range;
12476 var utcWednesdays = utcWednesday.range;
12477 var utcThursdays = utcThursday.range;
12478 var utcFridays = utcFriday.range;
12479 var utcSaturdays = utcSaturday.range;
12480
12481 var utcMonth = newInterval(function(date) {
12482   date.setUTCDate(1);
12483   date.setUTCHours(0, 0, 0, 0);
12484 }, function(date, step) {
12485   date.setUTCMonth(date.getUTCMonth() + step);
12486 }, function(start, end) {
12487   return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12488 }, function(date) {
12489   return date.getUTCMonth();
12490 });
12491 var utcMonths = utcMonth.range;
12492
12493 var utcYear = newInterval(function(date) {
12494   date.setUTCMonth(0, 1);
12495   date.setUTCHours(0, 0, 0, 0);
12496 }, function(date, step) {
12497   date.setUTCFullYear(date.getUTCFullYear() + step);
12498 }, function(start, end) {
12499   return end.getUTCFullYear() - start.getUTCFullYear();
12500 }, function(date) {
12501   return date.getUTCFullYear();
12502 });
12503
12504 // An optimized implementation for this simple case.
12505 utcYear.every = function(k) {
12506   return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12507     date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12508     date.setUTCMonth(0, 1);
12509     date.setUTCHours(0, 0, 0, 0);
12510   }, function(date, step) {
12511     date.setUTCFullYear(date.getUTCFullYear() + step * k);
12512   });
12513 };
12514 var utcYears = utcYear.range;
12515
12516 function localDate(d) {
12517   if (0 <= d.y && d.y < 100) {
12518     var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12519     date.setFullYear(d.y);
12520     return date;
12521   }
12522   return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12523 }
12524
12525 function utcDate(d) {
12526   if (0 <= d.y && d.y < 100) {
12527     var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12528     date.setUTCFullYear(d.y);
12529     return date;
12530   }
12531   return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12532 }
12533
12534 function newYear(y) {
12535   return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12536 }
12537
12538 function formatLocale$1(locale) {
12539   var locale_dateTime = locale.dateTime,
12540       locale_date = locale.date,
12541       locale_time = locale.time,
12542       locale_periods = locale.periods,
12543       locale_weekdays = locale.days,
12544       locale_shortWeekdays = locale.shortDays,
12545       locale_months = locale.months,
12546       locale_shortMonths = locale.shortMonths;
12547
12548   var periodRe = formatRe(locale_periods),
12549       periodLookup = formatLookup(locale_periods),
12550       weekdayRe = formatRe(locale_weekdays),
12551       weekdayLookup = formatLookup(locale_weekdays),
12552       shortWeekdayRe = formatRe(locale_shortWeekdays),
12553       shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12554       monthRe = formatRe(locale_months),
12555       monthLookup = formatLookup(locale_months),
12556       shortMonthRe = formatRe(locale_shortMonths),
12557       shortMonthLookup = formatLookup(locale_shortMonths);
12558
12559   var formats = {
12560     "a": formatShortWeekday,
12561     "A": formatWeekday,
12562     "b": formatShortMonth,
12563     "B": formatMonth,
12564     "c": null,
12565     "d": formatDayOfMonth,
12566     "e": formatDayOfMonth,
12567     "f": formatMicroseconds,
12568     "H": formatHour24,
12569     "I": formatHour12,
12570     "j": formatDayOfYear,
12571     "L": formatMilliseconds,
12572     "m": formatMonthNumber,
12573     "M": formatMinutes,
12574     "p": formatPeriod,
12575     "Q": formatUnixTimestamp,
12576     "s": formatUnixTimestampSeconds,
12577     "S": formatSeconds,
12578     "u": formatWeekdayNumberMonday,
12579     "U": formatWeekNumberSunday,
12580     "V": formatWeekNumberISO,
12581     "w": formatWeekdayNumberSunday,
12582     "W": formatWeekNumberMonday,
12583     "x": null,
12584     "X": null,
12585     "y": formatYear,
12586     "Y": formatFullYear,
12587     "Z": formatZone,
12588     "%": formatLiteralPercent
12589   };
12590
12591   var utcFormats = {
12592     "a": formatUTCShortWeekday,
12593     "A": formatUTCWeekday,
12594     "b": formatUTCShortMonth,
12595     "B": formatUTCMonth,
12596     "c": null,
12597     "d": formatUTCDayOfMonth,
12598     "e": formatUTCDayOfMonth,
12599     "f": formatUTCMicroseconds,
12600     "H": formatUTCHour24,
12601     "I": formatUTCHour12,
12602     "j": formatUTCDayOfYear,
12603     "L": formatUTCMilliseconds,
12604     "m": formatUTCMonthNumber,
12605     "M": formatUTCMinutes,
12606     "p": formatUTCPeriod,
12607     "Q": formatUnixTimestamp,
12608     "s": formatUnixTimestampSeconds,
12609     "S": formatUTCSeconds,
12610     "u": formatUTCWeekdayNumberMonday,
12611     "U": formatUTCWeekNumberSunday,
12612     "V": formatUTCWeekNumberISO,
12613     "w": formatUTCWeekdayNumberSunday,
12614     "W": formatUTCWeekNumberMonday,
12615     "x": null,
12616     "X": null,
12617     "y": formatUTCYear,
12618     "Y": formatUTCFullYear,
12619     "Z": formatUTCZone,
12620     "%": formatLiteralPercent
12621   };
12622
12623   var parses = {
12624     "a": parseShortWeekday,
12625     "A": parseWeekday,
12626     "b": parseShortMonth,
12627     "B": parseMonth,
12628     "c": parseLocaleDateTime,
12629     "d": parseDayOfMonth,
12630     "e": parseDayOfMonth,
12631     "f": parseMicroseconds,
12632     "H": parseHour24,
12633     "I": parseHour24,
12634     "j": parseDayOfYear,
12635     "L": parseMilliseconds,
12636     "m": parseMonthNumber,
12637     "M": parseMinutes,
12638     "p": parsePeriod,
12639     "Q": parseUnixTimestamp,
12640     "s": parseUnixTimestampSeconds,
12641     "S": parseSeconds,
12642     "u": parseWeekdayNumberMonday,
12643     "U": parseWeekNumberSunday,
12644     "V": parseWeekNumberISO,
12645     "w": parseWeekdayNumberSunday,
12646     "W": parseWeekNumberMonday,
12647     "x": parseLocaleDate,
12648     "X": parseLocaleTime,
12649     "y": parseYear,
12650     "Y": parseFullYear,
12651     "Z": parseZone,
12652     "%": parseLiteralPercent
12653   };
12654
12655   // These recursive directive definitions must be deferred.
12656   formats.x = newFormat(locale_date, formats);
12657   formats.X = newFormat(locale_time, formats);
12658   formats.c = newFormat(locale_dateTime, formats);
12659   utcFormats.x = newFormat(locale_date, utcFormats);
12660   utcFormats.X = newFormat(locale_time, utcFormats);
12661   utcFormats.c = newFormat(locale_dateTime, utcFormats);
12662
12663   function newFormat(specifier, formats) {
12664     return function(date) {
12665       var string = [],
12666           i = -1,
12667           j = 0,
12668           n = specifier.length,
12669           c,
12670           pad,
12671           format;
12672
12673       if (!(date instanceof Date)) date = new Date(+date);
12674
12675       while (++i < n) {
12676         if (specifier.charCodeAt(i) === 37) {
12677           string.push(specifier.slice(j, i));
12678           if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12679           else pad = c === "e" ? " " : "0";
12680           if (format = formats[c]) c = format(date, pad);
12681           string.push(c);
12682           j = i + 1;
12683         }
12684       }
12685
12686       string.push(specifier.slice(j, i));
12687       return string.join("");
12688     };
12689   }
12690
12691   function newParse(specifier, newDate) {
12692     return function(string) {
12693       var d = newYear(1900),
12694           i = parseSpecifier(d, specifier, string += "", 0),
12695           week, day$$1;
12696       if (i != string.length) return null;
12697
12698       // If a UNIX timestamp is specified, return it.
12699       if ("Q" in d) return new Date(d.Q);
12700
12701       // The am-pm flag is 0 for AM, and 1 for PM.
12702       if ("p" in d) d.H = d.H % 12 + d.p * 12;
12703
12704       // Convert day-of-week and week-of-year to day-of-year.
12705       if ("V" in d) {
12706         if (d.V < 1 || d.V > 53) return null;
12707         if (!("w" in d)) d.w = 1;
12708         if ("Z" in d) {
12709           week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
12710           week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
12711           week = utcDay.offset(week, (d.V - 1) * 7);
12712           d.y = week.getUTCFullYear();
12713           d.m = week.getUTCMonth();
12714           d.d = week.getUTCDate() + (d.w + 6) % 7;
12715         } else {
12716           week = newDate(newYear(d.y)), day$$1 = week.getDay();
12717           week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
12718           week = day.offset(week, (d.V - 1) * 7);
12719           d.y = week.getFullYear();
12720           d.m = week.getMonth();
12721           d.d = week.getDate() + (d.w + 6) % 7;
12722         }
12723       } else if ("W" in d || "U" in d) {
12724         if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
12725         day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12726         d.m = 0;
12727         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;
12728       }
12729
12730       // If a time zone is specified, all fields are interpreted as UTC and then
12731       // offset according to the specified time zone.
12732       if ("Z" in d) {
12733         d.H += d.Z / 100 | 0;
12734         d.M += d.Z % 100;
12735         return utcDate(d);
12736       }
12737
12738       // Otherwise, all fields are in local time.
12739       return newDate(d);
12740     };
12741   }
12742
12743   function parseSpecifier(d, specifier, string, j) {
12744     var i = 0,
12745         n = specifier.length,
12746         m = string.length,
12747         c,
12748         parse;
12749
12750     while (i < n) {
12751       if (j >= m) return -1;
12752       c = specifier.charCodeAt(i++);
12753       if (c === 37) {
12754         c = specifier.charAt(i++);
12755         parse = parses[c in pads ? specifier.charAt(i++) : c];
12756         if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12757       } else if (c != string.charCodeAt(j++)) {
12758         return -1;
12759       }
12760     }
12761
12762     return j;
12763   }
12764
12765   function parsePeriod(d, string, i) {
12766     var n = periodRe.exec(string.slice(i));
12767     return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12768   }
12769
12770   function parseShortWeekday(d, string, i) {
12771     var n = shortWeekdayRe.exec(string.slice(i));
12772     return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12773   }
12774
12775   function parseWeekday(d, string, i) {
12776     var n = weekdayRe.exec(string.slice(i));
12777     return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12778   }
12779
12780   function parseShortMonth(d, string, i) {
12781     var n = shortMonthRe.exec(string.slice(i));
12782     return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12783   }
12784
12785   function parseMonth(d, string, i) {
12786     var n = monthRe.exec(string.slice(i));
12787     return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12788   }
12789
12790   function parseLocaleDateTime(d, string, i) {
12791     return parseSpecifier(d, locale_dateTime, string, i);
12792   }
12793
12794   function parseLocaleDate(d, string, i) {
12795     return parseSpecifier(d, locale_date, string, i);
12796   }
12797
12798   function parseLocaleTime(d, string, i) {
12799     return parseSpecifier(d, locale_time, string, i);
12800   }
12801
12802   function formatShortWeekday(d) {
12803     return locale_shortWeekdays[d.getDay()];
12804   }
12805
12806   function formatWeekday(d) {
12807     return locale_weekdays[d.getDay()];
12808   }
12809
12810   function formatShortMonth(d) {
12811     return locale_shortMonths[d.getMonth()];
12812   }
12813
12814   function formatMonth(d) {
12815     return locale_months[d.getMonth()];
12816   }
12817
12818   function formatPeriod(d) {
12819     return locale_periods[+(d.getHours() >= 12)];
12820   }
12821
12822   function formatUTCShortWeekday(d) {
12823     return locale_shortWeekdays[d.getUTCDay()];
12824   }
12825
12826   function formatUTCWeekday(d) {
12827     return locale_weekdays[d.getUTCDay()];
12828   }
12829
12830   function formatUTCShortMonth(d) {
12831     return locale_shortMonths[d.getUTCMonth()];
12832   }
12833
12834   function formatUTCMonth(d) {
12835     return locale_months[d.getUTCMonth()];
12836   }
12837
12838   function formatUTCPeriod(d) {
12839     return locale_periods[+(d.getUTCHours() >= 12)];
12840   }
12841
12842   return {
12843     format: function(specifier) {
12844       var f = newFormat(specifier += "", formats);
12845       f.toString = function() { return specifier; };
12846       return f;
12847     },
12848     parse: function(specifier) {
12849       var p = newParse(specifier += "", localDate);
12850       p.toString = function() { return specifier; };
12851       return p;
12852     },
12853     utcFormat: function(specifier) {
12854       var f = newFormat(specifier += "", utcFormats);
12855       f.toString = function() { return specifier; };
12856       return f;
12857     },
12858     utcParse: function(specifier) {
12859       var p = newParse(specifier, utcDate);
12860       p.toString = function() { return specifier; };
12861       return p;
12862     }
12863   };
12864 }
12865
12866 var pads = {"-": "", "_": " ", "0": "0"},
12867     numberRe = /^\s*\d+/, // note: ignores next directive
12868     percentRe = /^%/,
12869     requoteRe = /[\\^$*+?|[\]().{}]/g;
12870
12871 function pad(value, fill, width) {
12872   var sign = value < 0 ? "-" : "",
12873       string = (sign ? -value : value) + "",
12874       length = string.length;
12875   return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12876 }
12877
12878 function requote(s) {
12879   return s.replace(requoteRe, "\\$&");
12880 }
12881
12882 function formatRe(names) {
12883   return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12884 }
12885
12886 function formatLookup(names) {
12887   var map = {}, i = -1, n = names.length;
12888   while (++i < n) map[names[i].toLowerCase()] = i;
12889   return map;
12890 }
12891
12892 function parseWeekdayNumberSunday(d, string, i) {
12893   var n = numberRe.exec(string.slice(i, i + 1));
12894   return n ? (d.w = +n[0], i + n[0].length) : -1;
12895 }
12896
12897 function parseWeekdayNumberMonday(d, string, i) {
12898   var n = numberRe.exec(string.slice(i, i + 1));
12899   return n ? (d.u = +n[0], i + n[0].length) : -1;
12900 }
12901
12902 function parseWeekNumberSunday(d, string, i) {
12903   var n = numberRe.exec(string.slice(i, i + 2));
12904   return n ? (d.U = +n[0], i + n[0].length) : -1;
12905 }
12906
12907 function parseWeekNumberISO(d, string, i) {
12908   var n = numberRe.exec(string.slice(i, i + 2));
12909   return n ? (d.V = +n[0], i + n[0].length) : -1;
12910 }
12911
12912 function parseWeekNumberMonday(d, string, i) {
12913   var n = numberRe.exec(string.slice(i, i + 2));
12914   return n ? (d.W = +n[0], i + n[0].length) : -1;
12915 }
12916
12917 function parseFullYear(d, string, i) {
12918   var n = numberRe.exec(string.slice(i, i + 4));
12919   return n ? (d.y = +n[0], i + n[0].length) : -1;
12920 }
12921
12922 function parseYear(d, string, i) {
12923   var n = numberRe.exec(string.slice(i, i + 2));
12924   return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12925 }
12926
12927 function parseZone(d, string, i) {
12928   var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
12929   return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12930 }
12931
12932 function parseMonthNumber(d, string, i) {
12933   var n = numberRe.exec(string.slice(i, i + 2));
12934   return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12935 }
12936
12937 function parseDayOfMonth(d, string, i) {
12938   var n = numberRe.exec(string.slice(i, i + 2));
12939   return n ? (d.d = +n[0], i + n[0].length) : -1;
12940 }
12941
12942 function parseDayOfYear(d, string, i) {
12943   var n = numberRe.exec(string.slice(i, i + 3));
12944   return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12945 }
12946
12947 function parseHour24(d, string, i) {
12948   var n = numberRe.exec(string.slice(i, i + 2));
12949   return n ? (d.H = +n[0], i + n[0].length) : -1;
12950 }
12951
12952 function parseMinutes(d, string, i) {
12953   var n = numberRe.exec(string.slice(i, i + 2));
12954   return n ? (d.M = +n[0], i + n[0].length) : -1;
12955 }
12956
12957 function parseSeconds(d, string, i) {
12958   var n = numberRe.exec(string.slice(i, i + 2));
12959   return n ? (d.S = +n[0], i + n[0].length) : -1;
12960 }
12961
12962 function parseMilliseconds(d, string, i) {
12963   var n = numberRe.exec(string.slice(i, i + 3));
12964   return n ? (d.L = +n[0], i + n[0].length) : -1;
12965 }
12966
12967 function parseMicroseconds(d, string, i) {
12968   var n = numberRe.exec(string.slice(i, i + 6));
12969   return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
12970 }
12971
12972 function parseLiteralPercent(d, string, i) {
12973   var n = percentRe.exec(string.slice(i, i + 1));
12974   return n ? i + n[0].length : -1;
12975 }
12976
12977 function parseUnixTimestamp(d, string, i) {
12978   var n = numberRe.exec(string.slice(i));
12979   return n ? (d.Q = +n[0], i + n[0].length) : -1;
12980 }
12981
12982 function parseUnixTimestampSeconds(d, string, i) {
12983   var n = numberRe.exec(string.slice(i));
12984   return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
12985 }
12986
12987 function formatDayOfMonth(d, p) {
12988   return pad(d.getDate(), p, 2);
12989 }
12990
12991 function formatHour24(d, p) {
12992   return pad(d.getHours(), p, 2);
12993 }
12994
12995 function formatHour12(d, p) {
12996   return pad(d.getHours() % 12 || 12, p, 2);
12997 }
12998
12999 function formatDayOfYear(d, p) {
13000   return pad(1 + day.count(year(d), d), p, 3);
13001 }
13002
13003 function formatMilliseconds(d, p) {
13004   return pad(d.getMilliseconds(), p, 3);
13005 }
13006
13007 function formatMicroseconds(d, p) {
13008   return formatMilliseconds(d, p) + "000";
13009 }
13010
13011 function formatMonthNumber(d, p) {
13012   return pad(d.getMonth() + 1, p, 2);
13013 }
13014
13015 function formatMinutes(d, p) {
13016   return pad(d.getMinutes(), p, 2);
13017 }
13018
13019 function formatSeconds(d, p) {
13020   return pad(d.getSeconds(), p, 2);
13021 }
13022
13023 function formatWeekdayNumberMonday(d) {
13024   var day$$1 = d.getDay();
13025   return day$$1 === 0 ? 7 : day$$1;
13026 }
13027
13028 function formatWeekNumberSunday(d, p) {
13029   return pad(sunday.count(year(d), d), p, 2);
13030 }
13031
13032 function formatWeekNumberISO(d, p) {
13033   var day$$1 = d.getDay();
13034   d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
13035   return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13036 }
13037
13038 function formatWeekdayNumberSunday(d) {
13039   return d.getDay();
13040 }
13041
13042 function formatWeekNumberMonday(d, p) {
13043   return pad(monday.count(year(d), d), p, 2);
13044 }
13045
13046 function formatYear(d, p) {
13047   return pad(d.getFullYear() % 100, p, 2);
13048 }
13049
13050 function formatFullYear(d, p) {
13051   return pad(d.getFullYear() % 10000, p, 4);
13052 }
13053
13054 function formatZone(d) {
13055   var z = d.getTimezoneOffset();
13056   return (z > 0 ? "-" : (z *= -1, "+"))
13057       + pad(z / 60 | 0, "0", 2)
13058       + pad(z % 60, "0", 2);
13059 }
13060
13061 function formatUTCDayOfMonth(d, p) {
13062   return pad(d.getUTCDate(), p, 2);
13063 }
13064
13065 function formatUTCHour24(d, p) {
13066   return pad(d.getUTCHours(), p, 2);
13067 }
13068
13069 function formatUTCHour12(d, p) {
13070   return pad(d.getUTCHours() % 12 || 12, p, 2);
13071 }
13072
13073 function formatUTCDayOfYear(d, p) {
13074   return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13075 }
13076
13077 function formatUTCMilliseconds(d, p) {
13078   return pad(d.getUTCMilliseconds(), p, 3);
13079 }
13080
13081 function formatUTCMicroseconds(d, p) {
13082   return formatUTCMilliseconds(d, p) + "000";
13083 }
13084
13085 function formatUTCMonthNumber(d, p) {
13086   return pad(d.getUTCMonth() + 1, p, 2);
13087 }
13088
13089 function formatUTCMinutes(d, p) {
13090   return pad(d.getUTCMinutes(), p, 2);
13091 }
13092
13093 function formatUTCSeconds(d, p) {
13094   return pad(d.getUTCSeconds(), p, 2);
13095 }
13096
13097 function formatUTCWeekdayNumberMonday(d) {
13098   var dow = d.getUTCDay();
13099   return dow === 0 ? 7 : dow;
13100 }
13101
13102 function formatUTCWeekNumberSunday(d, p) {
13103   return pad(utcSunday.count(utcYear(d), d), p, 2);
13104 }
13105
13106 function formatUTCWeekNumberISO(d, p) {
13107   var day$$1 = d.getUTCDay();
13108   d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
13109   return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13110 }
13111
13112 function formatUTCWeekdayNumberSunday(d) {
13113   return d.getUTCDay();
13114 }
13115
13116 function formatUTCWeekNumberMonday(d, p) {
13117   return pad(utcMonday.count(utcYear(d), d), p, 2);
13118 }
13119
13120 function formatUTCYear(d, p) {
13121   return pad(d.getUTCFullYear() % 100, p, 2);
13122 }
13123
13124 function formatUTCFullYear(d, p) {
13125   return pad(d.getUTCFullYear() % 10000, p, 4);
13126 }
13127
13128 function formatUTCZone() {
13129   return "+0000";
13130 }
13131
13132 function formatLiteralPercent() {
13133   return "%";
13134 }
13135
13136 function formatUnixTimestamp(d) {
13137   return +d;
13138 }
13139
13140 function formatUnixTimestampSeconds(d) {
13141   return Math.floor(+d / 1000);
13142 }
13143
13144 var locale$1;
13145 var timeFormat;
13146 var timeParse;
13147 var utcFormat;
13148 var utcParse;
13149
13150 defaultLocale$1({
13151   dateTime: "%x, %X",
13152   date: "%-m/%-d/%Y",
13153   time: "%-I:%M:%S %p",
13154   periods: ["AM", "PM"],
13155   days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13156   shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13157   months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13158   shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13159 });
13160
13161 function defaultLocale$1(definition) {
13162   locale$1 = formatLocale$1(definition);
13163   timeFormat = locale$1.format;
13164   timeParse = locale$1.parse;
13165   utcFormat = locale$1.utcFormat;
13166   utcParse = locale$1.utcParse;
13167   return locale$1;
13168 }
13169
13170 var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13171
13172 function formatIsoNative(date) {
13173   return date.toISOString();
13174 }
13175
13176 var formatIso = Date.prototype.toISOString
13177     ? formatIsoNative
13178     : utcFormat(isoSpecifier);
13179
13180 function parseIsoNative(string) {
13181   var date = new Date(string);
13182   return isNaN(date) ? null : date;
13183 }
13184
13185 var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13186     ? parseIsoNative
13187     : utcParse(isoSpecifier);
13188
13189 var durationSecond$1 = 1000,
13190     durationMinute$1 = durationSecond$1 * 60,
13191     durationHour$1 = durationMinute$1 * 60,
13192     durationDay$1 = durationHour$1 * 24,
13193     durationWeek$1 = durationDay$1 * 7,
13194     durationMonth = durationDay$1 * 30,
13195     durationYear = durationDay$1 * 365;
13196
13197 function date$1(t) {
13198   return new Date(t);
13199 }
13200
13201 function number$3(t) {
13202   return t instanceof Date ? +t : +new Date(+t);
13203 }
13204
13205 function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13206   var scale = continuous(deinterpolateLinear, d3_interpolateNumber),
13207       invert = scale.invert,
13208       domain = scale.domain;
13209
13210   var formatMillisecond = format(".%L"),
13211       formatSecond = format(":%S"),
13212       formatMinute = format("%I:%M"),
13213       formatHour = format("%I %p"),
13214       formatDay = format("%a %d"),
13215       formatWeek = format("%b %d"),
13216       formatMonth = format("%B"),
13217       formatYear = format("%Y");
13218
13219   var tickIntervals = [
13220     [second$$1,  1,      durationSecond$1],
13221     [second$$1,  5,  5 * durationSecond$1],
13222     [second$$1, 15, 15 * durationSecond$1],
13223     [second$$1, 30, 30 * durationSecond$1],
13224     [minute$$1,  1,      durationMinute$1],
13225     [minute$$1,  5,  5 * durationMinute$1],
13226     [minute$$1, 15, 15 * durationMinute$1],
13227     [minute$$1, 30, 30 * durationMinute$1],
13228     [  hour$$1,  1,      durationHour$1  ],
13229     [  hour$$1,  3,  3 * durationHour$1  ],
13230     [  hour$$1,  6,  6 * durationHour$1  ],
13231     [  hour$$1, 12, 12 * durationHour$1  ],
13232     [   day$$1,  1,      durationDay$1   ],
13233     [   day$$1,  2,  2 * durationDay$1   ],
13234     [  week,  1,      durationWeek$1  ],
13235     [ month$$1,  1,      durationMonth ],
13236     [ month$$1,  3,  3 * durationMonth ],
13237     [  year$$1,  1,      durationYear  ]
13238   ];
13239
13240   function tickFormat(date$$1) {
13241     return (second$$1(date$$1) < date$$1 ? formatMillisecond
13242         : minute$$1(date$$1) < date$$1 ? formatSecond
13243         : hour$$1(date$$1) < date$$1 ? formatMinute
13244         : day$$1(date$$1) < date$$1 ? formatHour
13245         : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13246         : year$$1(date$$1) < date$$1 ? formatMonth
13247         : formatYear)(date$$1);
13248   }
13249
13250   function tickInterval(interval, start, stop, step) {
13251     if (interval == null) interval = 10;
13252
13253     // If a desired tick count is specified, pick a reasonable tick interval
13254     // based on the extent of the domain and a rough estimate of tick size.
13255     // Otherwise, assume interval is already a time interval and use it.
13256     if (typeof interval === "number") {
13257       var target = Math.abs(stop - start) / interval,
13258           i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13259       if (i === tickIntervals.length) {
13260         step = tickStep(start / durationYear, stop / durationYear, interval);
13261         interval = year$$1;
13262       } else if (i) {
13263         i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13264         step = i[1];
13265         interval = i[0];
13266       } else {
13267         step = Math.max(tickStep(start, stop, interval), 1);
13268         interval = millisecond$$1;
13269       }
13270     }
13271
13272     return step == null ? interval : interval.every(step);
13273   }
13274
13275   scale.invert = function(y) {
13276     return new Date(invert(y));
13277   };
13278
13279   scale.domain = function(_) {
13280     return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13281   };
13282
13283   scale.ticks = function(interval, step) {
13284     var d = domain(),
13285         t0 = d[0],
13286         t1 = d[d.length - 1],
13287         r = t1 < t0,
13288         t;
13289     if (r) t = t0, t0 = t1, t1 = t;
13290     t = tickInterval(interval, t0, t1, step);
13291     t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13292     return r ? t.reverse() : t;
13293   };
13294
13295   scale.tickFormat = function(count, specifier) {
13296     return specifier == null ? tickFormat : format(specifier);
13297   };
13298
13299   scale.nice = function(interval, step) {
13300     var d = domain();
13301     return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13302         ? domain(nice(d, interval))
13303         : scale;
13304   };
13305
13306   scale.copy = function() {
13307     return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13308   };
13309
13310   return scale;
13311 }
13312
13313 function time() {
13314   return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13315 }
13316
13317 function utcTime() {
13318   return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13319 }
13320
13321 function colors(s) {
13322   return s.match(/.{6}/g).map(function(x) {
13323     return "#" + x;
13324   });
13325 }
13326
13327 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13328
13329 var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13330
13331 var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13332
13333 var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13334
13335 var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13336
13337 var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13338
13339 var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13340
13341 var rainbow = cubehelix();
13342
13343 function rainbow$1(t) {
13344   if (t < 0 || t > 1) t -= Math.floor(t);
13345   var ts = Math.abs(t - 0.5);
13346   rainbow.h = 360 * t - 100;
13347   rainbow.s = 1.5 - 1.5 * ts;
13348   rainbow.l = 0.8 - 0.9 * ts;
13349   return rainbow + "";
13350 }
13351
13352 function ramp(range) {
13353   var n = range.length;
13354   return function(t) {
13355     return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13356   };
13357 }
13358
13359 var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13360
13361 var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13362
13363 var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13364
13365 var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13366
13367 function sequential(interpolator) {
13368   var x0 = 0,
13369       x1 = 1,
13370       clamp = false;
13371
13372   function scale(x) {
13373     var t = (x - x0) / (x1 - x0);
13374     return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13375   }
13376
13377   scale.domain = function(_) {
13378     return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13379   };
13380
13381   scale.clamp = function(_) {
13382     return arguments.length ? (clamp = !!_, scale) : clamp;
13383   };
13384
13385   scale.interpolator = function(_) {
13386     return arguments.length ? (interpolator = _, scale) : interpolator;
13387   };
13388
13389   scale.copy = function() {
13390     return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13391   };
13392
13393   return linearish(scale);
13394 }
13395
13396 function constant$10(x) {
13397   return function constant() {
13398     return x;
13399   };
13400 }
13401
13402 var abs$1 = Math.abs;
13403 var atan2$1 = Math.atan2;
13404 var cos$2 = Math.cos;
13405 var max$2 = Math.max;
13406 var min$1 = Math.min;
13407 var sin$2 = Math.sin;
13408 var sqrt$2 = Math.sqrt;
13409
13410 var epsilon$3 = 1e-12;
13411 var pi$4 = Math.PI;
13412 var halfPi$3 = pi$4 / 2;
13413 var tau$4 = 2 * pi$4;
13414
13415 function acos$1(x) {
13416   return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13417 }
13418
13419 function asin$1(x) {
13420   return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13421 }
13422
13423 function arcInnerRadius(d) {
13424   return d.innerRadius;
13425 }
13426
13427 function arcOuterRadius(d) {
13428   return d.outerRadius;
13429 }
13430
13431 function arcStartAngle(d) {
13432   return d.startAngle;
13433 }
13434
13435 function arcEndAngle(d) {
13436   return d.endAngle;
13437 }
13438
13439 function arcPadAngle(d) {
13440   return d && d.padAngle; // Note: optional!
13441 }
13442
13443 function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13444   var x10 = x1 - x0, y10 = y1 - y0,
13445       x32 = x3 - x2, y32 = y3 - y2,
13446       t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13447   return [x0 + t * x10, y0 + t * y10];
13448 }
13449
13450 // Compute perpendicular offset line of length rc.
13451 // http://mathworld.wolfram.com/Circle-LineIntersection.html
13452 function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13453   var x01 = x0 - x1,
13454       y01 = y0 - y1,
13455       lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13456       ox = lo * y01,
13457       oy = -lo * x01,
13458       x11 = x0 + ox,
13459       y11 = y0 + oy,
13460       x10 = x1 + ox,
13461       y10 = y1 + oy,
13462       x00 = (x11 + x10) / 2,
13463       y00 = (y11 + y10) / 2,
13464       dx = x10 - x11,
13465       dy = y10 - y11,
13466       d2 = dx * dx + dy * dy,
13467       r = r1 - rc,
13468       D = x11 * y10 - x10 * y11,
13469       d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13470       cx0 = (D * dy - dx * d) / d2,
13471       cy0 = (-D * dx - dy * d) / d2,
13472       cx1 = (D * dy + dx * d) / d2,
13473       cy1 = (-D * dx + dy * d) / d2,
13474       dx0 = cx0 - x00,
13475       dy0 = cy0 - y00,
13476       dx1 = cx1 - x00,
13477       dy1 = cy1 - y00;
13478
13479   // Pick the closer of the two intersection points.
13480   // TODO Is there a faster way to determine which intersection to use?
13481   if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13482
13483   return {
13484     cx: cx0,
13485     cy: cy0,
13486     x01: -ox,
13487     y01: -oy,
13488     x11: cx0 * (r1 / r - 1),
13489     y11: cy0 * (r1 / r - 1)
13490   };
13491 }
13492
13493 function arc() {
13494   var innerRadius = arcInnerRadius,
13495       outerRadius = arcOuterRadius,
13496       cornerRadius = constant$10(0),
13497       padRadius = null,
13498       startAngle = arcStartAngle,
13499       endAngle = arcEndAngle,
13500       padAngle = arcPadAngle,
13501       context = null;
13502
13503   function arc() {
13504     var buffer,
13505         r,
13506         r0 = +innerRadius.apply(this, arguments),
13507         r1 = +outerRadius.apply(this, arguments),
13508         a0 = startAngle.apply(this, arguments) - halfPi$3,
13509         a1 = endAngle.apply(this, arguments) - halfPi$3,
13510         da = abs$1(a1 - a0),
13511         cw = a1 > a0;
13512
13513     if (!context) context = buffer = path();
13514
13515     // Ensure that the outer radius is always larger than the inner radius.
13516     if (r1 < r0) r = r1, r1 = r0, r0 = r;
13517
13518     // Is it a point?
13519     if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13520
13521     // Or is it a circle or annulus?
13522     else if (da > tau$4 - epsilon$3) {
13523       context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13524       context.arc(0, 0, r1, a0, a1, !cw);
13525       if (r0 > epsilon$3) {
13526         context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13527         context.arc(0, 0, r0, a1, a0, cw);
13528       }
13529     }
13530
13531     // Or is it a circular or annular sector?
13532     else {
13533       var a01 = a0,
13534           a11 = a1,
13535           a00 = a0,
13536           a10 = a1,
13537           da0 = da,
13538           da1 = da,
13539           ap = padAngle.apply(this, arguments) / 2,
13540           rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13541           rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13542           rc0 = rc,
13543           rc1 = rc,
13544           t0,
13545           t1;
13546
13547       // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13548       if (rp > epsilon$3) {
13549         var p0 = asin$1(rp / r0 * sin$2(ap)),
13550             p1 = asin$1(rp / r1 * sin$2(ap));
13551         if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13552         else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13553         if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13554         else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13555       }
13556
13557       var x01 = r1 * cos$2(a01),
13558           y01 = r1 * sin$2(a01),
13559           x10 = r0 * cos$2(a10),
13560           y10 = r0 * sin$2(a10);
13561
13562       // Apply rounded corners?
13563       if (rc > epsilon$3) {
13564         var x11 = r1 * cos$2(a11),
13565             y11 = r1 * sin$2(a11),
13566             x00 = r0 * cos$2(a00),
13567             y00 = r0 * sin$2(a00);
13568
13569         // Restrict the corner radius according to the sector angle.
13570         if (da < pi$4) {
13571           var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13572               ax = x01 - oc[0],
13573               ay = y01 - oc[1],
13574               bx = x11 - oc[0],
13575               by = y11 - oc[1],
13576               kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13577               lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13578           rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13579           rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13580         }
13581       }
13582
13583       // Is the sector collapsed to a line?
13584       if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13585
13586       // Does the sector’s outer ring have rounded corners?
13587       else if (rc1 > epsilon$3) {
13588         t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13589         t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13590
13591         context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13592
13593         // Have the corners merged?
13594         if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13595
13596         // Otherwise, draw the two corners and the ring.
13597         else {
13598           context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13599           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);
13600           context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13601         }
13602       }
13603
13604       // Or is the outer ring just a circular arc?
13605       else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13606
13607       // Is there no inner ring, and it’s a circular sector?
13608       // Or perhaps it’s an annular sector collapsed due to padding?
13609       if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13610
13611       // Does the sector’s inner ring (or point) have rounded corners?
13612       else if (rc0 > epsilon$3) {
13613         t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13614         t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13615
13616         context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13617
13618         // Have the corners merged?
13619         if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13620
13621         // Otherwise, draw the two corners and the ring.
13622         else {
13623           context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13624           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);
13625           context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13626         }
13627       }
13628
13629       // Or is the inner ring just a circular arc?
13630       else context.arc(0, 0, r0, a10, a00, cw);
13631     }
13632
13633     context.closePath();
13634
13635     if (buffer) return context = null, buffer + "" || null;
13636   }
13637
13638   arc.centroid = function() {
13639     var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13640         a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13641     return [cos$2(a) * r, sin$2(a) * r];
13642   };
13643
13644   arc.innerRadius = function(_) {
13645     return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : innerRadius;
13646   };
13647
13648   arc.outerRadius = function(_) {
13649     return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : outerRadius;
13650   };
13651
13652   arc.cornerRadius = function(_) {
13653     return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : cornerRadius;
13654   };
13655
13656   arc.padRadius = function(_) {
13657     return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), arc) : padRadius;
13658   };
13659
13660   arc.startAngle = function(_) {
13661     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : startAngle;
13662   };
13663
13664   arc.endAngle = function(_) {
13665     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : endAngle;
13666   };
13667
13668   arc.padAngle = function(_) {
13669     return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : padAngle;
13670   };
13671
13672   arc.context = function(_) {
13673     return arguments.length ? (context = _ == null ? null : _, arc) : context;
13674   };
13675
13676   return arc;
13677 }
13678
13679 function Linear(context) {
13680   this._context = context;
13681 }
13682
13683 Linear.prototype = {
13684   areaStart: function() {
13685     this._line = 0;
13686   },
13687   areaEnd: function() {
13688     this._line = NaN;
13689   },
13690   lineStart: function() {
13691     this._point = 0;
13692   },
13693   lineEnd: function() {
13694     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13695     this._line = 1 - this._line;
13696   },
13697   point: function(x, y) {
13698     x = +x, y = +y;
13699     switch (this._point) {
13700       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13701       case 1: this._point = 2; // proceed
13702       default: this._context.lineTo(x, y); break;
13703     }
13704   }
13705 };
13706
13707 function curveLinear(context) {
13708   return new Linear(context);
13709 }
13710
13711 function x$3(p) {
13712   return p[0];
13713 }
13714
13715 function y$3(p) {
13716   return p[1];
13717 }
13718
13719 function line() {
13720   var x$$1 = x$3,
13721       y$$1 = y$3,
13722       defined = constant$10(true),
13723       context = null,
13724       curve = curveLinear,
13725       output = null;
13726
13727   function line(data) {
13728     var i,
13729         n = data.length,
13730         d,
13731         defined0 = false,
13732         buffer;
13733
13734     if (context == null) output = curve(buffer = path());
13735
13736     for (i = 0; i <= n; ++i) {
13737       if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13738         if (defined0 = !defined0) output.lineStart();
13739         else output.lineEnd();
13740       }
13741       if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13742     }
13743
13744     if (buffer) return output = null, buffer + "" || null;
13745   }
13746
13747   line.x = function(_) {
13748     return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : x$$1;
13749   };
13750
13751   line.y = function(_) {
13752     return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : y$$1;
13753   };
13754
13755   line.defined = function(_) {
13756     return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), line) : defined;
13757   };
13758
13759   line.curve = function(_) {
13760     return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13761   };
13762
13763   line.context = function(_) {
13764     return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13765   };
13766
13767   return line;
13768 }
13769
13770 function area() {
13771   var x0 = x$3,
13772       x1 = null,
13773       y0 = constant$10(0),
13774       y1 = y$3,
13775       defined = constant$10(true),
13776       context = null,
13777       curve = curveLinear,
13778       output = null;
13779
13780   function area(data) {
13781     var i,
13782         j,
13783         k,
13784         n = data.length,
13785         d,
13786         defined0 = false,
13787         buffer,
13788         x0z = new Array(n),
13789         y0z = new Array(n);
13790
13791     if (context == null) output = curve(buffer = path());
13792
13793     for (i = 0; i <= n; ++i) {
13794       if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13795         if (defined0 = !defined0) {
13796           j = i;
13797           output.areaStart();
13798           output.lineStart();
13799         } else {
13800           output.lineEnd();
13801           output.lineStart();
13802           for (k = i - 1; k >= j; --k) {
13803             output.point(x0z[k], y0z[k]);
13804           }
13805           output.lineEnd();
13806           output.areaEnd();
13807         }
13808       }
13809       if (defined0) {
13810         x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13811         output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13812       }
13813     }
13814
13815     if (buffer) return output = null, buffer + "" || null;
13816   }
13817
13818   function arealine() {
13819     return line().defined(defined).curve(curve).context(context);
13820   }
13821
13822   area.x = function(_) {
13823     return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), x1 = null, area) : x0;
13824   };
13825
13826   area.x0 = function(_) {
13827     return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), area) : x0;
13828   };
13829
13830   area.x1 = function(_) {
13831     return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : x1;
13832   };
13833
13834   area.y = function(_) {
13835     return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), y1 = null, area) : y0;
13836   };
13837
13838   area.y0 = function(_) {
13839     return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), area) : y0;
13840   };
13841
13842   area.y1 = function(_) {
13843     return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : y1;
13844   };
13845
13846   area.lineX0 =
13847   area.lineY0 = function() {
13848     return arealine().x(x0).y(y0);
13849   };
13850
13851   area.lineY1 = function() {
13852     return arealine().x(x0).y(y1);
13853   };
13854
13855   area.lineX1 = function() {
13856     return arealine().x(x1).y(y0);
13857   };
13858
13859   area.defined = function(_) {
13860     return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), area) : defined;
13861   };
13862
13863   area.curve = function(_) {
13864     return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13865   };
13866
13867   area.context = function(_) {
13868     return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13869   };
13870
13871   return area;
13872 }
13873
13874 function descending(a, b) {
13875   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13876 }
13877
13878 function identity$6(d) {
13879   return d;
13880 }
13881
13882 function pie() {
13883   var value = identity$6,
13884       sortValues = descending,
13885       sort = null,
13886       startAngle = constant$10(0),
13887       endAngle = constant$10(tau$4),
13888       padAngle = constant$10(0);
13889
13890   function pie(data) {
13891     var i,
13892         n = data.length,
13893         j,
13894         k,
13895         sum = 0,
13896         index = new Array(n),
13897         arcs = new Array(n),
13898         a0 = +startAngle.apply(this, arguments),
13899         da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13900         a1,
13901         p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13902         pa = p * (da < 0 ? -1 : 1),
13903         v;
13904
13905     for (i = 0; i < n; ++i) {
13906       if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13907         sum += v;
13908       }
13909     }
13910
13911     // Optionally sort the arcs by previously-computed values or by data.
13912     if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13913     else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13914
13915     // Compute the arcs! They are stored in the original data's order.
13916     for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13917       j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13918         data: data[j],
13919         index: i,
13920         value: v,
13921         startAngle: a0,
13922         endAngle: a1,
13923         padAngle: p
13924       };
13925     }
13926
13927     return arcs;
13928   }
13929
13930   pie.value = function(_) {
13931     return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), pie) : value;
13932   };
13933
13934   pie.sortValues = function(_) {
13935     return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13936   };
13937
13938   pie.sort = function(_) {
13939     return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13940   };
13941
13942   pie.startAngle = function(_) {
13943     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : startAngle;
13944   };
13945
13946   pie.endAngle = function(_) {
13947     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : endAngle;
13948   };
13949
13950   pie.padAngle = function(_) {
13951     return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : padAngle;
13952   };
13953
13954   return pie;
13955 }
13956
13957 var curveRadialLinear = curveRadial(curveLinear);
13958
13959 function Radial(curve) {
13960   this._curve = curve;
13961 }
13962
13963 Radial.prototype = {
13964   areaStart: function() {
13965     this._curve.areaStart();
13966   },
13967   areaEnd: function() {
13968     this._curve.areaEnd();
13969   },
13970   lineStart: function() {
13971     this._curve.lineStart();
13972   },
13973   lineEnd: function() {
13974     this._curve.lineEnd();
13975   },
13976   point: function(a, r) {
13977     this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13978   }
13979 };
13980
13981 function curveRadial(curve) {
13982
13983   function radial(context) {
13984     return new Radial(curve(context));
13985   }
13986
13987   radial._curve = curve;
13988
13989   return radial;
13990 }
13991
13992 function lineRadial(l) {
13993   var c = l.curve;
13994
13995   l.angle = l.x, delete l.x;
13996   l.radius = l.y, delete l.y;
13997
13998   l.curve = function(_) {
13999     return arguments.length ? c(curveRadial(_)) : c()._curve;
14000   };
14001
14002   return l;
14003 }
14004
14005 function lineRadial$1() {
14006   return lineRadial(line().curve(curveRadialLinear));
14007 }
14008
14009 function areaRadial() {
14010   var a = area().curve(curveRadialLinear),
14011       c = a.curve,
14012       x0 = a.lineX0,
14013       x1 = a.lineX1,
14014       y0 = a.lineY0,
14015       y1 = a.lineY1;
14016
14017   a.angle = a.x, delete a.x;
14018   a.startAngle = a.x0, delete a.x0;
14019   a.endAngle = a.x1, delete a.x1;
14020   a.radius = a.y, delete a.y;
14021   a.innerRadius = a.y0, delete a.y0;
14022   a.outerRadius = a.y1, delete a.y1;
14023   a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
14024   a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
14025   a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
14026   a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
14027
14028   a.curve = function(_) {
14029     return arguments.length ? c(curveRadial(_)) : c()._curve;
14030   };
14031
14032   return a;
14033 }
14034
14035 function pointRadial(x, y) {
14036   return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14037 }
14038
14039 var slice$6 = Array.prototype.slice;
14040
14041 function linkSource(d) {
14042   return d.source;
14043 }
14044
14045 function linkTarget(d) {
14046   return d.target;
14047 }
14048
14049 function link$2(curve) {
14050   var source = linkSource,
14051       target = linkTarget,
14052       x$$1 = x$3,
14053       y$$1 = y$3,
14054       context = null;
14055
14056   function link() {
14057     var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
14058     if (!context) context = buffer = path();
14059     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));
14060     if (buffer) return context = null, buffer + "" || null;
14061   }
14062
14063   link.source = function(_) {
14064     return arguments.length ? (source = _, link) : source;
14065   };
14066
14067   link.target = function(_) {
14068     return arguments.length ? (target = _, link) : target;
14069   };
14070
14071   link.x = function(_) {
14072     return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), link) : x$$1;
14073   };
14074
14075   link.y = function(_) {
14076     return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), link) : y$$1;
14077   };
14078
14079   link.context = function(_) {
14080     return arguments.length ? (context = _ == null ? null : _, link) : context;
14081   };
14082
14083   return link;
14084 }
14085
14086 function curveHorizontal(context, x0, y0, x1, y1) {
14087   context.moveTo(x0, y0);
14088   context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
14089 }
14090
14091 function curveVertical(context, x0, y0, x1, y1) {
14092   context.moveTo(x0, y0);
14093   context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
14094 }
14095
14096 function curveRadial$1(context, x0, y0, x1, y1) {
14097   var p0 = pointRadial(x0, y0),
14098       p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
14099       p2 = pointRadial(x1, y0),
14100       p3 = pointRadial(x1, y1);
14101   context.moveTo(p0[0], p0[1]);
14102   context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
14103 }
14104
14105 function linkHorizontal() {
14106   return link$2(curveHorizontal);
14107 }
14108
14109 function linkVertical() {
14110   return link$2(curveVertical);
14111 }
14112
14113 function linkRadial() {
14114   var l = link$2(curveRadial$1);
14115   l.angle = l.x, delete l.x;
14116   l.radius = l.y, delete l.y;
14117   return l;
14118 }
14119
14120 var circle$2 = {
14121   draw: function(context, size) {
14122     var r = Math.sqrt(size / pi$4);
14123     context.moveTo(r, 0);
14124     context.arc(0, 0, r, 0, tau$4);
14125   }
14126 };
14127
14128 var cross$2 = {
14129   draw: function(context, size) {
14130     var r = Math.sqrt(size / 5) / 2;
14131     context.moveTo(-3 * r, -r);
14132     context.lineTo(-r, -r);
14133     context.lineTo(-r, -3 * r);
14134     context.lineTo(r, -3 * r);
14135     context.lineTo(r, -r);
14136     context.lineTo(3 * r, -r);
14137     context.lineTo(3 * r, r);
14138     context.lineTo(r, r);
14139     context.lineTo(r, 3 * r);
14140     context.lineTo(-r, 3 * r);
14141     context.lineTo(-r, r);
14142     context.lineTo(-3 * r, r);
14143     context.closePath();
14144   }
14145 };
14146
14147 var tan30 = Math.sqrt(1 / 3),
14148     tan30_2 = tan30 * 2;
14149
14150 var diamond = {
14151   draw: function(context, size) {
14152     var y = Math.sqrt(size / tan30_2),
14153         x = y * tan30;
14154     context.moveTo(0, -y);
14155     context.lineTo(x, 0);
14156     context.lineTo(0, y);
14157     context.lineTo(-x, 0);
14158     context.closePath();
14159   }
14160 };
14161
14162 var ka = 0.89081309152928522810,
14163     kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
14164     kx = Math.sin(tau$4 / 10) * kr,
14165     ky = -Math.cos(tau$4 / 10) * kr;
14166
14167 var star = {
14168   draw: function(context, size) {
14169     var r = Math.sqrt(size * ka),
14170         x = kx * r,
14171         y = ky * r;
14172     context.moveTo(0, -r);
14173     context.lineTo(x, y);
14174     for (var i = 1; i < 5; ++i) {
14175       var a = tau$4 * i / 5,
14176           c = Math.cos(a),
14177           s = Math.sin(a);
14178       context.lineTo(s * r, -c * r);
14179       context.lineTo(c * x - s * y, s * x + c * y);
14180     }
14181     context.closePath();
14182   }
14183 };
14184
14185 var square = {
14186   draw: function(context, size) {
14187     var w = Math.sqrt(size),
14188         x = -w / 2;
14189     context.rect(x, x, w, w);
14190   }
14191 };
14192
14193 var sqrt3 = Math.sqrt(3);
14194
14195 var triangle = {
14196   draw: function(context, size) {
14197     var y = -Math.sqrt(size / (sqrt3 * 3));
14198     context.moveTo(0, y * 2);
14199     context.lineTo(-sqrt3 * y, -y);
14200     context.lineTo(sqrt3 * y, -y);
14201     context.closePath();
14202   }
14203 };
14204
14205 var c = -0.5,
14206     s = Math.sqrt(3) / 2,
14207     k = 1 / Math.sqrt(12),
14208     a = (k / 2 + 1) * 3;
14209
14210 var wye = {
14211   draw: function(context, size) {
14212     var r = Math.sqrt(size / a),
14213         x0 = r / 2,
14214         y0 = r * k,
14215         x1 = x0,
14216         y1 = r * k + r,
14217         x2 = -x1,
14218         y2 = y1;
14219     context.moveTo(x0, y0);
14220     context.lineTo(x1, y1);
14221     context.lineTo(x2, y2);
14222     context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14223     context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14224     context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14225     context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14226     context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14227     context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14228     context.closePath();
14229   }
14230 };
14231
14232 var symbols = [
14233   circle$2,
14234   cross$2,
14235   diamond,
14236   square,
14237   star,
14238   triangle,
14239   wye
14240 ];
14241
14242 function symbol() {
14243   var type = constant$10(circle$2),
14244       size = constant$10(64),
14245       context = null;
14246
14247   function symbol() {
14248     var buffer;
14249     if (!context) context = buffer = path();
14250     type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14251     if (buffer) return context = null, buffer + "" || null;
14252   }
14253
14254   symbol.type = function(_) {
14255     return arguments.length ? (type = typeof _ === "function" ? _ : constant$10(_), symbol) : type;
14256   };
14257
14258   symbol.size = function(_) {
14259     return arguments.length ? (size = typeof _ === "function" ? _ : constant$10(+_), symbol) : size;
14260   };
14261
14262   symbol.context = function(_) {
14263     return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14264   };
14265
14266   return symbol;
14267 }
14268
14269 function noop$2() {}
14270
14271 function point$2(that, x, y) {
14272   that._context.bezierCurveTo(
14273     (2 * that._x0 + that._x1) / 3,
14274     (2 * that._y0 + that._y1) / 3,
14275     (that._x0 + 2 * that._x1) / 3,
14276     (that._y0 + 2 * that._y1) / 3,
14277     (that._x0 + 4 * that._x1 + x) / 6,
14278     (that._y0 + 4 * that._y1 + y) / 6
14279   );
14280 }
14281
14282 function Basis(context) {
14283   this._context = context;
14284 }
14285
14286 Basis.prototype = {
14287   areaStart: function() {
14288     this._line = 0;
14289   },
14290   areaEnd: function() {
14291     this._line = NaN;
14292   },
14293   lineStart: function() {
14294     this._x0 = this._x1 =
14295     this._y0 = this._y1 = NaN;
14296     this._point = 0;
14297   },
14298   lineEnd: function() {
14299     switch (this._point) {
14300       case 3: point$2(this, this._x1, this._y1); // proceed
14301       case 2: this._context.lineTo(this._x1, this._y1); break;
14302     }
14303     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14304     this._line = 1 - this._line;
14305   },
14306   point: function(x, y) {
14307     x = +x, y = +y;
14308     switch (this._point) {
14309       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14310       case 1: this._point = 2; break;
14311       case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14312       default: point$2(this, x, y); break;
14313     }
14314     this._x0 = this._x1, this._x1 = x;
14315     this._y0 = this._y1, this._y1 = y;
14316   }
14317 };
14318
14319 function basis$2(context) {
14320   return new Basis(context);
14321 }
14322
14323 function BasisClosed(context) {
14324   this._context = context;
14325 }
14326
14327 BasisClosed.prototype = {
14328   areaStart: noop$2,
14329   areaEnd: noop$2,
14330   lineStart: function() {
14331     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14332     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14333     this._point = 0;
14334   },
14335   lineEnd: function() {
14336     switch (this._point) {
14337       case 1: {
14338         this._context.moveTo(this._x2, this._y2);
14339         this._context.closePath();
14340         break;
14341       }
14342       case 2: {
14343         this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14344         this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14345         this._context.closePath();
14346         break;
14347       }
14348       case 3: {
14349         this.point(this._x2, this._y2);
14350         this.point(this._x3, this._y3);
14351         this.point(this._x4, this._y4);
14352         break;
14353       }
14354     }
14355   },
14356   point: function(x, y) {
14357     x = +x, y = +y;
14358     switch (this._point) {
14359       case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14360       case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14361       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;
14362       default: point$2(this, x, y); break;
14363     }
14364     this._x0 = this._x1, this._x1 = x;
14365     this._y0 = this._y1, this._y1 = y;
14366   }
14367 };
14368
14369 function basisClosed$1(context) {
14370   return new BasisClosed(context);
14371 }
14372
14373 function BasisOpen(context) {
14374   this._context = context;
14375 }
14376
14377 BasisOpen.prototype = {
14378   areaStart: function() {
14379     this._line = 0;
14380   },
14381   areaEnd: function() {
14382     this._line = NaN;
14383   },
14384   lineStart: function() {
14385     this._x0 = this._x1 =
14386     this._y0 = this._y1 = NaN;
14387     this._point = 0;
14388   },
14389   lineEnd: function() {
14390     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14391     this._line = 1 - this._line;
14392   },
14393   point: function(x, y) {
14394     x = +x, y = +y;
14395     switch (this._point) {
14396       case 0: this._point = 1; break;
14397       case 1: this._point = 2; break;
14398       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;
14399       case 3: this._point = 4; // proceed
14400       default: point$2(this, x, y); break;
14401     }
14402     this._x0 = this._x1, this._x1 = x;
14403     this._y0 = this._y1, this._y1 = y;
14404   }
14405 };
14406
14407 function basisOpen(context) {
14408   return new BasisOpen(context);
14409 }
14410
14411 function Bundle(context, beta) {
14412   this._basis = new Basis(context);
14413   this._beta = beta;
14414 }
14415
14416 Bundle.prototype = {
14417   lineStart: function() {
14418     this._x = [];
14419     this._y = [];
14420     this._basis.lineStart();
14421   },
14422   lineEnd: function() {
14423     var x = this._x,
14424         y = this._y,
14425         j = x.length - 1;
14426
14427     if (j > 0) {
14428       var x0 = x[0],
14429           y0 = y[0],
14430           dx = x[j] - x0,
14431           dy = y[j] - y0,
14432           i = -1,
14433           t;
14434
14435       while (++i <= j) {
14436         t = i / j;
14437         this._basis.point(
14438           this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14439           this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14440         );
14441       }
14442     }
14443
14444     this._x = this._y = null;
14445     this._basis.lineEnd();
14446   },
14447   point: function(x, y) {
14448     this._x.push(+x);
14449     this._y.push(+y);
14450   }
14451 };
14452
14453 var bundle = (function custom(beta) {
14454
14455   function bundle(context) {
14456     return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14457   }
14458
14459   bundle.beta = function(beta) {
14460     return custom(+beta);
14461   };
14462
14463   return bundle;
14464 })(0.85);
14465
14466 function point$3(that, x, y) {
14467   that._context.bezierCurveTo(
14468     that._x1 + that._k * (that._x2 - that._x0),
14469     that._y1 + that._k * (that._y2 - that._y0),
14470     that._x2 + that._k * (that._x1 - x),
14471     that._y2 + that._k * (that._y1 - y),
14472     that._x2,
14473     that._y2
14474   );
14475 }
14476
14477 function Cardinal(context, tension) {
14478   this._context = context;
14479   this._k = (1 - tension) / 6;
14480 }
14481
14482 Cardinal.prototype = {
14483   areaStart: function() {
14484     this._line = 0;
14485   },
14486   areaEnd: function() {
14487     this._line = NaN;
14488   },
14489   lineStart: function() {
14490     this._x0 = this._x1 = this._x2 =
14491     this._y0 = this._y1 = this._y2 = NaN;
14492     this._point = 0;
14493   },
14494   lineEnd: function() {
14495     switch (this._point) {
14496       case 2: this._context.lineTo(this._x2, this._y2); break;
14497       case 3: point$3(this, this._x1, this._y1); break;
14498     }
14499     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14500     this._line = 1 - this._line;
14501   },
14502   point: function(x, y) {
14503     x = +x, y = +y;
14504     switch (this._point) {
14505       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14506       case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14507       case 2: this._point = 3; // proceed
14508       default: point$3(this, x, y); break;
14509     }
14510     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14511     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14512   }
14513 };
14514
14515 var cardinal = (function custom(tension) {
14516
14517   function cardinal(context) {
14518     return new Cardinal(context, tension);
14519   }
14520
14521   cardinal.tension = function(tension) {
14522     return custom(+tension);
14523   };
14524
14525   return cardinal;
14526 })(0);
14527
14528 function CardinalClosed(context, tension) {
14529   this._context = context;
14530   this._k = (1 - tension) / 6;
14531 }
14532
14533 CardinalClosed.prototype = {
14534   areaStart: noop$2,
14535   areaEnd: noop$2,
14536   lineStart: function() {
14537     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14538     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14539     this._point = 0;
14540   },
14541   lineEnd: function() {
14542     switch (this._point) {
14543       case 1: {
14544         this._context.moveTo(this._x3, this._y3);
14545         this._context.closePath();
14546         break;
14547       }
14548       case 2: {
14549         this._context.lineTo(this._x3, this._y3);
14550         this._context.closePath();
14551         break;
14552       }
14553       case 3: {
14554         this.point(this._x3, this._y3);
14555         this.point(this._x4, this._y4);
14556         this.point(this._x5, this._y5);
14557         break;
14558       }
14559     }
14560   },
14561   point: function(x, y) {
14562     x = +x, y = +y;
14563     switch (this._point) {
14564       case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14565       case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14566       case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14567       default: point$3(this, x, y); break;
14568     }
14569     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14570     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14571   }
14572 };
14573
14574 var cardinalClosed = (function custom(tension) {
14575
14576   function cardinal$$1(context) {
14577     return new CardinalClosed(context, tension);
14578   }
14579
14580   cardinal$$1.tension = function(tension) {
14581     return custom(+tension);
14582   };
14583
14584   return cardinal$$1;
14585 })(0);
14586
14587 function CardinalOpen(context, tension) {
14588   this._context = context;
14589   this._k = (1 - tension) / 6;
14590 }
14591
14592 CardinalOpen.prototype = {
14593   areaStart: function() {
14594     this._line = 0;
14595   },
14596   areaEnd: function() {
14597     this._line = NaN;
14598   },
14599   lineStart: function() {
14600     this._x0 = this._x1 = this._x2 =
14601     this._y0 = this._y1 = this._y2 = NaN;
14602     this._point = 0;
14603   },
14604   lineEnd: function() {
14605     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14606     this._line = 1 - this._line;
14607   },
14608   point: function(x, y) {
14609     x = +x, y = +y;
14610     switch (this._point) {
14611       case 0: this._point = 1; break;
14612       case 1: this._point = 2; break;
14613       case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14614       case 3: this._point = 4; // proceed
14615       default: point$3(this, x, y); break;
14616     }
14617     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14618     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14619   }
14620 };
14621
14622 var cardinalOpen = (function custom(tension) {
14623
14624   function cardinal$$1(context) {
14625     return new CardinalOpen(context, tension);
14626   }
14627
14628   cardinal$$1.tension = function(tension) {
14629     return custom(+tension);
14630   };
14631
14632   return cardinal$$1;
14633 })(0);
14634
14635 function point$4(that, x, y) {
14636   var x1 = that._x1,
14637       y1 = that._y1,
14638       x2 = that._x2,
14639       y2 = that._y2;
14640
14641   if (that._l01_a > epsilon$3) {
14642     var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14643         n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14644     x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14645     y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14646   }
14647
14648   if (that._l23_a > epsilon$3) {
14649     var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14650         m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14651     x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14652     y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14653   }
14654
14655   that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14656 }
14657
14658 function CatmullRom(context, alpha) {
14659   this._context = context;
14660   this._alpha = alpha;
14661 }
14662
14663 CatmullRom.prototype = {
14664   areaStart: function() {
14665     this._line = 0;
14666   },
14667   areaEnd: function() {
14668     this._line = NaN;
14669   },
14670   lineStart: function() {
14671     this._x0 = this._x1 = this._x2 =
14672     this._y0 = this._y1 = this._y2 = NaN;
14673     this._l01_a = this._l12_a = this._l23_a =
14674     this._l01_2a = this._l12_2a = this._l23_2a =
14675     this._point = 0;
14676   },
14677   lineEnd: function() {
14678     switch (this._point) {
14679       case 2: this._context.lineTo(this._x2, this._y2); break;
14680       case 3: this.point(this._x2, this._y2); break;
14681     }
14682     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14683     this._line = 1 - this._line;
14684   },
14685   point: function(x, y) {
14686     x = +x, y = +y;
14687
14688     if (this._point) {
14689       var x23 = this._x2 - x,
14690           y23 = this._y2 - y;
14691       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14692     }
14693
14694     switch (this._point) {
14695       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14696       case 1: this._point = 2; break;
14697       case 2: this._point = 3; // proceed
14698       default: point$4(this, x, y); break;
14699     }
14700
14701     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14702     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14703     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14704     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14705   }
14706 };
14707
14708 var catmullRom = (function custom(alpha) {
14709
14710   function catmullRom(context) {
14711     return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14712   }
14713
14714   catmullRom.alpha = function(alpha) {
14715     return custom(+alpha);
14716   };
14717
14718   return catmullRom;
14719 })(0.5);
14720
14721 function CatmullRomClosed(context, alpha) {
14722   this._context = context;
14723   this._alpha = alpha;
14724 }
14725
14726 CatmullRomClosed.prototype = {
14727   areaStart: noop$2,
14728   areaEnd: noop$2,
14729   lineStart: function() {
14730     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14731     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14732     this._l01_a = this._l12_a = this._l23_a =
14733     this._l01_2a = this._l12_2a = this._l23_2a =
14734     this._point = 0;
14735   },
14736   lineEnd: function() {
14737     switch (this._point) {
14738       case 1: {
14739         this._context.moveTo(this._x3, this._y3);
14740         this._context.closePath();
14741         break;
14742       }
14743       case 2: {
14744         this._context.lineTo(this._x3, this._y3);
14745         this._context.closePath();
14746         break;
14747       }
14748       case 3: {
14749         this.point(this._x3, this._y3);
14750         this.point(this._x4, this._y4);
14751         this.point(this._x5, this._y5);
14752         break;
14753       }
14754     }
14755   },
14756   point: function(x, y) {
14757     x = +x, y = +y;
14758
14759     if (this._point) {
14760       var x23 = this._x2 - x,
14761           y23 = this._y2 - y;
14762       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14763     }
14764
14765     switch (this._point) {
14766       case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14767       case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14768       case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14769       default: point$4(this, x, y); break;
14770     }
14771
14772     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14773     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14774     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14775     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14776   }
14777 };
14778
14779 var catmullRomClosed = (function custom(alpha) {
14780
14781   function catmullRom$$1(context) {
14782     return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14783   }
14784
14785   catmullRom$$1.alpha = function(alpha) {
14786     return custom(+alpha);
14787   };
14788
14789   return catmullRom$$1;
14790 })(0.5);
14791
14792 function CatmullRomOpen(context, alpha) {
14793   this._context = context;
14794   this._alpha = alpha;
14795 }
14796
14797 CatmullRomOpen.prototype = {
14798   areaStart: function() {
14799     this._line = 0;
14800   },
14801   areaEnd: function() {
14802     this._line = NaN;
14803   },
14804   lineStart: function() {
14805     this._x0 = this._x1 = this._x2 =
14806     this._y0 = this._y1 = this._y2 = NaN;
14807     this._l01_a = this._l12_a = this._l23_a =
14808     this._l01_2a = this._l12_2a = this._l23_2a =
14809     this._point = 0;
14810   },
14811   lineEnd: function() {
14812     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14813     this._line = 1 - this._line;
14814   },
14815   point: function(x, y) {
14816     x = +x, y = +y;
14817
14818     if (this._point) {
14819       var x23 = this._x2 - x,
14820           y23 = this._y2 - y;
14821       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14822     }
14823
14824     switch (this._point) {
14825       case 0: this._point = 1; break;
14826       case 1: this._point = 2; break;
14827       case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14828       case 3: this._point = 4; // proceed
14829       default: point$4(this, x, y); break;
14830     }
14831
14832     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14833     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14834     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14835     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14836   }
14837 };
14838
14839 var catmullRomOpen = (function custom(alpha) {
14840
14841   function catmullRom$$1(context) {
14842     return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14843   }
14844
14845   catmullRom$$1.alpha = function(alpha) {
14846     return custom(+alpha);
14847   };
14848
14849   return catmullRom$$1;
14850 })(0.5);
14851
14852 function LinearClosed(context) {
14853   this._context = context;
14854 }
14855
14856 LinearClosed.prototype = {
14857   areaStart: noop$2,
14858   areaEnd: noop$2,
14859   lineStart: function() {
14860     this._point = 0;
14861   },
14862   lineEnd: function() {
14863     if (this._point) this._context.closePath();
14864   },
14865   point: function(x, y) {
14866     x = +x, y = +y;
14867     if (this._point) this._context.lineTo(x, y);
14868     else this._point = 1, this._context.moveTo(x, y);
14869   }
14870 };
14871
14872 function linearClosed(context) {
14873   return new LinearClosed(context);
14874 }
14875
14876 function sign$1(x) {
14877   return x < 0 ? -1 : 1;
14878 }
14879
14880 // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14881 // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14882 // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14883 // NOV(II), P. 443, 1990.
14884 function slope3(that, x2, y2) {
14885   var h0 = that._x1 - that._x0,
14886       h1 = x2 - that._x1,
14887       s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14888       s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14889       p = (s0 * h1 + s1 * h0) / (h0 + h1);
14890   return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14891 }
14892
14893 // Calculate a one-sided slope.
14894 function slope2(that, t) {
14895   var h = that._x1 - that._x0;
14896   return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14897 }
14898
14899 // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14900 // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14901 // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14902 function point$5(that, t0, t1) {
14903   var x0 = that._x0,
14904       y0 = that._y0,
14905       x1 = that._x1,
14906       y1 = that._y1,
14907       dx = (x1 - x0) / 3;
14908   that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14909 }
14910
14911 function MonotoneX(context) {
14912   this._context = context;
14913 }
14914
14915 MonotoneX.prototype = {
14916   areaStart: function() {
14917     this._line = 0;
14918   },
14919   areaEnd: function() {
14920     this._line = NaN;
14921   },
14922   lineStart: function() {
14923     this._x0 = this._x1 =
14924     this._y0 = this._y1 =
14925     this._t0 = NaN;
14926     this._point = 0;
14927   },
14928   lineEnd: function() {
14929     switch (this._point) {
14930       case 2: this._context.lineTo(this._x1, this._y1); break;
14931       case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14932     }
14933     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14934     this._line = 1 - this._line;
14935   },
14936   point: function(x, y) {
14937     var t1 = NaN;
14938
14939     x = +x, y = +y;
14940     if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14941     switch (this._point) {
14942       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14943       case 1: this._point = 2; break;
14944       case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14945       default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14946     }
14947
14948     this._x0 = this._x1, this._x1 = x;
14949     this._y0 = this._y1, this._y1 = y;
14950     this._t0 = t1;
14951   }
14952 };
14953
14954 function MonotoneY(context) {
14955   this._context = new ReflectContext(context);
14956 }
14957
14958 (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14959   MonotoneX.prototype.point.call(this, y, x);
14960 };
14961
14962 function ReflectContext(context) {
14963   this._context = context;
14964 }
14965
14966 ReflectContext.prototype = {
14967   moveTo: function(x, y) { this._context.moveTo(y, x); },
14968   closePath: function() { this._context.closePath(); },
14969   lineTo: function(x, y) { this._context.lineTo(y, x); },
14970   bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14971 };
14972
14973 function monotoneX(context) {
14974   return new MonotoneX(context);
14975 }
14976
14977 function monotoneY(context) {
14978   return new MonotoneY(context);
14979 }
14980
14981 function Natural(context) {
14982   this._context = context;
14983 }
14984
14985 Natural.prototype = {
14986   areaStart: function() {
14987     this._line = 0;
14988   },
14989   areaEnd: function() {
14990     this._line = NaN;
14991   },
14992   lineStart: function() {
14993     this._x = [];
14994     this._y = [];
14995   },
14996   lineEnd: function() {
14997     var x = this._x,
14998         y = this._y,
14999         n = x.length;
15000
15001     if (n) {
15002       this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15003       if (n === 2) {
15004         this._context.lineTo(x[1], y[1]);
15005       } else {
15006         var px = controlPoints(x),
15007             py = controlPoints(y);
15008         for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
15009           this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
15010         }
15011       }
15012     }
15013
15014     if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15015     this._line = 1 - this._line;
15016     this._x = this._y = null;
15017   },
15018   point: function(x, y) {
15019     this._x.push(+x);
15020     this._y.push(+y);
15021   }
15022 };
15023
15024 // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15025 function controlPoints(x) {
15026   var i,
15027       n = x.length - 1,
15028       m,
15029       a = new Array(n),
15030       b = new Array(n),
15031       r = new Array(n);
15032   a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
15033   for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
15034   a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
15035   for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
15036   a[n - 1] = r[n - 1] / b[n - 1];
15037   for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
15038   b[n - 1] = (x[n] + a[n - 1]) / 2;
15039   for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
15040   return [a, b];
15041 }
15042
15043 function natural(context) {
15044   return new Natural(context);
15045 }
15046
15047 function Step(context, t) {
15048   this._context = context;
15049   this._t = t;
15050 }
15051
15052 Step.prototype = {
15053   areaStart: function() {
15054     this._line = 0;
15055   },
15056   areaEnd: function() {
15057     this._line = NaN;
15058   },
15059   lineStart: function() {
15060     this._x = this._y = NaN;
15061     this._point = 0;
15062   },
15063   lineEnd: function() {
15064     if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
15065     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
15066     if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
15067   },
15068   point: function(x, y) {
15069     x = +x, y = +y;
15070     switch (this._point) {
15071       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
15072       case 1: this._point = 2; // proceed
15073       default: {
15074         if (this._t <= 0) {
15075           this._context.lineTo(this._x, y);
15076           this._context.lineTo(x, y);
15077         } else {
15078           var x1 = this._x * (1 - this._t) + x * this._t;
15079           this._context.lineTo(x1, this._y);
15080           this._context.lineTo(x1, y);
15081         }
15082         break;
15083       }
15084     }
15085     this._x = x, this._y = y;
15086   }
15087 };
15088
15089 function step(context) {
15090   return new Step(context, 0.5);
15091 }
15092
15093 function stepBefore(context) {
15094   return new Step(context, 0);
15095 }
15096
15097 function stepAfter(context) {
15098   return new Step(context, 1);
15099 }
15100
15101 function none$1(series, order) {
15102   if (!((n = series.length) > 1)) return;
15103   for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
15104     s0 = s1, s1 = series[order[i]];
15105     for (j = 0; j < m; ++j) {
15106       s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
15107     }
15108   }
15109 }
15110
15111 function none$2(series) {
15112   var n = series.length, o = new Array(n);
15113   while (--n >= 0) o[n] = n;
15114   return o;
15115 }
15116
15117 function stackValue(d, key) {
15118   return d[key];
15119 }
15120
15121 function stack() {
15122   var keys = constant$10([]),
15123       order = none$2,
15124       offset = none$1,
15125       value = stackValue;
15126
15127   function stack(data) {
15128     var kz = keys.apply(this, arguments),
15129         i,
15130         m = data.length,
15131         n = kz.length,
15132         sz = new Array(n),
15133         oz;
15134
15135     for (i = 0; i < n; ++i) {
15136       for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15137         si[j] = sij = [0, +value(data[j], ki, j, data)];
15138         sij.data = data[j];
15139       }
15140       si.key = ki;
15141     }
15142
15143     for (i = 0, oz = order(sz); i < n; ++i) {
15144       sz[oz[i]].index = i;
15145     }
15146
15147     offset(sz, oz);
15148     return sz;
15149   }
15150
15151   stack.keys = function(_) {
15152     return arguments.length ? (keys = typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : keys;
15153   };
15154
15155   stack.value = function(_) {
15156     return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), stack) : value;
15157   };
15158
15159   stack.order = function(_) {
15160     return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : order;
15161   };
15162
15163   stack.offset = function(_) {
15164     return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15165   };
15166
15167   return stack;
15168 }
15169
15170 function expand(series, order) {
15171   if (!((n = series.length) > 0)) return;
15172   for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15173     for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15174     if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15175   }
15176   none$1(series, order);
15177 }
15178
15179 function diverging(series, order) {
15180   if (!((n = series.length) > 1)) return;
15181   for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15182     for (yp = yn = 0, i = 0; i < n; ++i) {
15183       if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15184         d[0] = yp, d[1] = yp += dy;
15185       } else if (dy < 0) {
15186         d[1] = yn, d[0] = yn += dy;
15187       } else {
15188         d[0] = yp;
15189       }
15190     }
15191   }
15192 }
15193
15194 function silhouette(series, order) {
15195   if (!((n = series.length) > 0)) return;
15196   for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15197     for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15198     s0[j][1] += s0[j][0] = -y / 2;
15199   }
15200   none$1(series, order);
15201 }
15202
15203 function wiggle(series, order) {
15204   if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15205   for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15206     for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15207       var si = series[order[i]],
15208           sij0 = si[j][1] || 0,
15209           sij1 = si[j - 1][1] || 0,
15210           s3 = (sij0 - sij1) / 2;
15211       for (var k = 0; k < i; ++k) {
15212         var sk = series[order[k]],
15213             skj0 = sk[j][1] || 0,
15214             skj1 = sk[j - 1][1] || 0;
15215         s3 += skj0 - skj1;
15216       }
15217       s1 += sij0, s2 += s3 * sij0;
15218     }
15219     s0[j - 1][1] += s0[j - 1][0] = y;
15220     if (s1) y -= s2 / s1;
15221   }
15222   s0[j - 1][1] += s0[j - 1][0] = y;
15223   none$1(series, order);
15224 }
15225
15226 function ascending$1(series) {
15227   var sums = series.map(sum$2);
15228   return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15229 }
15230
15231 function sum$2(series) {
15232   var s = 0, i = -1, n = series.length, v;
15233   while (++i < n) if (v = +series[i][1]) s += v;
15234   return s;
15235 }
15236
15237 function descending$1(series) {
15238   return ascending$1(series).reverse();
15239 }
15240
15241 function insideOut(series) {
15242   var n = series.length,
15243       i,
15244       j,
15245       sums = series.map(sum$2),
15246       order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15247       top = 0,
15248       bottom = 0,
15249       tops = [],
15250       bottoms = [];
15251
15252   for (i = 0; i < n; ++i) {
15253     j = order[i];
15254     if (top < bottom) {
15255       top += sums[j];
15256       tops.push(j);
15257     } else {
15258       bottom += sums[j];
15259       bottoms.push(j);
15260     }
15261   }
15262
15263   return bottoms.reverse().concat(tops);
15264 }
15265
15266 function reverse(series) {
15267   return none$2(series).reverse();
15268 }
15269
15270 function constant$11(x) {
15271   return function() {
15272     return x;
15273   };
15274 }
15275
15276 function x$4(d) {
15277   return d[0];
15278 }
15279
15280 function y$4(d) {
15281   return d[1];
15282 }
15283
15284 function RedBlackTree() {
15285   this._ = null; // root node
15286 }
15287
15288 function RedBlackNode(node) {
15289   node.U = // parent node
15290   node.C = // color - true for red, false for black
15291   node.L = // left node
15292   node.R = // right node
15293   node.P = // previous node
15294   node.N = null; // next node
15295 }
15296
15297 RedBlackTree.prototype = {
15298   constructor: RedBlackTree,
15299
15300   insert: function(after, node) {
15301     var parent, grandpa, uncle;
15302
15303     if (after) {
15304       node.P = after;
15305       node.N = after.N;
15306       if (after.N) after.N.P = node;
15307       after.N = node;
15308       if (after.R) {
15309         after = after.R;
15310         while (after.L) after = after.L;
15311         after.L = node;
15312       } else {
15313         after.R = node;
15314       }
15315       parent = after;
15316     } else if (this._) {
15317       after = RedBlackFirst(this._);
15318       node.P = null;
15319       node.N = after;
15320       after.P = after.L = node;
15321       parent = after;
15322     } else {
15323       node.P = node.N = null;
15324       this._ = node;
15325       parent = null;
15326     }
15327     node.L = node.R = null;
15328     node.U = parent;
15329     node.C = true;
15330
15331     after = node;
15332     while (parent && parent.C) {
15333       grandpa = parent.U;
15334       if (parent === grandpa.L) {
15335         uncle = grandpa.R;
15336         if (uncle && uncle.C) {
15337           parent.C = uncle.C = false;
15338           grandpa.C = true;
15339           after = grandpa;
15340         } else {
15341           if (after === parent.R) {
15342             RedBlackRotateLeft(this, parent);
15343             after = parent;
15344             parent = after.U;
15345           }
15346           parent.C = false;
15347           grandpa.C = true;
15348           RedBlackRotateRight(this, grandpa);
15349         }
15350       } else {
15351         uncle = grandpa.L;
15352         if (uncle && uncle.C) {
15353           parent.C = uncle.C = false;
15354           grandpa.C = true;
15355           after = grandpa;
15356         } else {
15357           if (after === parent.L) {
15358             RedBlackRotateRight(this, parent);
15359             after = parent;
15360             parent = after.U;
15361           }
15362           parent.C = false;
15363           grandpa.C = true;
15364           RedBlackRotateLeft(this, grandpa);
15365         }
15366       }
15367       parent = after.U;
15368     }
15369     this._.C = false;
15370   },
15371
15372   remove: function(node) {
15373     if (node.N) node.N.P = node.P;
15374     if (node.P) node.P.N = node.N;
15375     node.N = node.P = null;
15376
15377     var parent = node.U,
15378         sibling,
15379         left = node.L,
15380         right = node.R,
15381         next,
15382         red;
15383
15384     if (!left) next = right;
15385     else if (!right) next = left;
15386     else next = RedBlackFirst(right);
15387
15388     if (parent) {
15389       if (parent.L === node) parent.L = next;
15390       else parent.R = next;
15391     } else {
15392       this._ = next;
15393     }
15394
15395     if (left && right) {
15396       red = next.C;
15397       next.C = node.C;
15398       next.L = left;
15399       left.U = next;
15400       if (next !== right) {
15401         parent = next.U;
15402         next.U = node.U;
15403         node = next.R;
15404         parent.L = node;
15405         next.R = right;
15406         right.U = next;
15407       } else {
15408         next.U = parent;
15409         parent = next;
15410         node = next.R;
15411       }
15412     } else {
15413       red = node.C;
15414       node = next;
15415     }
15416
15417     if (node) node.U = parent;
15418     if (red) return;
15419     if (node && node.C) { node.C = false; return; }
15420
15421     do {
15422       if (node === this._) break;
15423       if (node === parent.L) {
15424         sibling = parent.R;
15425         if (sibling.C) {
15426           sibling.C = false;
15427           parent.C = true;
15428           RedBlackRotateLeft(this, parent);
15429           sibling = parent.R;
15430         }
15431         if ((sibling.L && sibling.L.C)
15432             || (sibling.R && sibling.R.C)) {
15433           if (!sibling.R || !sibling.R.C) {
15434             sibling.L.C = false;
15435             sibling.C = true;
15436             RedBlackRotateRight(this, sibling);
15437             sibling = parent.R;
15438           }
15439           sibling.C = parent.C;
15440           parent.C = sibling.R.C = false;
15441           RedBlackRotateLeft(this, parent);
15442           node = this._;
15443           break;
15444         }
15445       } else {
15446         sibling = parent.L;
15447         if (sibling.C) {
15448           sibling.C = false;
15449           parent.C = true;
15450           RedBlackRotateRight(this, parent);
15451           sibling = parent.L;
15452         }
15453         if ((sibling.L && sibling.L.C)
15454           || (sibling.R && sibling.R.C)) {
15455           if (!sibling.L || !sibling.L.C) {
15456             sibling.R.C = false;
15457             sibling.C = true;
15458             RedBlackRotateLeft(this, sibling);
15459             sibling = parent.L;
15460           }
15461           sibling.C = parent.C;
15462           parent.C = sibling.L.C = false;
15463           RedBlackRotateRight(this, parent);
15464           node = this._;
15465           break;
15466         }
15467       }
15468       sibling.C = true;
15469       node = parent;
15470       parent = parent.U;
15471     } while (!node.C);
15472
15473     if (node) node.C = false;
15474   }
15475 };
15476
15477 function RedBlackRotateLeft(tree, node) {
15478   var p = node,
15479       q = node.R,
15480       parent = p.U;
15481
15482   if (parent) {
15483     if (parent.L === p) parent.L = q;
15484     else parent.R = q;
15485   } else {
15486     tree._ = q;
15487   }
15488
15489   q.U = parent;
15490   p.U = q;
15491   p.R = q.L;
15492   if (p.R) p.R.U = p;
15493   q.L = p;
15494 }
15495
15496 function RedBlackRotateRight(tree, node) {
15497   var p = node,
15498       q = node.L,
15499       parent = p.U;
15500
15501   if (parent) {
15502     if (parent.L === p) parent.L = q;
15503     else parent.R = q;
15504   } else {
15505     tree._ = q;
15506   }
15507
15508   q.U = parent;
15509   p.U = q;
15510   p.L = q.R;
15511   if (p.L) p.L.U = p;
15512   q.R = p;
15513 }
15514
15515 function RedBlackFirst(node) {
15516   while (node.L) node = node.L;
15517   return node;
15518 }
15519
15520 function createEdge(left, right, v0, v1) {
15521   var edge = [null, null],
15522       index = edges.push(edge) - 1;
15523   edge.left = left;
15524   edge.right = right;
15525   if (v0) setEdgeEnd(edge, left, right, v0);
15526   if (v1) setEdgeEnd(edge, right, left, v1);
15527   cells[left.index].halfedges.push(index);
15528   cells[right.index].halfedges.push(index);
15529   return edge;
15530 }
15531
15532 function createBorderEdge(left, v0, v1) {
15533   var edge = [v0, v1];
15534   edge.left = left;
15535   return edge;
15536 }
15537
15538 function setEdgeEnd(edge, left, right, vertex) {
15539   if (!edge[0] && !edge[1]) {
15540     edge[0] = vertex;
15541     edge.left = left;
15542     edge.right = right;
15543   } else if (edge.left === right) {
15544     edge[1] = vertex;
15545   } else {
15546     edge[0] = vertex;
15547   }
15548 }
15549
15550 // Liang–Barsky line clipping.
15551 function clipEdge(edge, x0, y0, x1, y1) {
15552   var a = edge[0],
15553       b = edge[1],
15554       ax = a[0],
15555       ay = a[1],
15556       bx = b[0],
15557       by = b[1],
15558       t0 = 0,
15559       t1 = 1,
15560       dx = bx - ax,
15561       dy = by - ay,
15562       r;
15563
15564   r = x0 - ax;
15565   if (!dx && r > 0) return;
15566   r /= dx;
15567   if (dx < 0) {
15568     if (r < t0) return;
15569     if (r < t1) t1 = r;
15570   } else if (dx > 0) {
15571     if (r > t1) return;
15572     if (r > t0) t0 = r;
15573   }
15574
15575   r = x1 - ax;
15576   if (!dx && r < 0) return;
15577   r /= dx;
15578   if (dx < 0) {
15579     if (r > t1) return;
15580     if (r > t0) t0 = r;
15581   } else if (dx > 0) {
15582     if (r < t0) return;
15583     if (r < t1) t1 = r;
15584   }
15585
15586   r = y0 - ay;
15587   if (!dy && r > 0) return;
15588   r /= dy;
15589   if (dy < 0) {
15590     if (r < t0) return;
15591     if (r < t1) t1 = r;
15592   } else if (dy > 0) {
15593     if (r > t1) return;
15594     if (r > t0) t0 = r;
15595   }
15596
15597   r = y1 - ay;
15598   if (!dy && r < 0) return;
15599   r /= dy;
15600   if (dy < 0) {
15601     if (r > t1) return;
15602     if (r > t0) t0 = r;
15603   } else if (dy > 0) {
15604     if (r < t0) return;
15605     if (r < t1) t1 = r;
15606   }
15607
15608   if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15609
15610   if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15611   if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15612   return true;
15613 }
15614
15615 function connectEdge(edge, x0, y0, x1, y1) {
15616   var v1 = edge[1];
15617   if (v1) return true;
15618
15619   var v0 = edge[0],
15620       left = edge.left,
15621       right = edge.right,
15622       lx = left[0],
15623       ly = left[1],
15624       rx = right[0],
15625       ry = right[1],
15626       fx = (lx + rx) / 2,
15627       fy = (ly + ry) / 2,
15628       fm,
15629       fb;
15630
15631   if (ry === ly) {
15632     if (fx < x0 || fx >= x1) return;
15633     if (lx > rx) {
15634       if (!v0) v0 = [fx, y0];
15635       else if (v0[1] >= y1) return;
15636       v1 = [fx, y1];
15637     } else {
15638       if (!v0) v0 = [fx, y1];
15639       else if (v0[1] < y0) return;
15640       v1 = [fx, y0];
15641     }
15642   } else {
15643     fm = (lx - rx) / (ry - ly);
15644     fb = fy - fm * fx;
15645     if (fm < -1 || fm > 1) {
15646       if (lx > rx) {
15647         if (!v0) v0 = [(y0 - fb) / fm, y0];
15648         else if (v0[1] >= y1) return;
15649         v1 = [(y1 - fb) / fm, y1];
15650       } else {
15651         if (!v0) v0 = [(y1 - fb) / fm, y1];
15652         else if (v0[1] < y0) return;
15653         v1 = [(y0 - fb) / fm, y0];
15654       }
15655     } else {
15656       if (ly < ry) {
15657         if (!v0) v0 = [x0, fm * x0 + fb];
15658         else if (v0[0] >= x1) return;
15659         v1 = [x1, fm * x1 + fb];
15660       } else {
15661         if (!v0) v0 = [x1, fm * x1 + fb];
15662         else if (v0[0] < x0) return;
15663         v1 = [x0, fm * x0 + fb];
15664       }
15665     }
15666   }
15667
15668   edge[0] = v0;
15669   edge[1] = v1;
15670   return true;
15671 }
15672
15673 function clipEdges(x0, y0, x1, y1) {
15674   var i = edges.length,
15675       edge;
15676
15677   while (i--) {
15678     if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15679         || !clipEdge(edge, x0, y0, x1, y1)
15680         || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15681             || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15682       delete edges[i];
15683     }
15684   }
15685 }
15686
15687 function createCell(site) {
15688   return cells[site.index] = {
15689     site: site,
15690     halfedges: []
15691   };
15692 }
15693
15694 function cellHalfedgeAngle(cell, edge) {
15695   var site = cell.site,
15696       va = edge.left,
15697       vb = edge.right;
15698   if (site === vb) vb = va, va = site;
15699   if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15700   if (site === va) va = edge[1], vb = edge[0];
15701   else va = edge[0], vb = edge[1];
15702   return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15703 }
15704
15705 function cellHalfedgeStart(cell, edge) {
15706   return edge[+(edge.left !== cell.site)];
15707 }
15708
15709 function cellHalfedgeEnd(cell, edge) {
15710   return edge[+(edge.left === cell.site)];
15711 }
15712
15713 function sortCellHalfedges() {
15714   for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15715     if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15716       var index = new Array(m),
15717           array = new Array(m);
15718       for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15719       index.sort(function(i, j) { return array[j] - array[i]; });
15720       for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15721       for (j = 0; j < m; ++j) halfedges[j] = array[j];
15722     }
15723   }
15724 }
15725
15726 function clipCells(x0, y0, x1, y1) {
15727   var nCells = cells.length,
15728       iCell,
15729       cell,
15730       site,
15731       iHalfedge,
15732       halfedges,
15733       nHalfedges,
15734       start,
15735       startX,
15736       startY,
15737       end,
15738       endX,
15739       endY,
15740       cover = true;
15741
15742   for (iCell = 0; iCell < nCells; ++iCell) {
15743     if (cell = cells[iCell]) {
15744       site = cell.site;
15745       halfedges = cell.halfedges;
15746       iHalfedge = halfedges.length;
15747
15748       // Remove any dangling clipped edges.
15749       while (iHalfedge--) {
15750         if (!edges[halfedges[iHalfedge]]) {
15751           halfedges.splice(iHalfedge, 1);
15752         }
15753       }
15754
15755       // Insert any border edges as necessary.
15756       iHalfedge = 0, nHalfedges = halfedges.length;
15757       while (iHalfedge < nHalfedges) {
15758         end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15759         start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15760         if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15761           halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15762               Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15763               : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15764               : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15765               : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15766               : null)) - 1);
15767           ++nHalfedges;
15768         }
15769       }
15770
15771       if (nHalfedges) cover = false;
15772     }
15773   }
15774
15775   // If there weren’t any edges, have the closest site cover the extent.
15776   // It doesn’t matter which corner of the extent we measure!
15777   if (cover) {
15778     var dx, dy, d2, dc = Infinity;
15779
15780     for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15781       if (cell = cells[iCell]) {
15782         site = cell.site;
15783         dx = site[0] - x0;
15784         dy = site[1] - y0;
15785         d2 = dx * dx + dy * dy;
15786         if (d2 < dc) dc = d2, cover = cell;
15787       }
15788     }
15789
15790     if (cover) {
15791       var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15792       cover.halfedges.push(
15793         edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15794         edges.push(createBorderEdge(site, v01, v11)) - 1,
15795         edges.push(createBorderEdge(site, v11, v10)) - 1,
15796         edges.push(createBorderEdge(site, v10, v00)) - 1
15797       );
15798     }
15799   }
15800
15801   // Lastly delete any cells with no edges; these were entirely clipped.
15802   for (iCell = 0; iCell < nCells; ++iCell) {
15803     if (cell = cells[iCell]) {
15804       if (!cell.halfedges.length) {
15805         delete cells[iCell];
15806       }
15807     }
15808   }
15809 }
15810
15811 var circlePool = [];
15812
15813 var firstCircle;
15814
15815 function Circle() {
15816   RedBlackNode(this);
15817   this.x =
15818   this.y =
15819   this.arc =
15820   this.site =
15821   this.cy = null;
15822 }
15823
15824 function attachCircle(arc) {
15825   var lArc = arc.P,
15826       rArc = arc.N;
15827
15828   if (!lArc || !rArc) return;
15829
15830   var lSite = lArc.site,
15831       cSite = arc.site,
15832       rSite = rArc.site;
15833
15834   if (lSite === rSite) return;
15835
15836   var bx = cSite[0],
15837       by = cSite[1],
15838       ax = lSite[0] - bx,
15839       ay = lSite[1] - by,
15840       cx = rSite[0] - bx,
15841       cy = rSite[1] - by;
15842
15843   var d = 2 * (ax * cy - ay * cx);
15844   if (d >= -epsilon2$2) return;
15845
15846   var ha = ax * ax + ay * ay,
15847       hc = cx * cx + cy * cy,
15848       x = (cy * ha - ay * hc) / d,
15849       y = (ax * hc - cx * ha) / d;
15850
15851   var circle = circlePool.pop() || new Circle;
15852   circle.arc = arc;
15853   circle.site = cSite;
15854   circle.x = x + bx;
15855   circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15856
15857   arc.circle = circle;
15858
15859   var before = null,
15860       node = circles._;
15861
15862   while (node) {
15863     if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15864       if (node.L) node = node.L;
15865       else { before = node.P; break; }
15866     } else {
15867       if (node.R) node = node.R;
15868       else { before = node; break; }
15869     }
15870   }
15871
15872   circles.insert(before, circle);
15873   if (!before) firstCircle = circle;
15874 }
15875
15876 function detachCircle(arc) {
15877   var circle = arc.circle;
15878   if (circle) {
15879     if (!circle.P) firstCircle = circle.N;
15880     circles.remove(circle);
15881     circlePool.push(circle);
15882     RedBlackNode(circle);
15883     arc.circle = null;
15884   }
15885 }
15886
15887 var beachPool = [];
15888
15889 function Beach() {
15890   RedBlackNode(this);
15891   this.edge =
15892   this.site =
15893   this.circle = null;
15894 }
15895
15896 function createBeach(site) {
15897   var beach = beachPool.pop() || new Beach;
15898   beach.site = site;
15899   return beach;
15900 }
15901
15902 function detachBeach(beach) {
15903   detachCircle(beach);
15904   beaches.remove(beach);
15905   beachPool.push(beach);
15906   RedBlackNode(beach);
15907 }
15908
15909 function removeBeach(beach) {
15910   var circle = beach.circle,
15911       x = circle.x,
15912       y = circle.cy,
15913       vertex = [x, y],
15914       previous = beach.P,
15915       next = beach.N,
15916       disappearing = [beach];
15917
15918   detachBeach(beach);
15919
15920   var lArc = previous;
15921   while (lArc.circle
15922       && Math.abs(x - lArc.circle.x) < epsilon$4
15923       && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15924     previous = lArc.P;
15925     disappearing.unshift(lArc);
15926     detachBeach(lArc);
15927     lArc = previous;
15928   }
15929
15930   disappearing.unshift(lArc);
15931   detachCircle(lArc);
15932
15933   var rArc = next;
15934   while (rArc.circle
15935       && Math.abs(x - rArc.circle.x) < epsilon$4
15936       && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15937     next = rArc.N;
15938     disappearing.push(rArc);
15939     detachBeach(rArc);
15940     rArc = next;
15941   }
15942
15943   disappearing.push(rArc);
15944   detachCircle(rArc);
15945
15946   var nArcs = disappearing.length,
15947       iArc;
15948   for (iArc = 1; iArc < nArcs; ++iArc) {
15949     rArc = disappearing[iArc];
15950     lArc = disappearing[iArc - 1];
15951     setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15952   }
15953
15954   lArc = disappearing[0];
15955   rArc = disappearing[nArcs - 1];
15956   rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15957
15958   attachCircle(lArc);
15959   attachCircle(rArc);
15960 }
15961
15962 function addBeach(site) {
15963   var x = site[0],
15964       directrix = site[1],
15965       lArc,
15966       rArc,
15967       dxl,
15968       dxr,
15969       node = beaches._;
15970
15971   while (node) {
15972     dxl = leftBreakPoint(node, directrix) - x;
15973     if (dxl > epsilon$4) node = node.L; else {
15974       dxr = x - rightBreakPoint(node, directrix);
15975       if (dxr > epsilon$4) {
15976         if (!node.R) {
15977           lArc = node;
15978           break;
15979         }
15980         node = node.R;
15981       } else {
15982         if (dxl > -epsilon$4) {
15983           lArc = node.P;
15984           rArc = node;
15985         } else if (dxr > -epsilon$4) {
15986           lArc = node;
15987           rArc = node.N;
15988         } else {
15989           lArc = rArc = node;
15990         }
15991         break;
15992       }
15993     }
15994   }
15995
15996   createCell(site);
15997   var newArc = createBeach(site);
15998   beaches.insert(lArc, newArc);
15999
16000   if (!lArc && !rArc) return;
16001
16002   if (lArc === rArc) {
16003     detachCircle(lArc);
16004     rArc = createBeach(lArc.site);
16005     beaches.insert(newArc, rArc);
16006     newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
16007     attachCircle(lArc);
16008     attachCircle(rArc);
16009     return;
16010   }
16011
16012   if (!rArc) { // && lArc
16013     newArc.edge = createEdge(lArc.site, newArc.site);
16014     return;
16015   }
16016
16017   // else lArc !== rArc
16018   detachCircle(lArc);
16019   detachCircle(rArc);
16020
16021   var lSite = lArc.site,
16022       ax = lSite[0],
16023       ay = lSite[1],
16024       bx = site[0] - ax,
16025       by = site[1] - ay,
16026       rSite = rArc.site,
16027       cx = rSite[0] - ax,
16028       cy = rSite[1] - ay,
16029       d = 2 * (bx * cy - by * cx),
16030       hb = bx * bx + by * by,
16031       hc = cx * cx + cy * cy,
16032       vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
16033
16034   setEdgeEnd(rArc.edge, lSite, rSite, vertex);
16035   newArc.edge = createEdge(lSite, site, null, vertex);
16036   rArc.edge = createEdge(site, rSite, null, vertex);
16037   attachCircle(lArc);
16038   attachCircle(rArc);
16039 }
16040
16041 function leftBreakPoint(arc, directrix) {
16042   var site = arc.site,
16043       rfocx = site[0],
16044       rfocy = site[1],
16045       pby2 = rfocy - directrix;
16046
16047   if (!pby2) return rfocx;
16048
16049   var lArc = arc.P;
16050   if (!lArc) return -Infinity;
16051
16052   site = lArc.site;
16053   var lfocx = site[0],
16054       lfocy = site[1],
16055       plby2 = lfocy - directrix;
16056
16057   if (!plby2) return lfocx;
16058
16059   var hl = lfocx - rfocx,
16060       aby2 = 1 / pby2 - 1 / plby2,
16061       b = hl / plby2;
16062
16063   if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16064
16065   return (rfocx + lfocx) / 2;
16066 }
16067
16068 function rightBreakPoint(arc, directrix) {
16069   var rArc = arc.N;
16070   if (rArc) return leftBreakPoint(rArc, directrix);
16071   var site = arc.site;
16072   return site[1] === directrix ? site[0] : Infinity;
16073 }
16074
16075 var epsilon$4 = 1e-6;
16076 var epsilon2$2 = 1e-12;
16077 var beaches;
16078 var cells;
16079 var circles;
16080 var edges;
16081
16082 function triangleArea(a, b, c) {
16083   return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16084 }
16085
16086 function lexicographic(a, b) {
16087   return b[1] - a[1]
16088       || b[0] - a[0];
16089 }
16090
16091 function Diagram(sites, extent) {
16092   var site = sites.sort(lexicographic).pop(),
16093       x,
16094       y,
16095       circle;
16096
16097   edges = [];
16098   cells = new Array(sites.length);
16099   beaches = new RedBlackTree;
16100   circles = new RedBlackTree;
16101
16102   while (true) {
16103     circle = firstCircle;
16104     if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
16105       if (site[0] !== x || site[1] !== y) {
16106         addBeach(site);
16107         x = site[0], y = site[1];
16108       }
16109       site = sites.pop();
16110     } else if (circle) {
16111       removeBeach(circle.arc);
16112     } else {
16113       break;
16114     }
16115   }
16116
16117   sortCellHalfedges();
16118
16119   if (extent) {
16120     var x0 = +extent[0][0],
16121         y0 = +extent[0][1],
16122         x1 = +extent[1][0],
16123         y1 = +extent[1][1];
16124     clipEdges(x0, y0, x1, y1);
16125     clipCells(x0, y0, x1, y1);
16126   }
16127
16128   this.edges = edges;
16129   this.cells = cells;
16130
16131   beaches =
16132   circles =
16133   edges =
16134   cells = null;
16135 }
16136
16137 Diagram.prototype = {
16138   constructor: Diagram,
16139
16140   polygons: function() {
16141     var edges = this.edges;
16142
16143     return this.cells.map(function(cell) {
16144       var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16145       polygon.data = cell.site.data;
16146       return polygon;
16147     });
16148   },
16149
16150   triangles: function() {
16151     var triangles = [],
16152         edges = this.edges;
16153
16154     this.cells.forEach(function(cell, i) {
16155       if (!(m = (halfedges = cell.halfedges).length)) return;
16156       var site = cell.site,
16157           halfedges,
16158           j = -1,
16159           m,
16160           s0,
16161           e1 = edges[halfedges[m - 1]],
16162           s1 = e1.left === site ? e1.right : e1.left;
16163
16164       while (++j < m) {
16165         s0 = s1;
16166         e1 = edges[halfedges[j]];
16167         s1 = e1.left === site ? e1.right : e1.left;
16168         if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16169           triangles.push([site.data, s0.data, s1.data]);
16170         }
16171       }
16172     });
16173
16174     return triangles;
16175   },
16176
16177   links: function() {
16178     return this.edges.filter(function(edge) {
16179       return edge.right;
16180     }).map(function(edge) {
16181       return {
16182         source: edge.left.data,
16183         target: edge.right.data
16184       };
16185     });
16186   },
16187
16188   find: function(x, y, radius) {
16189     var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16190
16191     // Use the previously-found cell, or start with an arbitrary one.
16192     while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16193     var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16194
16195     // Traverse the half-edges to find a closer cell, if any.
16196     do {
16197       cell = that.cells[i0 = i1], i1 = null;
16198       cell.halfedges.forEach(function(e) {
16199         var edge = that.edges[e], v = edge.left;
16200         if ((v === cell.site || !v) && !(v = edge.right)) return;
16201         var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16202         if (v2 < d2) d2 = v2, i1 = v.index;
16203       });
16204     } while (i1 !== null);
16205
16206     that._found = i0;
16207
16208     return radius == null || d2 <= radius * radius ? cell.site : null;
16209   }
16210 };
16211
16212 function voronoi() {
16213   var x$$1 = x$4,
16214       y$$1 = y$4,
16215       extent = null;
16216
16217   function voronoi(data) {
16218     return new Diagram(data.map(function(d, i) {
16219       var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4];
16220       s.index = i;
16221       s.data = d;
16222       return s;
16223     }), extent);
16224   }
16225
16226   voronoi.polygons = function(data) {
16227     return voronoi(data).polygons();
16228   };
16229
16230   voronoi.links = function(data) {
16231     return voronoi(data).links();
16232   };
16233
16234   voronoi.triangles = function(data) {
16235     return voronoi(data).triangles();
16236   };
16237
16238   voronoi.x = function(_) {
16239     return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$11(+_), voronoi) : x$$1;
16240   };
16241
16242   voronoi.y = function(_) {
16243     return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$11(+_), voronoi) : y$$1;
16244   };
16245
16246   voronoi.extent = function(_) {
16247     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]]];
16248   };
16249
16250   voronoi.size = function(_) {
16251     return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16252   };
16253
16254   return voronoi;
16255 }
16256
16257 function constant$12(x) {
16258   return function() {
16259     return x;
16260   };
16261 }
16262
16263 function ZoomEvent(target, type, transform) {
16264   this.target = target;
16265   this.type = type;
16266   this.transform = transform;
16267 }
16268
16269 function Transform(k, x, y) {
16270   this.k = k;
16271   this.x = x;
16272   this.y = y;
16273 }
16274
16275 Transform.prototype = {
16276   constructor: Transform,
16277   scale: function(k) {
16278     return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16279   },
16280   translate: function(x, y) {
16281     return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16282   },
16283   apply: function(point) {
16284     return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16285   },
16286   applyX: function(x) {
16287     return x * this.k + this.x;
16288   },
16289   applyY: function(y) {
16290     return y * this.k + this.y;
16291   },
16292   invert: function(location) {
16293     return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16294   },
16295   invertX: function(x) {
16296     return (x - this.x) / this.k;
16297   },
16298   invertY: function(y) {
16299     return (y - this.y) / this.k;
16300   },
16301   rescaleX: function(x) {
16302     return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16303   },
16304   rescaleY: function(y) {
16305     return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16306   },
16307   toString: function() {
16308     return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16309   }
16310 };
16311
16312 var identity$7 = new Transform(1, 0, 0);
16313
16314 transform.prototype = Transform.prototype;
16315
16316 function transform(node) {
16317   return node.__zoom || identity$7;
16318 }
16319
16320 function nopropagation$2() {
16321   event.stopImmediatePropagation();
16322 }
16323
16324 function noevent$2() {
16325   event.preventDefault();
16326   event.stopImmediatePropagation();
16327 }
16328
16329 // Ignore right-click, since that should open the context menu.
16330 function defaultFilter$2() {
16331   return !event.button;
16332 }
16333
16334 function defaultExtent$1() {
16335   var e = this, w, h;
16336   if (e instanceof SVGElement) {
16337     e = e.ownerSVGElement || e;
16338     w = e.width.baseVal.value;
16339     h = e.height.baseVal.value;
16340   } else {
16341     w = e.clientWidth;
16342     h = e.clientHeight;
16343   }
16344   return [[0, 0], [w, h]];
16345 }
16346
16347 function defaultTransform() {
16348   return this.__zoom || identity$7;
16349 }
16350
16351 function defaultWheelDelta() {
16352   return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16353 }
16354
16355 function defaultTouchable$1() {
16356   return "ontouchstart" in this;
16357 }
16358
16359 function defaultConstrain(transform$$1, extent, translateExtent) {
16360   var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
16361       dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
16362       dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
16363       dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
16364   return transform$$1.translate(
16365     dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16366     dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16367   );
16368 }
16369
16370 function d3_zoom() {
16371   var filter = defaultFilter$2,
16372       extent = defaultExtent$1,
16373       constrain = defaultConstrain,
16374       wheelDelta = defaultWheelDelta,
16375       touchable = defaultTouchable$1,
16376       scaleExtent = [0, Infinity],
16377       translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
16378       duration = 250,
16379       interpolate = interpolateZoom,
16380       gestures = [],
16381       listeners = dispatch("start", "zoom", "end"),
16382       touchstarting,
16383       touchending,
16384       touchDelay = 500,
16385       wheelDelay = 150,
16386       clickDistance2 = 0;
16387
16388   function zoom(selection$$1) {
16389     selection$$1
16390         .property("__zoom", defaultTransform)
16391         .on("wheel.zoom", wheeled)
16392         .on("mousedown.zoom", mousedowned)
16393         .on("dblclick.zoom", dblclicked)
16394       .filter(touchable)
16395         .on("touchstart.zoom", touchstarted)
16396         .on("touchmove.zoom", touchmoved)
16397         .on("touchend.zoom touchcancel.zoom", touchended)
16398         .style("touch-action", "none")
16399         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16400   }
16401
16402   zoom.transform = function(collection, transform$$1) {
16403     var selection$$1 = collection.selection ? collection.selection() : collection;
16404     selection$$1.property("__zoom", defaultTransform);
16405     if (collection !== selection$$1) {
16406       schedule(collection, transform$$1);
16407     } else {
16408       selection$$1.interrupt().each(function() {
16409         gesture(this, arguments)
16410             .start()
16411             .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16412             .end();
16413       });
16414     }
16415   };
16416
16417   zoom.scaleBy = function(selection$$1, k) {
16418     zoom.scaleTo(selection$$1, function() {
16419       var k0 = this.__zoom.k,
16420           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16421       return k0 * k1;
16422     });
16423   };
16424
16425   zoom.scaleTo = function(selection$$1, k) {
16426     zoom.transform(selection$$1, function() {
16427       var e = extent.apply(this, arguments),
16428           t0 = this.__zoom,
16429           p0 = centroid(e),
16430           p1 = t0.invert(p0),
16431           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16432       return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
16433     });
16434   };
16435
16436   zoom.translateBy = function(selection$$1, x, y) {
16437     zoom.transform(selection$$1, function() {
16438       return constrain(this.__zoom.translate(
16439         typeof x === "function" ? x.apply(this, arguments) : x,
16440         typeof y === "function" ? y.apply(this, arguments) : y
16441       ), extent.apply(this, arguments), translateExtent);
16442     });
16443   };
16444
16445   zoom.translateTo = function(selection$$1, x, y) {
16446     zoom.transform(selection$$1, function() {
16447       var e = extent.apply(this, arguments),
16448           t = this.__zoom,
16449           p = centroid(e);
16450       return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16451         typeof x === "function" ? -x.apply(this, arguments) : -x,
16452         typeof y === "function" ? -y.apply(this, arguments) : -y
16453       ), e, translateExtent);
16454     });
16455   };
16456
16457   function scale(transform$$1, k) {
16458     k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16459     return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16460   }
16461
16462   function translate(transform$$1, p0, p1) {
16463     var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16464     return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16465   }
16466
16467   function centroid(extent) {
16468     return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16469   }
16470
16471   function schedule(transition$$1, transform$$1, center) {
16472     transition$$1
16473         .on("start.zoom", function() { gesture(this, arguments).start(); })
16474         .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16475         .tween("zoom", function() {
16476           var that = this,
16477               args = arguments,
16478               g = gesture(that, args),
16479               e = extent.apply(that, args),
16480               p = center || centroid(e),
16481               w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16482               a = that.__zoom,
16483               b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16484               i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16485           return function(t) {
16486             if (t === 1) t = b; // Avoid rounding error on end.
16487             else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16488             g.zoom(null, t);
16489           };
16490         });
16491   }
16492
16493   function gesture(that, args) {
16494     for (var i = 0, n = gestures.length, g; i < n; ++i) {
16495       if ((g = gestures[i]).that === that) {
16496         return g;
16497       }
16498     }
16499     return new Gesture(that, args);
16500   }
16501
16502   function Gesture(that, args) {
16503     this.that = that;
16504     this.args = args;
16505     this.index = -1;
16506     this.active = 0;
16507     this.extent = extent.apply(that, args);
16508   }
16509
16510   Gesture.prototype = {
16511     start: function() {
16512       if (++this.active === 1) {
16513         this.index = gestures.push(this) - 1;
16514         this.emit("start");
16515       }
16516       return this;
16517     },
16518     zoom: function(key, transform$$1) {
16519       if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16520       if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16521       if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16522       this.that.__zoom = transform$$1;
16523       this.emit("zoom");
16524       return this;
16525     },
16526     end: function() {
16527       if (--this.active === 0) {
16528         gestures.splice(this.index, 1);
16529         this.index = -1;
16530         this.emit("end");
16531       }
16532       return this;
16533     },
16534     emit: function(type) {
16535       customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16536     }
16537   };
16538
16539   function wheeled() {
16540     if (!filter.apply(this, arguments)) return;
16541     var g = gesture(this, arguments),
16542         t = this.__zoom,
16543         k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16544         p = d3_mouse(this);
16545
16546     // If the mouse is in the same location as before, reuse it.
16547     // If there were recent wheel events, reset the wheel idle timeout.
16548     if (g.wheel) {
16549       if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16550         g.mouse[1] = t.invert(g.mouse[0] = p);
16551       }
16552       clearTimeout(g.wheel);
16553     }
16554
16555     // If this wheel event won’t trigger a transform change, ignore it.
16556     else if (t.k === k) return;
16557
16558     // Otherwise, capture the mouse point and location at the start.
16559     else {
16560       g.mouse = [p, t.invert(p)];
16561       interrupt(this);
16562       g.start();
16563     }
16564
16565     noevent$2();
16566     g.wheel = setTimeout(wheelidled, wheelDelay);
16567     g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16568
16569     function wheelidled() {
16570       g.wheel = null;
16571       g.end();
16572     }
16573   }
16574
16575   function mousedowned() {
16576     if (touchending || !filter.apply(this, arguments)) return;
16577     var g = gesture(this, arguments),
16578         v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16579         p = d3_mouse(this),
16580         x0 = event.clientX,
16581         y0 = event.clientY;
16582
16583     dragDisable(event.view);
16584     nopropagation$2();
16585     g.mouse = [p, this.__zoom.invert(p)];
16586     interrupt(this);
16587     g.start();
16588
16589     function mousemoved() {
16590       noevent$2();
16591       if (!g.moved) {
16592         var dx = event.clientX - x0, dy = event.clientY - y0;
16593         g.moved = dx * dx + dy * dy > clickDistance2;
16594       }
16595       g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16596     }
16597
16598     function mouseupped() {
16599       v.on("mousemove.zoom mouseup.zoom", null);
16600       yesdrag(event.view, g.moved);
16601       noevent$2();
16602       g.end();
16603     }
16604   }
16605
16606   function dblclicked() {
16607     if (!filter.apply(this, arguments)) return;
16608     var t0 = this.__zoom,
16609         p0 = d3_mouse(this),
16610         p1 = t0.invert(p0),
16611         k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16612         t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
16613
16614     noevent$2();
16615     if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
16616     else d3_select(this).call(zoom.transform, t1);
16617   }
16618
16619   function touchstarted() {
16620     if (!filter.apply(this, arguments)) return;
16621     var g = gesture(this, arguments),
16622         touches = event.changedTouches,
16623         started,
16624         n = touches.length, i, t, p;
16625
16626     nopropagation$2();
16627     for (i = 0; i < n; ++i) {
16628       t = touches[i], p = touch(this, touches, t.identifier);
16629       p = [p, this.__zoom.invert(p), t.identifier];
16630       if (!g.touch0) g.touch0 = p, started = true;
16631       else if (!g.touch1) g.touch1 = p;
16632     }
16633
16634     // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16635     if (touchstarting) {
16636       touchstarting = clearTimeout(touchstarting);
16637       if (!g.touch1) {
16638         g.end();
16639         p = d3_select(this).on("dblclick.zoom");
16640         if (p) p.apply(this, arguments);
16641         return;
16642       }
16643     }
16644
16645     if (started) {
16646       touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16647       interrupt(this);
16648       g.start();
16649     }
16650   }
16651
16652   function touchmoved() {
16653     var g = gesture(this, arguments),
16654         touches = event.changedTouches,
16655         n = touches.length, i, t, p, l;
16656
16657     noevent$2();
16658     if (touchstarting) touchstarting = clearTimeout(touchstarting);
16659     for (i = 0; i < n; ++i) {
16660       t = touches[i], p = touch(this, touches, t.identifier);
16661       if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16662       else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16663     }
16664     t = g.that.__zoom;
16665     if (g.touch1) {
16666       var p0 = g.touch0[0], l0 = g.touch0[1],
16667           p1 = g.touch1[0], l1 = g.touch1[1],
16668           dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16669           dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16670       t = scale(t, Math.sqrt(dp / dl));
16671       p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16672       l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16673     }
16674     else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16675     else return;
16676     g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16677   }
16678
16679   function touchended() {
16680     var g = gesture(this, arguments),
16681         touches = event.changedTouches,
16682         n = touches.length, i, t;
16683
16684     nopropagation$2();
16685     if (touchending) clearTimeout(touchending);
16686     touchending = setTimeout(function() { touchending = null; }, touchDelay);
16687     for (i = 0; i < n; ++i) {
16688       t = touches[i];
16689       if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16690       else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16691     }
16692     if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16693     if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16694     else g.end();
16695   }
16696
16697   zoom.wheelDelta = function(_) {
16698     return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$12(+_), zoom) : wheelDelta;
16699   };
16700
16701   zoom.filter = function(_) {
16702     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$12(!!_), zoom) : filter;
16703   };
16704
16705   zoom.touchable = function(_) {
16706     return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$12(!!_), zoom) : touchable;
16707   };
16708
16709   zoom.extent = function(_) {
16710     return arguments.length ? (extent = typeof _ === "function" ? _ : constant$12([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16711   };
16712
16713   zoom.scaleExtent = function(_) {
16714     return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16715   };
16716
16717   zoom.translateExtent = function(_) {
16718     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]]];
16719   };
16720
16721   zoom.constrain = function(_) {
16722     return arguments.length ? (constrain = _, zoom) : constrain;
16723   };
16724
16725   zoom.duration = function(_) {
16726     return arguments.length ? (duration = +_, zoom) : duration;
16727   };
16728
16729   zoom.interpolate = function(_) {
16730     return arguments.length ? (interpolate = _, zoom) : interpolate;
16731   };
16732
16733   zoom.on = function() {
16734     var value = listeners.on.apply(listeners, arguments);
16735     return value === listeners ? zoom : value;
16736   };
16737
16738   zoom.clickDistance = function(_) {
16739     return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16740   };
16741
16742   return zoom;
16743 }
16744
16745
16746
16747 var index$3 = Object.freeze({
16748         version: version,
16749         bisect: bisectRight,
16750         bisectRight: bisectRight,
16751         bisectLeft: bisectLeft,
16752         ascending: d3_ascending,
16753         bisector: d3_bisector,
16754         cross: cross,
16755         descending: d3_descending,
16756         deviation: deviation,
16757         extent: extent,
16758         histogram: histogram,
16759         thresholdFreedmanDiaconis: freedmanDiaconis,
16760         thresholdScott: scott,
16761         thresholdSturges: sturges,
16762         max: max,
16763         mean: mean,
16764         median: d3_median,
16765         merge: merge,
16766         min: min,
16767         pairs: pairs,
16768         permute: permute,
16769         quantile: threshold,
16770         range: d3_range,
16771         scan: scan,
16772         shuffle: shuffle,
16773         sum: sum,
16774         ticks: ticks,
16775         tickIncrement: tickIncrement,
16776         tickStep: tickStep,
16777         transpose: transpose,
16778         variance: variance,
16779         zip: zip,
16780         axisTop: axisTop,
16781         axisRight: axisRight,
16782         axisBottom: axisBottom,
16783         axisLeft: axisLeft,
16784         brush: brush,
16785         brushX: brushX,
16786         brushY: brushY,
16787         brushSelection: brushSelection,
16788         chord: chord,
16789         ribbon: ribbon,
16790         nest: nest,
16791         set: set$2,
16792         map: map$1,
16793         keys: keys,
16794         values: values,
16795         entries: entries,
16796         color: color,
16797         rgb: rgb,
16798         hsl: hsl,
16799         lab: lab,
16800         hcl: hcl,
16801         cubehelix: cubehelix,
16802         dispatch: dispatch,
16803         drag: drag,
16804         dragDisable: dragDisable,
16805         dragEnable: yesdrag,
16806         dsvFormat: dsv,
16807         csvParse: csvParse,
16808         csvParseRows: csvParseRows,
16809         csvFormat: csvFormat,
16810         csvFormatRows: csvFormatRows,
16811         tsvParse: tsvParse,
16812         tsvParseRows: tsvParseRows,
16813         tsvFormat: tsvFormat,
16814         tsvFormatRows: tsvFormatRows,
16815         easeLinear: linear$1,
16816         easeQuad: quadInOut,
16817         easeQuadIn: quadIn,
16818         easeQuadOut: quadOut,
16819         easeQuadInOut: quadInOut,
16820         easeCubic: cubicInOut,
16821         easeCubicIn: cubicIn,
16822         easeCubicOut: cubicOut,
16823         easeCubicInOut: cubicInOut,
16824         easePoly: polyInOut,
16825         easePolyIn: polyIn,
16826         easePolyOut: polyOut,
16827         easePolyInOut: polyInOut,
16828         easeSin: sinInOut,
16829         easeSinIn: sinIn,
16830         easeSinOut: sinOut,
16831         easeSinInOut: sinInOut,
16832         easeExp: expInOut,
16833         easeExpIn: expIn,
16834         easeExpOut: expOut,
16835         easeExpInOut: expInOut,
16836         easeCircle: circleInOut,
16837         easeCircleIn: circleIn,
16838         easeCircleOut: circleOut,
16839         easeCircleInOut: circleInOut,
16840         easeBounce: bounceOut,
16841         easeBounceIn: bounceIn,
16842         easeBounceOut: bounceOut,
16843         easeBounceInOut: bounceInOut,
16844         easeBack: backInOut,
16845         easeBackIn: backIn,
16846         easeBackOut: backOut,
16847         easeBackInOut: backInOut,
16848         easeElastic: elasticOut,
16849         easeElasticIn: elasticIn,
16850         easeElasticOut: elasticOut,
16851         easeElasticInOut: elasticInOut,
16852         forceCenter: center$1,
16853         forceCollide: collide,
16854         forceLink: link,
16855         forceManyBody: manyBody,
16856         forceRadial: radial,
16857         forceSimulation: simulation,
16858         forceX: x$2,
16859         forceY: y$2,
16860         formatDefaultLocale: defaultLocale,
16861         get format () { return format; },
16862         get formatPrefix () { return formatPrefix; },
16863         formatLocale: formatLocale,
16864         formatSpecifier: formatSpecifier,
16865         precisionFixed: precisionFixed,
16866         precisionPrefix: precisionPrefix,
16867         precisionRound: precisionRound,
16868         geoArea: d3_geoArea,
16869         geoBounds: d3_geoBounds,
16870         geoCentroid: d3_geoCentroid,
16871         geoCircle: circle,
16872         geoClipAntimeridian: clipAntimeridian,
16873         geoClipCircle: clipCircle,
16874         geoClipExtent: extent$1,
16875         geoClipRectangle: clipRectangle,
16876         geoContains: contains,
16877         geoDistance: distance,
16878         geoGraticule: graticule,
16879         geoGraticule10: graticule10,
16880         geoInterpolate: interpolate$1,
16881         geoLength: d3_geoLength,
16882         geoPath: d3_geoPath,
16883         geoAlbers: albers,
16884         geoAlbersUsa: albersUsa,
16885         geoAzimuthalEqualArea: azimuthalEqualArea,
16886         geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16887         geoAzimuthalEquidistant: azimuthalEquidistant,
16888         geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16889         geoConicConformal: conicConformal,
16890         geoConicConformalRaw: conicConformalRaw,
16891         geoConicEqualArea: conicEqualArea,
16892         geoConicEqualAreaRaw: conicEqualAreaRaw,
16893         geoConicEquidistant: conicEquidistant,
16894         geoConicEquidistantRaw: conicEquidistantRaw,
16895         geoEquirectangular: equirectangular,
16896         geoEquirectangularRaw: equirectangularRaw,
16897         geoGnomonic: gnomonic,
16898         geoGnomonicRaw: gnomonicRaw,
16899         geoIdentity: d3_geoIdentity,
16900         geoProjection: projection,
16901         geoProjectionMutator: projectionMutator,
16902         geoMercator: mercator,
16903         geoMercatorRaw: mercatorRaw,
16904         geoNaturalEarth1: naturalEarth1,
16905         geoNaturalEarth1Raw: naturalEarth1Raw,
16906         geoOrthographic: orthographic,
16907         geoOrthographicRaw: orthographicRaw,
16908         geoStereographic: stereographic,
16909         geoStereographicRaw: stereographicRaw,
16910         geoTransverseMercator: transverseMercator,
16911         geoTransverseMercatorRaw: transverseMercatorRaw,
16912         geoRotation: rotation,
16913         geoStream: d3_geoStream,
16914         geoTransform: d3_geoTransform,
16915         cluster: cluster,
16916         hierarchy: hierarchy,
16917         pack: index$1,
16918         packSiblings: siblings,
16919         packEnclose: enclose,
16920         partition: partition,
16921         stratify: stratify,
16922         tree: tree,
16923         treemap: index$2,
16924         treemapBinary: binary,
16925         treemapDice: treemapDice,
16926         treemapSlice: treemapSlice,
16927         treemapSliceDice: sliceDice,
16928         treemapSquarify: squarify,
16929         treemapResquarify: resquarify,
16930         interpolate: d3_interpolate,
16931         interpolateArray: array$1,
16932         interpolateBasis: basis$1,
16933         interpolateBasisClosed: basisClosed,
16934         interpolateDate: date,
16935         interpolateNumber: d3_interpolateNumber,
16936         interpolateObject: object,
16937         interpolateRound: interpolateRound,
16938         interpolateString: interpolateString,
16939         interpolateTransformCss: interpolateTransformCss,
16940         interpolateTransformSvg: interpolateTransformSvg,
16941         interpolateZoom: interpolateZoom,
16942         interpolateRgb: d3_interpolateRgb,
16943         interpolateRgbBasis: rgbBasis,
16944         interpolateRgbBasisClosed: rgbBasisClosed,
16945         interpolateHsl: hsl$2,
16946         interpolateHslLong: hslLong,
16947         interpolateLab: lab$1,
16948         interpolateHcl: hcl$2,
16949         interpolateHclLong: hclLong,
16950         interpolateCubehelix: cubehelix$2,
16951         interpolateCubehelixLong: cubehelixLong,
16952         quantize: d3_quantize,
16953         path: path,
16954         polygonArea: d3_polygonArea,
16955         polygonCentroid: d3_polygonCentroid,
16956         polygonHull: d3_polygonHull,
16957         polygonContains: contains$1,
16958         polygonLength: length$1,
16959         quadtree: quadtree,
16960         queue: queue,
16961         randomUniform: uniform,
16962         randomNormal: normal,
16963         randomLogNormal: logNormal,
16964         randomBates: bates,
16965         randomIrwinHall: irwinHall,
16966         randomExponential: exponential$1,
16967         request: d3_request,
16968         html: html,
16969         json: d3_json,
16970         text: d3_text,
16971         xml: d3_xml,
16972         csv: csv$1,
16973         tsv: tsv$1,
16974         scaleBand: band,
16975         scalePoint: point$1,
16976         scaleIdentity: identity$5,
16977         scaleLinear: linear$2,
16978         scaleLog: log$1,
16979         scaleOrdinal: ordinal,
16980         scaleImplicit: implicit,
16981         scalePow: pow$1,
16982         scaleSqrt: sqrt$1,
16983         scaleQuantile: quantile$$1,
16984         scaleQuantize: quantize,
16985         scaleThreshold: threshold$1,
16986         scaleTime: time,
16987         scaleUtc: utcTime,
16988         schemeCategory10: category10,
16989         schemeCategory20b: category20b,
16990         schemeCategory20c: category20c,
16991         schemeCategory20: category20,
16992         interpolateCubehelixDefault: cubehelix$3,
16993         interpolateRainbow: rainbow$1,
16994         interpolateWarm: warm,
16995         interpolateCool: cool,
16996         interpolateViridis: viridis,
16997         interpolateMagma: magma,
16998         interpolateInferno: inferno,
16999         interpolatePlasma: plasma,
17000         scaleSequential: sequential,
17001         create: create,
17002         creator: creator,
17003         local: local,
17004         matcher: matcher$1,
17005         mouse: d3_mouse,
17006         namespace: namespace,
17007         namespaces: namespaces,
17008         clientPoint: point,
17009         select: d3_select,
17010         selectAll: d3_selectAll,
17011         selection: selection,
17012         selector: selector,
17013         selectorAll: selectorAll,
17014         style: styleValue,
17015         touch: touch,
17016         touches: d3_touches,
17017         window: defaultView,
17018         get event () { return event; },
17019         customEvent: customEvent,
17020         arc: arc,
17021         area: area,
17022         line: line,
17023         pie: pie,
17024         areaRadial: areaRadial,
17025         radialArea: areaRadial,
17026         lineRadial: lineRadial$1,
17027         radialLine: lineRadial$1,
17028         pointRadial: pointRadial,
17029         linkHorizontal: linkHorizontal,
17030         linkVertical: linkVertical,
17031         linkRadial: linkRadial,
17032         symbol: symbol,
17033         symbols: symbols,
17034         symbolCircle: circle$2,
17035         symbolCross: cross$2,
17036         symbolDiamond: diamond,
17037         symbolSquare: square,
17038         symbolStar: star,
17039         symbolTriangle: triangle,
17040         symbolWye: wye,
17041         curveBasisClosed: basisClosed$1,
17042         curveBasisOpen: basisOpen,
17043         curveBasis: basis$2,
17044         curveBundle: bundle,
17045         curveCardinalClosed: cardinalClosed,
17046         curveCardinalOpen: cardinalOpen,
17047         curveCardinal: cardinal,
17048         curveCatmullRomClosed: catmullRomClosed,
17049         curveCatmullRomOpen: catmullRomOpen,
17050         curveCatmullRom: catmullRom,
17051         curveLinearClosed: linearClosed,
17052         curveLinear: curveLinear,
17053         curveMonotoneX: monotoneX,
17054         curveMonotoneY: monotoneY,
17055         curveNatural: natural,
17056         curveStep: step,
17057         curveStepAfter: stepAfter,
17058         curveStepBefore: stepBefore,
17059         stack: stack,
17060         stackOffsetExpand: expand,
17061         stackOffsetDiverging: diverging,
17062         stackOffsetNone: none$1,
17063         stackOffsetSilhouette: silhouette,
17064         stackOffsetWiggle: wiggle,
17065         stackOrderAscending: ascending$1,
17066         stackOrderDescending: descending$1,
17067         stackOrderInsideOut: insideOut,
17068         stackOrderNone: none$2,
17069         stackOrderReverse: reverse,
17070         timeInterval: newInterval,
17071         timeMillisecond: millisecond,
17072         timeMilliseconds: milliseconds,
17073         utcMillisecond: millisecond,
17074         utcMilliseconds: milliseconds,
17075         timeSecond: second,
17076         timeSeconds: seconds,
17077         utcSecond: second,
17078         utcSeconds: seconds,
17079         timeMinute: minute,
17080         timeMinutes: minutes,
17081         timeHour: hour,
17082         timeHours: hours,
17083         timeDay: day,
17084         timeDays: days,
17085         timeWeek: sunday,
17086         timeWeeks: sundays,
17087         timeSunday: sunday,
17088         timeSundays: sundays,
17089         timeMonday: monday,
17090         timeMondays: mondays,
17091         timeTuesday: tuesday,
17092         timeTuesdays: tuesdays,
17093         timeWednesday: wednesday,
17094         timeWednesdays: wednesdays,
17095         timeThursday: thursday,
17096         timeThursdays: thursdays,
17097         timeFriday: friday,
17098         timeFridays: fridays,
17099         timeSaturday: saturday,
17100         timeSaturdays: saturdays,
17101         timeMonth: month,
17102         timeMonths: months,
17103         timeYear: year,
17104         timeYears: years,
17105         utcMinute: utcMinute,
17106         utcMinutes: utcMinutes,
17107         utcHour: utcHour,
17108         utcHours: utcHours,
17109         utcDay: utcDay,
17110         utcDays: utcDays,
17111         utcWeek: utcSunday,
17112         utcWeeks: utcSundays,
17113         utcSunday: utcSunday,
17114         utcSundays: utcSundays,
17115         utcMonday: utcMonday,
17116         utcMondays: utcMondays,
17117         utcTuesday: utcTuesday,
17118         utcTuesdays: utcTuesdays,
17119         utcWednesday: utcWednesday,
17120         utcWednesdays: utcWednesdays,
17121         utcThursday: utcThursday,
17122         utcThursdays: utcThursdays,
17123         utcFriday: utcFriday,
17124         utcFridays: utcFridays,
17125         utcSaturday: utcSaturday,
17126         utcSaturdays: utcSaturdays,
17127         utcMonth: utcMonth,
17128         utcMonths: utcMonths,
17129         utcYear: utcYear,
17130         utcYears: utcYears,
17131         timeFormatDefaultLocale: defaultLocale$1,
17132         get timeFormat () { return timeFormat; },
17133         get timeParse () { return timeParse; },
17134         get utcFormat () { return utcFormat; },
17135         get utcParse () { return utcParse; },
17136         timeFormatLocale: formatLocale$1,
17137         isoFormat: formatIso,
17138         isoParse: parseIso,
17139         now: now,
17140         timer: timer,
17141         timerFlush: timerFlush,
17142         timeout: d3_timeout,
17143         interval: interval$1,
17144         transition: transition,
17145         active: active,
17146         interrupt: interrupt,
17147         voronoi: voronoi,
17148         zoom: d3_zoom,
17149         zoomTransform: transform,
17150         zoomIdentity: identity$7
17151 });
17152
17153 function actionAddEntity(way) {
17154     return function(graph) {
17155         return graph.replace(way);
17156     };
17157 }
17158
17159 /**
17160  * Removes all key-value entries from the list cache.
17161  *
17162  * @private
17163  * @name clear
17164  * @memberOf ListCache
17165  */
17166 function listCacheClear() {
17167   this.__data__ = [];
17168   this.size = 0;
17169 }
17170
17171 /**
17172  * Performs a
17173  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17174  * comparison between two values to determine if they are equivalent.
17175  *
17176  * @static
17177  * @memberOf _
17178  * @since 4.0.0
17179  * @category Lang
17180  * @param {*} value The value to compare.
17181  * @param {*} other The other value to compare.
17182  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17183  * @example
17184  *
17185  * var object = { 'a': 1 };
17186  * var other = { 'a': 1 };
17187  *
17188  * _.eq(object, object);
17189  * // => true
17190  *
17191  * _.eq(object, other);
17192  * // => false
17193  *
17194  * _.eq('a', 'a');
17195  * // => true
17196  *
17197  * _.eq('a', Object('a'));
17198  * // => false
17199  *
17200  * _.eq(NaN, NaN);
17201  * // => true
17202  */
17203 function eq(value, other) {
17204   return value === other || (value !== value && other !== other);
17205 }
17206
17207 /**
17208  * Gets the index at which the `key` is found in `array` of key-value pairs.
17209  *
17210  * @private
17211  * @param {Array} array The array to inspect.
17212  * @param {*} key The key to search for.
17213  * @returns {number} Returns the index of the matched value, else `-1`.
17214  */
17215 function assocIndexOf(array, key) {
17216   var length = array.length;
17217   while (length--) {
17218     if (eq(array[length][0], key)) {
17219       return length;
17220     }
17221   }
17222   return -1;
17223 }
17224
17225 /** Used for built-in method references. */
17226 var arrayProto = Array.prototype;
17227
17228 /** Built-in value references. */
17229 var splice = arrayProto.splice;
17230
17231 /**
17232  * Removes `key` and its value from the list cache.
17233  *
17234  * @private
17235  * @name delete
17236  * @memberOf ListCache
17237  * @param {string} key The key of the value to remove.
17238  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17239  */
17240 function listCacheDelete(key) {
17241   var data = this.__data__,
17242       index = assocIndexOf(data, key);
17243
17244   if (index < 0) {
17245     return false;
17246   }
17247   var lastIndex = data.length - 1;
17248   if (index == lastIndex) {
17249     data.pop();
17250   } else {
17251     splice.call(data, index, 1);
17252   }
17253   --this.size;
17254   return true;
17255 }
17256
17257 /**
17258  * Gets the list cache value for `key`.
17259  *
17260  * @private
17261  * @name get
17262  * @memberOf ListCache
17263  * @param {string} key The key of the value to get.
17264  * @returns {*} Returns the entry value.
17265  */
17266 function listCacheGet(key) {
17267   var data = this.__data__,
17268       index = assocIndexOf(data, key);
17269
17270   return index < 0 ? undefined : data[index][1];
17271 }
17272
17273 /**
17274  * Checks if a list cache value for `key` exists.
17275  *
17276  * @private
17277  * @name has
17278  * @memberOf ListCache
17279  * @param {string} key The key of the entry to check.
17280  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17281  */
17282 function listCacheHas(key) {
17283   return assocIndexOf(this.__data__, key) > -1;
17284 }
17285
17286 /**
17287  * Sets the list cache `key` to `value`.
17288  *
17289  * @private
17290  * @name set
17291  * @memberOf ListCache
17292  * @param {string} key The key of the value to set.
17293  * @param {*} value The value to set.
17294  * @returns {Object} Returns the list cache instance.
17295  */
17296 function listCacheSet(key, value) {
17297   var data = this.__data__,
17298       index = assocIndexOf(data, key);
17299
17300   if (index < 0) {
17301     ++this.size;
17302     data.push([key, value]);
17303   } else {
17304     data[index][1] = value;
17305   }
17306   return this;
17307 }
17308
17309 /**
17310  * Creates an list cache object.
17311  *
17312  * @private
17313  * @constructor
17314  * @param {Array} [entries] The key-value pairs to cache.
17315  */
17316 function ListCache(entries) {
17317   var index = -1,
17318       length = entries == null ? 0 : entries.length;
17319
17320   this.clear();
17321   while (++index < length) {
17322     var entry = entries[index];
17323     this.set(entry[0], entry[1]);
17324   }
17325 }
17326
17327 // Add methods to `ListCache`.
17328 ListCache.prototype.clear = listCacheClear;
17329 ListCache.prototype['delete'] = listCacheDelete;
17330 ListCache.prototype.get = listCacheGet;
17331 ListCache.prototype.has = listCacheHas;
17332 ListCache.prototype.set = listCacheSet;
17333
17334 /**
17335  * Removes all key-value entries from the stack.
17336  *
17337  * @private
17338  * @name clear
17339  * @memberOf Stack
17340  */
17341 function stackClear() {
17342   this.__data__ = new ListCache;
17343   this.size = 0;
17344 }
17345
17346 /**
17347  * Removes `key` and its value from the stack.
17348  *
17349  * @private
17350  * @name delete
17351  * @memberOf Stack
17352  * @param {string} key The key of the value to remove.
17353  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17354  */
17355 function stackDelete(key) {
17356   var data = this.__data__,
17357       result = data['delete'](key);
17358
17359   this.size = data.size;
17360   return result;
17361 }
17362
17363 /**
17364  * Gets the stack value for `key`.
17365  *
17366  * @private
17367  * @name get
17368  * @memberOf Stack
17369  * @param {string} key The key of the value to get.
17370  * @returns {*} Returns the entry value.
17371  */
17372 function stackGet(key) {
17373   return this.__data__.get(key);
17374 }
17375
17376 /**
17377  * Checks if a stack value for `key` exists.
17378  *
17379  * @private
17380  * @name has
17381  * @memberOf Stack
17382  * @param {string} key The key of the entry to check.
17383  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17384  */
17385 function stackHas(key) {
17386   return this.__data__.has(key);
17387 }
17388
17389 /** Detect free variable `global` from Node.js. */
17390 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17391
17392 /** Detect free variable `self`. */
17393 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17394
17395 /** Used as a reference to the global object. */
17396 var root$2 = freeGlobal || freeSelf || Function('return this')();
17397
17398 /** Built-in value references. */
17399 var Symbol = root$2.Symbol;
17400
17401 /** Used for built-in method references. */
17402 var objectProto = Object.prototype;
17403
17404 /** Used to check objects for own properties. */
17405 var hasOwnProperty = objectProto.hasOwnProperty;
17406
17407 /**
17408  * Used to resolve the
17409  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17410  * of values.
17411  */
17412 var nativeObjectToString = objectProto.toString;
17413
17414 /** Built-in value references. */
17415 var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17416
17417 /**
17418  * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17419  *
17420  * @private
17421  * @param {*} value The value to query.
17422  * @returns {string} Returns the raw `toStringTag`.
17423  */
17424 function getRawTag(value) {
17425   var isOwn = hasOwnProperty.call(value, symToStringTag),
17426       tag = value[symToStringTag];
17427
17428   try {
17429     value[symToStringTag] = undefined;
17430     var unmasked = true;
17431   } catch (e) {}
17432
17433   var result = nativeObjectToString.call(value);
17434   if (unmasked) {
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     return freeProcess && freeProcess.binding && freeProcess.binding('util');
18388   } catch (e) {}
18389 }());
18390
18391 /* Node.js helper references. */
18392 var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18393
18394 /**
18395  * Checks if `value` is classified as a typed array.
18396  *
18397  * @static
18398  * @memberOf _
18399  * @since 3.0.0
18400  * @category Lang
18401  * @param {*} value The value to check.
18402  * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18403  * @example
18404  *
18405  * _.isTypedArray(new Uint8Array);
18406  * // => true
18407  *
18408  * _.isTypedArray([]);
18409  * // => false
18410  */
18411 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18412
18413 /** Used for built-in method references. */
18414 var objectProto$7 = Object.prototype;
18415
18416 /** Used to check objects for own properties. */
18417 var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18418
18419 /**
18420  * Creates an array of the enumerable property names of the array-like `value`.
18421  *
18422  * @private
18423  * @param {*} value The value to query.
18424  * @param {boolean} inherited Specify returning inherited property names.
18425  * @returns {Array} Returns the array of property names.
18426  */
18427 function arrayLikeKeys(value, inherited) {
18428   var isArr = isArray(value),
18429       isArg = !isArr && isArguments(value),
18430       isBuff = !isArr && !isArg && isBuffer(value),
18431       isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18432       skipIndexes = isArr || isArg || isBuff || isType,
18433       result = skipIndexes ? baseTimes(value.length, String) : [],
18434       length = result.length;
18435
18436   for (var key in value) {
18437     if ((inherited || hasOwnProperty$6.call(value, key)) &&
18438         !(skipIndexes && (
18439            // Safari 9 has enumerable `arguments.length` in strict mode.
18440            key == 'length' ||
18441            // Node.js 0.10 has enumerable non-index properties on buffers.
18442            (isBuff && (key == 'offset' || key == 'parent')) ||
18443            // PhantomJS 2 has enumerable non-index properties on typed arrays.
18444            (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18445            // Skip index properties.
18446            isIndex(key, length)
18447         ))) {
18448       result.push(key);
18449     }
18450   }
18451   return result;
18452 }
18453
18454 /** Used for built-in method references. */
18455 var objectProto$8 = Object.prototype;
18456
18457 /**
18458  * Checks if `value` is likely a prototype object.
18459  *
18460  * @private
18461  * @param {*} value The value to check.
18462  * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18463  */
18464 function isPrototype(value) {
18465   var Ctor = value && value.constructor,
18466       proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18467
18468   return value === proto;
18469 }
18470
18471 /**
18472  * Creates a unary function that invokes `func` with its argument transformed.
18473  *
18474  * @private
18475  * @param {Function} func The function to wrap.
18476  * @param {Function} transform The argument transform.
18477  * @returns {Function} Returns the new function.
18478  */
18479 function overArg(func, transform) {
18480   return function(arg) {
18481     return func(transform(arg));
18482   };
18483 }
18484
18485 /* Built-in method references for those with the same name as other `lodash` methods. */
18486 var nativeKeys = overArg(Object.keys, Object);
18487
18488 /** Used for built-in method references. */
18489 var objectProto$9 = Object.prototype;
18490
18491 /** Used to check objects for own properties. */
18492 var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18493
18494 /**
18495  * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18496  *
18497  * @private
18498  * @param {Object} object The object to query.
18499  * @returns {Array} Returns the array of property names.
18500  */
18501 function baseKeys(object) {
18502   if (!isPrototype(object)) {
18503     return nativeKeys(object);
18504   }
18505   var result = [];
18506   for (var key in Object(object)) {
18507     if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18508       result.push(key);
18509     }
18510   }
18511   return result;
18512 }
18513
18514 /**
18515  * Checks if `value` is array-like. A value is considered array-like if it's
18516  * not a function and has a `value.length` that's an integer greater than or
18517  * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18518  *
18519  * @static
18520  * @memberOf _
18521  * @since 4.0.0
18522  * @category Lang
18523  * @param {*} value The value to check.
18524  * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18525  * @example
18526  *
18527  * _.isArrayLike([1, 2, 3]);
18528  * // => true
18529  *
18530  * _.isArrayLike(document.body.children);
18531  * // => true
18532  *
18533  * _.isArrayLike('abc');
18534  * // => true
18535  *
18536  * _.isArrayLike(_.noop);
18537  * // => false
18538  */
18539 function isArrayLike(value) {
18540   return value != null && isLength(value.length) && !isFunction(value);
18541 }
18542
18543 /**
18544  * Creates an array of the own enumerable property names of `object`.
18545  *
18546  * **Note:** Non-object values are coerced to objects. See the
18547  * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18548  * for more details.
18549  *
18550  * @static
18551  * @since 0.1.0
18552  * @memberOf _
18553  * @category Object
18554  * @param {Object} object The object to query.
18555  * @returns {Array} Returns the array of property names.
18556  * @example
18557  *
18558  * function Foo() {
18559  *   this.a = 1;
18560  *   this.b = 2;
18561  * }
18562  *
18563  * Foo.prototype.c = 3;
18564  *
18565  * _.keys(new Foo);
18566  * // => ['a', 'b'] (iteration order is not guaranteed)
18567  *
18568  * _.keys('hi');
18569  * // => ['0', '1']
18570  */
18571 function keys$1(object) {
18572   return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18573 }
18574
18575 /**
18576  * The base implementation of `_.assign` without support for multiple sources
18577  * or `customizer` functions.
18578  *
18579  * @private
18580  * @param {Object} object The destination object.
18581  * @param {Object} source The source object.
18582  * @returns {Object} Returns `object`.
18583  */
18584 function baseAssign(object, source) {
18585   return object && copyObject(source, keys$1(source), object);
18586 }
18587
18588 /**
18589  * This function is like
18590  * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18591  * except that it includes inherited enumerable properties.
18592  *
18593  * @private
18594  * @param {Object} object The object to query.
18595  * @returns {Array} Returns the array of property names.
18596  */
18597 function nativeKeysIn(object) {
18598   var result = [];
18599   if (object != null) {
18600     for (var key in Object(object)) {
18601       result.push(key);
18602     }
18603   }
18604   return result;
18605 }
18606
18607 /** Used for built-in method references. */
18608 var objectProto$10 = Object.prototype;
18609
18610 /** Used to check objects for own properties. */
18611 var hasOwnProperty$8 = objectProto$10.hasOwnProperty;
18612
18613 /**
18614  * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18615  *
18616  * @private
18617  * @param {Object} object The object to query.
18618  * @returns {Array} Returns the array of property names.
18619  */
18620 function baseKeysIn(object) {
18621   if (!isObject(object)) {
18622     return nativeKeysIn(object);
18623   }
18624   var isProto = isPrototype(object),
18625       result = [];
18626
18627   for (var key in object) {
18628     if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18629       result.push(key);
18630     }
18631   }
18632   return result;
18633 }
18634
18635 /**
18636  * Creates an array of the own and inherited enumerable property names of `object`.
18637  *
18638  * **Note:** Non-object values are coerced to objects.
18639  *
18640  * @static
18641  * @memberOf _
18642  * @since 3.0.0
18643  * @category Object
18644  * @param {Object} object The object to query.
18645  * @returns {Array} Returns the array of property names.
18646  * @example
18647  *
18648  * function Foo() {
18649  *   this.a = 1;
18650  *   this.b = 2;
18651  * }
18652  *
18653  * Foo.prototype.c = 3;
18654  *
18655  * _.keysIn(new Foo);
18656  * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18657  */
18658 function keysIn$1(object) {
18659   return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18660 }
18661
18662 /**
18663  * The base implementation of `_.assignIn` without support for multiple sources
18664  * or `customizer` functions.
18665  *
18666  * @private
18667  * @param {Object} object The destination object.
18668  * @param {Object} source The source object.
18669  * @returns {Object} Returns `object`.
18670  */
18671 function baseAssignIn(object, source) {
18672   return object && copyObject(source, keysIn$1(source), object);
18673 }
18674
18675 /** Detect free variable `exports`. */
18676 var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18677
18678 /** Detect free variable `module`. */
18679 var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18680
18681 /** Detect the popular CommonJS extension `module.exports`. */
18682 var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18683
18684 /** Built-in value references. */
18685 var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18686     allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18687
18688 /**
18689  * Creates a clone of  `buffer`.
18690  *
18691  * @private
18692  * @param {Buffer} buffer The buffer to clone.
18693  * @param {boolean} [isDeep] Specify a deep clone.
18694  * @returns {Buffer} Returns the cloned buffer.
18695  */
18696 function cloneBuffer(buffer, isDeep) {
18697   if (isDeep) {
18698     return buffer.slice();
18699   }
18700   var length = buffer.length,
18701       result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18702
18703   buffer.copy(result);
18704   return result;
18705 }
18706
18707 /**
18708  * Copies the values of `source` to `array`.
18709  *
18710  * @private
18711  * @param {Array} source The array to copy values from.
18712  * @param {Array} [array=[]] The array to copy values to.
18713  * @returns {Array} Returns `array`.
18714  */
18715 function copyArray(source, array) {
18716   var index = -1,
18717       length = source.length;
18718
18719   array || (array = Array(length));
18720   while (++index < length) {
18721     array[index] = source[index];
18722   }
18723   return array;
18724 }
18725
18726 /**
18727  * A specialized version of `_.filter` for arrays without support for
18728  * iteratee shorthands.
18729  *
18730  * @private
18731  * @param {Array} [array] The array to iterate over.
18732  * @param {Function} predicate The function invoked per iteration.
18733  * @returns {Array} Returns the new filtered array.
18734  */
18735 function arrayFilter(array, predicate) {
18736   var index = -1,
18737       length = array == null ? 0 : array.length,
18738       resIndex = 0,
18739       result = [];
18740
18741   while (++index < length) {
18742     var value = array[index];
18743     if (predicate(value, index, array)) {
18744       result[resIndex++] = value;
18745     }
18746   }
18747   return result;
18748 }
18749
18750 /**
18751  * This method returns a new empty array.
18752  *
18753  * @static
18754  * @memberOf _
18755  * @since 4.13.0
18756  * @category Util
18757  * @returns {Array} Returns the new empty array.
18758  * @example
18759  *
18760  * var arrays = _.times(2, _.stubArray);
18761  *
18762  * console.log(arrays);
18763  * // => [[], []]
18764  *
18765  * console.log(arrays[0] === arrays[1]);
18766  * // => false
18767  */
18768 function stubArray() {
18769   return [];
18770 }
18771
18772 /** Used for built-in method references. */
18773 var objectProto$11 = Object.prototype;
18774
18775 /** Built-in value references. */
18776 var propertyIsEnumerable$1 = objectProto$11.propertyIsEnumerable;
18777
18778 /* Built-in method references for those with the same name as other `lodash` methods. */
18779 var nativeGetSymbols = Object.getOwnPropertySymbols;
18780
18781 /**
18782  * Creates an array of the own enumerable symbols of `object`.
18783  *
18784  * @private
18785  * @param {Object} object The object to query.
18786  * @returns {Array} Returns the array of symbols.
18787  */
18788 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18789   if (object == null) {
18790     return [];
18791   }
18792   object = Object(object);
18793   return arrayFilter(nativeGetSymbols(object), function(symbol) {
18794     return propertyIsEnumerable$1.call(object, symbol);
18795   });
18796 };
18797
18798 /**
18799  * Copies own symbols of `source` to `object`.
18800  *
18801  * @private
18802  * @param {Object} source The object to copy symbols from.
18803  * @param {Object} [object={}] The object to copy symbols to.
18804  * @returns {Object} Returns `object`.
18805  */
18806 function copySymbols(source, object) {
18807   return copyObject(source, getSymbols(source), object);
18808 }
18809
18810 /**
18811  * Appends the elements of `values` to `array`.
18812  *
18813  * @private
18814  * @param {Array} array The array to modify.
18815  * @param {Array} values The values to append.
18816  * @returns {Array} Returns `array`.
18817  */
18818 function arrayPush(array, values) {
18819   var index = -1,
18820       length = values.length,
18821       offset = array.length;
18822
18823   while (++index < length) {
18824     array[offset + index] = values[index];
18825   }
18826   return array;
18827 }
18828
18829 /** Built-in value references. */
18830 var getPrototype = overArg(Object.getPrototypeOf, Object);
18831
18832 /* Built-in method references for those with the same name as other `lodash` methods. */
18833 var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18834
18835 /**
18836  * Creates an array of the own and inherited enumerable symbols of `object`.
18837  *
18838  * @private
18839  * @param {Object} object The object to query.
18840  * @returns {Array} Returns the array of symbols.
18841  */
18842 var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18843   var result = [];
18844   while (object) {
18845     arrayPush(result, getSymbols(object));
18846     object = getPrototype(object);
18847   }
18848   return result;
18849 };
18850
18851 /**
18852  * Copies own and inherited symbols of `source` to `object`.
18853  *
18854  * @private
18855  * @param {Object} source The object to copy symbols from.
18856  * @param {Object} [object={}] The object to copy symbols to.
18857  * @returns {Object} Returns `object`.
18858  */
18859 function copySymbolsIn(source, object) {
18860   return copyObject(source, getSymbolsIn(source), object);
18861 }
18862
18863 /**
18864  * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18865  * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18866  * symbols of `object`.
18867  *
18868  * @private
18869  * @param {Object} object The object to query.
18870  * @param {Function} keysFunc The function to get the keys of `object`.
18871  * @param {Function} symbolsFunc The function to get the symbols of `object`.
18872  * @returns {Array} Returns the array of property names and symbols.
18873  */
18874 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18875   var result = keysFunc(object);
18876   return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18877 }
18878
18879 /**
18880  * Creates an array of own enumerable property names and symbols of `object`.
18881  *
18882  * @private
18883  * @param {Object} object The object to query.
18884  * @returns {Array} Returns the array of property names and symbols.
18885  */
18886 function getAllKeys(object) {
18887   return baseGetAllKeys(object, keys$1, getSymbols);
18888 }
18889
18890 /**
18891  * Creates an array of own and inherited enumerable property names and
18892  * symbols of `object`.
18893  *
18894  * @private
18895  * @param {Object} object The object to query.
18896  * @returns {Array} Returns the array of property names and symbols.
18897  */
18898 function getAllKeysIn(object) {
18899   return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18900 }
18901
18902 /* Built-in method references that are verified to be native. */
18903 var DataView = getNative(root$2, 'DataView');
18904
18905 /* Built-in method references that are verified to be native. */
18906 var Promise = getNative(root$2, 'Promise');
18907
18908 /* Built-in method references that are verified to be native. */
18909 var Set$1 = getNative(root$2, 'Set');
18910
18911 /* Built-in method references that are verified to be native. */
18912 var WeakMap = getNative(root$2, 'WeakMap');
18913
18914 /** `Object#toString` result references. */
18915 var mapTag$1 = '[object Map]',
18916     objectTag$1 = '[object Object]',
18917     promiseTag = '[object Promise]',
18918     setTag$1 = '[object Set]',
18919     weakMapTag$1 = '[object WeakMap]';
18920
18921 var dataViewTag$1 = '[object DataView]';
18922
18923 /** Used to detect maps, sets, and weakmaps. */
18924 var dataViewCtorString = toSource(DataView),
18925     mapCtorString = toSource(Map$1),
18926     promiseCtorString = toSource(Promise),
18927     setCtorString = toSource(Set$1),
18928     weakMapCtorString = toSource(WeakMap);
18929
18930 /**
18931  * Gets the `toStringTag` of `value`.
18932  *
18933  * @private
18934  * @param {*} value The value to query.
18935  * @returns {string} Returns the `toStringTag`.
18936  */
18937 var getTag = baseGetTag;
18938
18939 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18940 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18941     (Map$1 && getTag(new Map$1) != mapTag$1) ||
18942     (Promise && getTag(Promise.resolve()) != promiseTag) ||
18943     (Set$1 && getTag(new Set$1) != setTag$1) ||
18944     (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18945   getTag = function(value) {
18946     var result = baseGetTag(value),
18947         Ctor = result == objectTag$1 ? value.constructor : undefined,
18948         ctorString = Ctor ? toSource(Ctor) : '';
18949
18950     if (ctorString) {
18951       switch (ctorString) {
18952         case dataViewCtorString: return dataViewTag$1;
18953         case mapCtorString: return mapTag$1;
18954         case promiseCtorString: return promiseTag;
18955         case setCtorString: return setTag$1;
18956         case weakMapCtorString: return weakMapTag$1;
18957       }
18958     }
18959     return result;
18960   };
18961 }
18962
18963 var getTag$1 = getTag;
18964
18965 /** Used for built-in method references. */
18966 var objectProto$12 = Object.prototype;
18967
18968 /** Used to check objects for own properties. */
18969 var hasOwnProperty$9 = objectProto$12.hasOwnProperty;
18970
18971 /**
18972  * Initializes an array clone.
18973  *
18974  * @private
18975  * @param {Array} array The array to clone.
18976  * @returns {Array} Returns the initialized clone.
18977  */
18978 function initCloneArray(array) {
18979   var length = array.length,
18980       result = new array.constructor(length);
18981
18982   // Add properties assigned by `RegExp#exec`.
18983   if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18984     result.index = array.index;
18985     result.input = array.input;
18986   }
18987   return result;
18988 }
18989
18990 /** Built-in value references. */
18991 var Uint8Array = root$2.Uint8Array;
18992
18993 /**
18994  * Creates a clone of `arrayBuffer`.
18995  *
18996  * @private
18997  * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
18998  * @returns {ArrayBuffer} Returns the cloned array buffer.
18999  */
19000 function cloneArrayBuffer(arrayBuffer) {
19001   var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19002   new Uint8Array(result).set(new Uint8Array(arrayBuffer));
19003   return result;
19004 }
19005
19006 /**
19007  * Creates a clone of `dataView`.
19008  *
19009  * @private
19010  * @param {Object} dataView The data view to clone.
19011  * @param {boolean} [isDeep] Specify a deep clone.
19012  * @returns {Object} Returns the cloned data view.
19013  */
19014 function cloneDataView(dataView, isDeep) {
19015   var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19016   return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19017 }
19018
19019 /** Used to match `RegExp` flags from their coerced string values. */
19020 var reFlags = /\w*$/;
19021
19022 /**
19023  * Creates a clone of `regexp`.
19024  *
19025  * @private
19026  * @param {Object} regexp The regexp to clone.
19027  * @returns {Object} Returns the cloned regexp.
19028  */
19029 function cloneRegExp(regexp) {
19030   var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19031   result.lastIndex = regexp.lastIndex;
19032   return result;
19033 }
19034
19035 /** Used to convert symbols to primitives and strings. */
19036 var symbolProto = Symbol ? Symbol.prototype : undefined,
19037     symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19038
19039 /**
19040  * Creates a clone of the `symbol` object.
19041  *
19042  * @private
19043  * @param {Object} symbol The symbol object to clone.
19044  * @returns {Object} Returns the cloned symbol object.
19045  */
19046 function cloneSymbol(symbol) {
19047   return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19048 }
19049
19050 /**
19051  * Creates a clone of `typedArray`.
19052  *
19053  * @private
19054  * @param {Object} typedArray The typed array to clone.
19055  * @param {boolean} [isDeep] Specify a deep clone.
19056  * @returns {Object} Returns the cloned typed array.
19057  */
19058 function cloneTypedArray(typedArray, isDeep) {
19059   var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19060   return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19061 }
19062
19063 /** `Object#toString` result references. */
19064 var boolTag$1 = '[object Boolean]',
19065     dateTag$1 = '[object Date]',
19066     mapTag$2 = '[object Map]',
19067     numberTag$1 = '[object Number]',
19068     regexpTag$1 = '[object RegExp]',
19069     setTag$2 = '[object Set]',
19070     stringTag$1 = '[object String]',
19071     symbolTag = '[object Symbol]';
19072
19073 var arrayBufferTag$1 = '[object ArrayBuffer]',
19074     dataViewTag$2 = '[object DataView]',
19075     float32Tag$1 = '[object Float32Array]',
19076     float64Tag$1 = '[object Float64Array]',
19077     int8Tag$1 = '[object Int8Array]',
19078     int16Tag$1 = '[object Int16Array]',
19079     int32Tag$1 = '[object Int32Array]',
19080     uint8Tag$1 = '[object Uint8Array]',
19081     uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19082     uint16Tag$1 = '[object Uint16Array]',
19083     uint32Tag$1 = '[object Uint32Array]';
19084
19085 /**
19086  * Initializes an object clone based on its `toStringTag`.
19087  *
19088  * **Note:** This function only supports cloning values with tags of
19089  * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19090  *
19091  * @private
19092  * @param {Object} object The object to clone.
19093  * @param {string} tag The `toStringTag` of the object to clone.
19094  * @param {boolean} [isDeep] Specify a deep clone.
19095  * @returns {Object} Returns the initialized clone.
19096  */
19097 function initCloneByTag(object, tag, isDeep) {
19098   var Ctor = object.constructor;
19099   switch (tag) {
19100     case arrayBufferTag$1:
19101       return cloneArrayBuffer(object);
19102
19103     case boolTag$1:
19104     case dateTag$1:
19105       return new Ctor(+object);
19106
19107     case dataViewTag$2:
19108       return cloneDataView(object, isDeep);
19109
19110     case float32Tag$1: case float64Tag$1:
19111     case int8Tag$1: case int16Tag$1: case int32Tag$1:
19112     case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19113       return cloneTypedArray(object, isDeep);
19114
19115     case mapTag$2:
19116       return new Ctor;
19117
19118     case numberTag$1:
19119     case stringTag$1:
19120       return new Ctor(object);
19121
19122     case regexpTag$1:
19123       return cloneRegExp(object);
19124
19125     case setTag$2:
19126       return new Ctor;
19127
19128     case symbolTag:
19129       return cloneSymbol(object);
19130   }
19131 }
19132
19133 /** Built-in value references. */
19134 var objectCreate = Object.create;
19135
19136 /**
19137  * The base implementation of `_.create` without support for assigning
19138  * properties to the created object.
19139  *
19140  * @private
19141  * @param {Object} proto The object to inherit from.
19142  * @returns {Object} Returns the new object.
19143  */
19144 var baseCreate = (function() {
19145   function object() {}
19146   return function(proto) {
19147     if (!isObject(proto)) {
19148       return {};
19149     }
19150     if (objectCreate) {
19151       return objectCreate(proto);
19152     }
19153     object.prototype = proto;
19154     var result = new object;
19155     object.prototype = undefined;
19156     return result;
19157   };
19158 }());
19159
19160 /**
19161  * Initializes an object clone.
19162  *
19163  * @private
19164  * @param {Object} object The object to clone.
19165  * @returns {Object} Returns the initialized clone.
19166  */
19167 function initCloneObject(object) {
19168   return (typeof object.constructor == 'function' && !isPrototype(object))
19169     ? baseCreate(getPrototype(object))
19170     : {};
19171 }
19172
19173 /** `Object#toString` result references. */
19174 var mapTag$3 = '[object Map]';
19175
19176 /**
19177  * The base implementation of `_.isMap` without Node.js optimizations.
19178  *
19179  * @private
19180  * @param {*} value The value to check.
19181  * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19182  */
19183 function baseIsMap(value) {
19184   return isObjectLike(value) && getTag$1(value) == mapTag$3;
19185 }
19186
19187 /* Node.js helper references. */
19188 var nodeIsMap = nodeUtil && nodeUtil.isMap;
19189
19190 /**
19191  * Checks if `value` is classified as a `Map` object.
19192  *
19193  * @static
19194  * @memberOf _
19195  * @since 4.3.0
19196  * @category Lang
19197  * @param {*} value The value to check.
19198  * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19199  * @example
19200  *
19201  * _.isMap(new Map);
19202  * // => true
19203  *
19204  * _.isMap(new WeakMap);
19205  * // => false
19206  */
19207 var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19208
19209 /** `Object#toString` result references. */
19210 var setTag$3 = '[object Set]';
19211
19212 /**
19213  * The base implementation of `_.isSet` without Node.js optimizations.
19214  *
19215  * @private
19216  * @param {*} value The value to check.
19217  * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19218  */
19219 function baseIsSet(value) {
19220   return isObjectLike(value) && getTag$1(value) == setTag$3;
19221 }
19222
19223 /* Node.js helper references. */
19224 var nodeIsSet = nodeUtil && nodeUtil.isSet;
19225
19226 /**
19227  * Checks if `value` is classified as a `Set` object.
19228  *
19229  * @static
19230  * @memberOf _
19231  * @since 4.3.0
19232  * @category Lang
19233  * @param {*} value The value to check.
19234  * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19235  * @example
19236  *
19237  * _.isSet(new Set);
19238  * // => true
19239  *
19240  * _.isSet(new WeakSet);
19241  * // => false
19242  */
19243 var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19244
19245 /** Used to compose bitmasks for cloning. */
19246 var CLONE_DEEP_FLAG = 1,
19247     CLONE_FLAT_FLAG = 2,
19248     CLONE_SYMBOLS_FLAG = 4;
19249
19250 /** `Object#toString` result references. */
19251 var argsTag$2 = '[object Arguments]',
19252     arrayTag$1 = '[object Array]',
19253     boolTag$2 = '[object Boolean]',
19254     dateTag$2 = '[object Date]',
19255     errorTag$1 = '[object Error]',
19256     funcTag$2 = '[object Function]',
19257     genTag$1 = '[object GeneratorFunction]',
19258     mapTag$4 = '[object Map]',
19259     numberTag$2 = '[object Number]',
19260     objectTag$2 = '[object Object]',
19261     regexpTag$2 = '[object RegExp]',
19262     setTag$4 = '[object Set]',
19263     stringTag$2 = '[object String]',
19264     symbolTag$1 = '[object Symbol]',
19265     weakMapTag$2 = '[object WeakMap]';
19266
19267 var arrayBufferTag$2 = '[object ArrayBuffer]',
19268     dataViewTag$3 = '[object DataView]',
19269     float32Tag$2 = '[object Float32Array]',
19270     float64Tag$2 = '[object Float64Array]',
19271     int8Tag$2 = '[object Int8Array]',
19272     int16Tag$2 = '[object Int16Array]',
19273     int32Tag$2 = '[object Int32Array]',
19274     uint8Tag$2 = '[object Uint8Array]',
19275     uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19276     uint16Tag$2 = '[object Uint16Array]',
19277     uint32Tag$2 = '[object Uint32Array]';
19278
19279 /** Used to identify `toStringTag` values supported by `_.clone`. */
19280 var cloneableTags = {};
19281 cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19282 cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19283 cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19284 cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19285 cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19286 cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19287 cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19288 cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19289 cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19290 cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19291 cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19292 cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19293 cloneableTags[weakMapTag$2] = false;
19294
19295 /**
19296  * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19297  * traversed objects.
19298  *
19299  * @private
19300  * @param {*} value The value to clone.
19301  * @param {boolean} bitmask The bitmask flags.
19302  *  1 - Deep clone
19303  *  2 - Flatten inherited properties
19304  *  4 - Clone symbols
19305  * @param {Function} [customizer] The function to customize cloning.
19306  * @param {string} [key] The key of `value`.
19307  * @param {Object} [object] The parent object of `value`.
19308  * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19309  * @returns {*} Returns the cloned value.
19310  */
19311 function baseClone(value, bitmask, customizer, key, object, stack) {
19312   var result,
19313       isDeep = bitmask & CLONE_DEEP_FLAG,
19314       isFlat = bitmask & CLONE_FLAT_FLAG,
19315       isFull = bitmask & CLONE_SYMBOLS_FLAG;
19316
19317   if (customizer) {
19318     result = object ? customizer(value, key, object, stack) : customizer(value);
19319   }
19320   if (result !== undefined) {
19321     return result;
19322   }
19323   if (!isObject(value)) {
19324     return value;
19325   }
19326   var isArr = isArray(value);
19327   if (isArr) {
19328     result = initCloneArray(value);
19329     if (!isDeep) {
19330       return copyArray(value, result);
19331     }
19332   } else {
19333     var tag = getTag$1(value),
19334         isFunc = tag == funcTag$2 || tag == genTag$1;
19335
19336     if (isBuffer(value)) {
19337       return cloneBuffer(value, isDeep);
19338     }
19339     if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19340       result = (isFlat || isFunc) ? {} : initCloneObject(value);
19341       if (!isDeep) {
19342         return isFlat
19343           ? copySymbolsIn(value, baseAssignIn(result, value))
19344           : copySymbols(value, baseAssign(result, value));
19345       }
19346     } else {
19347       if (!cloneableTags[tag]) {
19348         return object ? value : {};
19349       }
19350       result = initCloneByTag(value, tag, isDeep);
19351     }
19352   }
19353   // Check for circular references and return its corresponding clone.
19354   stack || (stack = new Stack);
19355   var stacked = stack.get(value);
19356   if (stacked) {
19357     return stacked;
19358   }
19359   stack.set(value, result);
19360
19361   if (isSet(value)) {
19362     value.forEach(function(subValue) {
19363       result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19364     });
19365
19366     return result;
19367   }
19368
19369   if (isMap(value)) {
19370     value.forEach(function(subValue, key) {
19371       result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19372     });
19373
19374     return result;
19375   }
19376
19377   var keysFunc = isFull
19378     ? (isFlat ? getAllKeysIn : getAllKeys)
19379     : (isFlat ? keysIn : keys$1);
19380
19381   var props = isArr ? undefined : keysFunc(value);
19382   arrayEach(props || value, function(subValue, key) {
19383     if (props) {
19384       key = subValue;
19385       subValue = value[key];
19386     }
19387     // Recursively populate clone (susceptible to call stack limits).
19388     assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19389   });
19390   return result;
19391 }
19392
19393 /** Used to compose bitmasks for cloning. */
19394 var CLONE_SYMBOLS_FLAG$1 = 4;
19395
19396 /**
19397  * Creates a shallow clone of `value`.
19398  *
19399  * **Note:** This method is loosely based on the
19400  * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19401  * and supports cloning arrays, array buffers, booleans, date objects, maps,
19402  * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19403  * arrays. The own enumerable properties of `arguments` objects are cloned
19404  * as plain objects. An empty object is returned for uncloneable values such
19405  * as error objects, functions, DOM nodes, and WeakMaps.
19406  *
19407  * @static
19408  * @memberOf _
19409  * @since 0.1.0
19410  * @category Lang
19411  * @param {*} value The value to clone.
19412  * @returns {*} Returns the cloned value.
19413  * @see _.cloneDeep
19414  * @example
19415  *
19416  * var objects = [{ 'a': 1 }, { 'b': 2 }];
19417  *
19418  * var shallow = _.clone(objects);
19419  * console.log(shallow[0] === objects[0]);
19420  * // => true
19421  */
19422 function clone(value) {
19423   return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19424 }
19425
19426 /**
19427  * A specialized version of `baseAggregator` for arrays.
19428  *
19429  * @private
19430  * @param {Array} [array] The array to iterate over.
19431  * @param {Function} setter The function to set `accumulator` values.
19432  * @param {Function} iteratee The iteratee to transform keys.
19433  * @param {Object} accumulator The initial aggregated object.
19434  * @returns {Function} Returns `accumulator`.
19435  */
19436 function arrayAggregator(array, setter, iteratee, accumulator) {
19437   var index = -1,
19438       length = array == null ? 0 : array.length;
19439
19440   while (++index < length) {
19441     var value = array[index];
19442     setter(accumulator, value, iteratee(value), array);
19443   }
19444   return accumulator;
19445 }
19446
19447 /**
19448  * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19449  *
19450  * @private
19451  * @param {boolean} [fromRight] Specify iterating from right to left.
19452  * @returns {Function} Returns the new base function.
19453  */
19454 function createBaseFor(fromRight) {
19455   return function(object, iteratee, keysFunc) {
19456     var index = -1,
19457         iterable = Object(object),
19458         props = keysFunc(object),
19459         length = props.length;
19460
19461     while (length--) {
19462       var key = props[fromRight ? length : ++index];
19463       if (iteratee(iterable[key], key, iterable) === false) {
19464         break;
19465       }
19466     }
19467     return object;
19468   };
19469 }
19470
19471 /**
19472  * The base implementation of `baseForOwn` which iterates over `object`
19473  * properties returned by `keysFunc` and invokes `iteratee` for each property.
19474  * Iteratee functions may exit iteration early by explicitly returning `false`.
19475  *
19476  * @private
19477  * @param {Object} object The object to iterate over.
19478  * @param {Function} iteratee The function invoked per iteration.
19479  * @param {Function} keysFunc The function to get the keys of `object`.
19480  * @returns {Object} Returns `object`.
19481  */
19482 var baseFor = createBaseFor();
19483
19484 /**
19485  * The base implementation of `_.forOwn` without support for iteratee shorthands.
19486  *
19487  * @private
19488  * @param {Object} object The object to iterate over.
19489  * @param {Function} iteratee The function invoked per iteration.
19490  * @returns {Object} Returns `object`.
19491  */
19492 function baseForOwn(object, iteratee) {
19493   return object && baseFor(object, iteratee, keys$1);
19494 }
19495
19496 /**
19497  * Creates a `baseEach` or `baseEachRight` function.
19498  *
19499  * @private
19500  * @param {Function} eachFunc The function to iterate over a collection.
19501  * @param {boolean} [fromRight] Specify iterating from right to left.
19502  * @returns {Function} Returns the new base function.
19503  */
19504 function createBaseEach(eachFunc, fromRight) {
19505   return function(collection, iteratee) {
19506     if (collection == null) {
19507       return collection;
19508     }
19509     if (!isArrayLike(collection)) {
19510       return eachFunc(collection, iteratee);
19511     }
19512     var length = collection.length,
19513         index = fromRight ? length : -1,
19514         iterable = Object(collection);
19515
19516     while ((fromRight ? index-- : ++index < length)) {
19517       if (iteratee(iterable[index], index, iterable) === false) {
19518         break;
19519       }
19520     }
19521     return collection;
19522   };
19523 }
19524
19525 /**
19526  * The base implementation of `_.forEach` without support for iteratee shorthands.
19527  *
19528  * @private
19529  * @param {Array|Object} collection The collection to iterate over.
19530  * @param {Function} iteratee The function invoked per iteration.
19531  * @returns {Array|Object} Returns `collection`.
19532  */
19533 var baseEach = createBaseEach(baseForOwn);
19534
19535 /**
19536  * Aggregates elements of `collection` on `accumulator` with keys transformed
19537  * by `iteratee` and values set by `setter`.
19538  *
19539  * @private
19540  * @param {Array|Object} collection The collection to iterate over.
19541  * @param {Function} setter The function to set `accumulator` values.
19542  * @param {Function} iteratee The iteratee to transform keys.
19543  * @param {Object} accumulator The initial aggregated object.
19544  * @returns {Function} Returns `accumulator`.
19545  */
19546 function baseAggregator(collection, setter, iteratee, accumulator) {
19547   baseEach(collection, function(value, key, collection) {
19548     setter(accumulator, value, iteratee(value), collection);
19549   });
19550   return accumulator;
19551 }
19552
19553 /** Used to stand-in for `undefined` hash values. */
19554 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19555
19556 /**
19557  * Adds `value` to the array cache.
19558  *
19559  * @private
19560  * @name add
19561  * @memberOf SetCache
19562  * @alias push
19563  * @param {*} value The value to cache.
19564  * @returns {Object} Returns the cache instance.
19565  */
19566 function setCacheAdd(value) {
19567   this.__data__.set(value, HASH_UNDEFINED$2);
19568   return this;
19569 }
19570
19571 /**
19572  * Checks if `value` is in the array cache.
19573  *
19574  * @private
19575  * @name has
19576  * @memberOf SetCache
19577  * @param {*} value The value to search for.
19578  * @returns {number} Returns `true` if `value` is found, else `false`.
19579  */
19580 function setCacheHas(value) {
19581   return this.__data__.has(value);
19582 }
19583
19584 /**
19585  *
19586  * Creates an array cache object to store unique values.
19587  *
19588  * @private
19589  * @constructor
19590  * @param {Array} [values] The values to cache.
19591  */
19592 function SetCache(values) {
19593   var index = -1,
19594       length = values == null ? 0 : values.length;
19595
19596   this.__data__ = new MapCache;
19597   while (++index < length) {
19598     this.add(values[index]);
19599   }
19600 }
19601
19602 // Add methods to `SetCache`.
19603 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19604 SetCache.prototype.has = setCacheHas;
19605
19606 /**
19607  * A specialized version of `_.some` for arrays without support for iteratee
19608  * shorthands.
19609  *
19610  * @private
19611  * @param {Array} [array] The array to iterate over.
19612  * @param {Function} predicate The function invoked per iteration.
19613  * @returns {boolean} Returns `true` if any element passes the predicate check,
19614  *  else `false`.
19615  */
19616 function arraySome(array, predicate) {
19617   var index = -1,
19618       length = array == null ? 0 : array.length;
19619
19620   while (++index < length) {
19621     if (predicate(array[index], index, array)) {
19622       return true;
19623     }
19624   }
19625   return false;
19626 }
19627
19628 /**
19629  * Checks if a `cache` value for `key` exists.
19630  *
19631  * @private
19632  * @param {Object} cache The cache to query.
19633  * @param {string} key The key of the entry to check.
19634  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19635  */
19636 function cacheHas(cache, key) {
19637   return cache.has(key);
19638 }
19639
19640 /** Used to compose bitmasks for value comparisons. */
19641 var COMPARE_PARTIAL_FLAG = 1,
19642     COMPARE_UNORDERED_FLAG = 2;
19643
19644 /**
19645  * A specialized version of `baseIsEqualDeep` for arrays with support for
19646  * partial deep comparisons.
19647  *
19648  * @private
19649  * @param {Array} array The array to compare.
19650  * @param {Array} other The other array to compare.
19651  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19652  * @param {Function} customizer The function to customize comparisons.
19653  * @param {Function} equalFunc The function to determine equivalents of values.
19654  * @param {Object} stack Tracks traversed `array` and `other` objects.
19655  * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19656  */
19657 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19658   var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19659       arrLength = array.length,
19660       othLength = other.length;
19661
19662   if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19663     return false;
19664   }
19665   // Assume cyclic values are equal.
19666   var stacked = stack.get(array);
19667   if (stacked && stack.get(other)) {
19668     return stacked == other;
19669   }
19670   var index = -1,
19671       result = true,
19672       seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19673
19674   stack.set(array, other);
19675   stack.set(other, array);
19676
19677   // Ignore non-index properties.
19678   while (++index < arrLength) {
19679     var arrValue = array[index],
19680         othValue = other[index];
19681
19682     if (customizer) {
19683       var compared = isPartial
19684         ? customizer(othValue, arrValue, index, other, array, stack)
19685         : customizer(arrValue, othValue, index, array, other, stack);
19686     }
19687     if (compared !== undefined) {
19688       if (compared) {
19689         continue;
19690       }
19691       result = false;
19692       break;
19693     }
19694     // Recursively compare arrays (susceptible to call stack limits).
19695     if (seen) {
19696       if (!arraySome(other, function(othValue, othIndex) {
19697             if (!cacheHas(seen, othIndex) &&
19698                 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19699               return seen.push(othIndex);
19700             }
19701           })) {
19702         result = false;
19703         break;
19704       }
19705     } else if (!(
19706           arrValue === othValue ||
19707             equalFunc(arrValue, othValue, bitmask, customizer, stack)
19708         )) {
19709       result = false;
19710       break;
19711     }
19712   }
19713   stack['delete'](array);
19714   stack['delete'](other);
19715   return result;
19716 }
19717
19718 /**
19719  * Converts `map` to its key-value pairs.
19720  *
19721  * @private
19722  * @param {Object} map The map to convert.
19723  * @returns {Array} Returns the key-value pairs.
19724  */
19725 function mapToArray(map) {
19726   var index = -1,
19727       result = Array(map.size);
19728
19729   map.forEach(function(value, key) {
19730     result[++index] = [key, value];
19731   });
19732   return result;
19733 }
19734
19735 /**
19736  * Converts `set` to an array of its values.
19737  *
19738  * @private
19739  * @param {Object} set The set to convert.
19740  * @returns {Array} Returns the values.
19741  */
19742 function setToArray(set) {
19743   var index = -1,
19744       result = Array(set.size);
19745
19746   set.forEach(function(value) {
19747     result[++index] = value;
19748   });
19749   return result;
19750 }
19751
19752 /** Used to compose bitmasks for value comparisons. */
19753 var COMPARE_PARTIAL_FLAG$1 = 1,
19754     COMPARE_UNORDERED_FLAG$1 = 2;
19755
19756 /** `Object#toString` result references. */
19757 var boolTag$3 = '[object Boolean]',
19758     dateTag$3 = '[object Date]',
19759     errorTag$2 = '[object Error]',
19760     mapTag$5 = '[object Map]',
19761     numberTag$3 = '[object Number]',
19762     regexpTag$3 = '[object RegExp]',
19763     setTag$5 = '[object Set]',
19764     stringTag$3 = '[object String]',
19765     symbolTag$2 = '[object Symbol]';
19766
19767 var arrayBufferTag$3 = '[object ArrayBuffer]',
19768     dataViewTag$4 = '[object DataView]';
19769
19770 /** Used to convert symbols to primitives and strings. */
19771 var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19772     symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19773
19774 /**
19775  * A specialized version of `baseIsEqualDeep` for comparing objects of
19776  * the same `toStringTag`.
19777  *
19778  * **Note:** This function only supports comparing values with tags of
19779  * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19780  *
19781  * @private
19782  * @param {Object} object The object to compare.
19783  * @param {Object} other The other object to compare.
19784  * @param {string} tag The `toStringTag` of the objects to compare.
19785  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19786  * @param {Function} customizer The function to customize comparisons.
19787  * @param {Function} equalFunc The function to determine equivalents of values.
19788  * @param {Object} stack Tracks traversed `object` and `other` objects.
19789  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19790  */
19791 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19792   switch (tag) {
19793     case dataViewTag$4:
19794       if ((object.byteLength != other.byteLength) ||
19795           (object.byteOffset != other.byteOffset)) {
19796         return false;
19797       }
19798       object = object.buffer;
19799       other = other.buffer;
19800
19801     case arrayBufferTag$3:
19802       if ((object.byteLength != other.byteLength) ||
19803           !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19804         return false;
19805       }
19806       return true;
19807
19808     case boolTag$3:
19809     case dateTag$3:
19810     case numberTag$3:
19811       // Coerce booleans to `1` or `0` and dates to milliseconds.
19812       // Invalid dates are coerced to `NaN`.
19813       return eq(+object, +other);
19814
19815     case errorTag$2:
19816       return object.name == other.name && object.message == other.message;
19817
19818     case regexpTag$3:
19819     case stringTag$3:
19820       // Coerce regexes to strings and treat strings, primitives and objects,
19821       // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19822       // for more details.
19823       return object == (other + '');
19824
19825     case mapTag$5:
19826       var convert = mapToArray;
19827
19828     case setTag$5:
19829       var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19830       convert || (convert = setToArray);
19831
19832       if (object.size != other.size && !isPartial) {
19833         return false;
19834       }
19835       // Assume cyclic values are equal.
19836       var stacked = stack.get(object);
19837       if (stacked) {
19838         return stacked == other;
19839       }
19840       bitmask |= COMPARE_UNORDERED_FLAG$1;
19841
19842       // Recursively compare objects (susceptible to call stack limits).
19843       stack.set(object, other);
19844       var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19845       stack['delete'](object);
19846       return result;
19847
19848     case symbolTag$2:
19849       if (symbolValueOf$1) {
19850         return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19851       }
19852   }
19853   return false;
19854 }
19855
19856 /** Used to compose bitmasks for value comparisons. */
19857 var COMPARE_PARTIAL_FLAG$2 = 1;
19858
19859 /** Used for built-in method references. */
19860 var objectProto$13 = Object.prototype;
19861
19862 /** Used to check objects for own properties. */
19863 var hasOwnProperty$10 = objectProto$13.hasOwnProperty;
19864
19865 /**
19866  * A specialized version of `baseIsEqualDeep` for objects with support for
19867  * partial deep comparisons.
19868  *
19869  * @private
19870  * @param {Object} object The object to compare.
19871  * @param {Object} other The other object to compare.
19872  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19873  * @param {Function} customizer The function to customize comparisons.
19874  * @param {Function} equalFunc The function to determine equivalents of values.
19875  * @param {Object} stack Tracks traversed `object` and `other` objects.
19876  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19877  */
19878 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19879   var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19880       objProps = getAllKeys(object),
19881       objLength = objProps.length,
19882       othProps = getAllKeys(other),
19883       othLength = othProps.length;
19884
19885   if (objLength != othLength && !isPartial) {
19886     return false;
19887   }
19888   var index = objLength;
19889   while (index--) {
19890     var key = objProps[index];
19891     if (!(isPartial ? key in other : hasOwnProperty$10.call(other, key))) {
19892       return false;
19893     }
19894   }
19895   // Assume cyclic values are equal.
19896   var stacked = stack.get(object);
19897   if (stacked && stack.get(other)) {
19898     return stacked == other;
19899   }
19900   var result = true;
19901   stack.set(object, other);
19902   stack.set(other, object);
19903
19904   var skipCtor = isPartial;
19905   while (++index < objLength) {
19906     key = objProps[index];
19907     var objValue = object[key],
19908         othValue = other[key];
19909
19910     if (customizer) {
19911       var compared = isPartial
19912         ? customizer(othValue, objValue, key, other, object, stack)
19913         : customizer(objValue, othValue, key, object, other, stack);
19914     }
19915     // Recursively compare objects (susceptible to call stack limits).
19916     if (!(compared === undefined
19917           ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19918           : compared
19919         )) {
19920       result = false;
19921       break;
19922     }
19923     skipCtor || (skipCtor = key == 'constructor');
19924   }
19925   if (result && !skipCtor) {
19926     var objCtor = object.constructor,
19927         othCtor = other.constructor;
19928
19929     // Non `Object` object instances with different constructors are not equal.
19930     if (objCtor != othCtor &&
19931         ('constructor' in object && 'constructor' in other) &&
19932         !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19933           typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19934       result = false;
19935     }
19936   }
19937   stack['delete'](object);
19938   stack['delete'](other);
19939   return result;
19940 }
19941
19942 /** Used to compose bitmasks for value comparisons. */
19943 var COMPARE_PARTIAL_FLAG$3 = 1;
19944
19945 /** `Object#toString` result references. */
19946 var argsTag$3 = '[object Arguments]',
19947     arrayTag$2 = '[object Array]',
19948     objectTag$3 = '[object Object]';
19949
19950 /** Used for built-in method references. */
19951 var objectProto$14 = Object.prototype;
19952
19953 /** Used to check objects for own properties. */
19954 var hasOwnProperty$11 = objectProto$14.hasOwnProperty;
19955
19956 /**
19957  * A specialized version of `baseIsEqual` for arrays and objects which performs
19958  * deep comparisons and tracks traversed objects enabling objects with circular
19959  * references to be compared.
19960  *
19961  * @private
19962  * @param {Object} object The object to compare.
19963  * @param {Object} other The other object to compare.
19964  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19965  * @param {Function} customizer The function to customize comparisons.
19966  * @param {Function} equalFunc The function to determine equivalents of values.
19967  * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19968  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19969  */
19970 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19971   var objIsArr = isArray(object),
19972       othIsArr = isArray(other),
19973       objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19974       othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19975
19976   objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19977   othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19978
19979   var objIsObj = objTag == objectTag$3,
19980       othIsObj = othTag == objectTag$3,
19981       isSameTag = objTag == othTag;
19982
19983   if (isSameTag && isBuffer(object)) {
19984     if (!isBuffer(other)) {
19985       return false;
19986     }
19987     objIsArr = true;
19988     objIsObj = false;
19989   }
19990   if (isSameTag && !objIsObj) {
19991     stack || (stack = new Stack);
19992     return (objIsArr || isTypedArray(object))
19993       ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
19994       : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
19995   }
19996   if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
19997     var objIsWrapped = objIsObj && hasOwnProperty$11.call(object, '__wrapped__'),
19998         othIsWrapped = othIsObj && hasOwnProperty$11.call(other, '__wrapped__');
19999
20000     if (objIsWrapped || othIsWrapped) {
20001       var objUnwrapped = objIsWrapped ? object.value() : object,
20002           othUnwrapped = othIsWrapped ? other.value() : other;
20003
20004       stack || (stack = new Stack);
20005       return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20006     }
20007   }
20008   if (!isSameTag) {
20009     return false;
20010   }
20011   stack || (stack = new Stack);
20012   return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20013 }
20014
20015 /**
20016  * The base implementation of `_.isEqual` which supports partial comparisons
20017  * and tracks traversed objects.
20018  *
20019  * @private
20020  * @param {*} value The value to compare.
20021  * @param {*} other The other value to compare.
20022  * @param {boolean} bitmask The bitmask flags.
20023  *  1 - Unordered comparison
20024  *  2 - Partial comparison
20025  * @param {Function} [customizer] The function to customize comparisons.
20026  * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20027  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20028  */
20029 function baseIsEqual(value, other, bitmask, customizer, stack) {
20030   if (value === other) {
20031     return true;
20032   }
20033   if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20034     return value !== value && other !== other;
20035   }
20036   return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20037 }
20038
20039 /** Used to compose bitmasks for value comparisons. */
20040 var COMPARE_PARTIAL_FLAG$4 = 1,
20041     COMPARE_UNORDERED_FLAG$2 = 2;
20042
20043 /**
20044  * The base implementation of `_.isMatch` without support for iteratee shorthands.
20045  *
20046  * @private
20047  * @param {Object} object The object to inspect.
20048  * @param {Object} source The object of property values to match.
20049  * @param {Array} matchData The property names, values, and compare flags to match.
20050  * @param {Function} [customizer] The function to customize comparisons.
20051  * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20052  */
20053 function baseIsMatch(object, source, matchData, customizer) {
20054   var index = matchData.length,
20055       length = index,
20056       noCustomizer = !customizer;
20057
20058   if (object == null) {
20059     return !length;
20060   }
20061   object = Object(object);
20062   while (index--) {
20063     var data = matchData[index];
20064     if ((noCustomizer && data[2])
20065           ? data[1] !== object[data[0]]
20066           : !(data[0] in object)
20067         ) {
20068       return false;
20069     }
20070   }
20071   while (++index < length) {
20072     data = matchData[index];
20073     var key = data[0],
20074         objValue = object[key],
20075         srcValue = data[1];
20076
20077     if (noCustomizer && data[2]) {
20078       if (objValue === undefined && !(key in object)) {
20079         return false;
20080       }
20081     } else {
20082       var stack = new Stack;
20083       if (customizer) {
20084         var result = customizer(objValue, srcValue, key, object, source, stack);
20085       }
20086       if (!(result === undefined
20087             ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20088             : result
20089           )) {
20090         return false;
20091       }
20092     }
20093   }
20094   return true;
20095 }
20096
20097 /**
20098  * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20099  *
20100  * @private
20101  * @param {*} value The value to check.
20102  * @returns {boolean} Returns `true` if `value` if suitable for strict
20103  *  equality comparisons, else `false`.
20104  */
20105 function isStrictComparable(value) {
20106   return value === value && !isObject(value);
20107 }
20108
20109 /**
20110  * Gets the property names, values, and compare flags of `object`.
20111  *
20112  * @private
20113  * @param {Object} object The object to query.
20114  * @returns {Array} Returns the match data of `object`.
20115  */
20116 function getMatchData(object) {
20117   var result = keys$1(object),
20118       length = result.length;
20119
20120   while (length--) {
20121     var key = result[length],
20122         value = object[key];
20123
20124     result[length] = [key, value, isStrictComparable(value)];
20125   }
20126   return result;
20127 }
20128
20129 /**
20130  * A specialized version of `matchesProperty` for source values suitable
20131  * for strict equality comparisons, i.e. `===`.
20132  *
20133  * @private
20134  * @param {string} key The key of the property to get.
20135  * @param {*} srcValue The value to match.
20136  * @returns {Function} Returns the new spec function.
20137  */
20138 function matchesStrictComparable(key, srcValue) {
20139   return function(object) {
20140     if (object == null) {
20141       return false;
20142     }
20143     return object[key] === srcValue &&
20144       (srcValue !== undefined || (key in Object(object)));
20145   };
20146 }
20147
20148 /**
20149  * The base implementation of `_.matches` which doesn't clone `source`.
20150  *
20151  * @private
20152  * @param {Object} source The object of property values to match.
20153  * @returns {Function} Returns the new spec function.
20154  */
20155 function baseMatches(source) {
20156   var matchData = getMatchData(source);
20157   if (matchData.length == 1 && matchData[0][2]) {
20158     return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20159   }
20160   return function(object) {
20161     return object === source || baseIsMatch(object, source, matchData);
20162   };
20163 }
20164
20165 /** `Object#toString` result references. */
20166 var symbolTag$3 = '[object Symbol]';
20167
20168 /**
20169  * Checks if `value` is classified as a `Symbol` primitive or object.
20170  *
20171  * @static
20172  * @memberOf _
20173  * @since 4.0.0
20174  * @category Lang
20175  * @param {*} value The value to check.
20176  * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20177  * @example
20178  *
20179  * _.isSymbol(Symbol.iterator);
20180  * // => true
20181  *
20182  * _.isSymbol('abc');
20183  * // => false
20184  */
20185 function isSymbol(value) {
20186   return typeof value == 'symbol' ||
20187     (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20188 }
20189
20190 /** Used to match property names within property paths. */
20191 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20192     reIsPlainProp = /^\w*$/;
20193
20194 /**
20195  * Checks if `value` is a property name and not a property path.
20196  *
20197  * @private
20198  * @param {*} value The value to check.
20199  * @param {Object} [object] The object to query keys on.
20200  * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20201  */
20202 function isKey(value, object) {
20203   if (isArray(value)) {
20204     return false;
20205   }
20206   var type = typeof value;
20207   if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20208       value == null || isSymbol(value)) {
20209     return true;
20210   }
20211   return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20212     (object != null && value in Object(object));
20213 }
20214
20215 /** Error message constants. */
20216 var FUNC_ERROR_TEXT = 'Expected a function';
20217
20218 /**
20219  * Creates a function that memoizes the result of `func`. If `resolver` is
20220  * provided, it determines the cache key for storing the result based on the
20221  * arguments provided to the memoized function. By default, the first argument
20222  * provided to the memoized function is used as the map cache key. The `func`
20223  * is invoked with the `this` binding of the memoized function.
20224  *
20225  * **Note:** The cache is exposed as the `cache` property on the memoized
20226  * function. Its creation may be customized by replacing the `_.memoize.Cache`
20227  * constructor with one whose instances implement the
20228  * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20229  * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20230  *
20231  * @static
20232  * @memberOf _
20233  * @since 0.1.0
20234  * @category Function
20235  * @param {Function} func The function to have its output memoized.
20236  * @param {Function} [resolver] The function to resolve the cache key.
20237  * @returns {Function} Returns the new memoized function.
20238  * @example
20239  *
20240  * var object = { 'a': 1, 'b': 2 };
20241  * var other = { 'c': 3, 'd': 4 };
20242  *
20243  * var values = _.memoize(_.values);
20244  * values(object);
20245  * // => [1, 2]
20246  *
20247  * values(other);
20248  * // => [3, 4]
20249  *
20250  * object.a = 2;
20251  * values(object);
20252  * // => [1, 2]
20253  *
20254  * // Modify the result cache.
20255  * values.cache.set(object, ['a', 'b']);
20256  * values(object);
20257  * // => ['a', 'b']
20258  *
20259  * // Replace `_.memoize.Cache`.
20260  * _.memoize.Cache = WeakMap;
20261  */
20262 function memoize(func, resolver) {
20263   if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20264     throw new TypeError(FUNC_ERROR_TEXT);
20265   }
20266   var memoized = function() {
20267     var args = arguments,
20268         key = resolver ? resolver.apply(this, args) : args[0],
20269         cache = memoized.cache;
20270
20271     if (cache.has(key)) {
20272       return cache.get(key);
20273     }
20274     var result = func.apply(this, args);
20275     memoized.cache = cache.set(key, result) || cache;
20276     return result;
20277   };
20278   memoized.cache = new (memoize.Cache || MapCache);
20279   return memoized;
20280 }
20281
20282 // Expose `MapCache`.
20283 memoize.Cache = MapCache;
20284
20285 /** Used as the maximum memoize cache size. */
20286 var MAX_MEMOIZE_SIZE = 500;
20287
20288 /**
20289  * A specialized version of `_.memoize` which clears the memoized function's
20290  * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20291  *
20292  * @private
20293  * @param {Function} func The function to have its output memoized.
20294  * @returns {Function} Returns the new memoized function.
20295  */
20296 function memoizeCapped(func) {
20297   var result = memoize(func, function(key) {
20298     if (cache.size === MAX_MEMOIZE_SIZE) {
20299       cache.clear();
20300     }
20301     return key;
20302   });
20303
20304   var cache = result.cache;
20305   return result;
20306 }
20307
20308 /** Used to match property names within property paths. */
20309 var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20310
20311 /** Used to match backslashes in property paths. */
20312 var reEscapeChar = /\\(\\)?/g;
20313
20314 /**
20315  * Converts `string` to a property path array.
20316  *
20317  * @private
20318  * @param {string} string The string to convert.
20319  * @returns {Array} Returns the property path array.
20320  */
20321 var stringToPath = memoizeCapped(function(string) {
20322   var result = [];
20323   if (string.charCodeAt(0) === 46 /* . */) {
20324     result.push('');
20325   }
20326   string.replace(rePropName, function(match, number, quote, subString) {
20327     result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20328   });
20329   return result;
20330 });
20331
20332 /**
20333  * A specialized version of `_.map` for arrays without support for iteratee
20334  * shorthands.
20335  *
20336  * @private
20337  * @param {Array} [array] The array to iterate over.
20338  * @param {Function} iteratee The function invoked per iteration.
20339  * @returns {Array} Returns the new mapped array.
20340  */
20341 function arrayMap(array, iteratee) {
20342   var index = -1,
20343       length = array == null ? 0 : array.length,
20344       result = Array(length);
20345
20346   while (++index < length) {
20347     result[index] = iteratee(array[index], index, array);
20348   }
20349   return result;
20350 }
20351
20352 /** Used as references for various `Number` constants. */
20353 var INFINITY = 1 / 0;
20354
20355 /** Used to convert symbols to primitives and strings. */
20356 var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20357     symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20358
20359 /**
20360  * The base implementation of `_.toString` which doesn't convert nullish
20361  * values to empty strings.
20362  *
20363  * @private
20364  * @param {*} value The value to process.
20365  * @returns {string} Returns the string.
20366  */
20367 function baseToString(value) {
20368   // Exit early for strings to avoid a performance hit in some environments.
20369   if (typeof value == 'string') {
20370     return value;
20371   }
20372   if (isArray(value)) {
20373     // Recursively convert values (susceptible to call stack limits).
20374     return arrayMap(value, baseToString) + '';
20375   }
20376   if (isSymbol(value)) {
20377     return symbolToString ? symbolToString.call(value) : '';
20378   }
20379   var result = (value + '');
20380   return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20381 }
20382
20383 /**
20384  * Converts `value` to a string. An empty string is returned for `null`
20385  * and `undefined` values. The sign of `-0` is preserved.
20386  *
20387  * @static
20388  * @memberOf _
20389  * @since 4.0.0
20390  * @category Lang
20391  * @param {*} value The value to convert.
20392  * @returns {string} Returns the converted string.
20393  * @example
20394  *
20395  * _.toString(null);
20396  * // => ''
20397  *
20398  * _.toString(-0);
20399  * // => '-0'
20400  *
20401  * _.toString([1, 2, 3]);
20402  * // => '1,2,3'
20403  */
20404 function toString(value) {
20405   return value == null ? '' : baseToString(value);
20406 }
20407
20408 /**
20409  * Casts `value` to a path array if it's not one.
20410  *
20411  * @private
20412  * @param {*} value The value to inspect.
20413  * @param {Object} [object] The object to query keys on.
20414  * @returns {Array} Returns the cast property path array.
20415  */
20416 function castPath(value, object) {
20417   if (isArray(value)) {
20418     return value;
20419   }
20420   return isKey(value, object) ? [value] : stringToPath(toString(value));
20421 }
20422
20423 /** Used as references for various `Number` constants. */
20424 var INFINITY$1 = 1 / 0;
20425
20426 /**
20427  * Converts `value` to a string key if it's not a string or symbol.
20428  *
20429  * @private
20430  * @param {*} value The value to inspect.
20431  * @returns {string|symbol} Returns the key.
20432  */
20433 function toKey(value) {
20434   if (typeof value == 'string' || isSymbol(value)) {
20435     return value;
20436   }
20437   var result = (value + '');
20438   return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20439 }
20440
20441 /**
20442  * The base implementation of `_.get` without support for default values.
20443  *
20444  * @private
20445  * @param {Object} object The object to query.
20446  * @param {Array|string} path The path of the property to get.
20447  * @returns {*} Returns the resolved value.
20448  */
20449 function baseGet(object, path) {
20450   path = castPath(path, object);
20451
20452   var index = 0,
20453       length = path.length;
20454
20455   while (object != null && index < length) {
20456     object = object[toKey(path[index++])];
20457   }
20458   return (index && index == length) ? object : undefined;
20459 }
20460
20461 /**
20462  * Gets the value at `path` of `object`. If the resolved value is
20463  * `undefined`, the `defaultValue` is returned in its place.
20464  *
20465  * @static
20466  * @memberOf _
20467  * @since 3.7.0
20468  * @category Object
20469  * @param {Object} object The object to query.
20470  * @param {Array|string} path The path of the property to get.
20471  * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20472  * @returns {*} Returns the resolved value.
20473  * @example
20474  *
20475  * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20476  *
20477  * _.get(object, 'a[0].b.c');
20478  * // => 3
20479  *
20480  * _.get(object, ['a', '0', 'b', 'c']);
20481  * // => 3
20482  *
20483  * _.get(object, 'a.b.c', 'default');
20484  * // => 'default'
20485  */
20486 function get$2(object, path, defaultValue) {
20487   var result = object == null ? undefined : baseGet(object, path);
20488   return result === undefined ? defaultValue : result;
20489 }
20490
20491 /**
20492  * The base implementation of `_.hasIn` without support for deep paths.
20493  *
20494  * @private
20495  * @param {Object} [object] The object to query.
20496  * @param {Array|string} key The key to check.
20497  * @returns {boolean} Returns `true` if `key` exists, else `false`.
20498  */
20499 function baseHasIn(object, key) {
20500   return object != null && key in Object(object);
20501 }
20502
20503 /**
20504  * Checks if `path` exists on `object`.
20505  *
20506  * @private
20507  * @param {Object} object The object to query.
20508  * @param {Array|string} path The path to check.
20509  * @param {Function} hasFunc The function to check properties.
20510  * @returns {boolean} Returns `true` if `path` exists, else `false`.
20511  */
20512 function hasPath(object, path, hasFunc) {
20513   path = castPath(path, object);
20514
20515   var index = -1,
20516       length = path.length,
20517       result = false;
20518
20519   while (++index < length) {
20520     var key = toKey(path[index]);
20521     if (!(result = object != null && hasFunc(object, key))) {
20522       break;
20523     }
20524     object = object[key];
20525   }
20526   if (result || ++index != length) {
20527     return result;
20528   }
20529   length = object == null ? 0 : object.length;
20530   return !!length && isLength(length) && isIndex(key, length) &&
20531     (isArray(object) || isArguments(object));
20532 }
20533
20534 /**
20535  * Checks if `path` is a direct or inherited property of `object`.
20536  *
20537  * @static
20538  * @memberOf _
20539  * @since 4.0.0
20540  * @category Object
20541  * @param {Object} object The object to query.
20542  * @param {Array|string} path The path to check.
20543  * @returns {boolean} Returns `true` if `path` exists, else `false`.
20544  * @example
20545  *
20546  * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20547  *
20548  * _.hasIn(object, 'a');
20549  * // => true
20550  *
20551  * _.hasIn(object, 'a.b');
20552  * // => true
20553  *
20554  * _.hasIn(object, ['a', 'b']);
20555  * // => true
20556  *
20557  * _.hasIn(object, 'b');
20558  * // => false
20559  */
20560 function hasIn(object, path) {
20561   return object != null && hasPath(object, path, baseHasIn);
20562 }
20563
20564 /** Used to compose bitmasks for value comparisons. */
20565 var COMPARE_PARTIAL_FLAG$5 = 1,
20566     COMPARE_UNORDERED_FLAG$3 = 2;
20567
20568 /**
20569  * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20570  *
20571  * @private
20572  * @param {string} path The path of the property to get.
20573  * @param {*} srcValue The value to match.
20574  * @returns {Function} Returns the new spec function.
20575  */
20576 function baseMatchesProperty(path, srcValue) {
20577   if (isKey(path) && isStrictComparable(srcValue)) {
20578     return matchesStrictComparable(toKey(path), srcValue);
20579   }
20580   return function(object) {
20581     var objValue = get$2(object, path);
20582     return (objValue === undefined && objValue === srcValue)
20583       ? hasIn(object, path)
20584       : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20585   };
20586 }
20587
20588 /**
20589  * This method returns the first argument it receives.
20590  *
20591  * @static
20592  * @since 0.1.0
20593  * @memberOf _
20594  * @category Util
20595  * @param {*} value Any value.
20596  * @returns {*} Returns `value`.
20597  * @example
20598  *
20599  * var object = { 'a': 1 };
20600  *
20601  * console.log(_.identity(object) === object);
20602  * // => true
20603  */
20604 function identity$8(value) {
20605   return value;
20606 }
20607
20608 /**
20609  * The base implementation of `_.property` without support for deep paths.
20610  *
20611  * @private
20612  * @param {string} key The key of the property to get.
20613  * @returns {Function} Returns the new accessor function.
20614  */
20615 function baseProperty(key) {
20616   return function(object) {
20617     return object == null ? undefined : object[key];
20618   };
20619 }
20620
20621 /**
20622  * A specialized version of `baseProperty` which supports deep paths.
20623  *
20624  * @private
20625  * @param {Array|string} path The path of the property to get.
20626  * @returns {Function} Returns the new accessor function.
20627  */
20628 function basePropertyDeep(path) {
20629   return function(object) {
20630     return baseGet(object, path);
20631   };
20632 }
20633
20634 /**
20635  * Creates a function that returns the value at `path` of a given object.
20636  *
20637  * @static
20638  * @memberOf _
20639  * @since 2.4.0
20640  * @category Util
20641  * @param {Array|string} path The path of the property to get.
20642  * @returns {Function} Returns the new accessor function.
20643  * @example
20644  *
20645  * var objects = [
20646  *   { 'a': { 'b': 2 } },
20647  *   { 'a': { 'b': 1 } }
20648  * ];
20649  *
20650  * _.map(objects, _.property('a.b'));
20651  * // => [2, 1]
20652  *
20653  * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20654  * // => [1, 2]
20655  */
20656 function property(path) {
20657   return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20658 }
20659
20660 /**
20661  * The base implementation of `_.iteratee`.
20662  *
20663  * @private
20664  * @param {*} [value=_.identity] The value to convert to an iteratee.
20665  * @returns {Function} Returns the iteratee.
20666  */
20667 function baseIteratee(value) {
20668   // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20669   // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20670   if (typeof value == 'function') {
20671     return value;
20672   }
20673   if (value == null) {
20674     return identity$8;
20675   }
20676   if (typeof value == 'object') {
20677     return isArray(value)
20678       ? baseMatchesProperty(value[0], value[1])
20679       : baseMatches(value);
20680   }
20681   return property(value);
20682 }
20683
20684 /**
20685  * Creates a function like `_.groupBy`.
20686  *
20687  * @private
20688  * @param {Function} setter The function to set accumulator values.
20689  * @param {Function} [initializer] The accumulator object initializer.
20690  * @returns {Function} Returns the new aggregator function.
20691  */
20692 function createAggregator(setter, initializer) {
20693   return function(collection, iteratee) {
20694     var func = isArray(collection) ? arrayAggregator : baseAggregator,
20695         accumulator = initializer ? initializer() : {};
20696
20697     return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20698   };
20699 }
20700
20701 /** Used for built-in method references. */
20702 var objectProto$15 = Object.prototype;
20703
20704 /** Used to check objects for own properties. */
20705 var hasOwnProperty$12 = objectProto$15.hasOwnProperty;
20706
20707 /**
20708  * Creates an object composed of keys generated from the results of running
20709  * each element of `collection` thru `iteratee`. The order of grouped values
20710  * is determined by the order they occur in `collection`. The corresponding
20711  * value of each key is an array of elements responsible for generating the
20712  * key. The iteratee is invoked with one argument: (value).
20713  *
20714  * @static
20715  * @memberOf _
20716  * @since 0.1.0
20717  * @category Collection
20718  * @param {Array|Object} collection The collection to iterate over.
20719  * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20720  * @returns {Object} Returns the composed aggregate object.
20721  * @example
20722  *
20723  * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20724  * // => { '4': [4.2], '6': [6.1, 6.3] }
20725  *
20726  * // The `_.property` iteratee shorthand.
20727  * _.groupBy(['one', 'two', 'three'], 'length');
20728  * // => { '3': ['one', 'two'], '5': ['three'] }
20729  */
20730 var groupBy = createAggregator(function(result, value, key) {
20731   if (hasOwnProperty$12.call(result, key)) {
20732     result[key].push(value);
20733   } else {
20734     baseAssignValue(result, key, [value]);
20735   }
20736 });
20737
20738 /**
20739  * Gets the last element of `array`.
20740  *
20741  * @static
20742  * @memberOf _
20743  * @since 0.1.0
20744  * @category Array
20745  * @param {Array} array The array to query.
20746  * @returns {*} Returns the last element of `array`.
20747  * @example
20748  *
20749  * _.last([1, 2, 3]);
20750  * // => 3
20751  */
20752 function last(array) {
20753   var length = array == null ? 0 : array.length;
20754   return length ? array[length - 1] : undefined;
20755 }
20756
20757 /**
20758  * The base implementation of `_.slice` without an iteratee call guard.
20759  *
20760  * @private
20761  * @param {Array} array The array to slice.
20762  * @param {number} [start=0] The start position.
20763  * @param {number} [end=array.length] The end position.
20764  * @returns {Array} Returns the slice of `array`.
20765  */
20766 function baseSlice(array, start, end) {
20767   var index = -1,
20768       length = array.length;
20769
20770   if (start < 0) {
20771     start = -start > length ? 0 : (length + start);
20772   }
20773   end = end > length ? length : end;
20774   if (end < 0) {
20775     end += length;
20776   }
20777   length = start > end ? 0 : ((end - start) >>> 0);
20778   start >>>= 0;
20779
20780   var result = Array(length);
20781   while (++index < length) {
20782     result[index] = array[index + start];
20783   }
20784   return result;
20785 }
20786
20787 /**
20788  * Gets the parent value at `path` of `object`.
20789  *
20790  * @private
20791  * @param {Object} object The object to query.
20792  * @param {Array} path The path to get the parent value of.
20793  * @returns {*} Returns the parent value.
20794  */
20795 function parent(object, path) {
20796   return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20797 }
20798
20799 /**
20800  * The base implementation of `_.unset`.
20801  *
20802  * @private
20803  * @param {Object} object The object to modify.
20804  * @param {Array|string} path The property path to unset.
20805  * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20806  */
20807 function baseUnset(object, path) {
20808   path = castPath(path, object);
20809   object = parent(object, path);
20810   return object == null || delete object[toKey(last(path))];
20811 }
20812
20813 /** `Object#toString` result references. */
20814 var objectTag$4 = '[object Object]';
20815
20816 /** Used for built-in method references. */
20817 var funcProto$2 = Function.prototype,
20818     objectProto$16 = Object.prototype;
20819
20820 /** Used to resolve the decompiled source of functions. */
20821 var funcToString$2 = funcProto$2.toString;
20822
20823 /** Used to check objects for own properties. */
20824 var hasOwnProperty$13 = objectProto$16.hasOwnProperty;
20825
20826 /** Used to infer the `Object` constructor. */
20827 var objectCtorString = funcToString$2.call(Object);
20828
20829 /**
20830  * Checks if `value` is a plain object, that is, an object created by the
20831  * `Object` constructor or one with a `[[Prototype]]` of `null`.
20832  *
20833  * @static
20834  * @memberOf _
20835  * @since 0.8.0
20836  * @category Lang
20837  * @param {*} value The value to check.
20838  * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20839  * @example
20840  *
20841  * function Foo() {
20842  *   this.a = 1;
20843  * }
20844  *
20845  * _.isPlainObject(new Foo);
20846  * // => false
20847  *
20848  * _.isPlainObject([1, 2, 3]);
20849  * // => false
20850  *
20851  * _.isPlainObject({ 'x': 0, 'y': 0 });
20852  * // => true
20853  *
20854  * _.isPlainObject(Object.create(null));
20855  * // => true
20856  */
20857 function isPlainObject(value) {
20858   if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20859     return false;
20860   }
20861   var proto = getPrototype(value);
20862   if (proto === null) {
20863     return true;
20864   }
20865   var Ctor = hasOwnProperty$13.call(proto, 'constructor') && proto.constructor;
20866   return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20867     funcToString$2.call(Ctor) == objectCtorString;
20868 }
20869
20870 /**
20871  * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20872  * objects.
20873  *
20874  * @private
20875  * @param {*} value The value to inspect.
20876  * @param {string} key The key of the property to inspect.
20877  * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20878  */
20879 function customOmitClone(value) {
20880   return isPlainObject(value) ? undefined : value;
20881 }
20882
20883 /** Built-in value references. */
20884 var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20885
20886 /**
20887  * Checks if `value` is a flattenable `arguments` object or array.
20888  *
20889  * @private
20890  * @param {*} value The value to check.
20891  * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20892  */
20893 function isFlattenable(value) {
20894   return isArray(value) || isArguments(value) ||
20895     !!(spreadableSymbol && value && value[spreadableSymbol]);
20896 }
20897
20898 /**
20899  * The base implementation of `_.flatten` with support for restricting flattening.
20900  *
20901  * @private
20902  * @param {Array} array The array to flatten.
20903  * @param {number} depth The maximum recursion depth.
20904  * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20905  * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20906  * @param {Array} [result=[]] The initial result value.
20907  * @returns {Array} Returns the new flattened array.
20908  */
20909 function baseFlatten(array, depth, predicate, isStrict, result) {
20910   var index = -1,
20911       length = array.length;
20912
20913   predicate || (predicate = isFlattenable);
20914   result || (result = []);
20915
20916   while (++index < length) {
20917     var value = array[index];
20918     if (depth > 0 && predicate(value)) {
20919       if (depth > 1) {
20920         // Recursively flatten arrays (susceptible to call stack limits).
20921         baseFlatten(value, depth - 1, predicate, isStrict, result);
20922       } else {
20923         arrayPush(result, value);
20924       }
20925     } else if (!isStrict) {
20926       result[result.length] = value;
20927     }
20928   }
20929   return result;
20930 }
20931
20932 /**
20933  * Flattens `array` a single level deep.
20934  *
20935  * @static
20936  * @memberOf _
20937  * @since 0.1.0
20938  * @category Array
20939  * @param {Array} array The array to flatten.
20940  * @returns {Array} Returns the new flattened array.
20941  * @example
20942  *
20943  * _.flatten([1, [2, [3, [4]], 5]]);
20944  * // => [1, 2, [3, [4]], 5]
20945  */
20946 function flatten(array) {
20947   var length = array == null ? 0 : array.length;
20948   return length ? baseFlatten(array, 1) : [];
20949 }
20950
20951 /**
20952  * A faster alternative to `Function#apply`, this function invokes `func`
20953  * with the `this` binding of `thisArg` and the arguments of `args`.
20954  *
20955  * @private
20956  * @param {Function} func The function to invoke.
20957  * @param {*} thisArg The `this` binding of `func`.
20958  * @param {Array} args The arguments to invoke `func` with.
20959  * @returns {*} Returns the result of `func`.
20960  */
20961 function apply(func, thisArg, args) {
20962   switch (args.length) {
20963     case 0: return func.call(thisArg);
20964     case 1: return func.call(thisArg, args[0]);
20965     case 2: return func.call(thisArg, args[0], args[1]);
20966     case 3: return func.call(thisArg, args[0], args[1], args[2]);
20967   }
20968   return func.apply(thisArg, args);
20969 }
20970
20971 /* Built-in method references for those with the same name as other `lodash` methods. */
20972 var nativeMax = Math.max;
20973
20974 /**
20975  * A specialized version of `baseRest` which transforms the rest array.
20976  *
20977  * @private
20978  * @param {Function} func The function to apply a rest parameter to.
20979  * @param {number} [start=func.length-1] The start position of the rest parameter.
20980  * @param {Function} transform The rest array transform.
20981  * @returns {Function} Returns the new function.
20982  */
20983 function overRest(func, start, transform) {
20984   start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20985   return function() {
20986     var args = arguments,
20987         index = -1,
20988         length = nativeMax(args.length - start, 0),
20989         array = Array(length);
20990
20991     while (++index < length) {
20992       array[index] = args[start + index];
20993     }
20994     index = -1;
20995     var otherArgs = Array(start + 1);
20996     while (++index < start) {
20997       otherArgs[index] = args[index];
20998     }
20999     otherArgs[start] = transform(array);
21000     return apply(func, this, otherArgs);
21001   };
21002 }
21003
21004 /**
21005  * Creates a function that returns `value`.
21006  *
21007  * @static
21008  * @memberOf _
21009  * @since 2.4.0
21010  * @category Util
21011  * @param {*} value The value to return from the new function.
21012  * @returns {Function} Returns the new constant function.
21013  * @example
21014  *
21015  * var objects = _.times(2, _.constant({ 'a': 1 }));
21016  *
21017  * console.log(objects);
21018  * // => [{ 'a': 1 }, { 'a': 1 }]
21019  *
21020  * console.log(objects[0] === objects[1]);
21021  * // => true
21022  */
21023 function constant$13(value) {
21024   return function() {
21025     return value;
21026   };
21027 }
21028
21029 /**
21030  * The base implementation of `setToString` without support for hot loop shorting.
21031  *
21032  * @private
21033  * @param {Function} func The function to modify.
21034  * @param {Function} string The `toString` result.
21035  * @returns {Function} Returns `func`.
21036  */
21037 var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21038   return defineProperty(func, 'toString', {
21039     'configurable': true,
21040     'enumerable': false,
21041     'value': constant$13(string),
21042     'writable': true
21043   });
21044 };
21045
21046 /** Used to detect hot functions by number of calls within a span of milliseconds. */
21047 var HOT_COUNT = 800,
21048     HOT_SPAN = 16;
21049
21050 /* Built-in method references for those with the same name as other `lodash` methods. */
21051 var nativeNow = Date.now;
21052
21053 /**
21054  * Creates a function that'll short out and invoke `identity` instead
21055  * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21056  * milliseconds.
21057  *
21058  * @private
21059  * @param {Function} func The function to restrict.
21060  * @returns {Function} Returns the new shortable function.
21061  */
21062 function shortOut(func) {
21063   var count = 0,
21064       lastCalled = 0;
21065
21066   return function() {
21067     var stamp = nativeNow(),
21068         remaining = HOT_SPAN - (stamp - lastCalled);
21069
21070     lastCalled = stamp;
21071     if (remaining > 0) {
21072       if (++count >= HOT_COUNT) {
21073         return arguments[0];
21074       }
21075     } else {
21076       count = 0;
21077     }
21078     return func.apply(undefined, arguments);
21079   };
21080 }
21081
21082 /**
21083  * Sets the `toString` method of `func` to return `string`.
21084  *
21085  * @private
21086  * @param {Function} func The function to modify.
21087  * @param {Function} string The `toString` result.
21088  * @returns {Function} Returns `func`.
21089  */
21090 var setToString = shortOut(baseSetToString);
21091
21092 /**
21093  * A specialized version of `baseRest` which flattens the rest array.
21094  *
21095  * @private
21096  * @param {Function} func The function to apply a rest parameter to.
21097  * @returns {Function} Returns the new function.
21098  */
21099 function flatRest(func) {
21100   return setToString(overRest(func, undefined, flatten), func + '');
21101 }
21102
21103 /** Used to compose bitmasks for cloning. */
21104 var CLONE_DEEP_FLAG$1 = 1,
21105     CLONE_FLAT_FLAG$1 = 2,
21106     CLONE_SYMBOLS_FLAG$2 = 4;
21107
21108 /**
21109  * The opposite of `_.pick`; this method creates an object composed of the
21110  * own and inherited enumerable property paths of `object` that are not omitted.
21111  *
21112  * **Note:** This method is considerably slower than `_.pick`.
21113  *
21114  * @static
21115  * @since 0.1.0
21116  * @memberOf _
21117  * @category Object
21118  * @param {Object} object The source object.
21119  * @param {...(string|string[])} [paths] The property paths to omit.
21120  * @returns {Object} Returns the new object.
21121  * @example
21122  *
21123  * var object = { 'a': 1, 'b': '2', 'c': 3 };
21124  *
21125  * _.omit(object, ['a', 'c']);
21126  * // => { 'b': '2' }
21127  */
21128 var omit = flatRest(function(object, paths) {
21129   var result = {};
21130   if (object == null) {
21131     return result;
21132   }
21133   var isDeep = false;
21134   paths = arrayMap(paths, function(path) {
21135     path = castPath(path, object);
21136     isDeep || (isDeep = path.length > 1);
21137     return path;
21138   });
21139   copyObject(object, getAllKeysIn(object), result);
21140   if (isDeep) {
21141     result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21142   }
21143   var length = paths.length;
21144   while (length--) {
21145     baseUnset(result, paths[length]);
21146   }
21147   return result;
21148 });
21149
21150 /**
21151  * Creates an array with all falsey values removed. The values `false`, `null`,
21152  * `0`, `""`, `undefined`, and `NaN` are falsey.
21153  *
21154  * @static
21155  * @memberOf _
21156  * @since 0.1.0
21157  * @category Array
21158  * @param {Array} array The array to compact.
21159  * @returns {Array} Returns the new array of filtered values.
21160  * @example
21161  *
21162  * _.compact([0, 1, false, 2, '', 3]);
21163  * // => [1, 2, 3]
21164  */
21165 function compact(array) {
21166   var index = -1,
21167       length = array == null ? 0 : array.length,
21168       resIndex = 0,
21169       result = [];
21170
21171   while (++index < length) {
21172     var value = array[index];
21173     if (value) {
21174       result[resIndex++] = value;
21175     }
21176   }
21177   return result;
21178 }
21179
21180 /**
21181  * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21182  *
21183  * @private
21184  * @param {Function} func The function to apply a rest parameter to.
21185  * @param {number} [start=func.length-1] The start position of the rest parameter.
21186  * @returns {Function} Returns the new function.
21187  */
21188 function baseRest(func, start) {
21189   return setToString(overRest(func, start, identity$8), func + '');
21190 }
21191
21192 /**
21193  * Checks if the given arguments are from an iteratee call.
21194  *
21195  * @private
21196  * @param {*} value The potential iteratee value argument.
21197  * @param {*} index The potential iteratee index or key argument.
21198  * @param {*} object The potential iteratee object argument.
21199  * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21200  *  else `false`.
21201  */
21202 function isIterateeCall(value, index, object) {
21203   if (!isObject(object)) {
21204     return false;
21205   }
21206   var type = typeof index;
21207   if (type == 'number'
21208         ? (isArrayLike(object) && isIndex(index, object.length))
21209         : (type == 'string' && index in object)
21210       ) {
21211     return eq(object[index], value);
21212   }
21213   return false;
21214 }
21215
21216 /**
21217  * Creates a function like `_.assign`.
21218  *
21219  * @private
21220  * @param {Function} assigner The function to assign values.
21221  * @returns {Function} Returns the new assigner function.
21222  */
21223 function createAssigner(assigner) {
21224   return baseRest(function(object, sources) {
21225     var index = -1,
21226         length = sources.length,
21227         customizer = length > 1 ? sources[length - 1] : undefined,
21228         guard = length > 2 ? sources[2] : undefined;
21229
21230     customizer = (assigner.length > 3 && typeof customizer == 'function')
21231       ? (length--, customizer)
21232       : undefined;
21233
21234     if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21235       customizer = length < 3 ? undefined : customizer;
21236       length = 1;
21237     }
21238     object = Object(object);
21239     while (++index < length) {
21240       var source = sources[index];
21241       if (source) {
21242         assigner(object, source, index, customizer);
21243       }
21244     }
21245     return object;
21246   });
21247 }
21248
21249 /**
21250  * This method is like `_.assign` except that it iterates over own and
21251  * inherited source properties.
21252  *
21253  * **Note:** This method mutates `object`.
21254  *
21255  * @static
21256  * @memberOf _
21257  * @since 4.0.0
21258  * @alias extend
21259  * @category Object
21260  * @param {Object} object The destination object.
21261  * @param {...Object} [sources] The source objects.
21262  * @returns {Object} Returns `object`.
21263  * @see _.assign
21264  * @example
21265  *
21266  * function Foo() {
21267  *   this.a = 1;
21268  * }
21269  *
21270  * function Bar() {
21271  *   this.c = 3;
21272  * }
21273  *
21274  * Foo.prototype.b = 2;
21275  * Bar.prototype.d = 4;
21276  *
21277  * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21278  * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21279  */
21280 var assignIn = createAssigner(function(object, source) {
21281   copyObject(source, keysIn$1(source), object);
21282 });
21283
21284 /**
21285  * The base implementation of `_.filter` without support for iteratee shorthands.
21286  *
21287  * @private
21288  * @param {Array|Object} collection The collection to iterate over.
21289  * @param {Function} predicate The function invoked per iteration.
21290  * @returns {Array} Returns the new filtered array.
21291  */
21292 function baseFilter(collection, predicate) {
21293   var result = [];
21294   baseEach(collection, function(value, index, collection) {
21295     if (predicate(value, index, collection)) {
21296       result.push(value);
21297     }
21298   });
21299   return result;
21300 }
21301
21302 /**
21303  * Iterates over elements of `collection`, returning an array of all elements
21304  * `predicate` returns truthy for. The predicate is invoked with three
21305  * arguments: (value, index|key, collection).
21306  *
21307  * **Note:** Unlike `_.remove`, this method returns a new array.
21308  *
21309  * @static
21310  * @memberOf _
21311  * @since 0.1.0
21312  * @category Collection
21313  * @param {Array|Object} collection The collection to iterate over.
21314  * @param {Function} [predicate=_.identity] The function invoked per iteration.
21315  * @returns {Array} Returns the new filtered array.
21316  * @see _.reject
21317  * @example
21318  *
21319  * var users = [
21320  *   { 'user': 'barney', 'age': 36, 'active': true },
21321  *   { 'user': 'fred',   'age': 40, 'active': false }
21322  * ];
21323  *
21324  * _.filter(users, function(o) { return !o.active; });
21325  * // => objects for ['fred']
21326  *
21327  * // The `_.matches` iteratee shorthand.
21328  * _.filter(users, { 'age': 36, 'active': true });
21329  * // => objects for ['barney']
21330  *
21331  * // The `_.matchesProperty` iteratee shorthand.
21332  * _.filter(users, ['active', false]);
21333  * // => objects for ['fred']
21334  *
21335  * // The `_.property` iteratee shorthand.
21336  * _.filter(users, 'active');
21337  * // => objects for ['barney']
21338  */
21339 function filter(collection, predicate) {
21340   var func = isArray(collection) ? arrayFilter : baseFilter;
21341   return func(collection, baseIteratee(predicate, 3));
21342 }
21343
21344 /**
21345  * Creates a `_.find` or `_.findLast` function.
21346  *
21347  * @private
21348  * @param {Function} findIndexFunc The function to find the collection index.
21349  * @returns {Function} Returns the new find function.
21350  */
21351 function createFind(findIndexFunc) {
21352   return function(collection, predicate, fromIndex) {
21353     var iterable = Object(collection);
21354     if (!isArrayLike(collection)) {
21355       var iteratee = baseIteratee(predicate, 3);
21356       collection = keys$1(collection);
21357       predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21358     }
21359     var index = findIndexFunc(collection, predicate, fromIndex);
21360     return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21361   };
21362 }
21363
21364 /**
21365  * The base implementation of `_.findIndex` and `_.findLastIndex` without
21366  * support for iteratee shorthands.
21367  *
21368  * @private
21369  * @param {Array} array The array to inspect.
21370  * @param {Function} predicate The function invoked per iteration.
21371  * @param {number} fromIndex The index to search from.
21372  * @param {boolean} [fromRight] Specify iterating from right to left.
21373  * @returns {number} Returns the index of the matched value, else `-1`.
21374  */
21375 function baseFindIndex(array, predicate, fromIndex, fromRight) {
21376   var length = array.length,
21377       index = fromIndex + (fromRight ? 1 : -1);
21378
21379   while ((fromRight ? index-- : ++index < length)) {
21380     if (predicate(array[index], index, array)) {
21381       return index;
21382     }
21383   }
21384   return -1;
21385 }
21386
21387 /** Used as references for various `Number` constants. */
21388 var NAN = 0 / 0;
21389
21390 /** Used to match leading and trailing whitespace. */
21391 var reTrim = /^\s+|\s+$/g;
21392
21393 /** Used to detect bad signed hexadecimal string values. */
21394 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21395
21396 /** Used to detect binary string values. */
21397 var reIsBinary = /^0b[01]+$/i;
21398
21399 /** Used to detect octal string values. */
21400 var reIsOctal = /^0o[0-7]+$/i;
21401
21402 /** Built-in method references without a dependency on `root`. */
21403 var freeParseInt = parseInt;
21404
21405 /**
21406  * Converts `value` to a number.
21407  *
21408  * @static
21409  * @memberOf _
21410  * @since 4.0.0
21411  * @category Lang
21412  * @param {*} value The value to process.
21413  * @returns {number} Returns the number.
21414  * @example
21415  *
21416  * _.toNumber(3.2);
21417  * // => 3.2
21418  *
21419  * _.toNumber(Number.MIN_VALUE);
21420  * // => 5e-324
21421  *
21422  * _.toNumber(Infinity);
21423  * // => Infinity
21424  *
21425  * _.toNumber('3.2');
21426  * // => 3.2
21427  */
21428 function toNumber(value) {
21429   if (typeof value == 'number') {
21430     return value;
21431   }
21432   if (isSymbol(value)) {
21433     return NAN;
21434   }
21435   if (isObject(value)) {
21436     var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21437     value = isObject(other) ? (other + '') : other;
21438   }
21439   if (typeof value != 'string') {
21440     return value === 0 ? value : +value;
21441   }
21442   value = value.replace(reTrim, '');
21443   var isBinary = reIsBinary.test(value);
21444   return (isBinary || reIsOctal.test(value))
21445     ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21446     : (reIsBadHex.test(value) ? NAN : +value);
21447 }
21448
21449 /** Used as references for various `Number` constants. */
21450 var INFINITY$2 = 1 / 0,
21451     MAX_INTEGER = 1.7976931348623157e+308;
21452
21453 /**
21454  * Converts `value` to a finite number.
21455  *
21456  * @static
21457  * @memberOf _
21458  * @since 4.12.0
21459  * @category Lang
21460  * @param {*} value The value to convert.
21461  * @returns {number} Returns the converted number.
21462  * @example
21463  *
21464  * _.toFinite(3.2);
21465  * // => 3.2
21466  *
21467  * _.toFinite(Number.MIN_VALUE);
21468  * // => 5e-324
21469  *
21470  * _.toFinite(Infinity);
21471  * // => 1.7976931348623157e+308
21472  *
21473  * _.toFinite('3.2');
21474  * // => 3.2
21475  */
21476 function toFinite(value) {
21477   if (!value) {
21478     return value === 0 ? value : 0;
21479   }
21480   value = toNumber(value);
21481   if (value === INFINITY$2 || value === -INFINITY$2) {
21482     var sign = (value < 0 ? -1 : 1);
21483     return sign * MAX_INTEGER;
21484   }
21485   return value === value ? value : 0;
21486 }
21487
21488 /**
21489  * Converts `value` to an integer.
21490  *
21491  * **Note:** This method is loosely based on
21492  * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21493  *
21494  * @static
21495  * @memberOf _
21496  * @since 4.0.0
21497  * @category Lang
21498  * @param {*} value The value to convert.
21499  * @returns {number} Returns the converted integer.
21500  * @example
21501  *
21502  * _.toInteger(3.2);
21503  * // => 3
21504  *
21505  * _.toInteger(Number.MIN_VALUE);
21506  * // => 0
21507  *
21508  * _.toInteger(Infinity);
21509  * // => 1.7976931348623157e+308
21510  *
21511  * _.toInteger('3.2');
21512  * // => 3
21513  */
21514 function toInteger(value) {
21515   var result = toFinite(value),
21516       remainder = result % 1;
21517
21518   return result === result ? (remainder ? result - remainder : result) : 0;
21519 }
21520
21521 /* Built-in method references for those with the same name as other `lodash` methods. */
21522 var nativeMax$1 = Math.max;
21523
21524 /**
21525  * This method is like `_.find` except that it returns the index of the first
21526  * element `predicate` returns truthy for instead of the element itself.
21527  *
21528  * @static
21529  * @memberOf _
21530  * @since 1.1.0
21531  * @category Array
21532  * @param {Array} array The array to inspect.
21533  * @param {Function} [predicate=_.identity] The function invoked per iteration.
21534  * @param {number} [fromIndex=0] The index to search from.
21535  * @returns {number} Returns the index of the found element, else `-1`.
21536  * @example
21537  *
21538  * var users = [
21539  *   { 'user': 'barney',  'active': false },
21540  *   { 'user': 'fred',    'active': false },
21541  *   { 'user': 'pebbles', 'active': true }
21542  * ];
21543  *
21544  * _.findIndex(users, function(o) { return o.user == 'barney'; });
21545  * // => 0
21546  *
21547  * // The `_.matches` iteratee shorthand.
21548  * _.findIndex(users, { 'user': 'fred', 'active': false });
21549  * // => 1
21550  *
21551  * // The `_.matchesProperty` iteratee shorthand.
21552  * _.findIndex(users, ['active', false]);
21553  * // => 0
21554  *
21555  * // The `_.property` iteratee shorthand.
21556  * _.findIndex(users, 'active');
21557  * // => 2
21558  */
21559 function findIndex(array, predicate, fromIndex) {
21560   var length = array == null ? 0 : array.length;
21561   if (!length) {
21562     return -1;
21563   }
21564   var index = fromIndex == null ? 0 : toInteger(fromIndex);
21565   if (index < 0) {
21566     index = nativeMax$1(length + index, 0);
21567   }
21568   return baseFindIndex(array, baseIteratee(predicate, 3), index);
21569 }
21570
21571 /**
21572  * Iterates over elements of `collection`, returning the first element
21573  * `predicate` returns truthy for. The predicate is invoked with three
21574  * arguments: (value, index|key, collection).
21575  *
21576  * @static
21577  * @memberOf _
21578  * @since 0.1.0
21579  * @category Collection
21580  * @param {Array|Object} collection The collection to inspect.
21581  * @param {Function} [predicate=_.identity] The function invoked per iteration.
21582  * @param {number} [fromIndex=0] The index to search from.
21583  * @returns {*} Returns the matched element, else `undefined`.
21584  * @example
21585  *
21586  * var users = [
21587  *   { 'user': 'barney',  'age': 36, 'active': true },
21588  *   { 'user': 'fred',    'age': 40, 'active': false },
21589  *   { 'user': 'pebbles', 'age': 1,  'active': true }
21590  * ];
21591  *
21592  * _.find(users, function(o) { return o.age < 40; });
21593  * // => object for 'barney'
21594  *
21595  * // The `_.matches` iteratee shorthand.
21596  * _.find(users, { 'age': 1, 'active': true });
21597  * // => object for 'pebbles'
21598  *
21599  * // The `_.matchesProperty` iteratee shorthand.
21600  * _.find(users, ['active', false]);
21601  * // => object for 'fred'
21602  *
21603  * // The `_.property` iteratee shorthand.
21604  * _.find(users, 'active');
21605  * // => object for 'barney'
21606  */
21607 var find$1 = createFind(findIndex);
21608
21609 /**
21610  * The base implementation of `_.map` without support for iteratee shorthands.
21611  *
21612  * @private
21613  * @param {Array|Object} collection The collection to iterate over.
21614  * @param {Function} iteratee The function invoked per iteration.
21615  * @returns {Array} Returns the new mapped array.
21616  */
21617 function baseMap(collection, iteratee) {
21618   var index = -1,
21619       result = isArrayLike(collection) ? Array(collection.length) : [];
21620
21621   baseEach(collection, function(value, key, collection) {
21622     result[++index] = iteratee(value, key, collection);
21623   });
21624   return result;
21625 }
21626
21627 /**
21628  * Creates an array of values by running each element in `collection` thru
21629  * `iteratee`. The iteratee is invoked with three arguments:
21630  * (value, index|key, collection).
21631  *
21632  * Many lodash methods are guarded to work as iteratees for methods like
21633  * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21634  *
21635  * The guarded methods are:
21636  * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21637  * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21638  * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21639  * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21640  *
21641  * @static
21642  * @memberOf _
21643  * @since 0.1.0
21644  * @category Collection
21645  * @param {Array|Object} collection The collection to iterate over.
21646  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21647  * @returns {Array} Returns the new mapped array.
21648  * @example
21649  *
21650  * function square(n) {
21651  *   return n * n;
21652  * }
21653  *
21654  * _.map([4, 8], square);
21655  * // => [16, 64]
21656  *
21657  * _.map({ 'a': 4, 'b': 8 }, square);
21658  * // => [16, 64] (iteration order is not guaranteed)
21659  *
21660  * var users = [
21661  *   { 'user': 'barney' },
21662  *   { 'user': 'fred' }
21663  * ];
21664  *
21665  * // The `_.property` iteratee shorthand.
21666  * _.map(users, 'user');
21667  * // => ['barney', 'fred']
21668  */
21669 function map$3(collection, iteratee) {
21670   var func = isArray(collection) ? arrayMap : baseMap;
21671   return func(collection, baseIteratee(iteratee, 3));
21672 }
21673
21674 /**
21675  * The base implementation of `_.values` and `_.valuesIn` which creates an
21676  * array of `object` property values corresponding to the property names
21677  * of `props`.
21678  *
21679  * @private
21680  * @param {Object} object The object to query.
21681  * @param {Array} props The property names to get values for.
21682  * @returns {Object} Returns the array of property values.
21683  */
21684 function baseValues(object, props) {
21685   return arrayMap(props, function(key) {
21686     return object[key];
21687   });
21688 }
21689
21690 /**
21691  * Creates an array of the own enumerable string keyed property values of `object`.
21692  *
21693  * **Note:** Non-object values are coerced to objects.
21694  *
21695  * @static
21696  * @since 0.1.0
21697  * @memberOf _
21698  * @category Object
21699  * @param {Object} object The object to query.
21700  * @returns {Array} Returns the array of property values.
21701  * @example
21702  *
21703  * function Foo() {
21704  *   this.a = 1;
21705  *   this.b = 2;
21706  * }
21707  *
21708  * Foo.prototype.c = 3;
21709  *
21710  * _.values(new Foo);
21711  * // => [1, 2] (iteration order is not guaranteed)
21712  *
21713  * _.values('hi');
21714  * // => ['h', 'i']
21715  */
21716 function values$1(object) {
21717   return object == null ? [] : baseValues(object, keys$1(object));
21718 }
21719
21720 /**
21721  * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21722  * of key-value pairs for `object` corresponding to the property names of `props`.
21723  *
21724  * @private
21725  * @param {Object} object The object to query.
21726  * @param {Array} props The property names to get values for.
21727  * @returns {Object} Returns the key-value pairs.
21728  */
21729 function baseToPairs(object, props) {
21730   return arrayMap(props, function(key) {
21731     return [key, object[key]];
21732   });
21733 }
21734
21735 /**
21736  * Converts `set` to its value-value pairs.
21737  *
21738  * @private
21739  * @param {Object} set The set to convert.
21740  * @returns {Array} Returns the value-value pairs.
21741  */
21742 function setToPairs(set) {
21743   var index = -1,
21744       result = Array(set.size);
21745
21746   set.forEach(function(value) {
21747     result[++index] = [value, value];
21748   });
21749   return result;
21750 }
21751
21752 /** `Object#toString` result references. */
21753 var mapTag$6 = '[object Map]',
21754     setTag$6 = '[object Set]';
21755
21756 /**
21757  * Creates a `_.toPairs` or `_.toPairsIn` function.
21758  *
21759  * @private
21760  * @param {Function} keysFunc The function to get the keys of a given object.
21761  * @returns {Function} Returns the new pairs function.
21762  */
21763 function createToPairs(keysFunc) {
21764   return function(object) {
21765     var tag = getTag$1(object);
21766     if (tag == mapTag$6) {
21767       return mapToArray(object);
21768     }
21769     if (tag == setTag$6) {
21770       return setToPairs(object);
21771     }
21772     return baseToPairs(object, keysFunc(object));
21773   };
21774 }
21775
21776 /**
21777  * Creates an array of own enumerable string keyed-value pairs for `object`
21778  * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21779  * entries are returned.
21780  *
21781  * @static
21782  * @memberOf _
21783  * @since 4.0.0
21784  * @alias entries
21785  * @category Object
21786  * @param {Object} object The object to query.
21787  * @returns {Array} Returns the key-value pairs.
21788  * @example
21789  *
21790  * function Foo() {
21791  *   this.a = 1;
21792  *   this.b = 2;
21793  * }
21794  *
21795  * Foo.prototype.c = 3;
21796  *
21797  * _.toPairs(new Foo);
21798  * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21799  */
21800 var toPairs = createToPairs(keys$1);
21801
21802 /**
21803  * The base implementation of `_.isNaN` without support for number objects.
21804  *
21805  * @private
21806  * @param {*} value The value to check.
21807  * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21808  */
21809 function baseIsNaN(value) {
21810   return value !== value;
21811 }
21812
21813 /**
21814  * A specialized version of `_.indexOf` which performs strict equality
21815  * comparisons of values, i.e. `===`.
21816  *
21817  * @private
21818  * @param {Array} array The array to inspect.
21819  * @param {*} value The value to search for.
21820  * @param {number} fromIndex The index to search from.
21821  * @returns {number} Returns the index of the matched value, else `-1`.
21822  */
21823 function strictIndexOf(array, value, fromIndex) {
21824   var index = fromIndex - 1,
21825       length = array.length;
21826
21827   while (++index < length) {
21828     if (array[index] === value) {
21829       return index;
21830     }
21831   }
21832   return -1;
21833 }
21834
21835 /**
21836  * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21837  *
21838  * @private
21839  * @param {Array} array The array to inspect.
21840  * @param {*} value The value to search for.
21841  * @param {number} fromIndex The index to search from.
21842  * @returns {number} Returns the index of the matched value, else `-1`.
21843  */
21844 function baseIndexOf(array, value, fromIndex) {
21845   return value === value
21846     ? strictIndexOf(array, value, fromIndex)
21847     : baseFindIndex(array, baseIsNaN, fromIndex);
21848 }
21849
21850 /**
21851  * A specialized version of `_.includes` for arrays without support for
21852  * specifying an index to search from.
21853  *
21854  * @private
21855  * @param {Array} [array] The array to inspect.
21856  * @param {*} target The value to search for.
21857  * @returns {boolean} Returns `true` if `target` is found, else `false`.
21858  */
21859 function arrayIncludes(array, value) {
21860   var length = array == null ? 0 : array.length;
21861   return !!length && baseIndexOf(array, value, 0) > -1;
21862 }
21863
21864 /**
21865  * This function is like `arrayIncludes` except that it accepts a comparator.
21866  *
21867  * @private
21868  * @param {Array} [array] The array to inspect.
21869  * @param {*} target The value to search for.
21870  * @param {Function} comparator The comparator invoked per element.
21871  * @returns {boolean} Returns `true` if `target` is found, else `false`.
21872  */
21873 function arrayIncludesWith(array, value, comparator) {
21874   var index = -1,
21875       length = array == null ? 0 : array.length;
21876
21877   while (++index < length) {
21878     if (comparator(value, array[index])) {
21879       return true;
21880     }
21881   }
21882   return false;
21883 }
21884
21885 /**
21886  * This method returns `undefined`.
21887  *
21888  * @static
21889  * @memberOf _
21890  * @since 2.3.0
21891  * @category Util
21892  * @example
21893  *
21894  * _.times(2, _.noop);
21895  * // => [undefined, undefined]
21896  */
21897 function noop$3() {
21898   // No operation performed.
21899 }
21900
21901 /** Used as references for various `Number` constants. */
21902 var INFINITY$3 = 1 / 0;
21903
21904 /**
21905  * Creates a set object of `values`.
21906  *
21907  * @private
21908  * @param {Array} values The values to add to the set.
21909  * @returns {Object} Returns the new set.
21910  */
21911 var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21912   return new Set$1(values);
21913 };
21914
21915 /** Used as the size to enable large array optimizations. */
21916 var LARGE_ARRAY_SIZE$1 = 200;
21917
21918 /**
21919  * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21920  *
21921  * @private
21922  * @param {Array} array The array to inspect.
21923  * @param {Function} [iteratee] The iteratee invoked per element.
21924  * @param {Function} [comparator] The comparator invoked per element.
21925  * @returns {Array} Returns the new duplicate free array.
21926  */
21927 function baseUniq(array, iteratee, comparator) {
21928   var index = -1,
21929       includes = arrayIncludes,
21930       length = array.length,
21931       isCommon = true,
21932       result = [],
21933       seen = result;
21934
21935   if (comparator) {
21936     isCommon = false;
21937     includes = arrayIncludesWith;
21938   }
21939   else if (length >= LARGE_ARRAY_SIZE$1) {
21940     var set = iteratee ? null : createSet(array);
21941     if (set) {
21942       return setToArray(set);
21943     }
21944     isCommon = false;
21945     includes = cacheHas;
21946     seen = new SetCache;
21947   }
21948   else {
21949     seen = iteratee ? [] : result;
21950   }
21951   outer:
21952   while (++index < length) {
21953     var value = array[index],
21954         computed = iteratee ? iteratee(value) : value;
21955
21956     value = (comparator || value !== 0) ? value : 0;
21957     if (isCommon && computed === computed) {
21958       var seenIndex = seen.length;
21959       while (seenIndex--) {
21960         if (seen[seenIndex] === computed) {
21961           continue outer;
21962         }
21963       }
21964       if (iteratee) {
21965         seen.push(computed);
21966       }
21967       result.push(value);
21968     }
21969     else if (!includes(seen, computed, comparator)) {
21970       if (seen !== result) {
21971         seen.push(computed);
21972       }
21973       result.push(value);
21974     }
21975   }
21976   return result;
21977 }
21978
21979 /**
21980  * This method is like `_.isArrayLike` except that it also checks if `value`
21981  * is an object.
21982  *
21983  * @static
21984  * @memberOf _
21985  * @since 4.0.0
21986  * @category Lang
21987  * @param {*} value The value to check.
21988  * @returns {boolean} Returns `true` if `value` is an array-like object,
21989  *  else `false`.
21990  * @example
21991  *
21992  * _.isArrayLikeObject([1, 2, 3]);
21993  * // => true
21994  *
21995  * _.isArrayLikeObject(document.body.children);
21996  * // => true
21997  *
21998  * _.isArrayLikeObject('abc');
21999  * // => false
22000  *
22001  * _.isArrayLikeObject(_.noop);
22002  * // => false
22003  */
22004 function isArrayLikeObject(value) {
22005   return isObjectLike(value) && isArrayLike(value);
22006 }
22007
22008 /**
22009  * Creates an array of unique values, in order, from all given arrays using
22010  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22011  * for equality comparisons.
22012  *
22013  * @static
22014  * @memberOf _
22015  * @since 0.1.0
22016  * @category Array
22017  * @param {...Array} [arrays] The arrays to inspect.
22018  * @returns {Array} Returns the new array of combined values.
22019  * @example
22020  *
22021  * _.union([2], [1, 2]);
22022  * // => [2, 1]
22023  */
22024 var union = baseRest(function(arrays) {
22025   return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22026 });
22027
22028 /** Used as the size to enable large array optimizations. */
22029 var LARGE_ARRAY_SIZE$2 = 200;
22030
22031 /**
22032  * The base implementation of methods like `_.difference` without support
22033  * for excluding multiple arrays or iteratee shorthands.
22034  *
22035  * @private
22036  * @param {Array} array The array to inspect.
22037  * @param {Array} values The values to exclude.
22038  * @param {Function} [iteratee] The iteratee invoked per element.
22039  * @param {Function} [comparator] The comparator invoked per element.
22040  * @returns {Array} Returns the new array of filtered values.
22041  */
22042 function baseDifference(array, values, iteratee, comparator) {
22043   var index = -1,
22044       includes = arrayIncludes,
22045       isCommon = true,
22046       length = array.length,
22047       result = [],
22048       valuesLength = values.length;
22049
22050   if (!length) {
22051     return result;
22052   }
22053   if (iteratee) {
22054     values = arrayMap(values, baseUnary(iteratee));
22055   }
22056   if (comparator) {
22057     includes = arrayIncludesWith;
22058     isCommon = false;
22059   }
22060   else if (values.length >= LARGE_ARRAY_SIZE$2) {
22061     includes = cacheHas;
22062     isCommon = false;
22063     values = new SetCache(values);
22064   }
22065   outer:
22066   while (++index < length) {
22067     var value = array[index],
22068         computed = iteratee == null ? value : iteratee(value);
22069
22070     value = (comparator || value !== 0) ? value : 0;
22071     if (isCommon && computed === computed) {
22072       var valuesIndex = valuesLength;
22073       while (valuesIndex--) {
22074         if (values[valuesIndex] === computed) {
22075           continue outer;
22076         }
22077       }
22078       result.push(value);
22079     }
22080     else if (!includes(values, computed, comparator)) {
22081       result.push(value);
22082     }
22083   }
22084   return result;
22085 }
22086
22087 /**
22088  * Creates an array excluding all given values using
22089  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22090  * for equality comparisons.
22091  *
22092  * **Note:** Unlike `_.pull`, this method returns a new array.
22093  *
22094  * @static
22095  * @memberOf _
22096  * @since 0.1.0
22097  * @category Array
22098  * @param {Array} array The array to inspect.
22099  * @param {...*} [values] The values to exclude.
22100  * @returns {Array} Returns the new array of filtered values.
22101  * @see _.difference, _.xor
22102  * @example
22103  *
22104  * _.without([2, 1, 2, 3], 1, 2);
22105  * // => [3]
22106  */
22107 var without = baseRest(function(array, values) {
22108   return isArrayLikeObject(array)
22109     ? baseDifference(array, values)
22110     : [];
22111 });
22112
22113 function osmIsInterestingTag(key) {
22114     return key !== 'attribution' &&
22115         key !== 'created_by' &&
22116         key !== 'source' &&
22117         key !== 'odbl' &&
22118         key.indexOf('tiger:') !== 0;
22119
22120 }
22121
22122
22123 var osmOneWayTags = {
22124     'aerialway': {
22125         'chair_lift': true,
22126         'mixed_lift': true,
22127         't-bar': true,
22128         'j-bar': true,
22129         'platter': true,
22130         'rope_tow': true,
22131         'magic_carpet': true,
22132         'yes': true
22133     },
22134     'highway': {
22135         'motorway': true
22136     },
22137     'junction': {
22138         'circular': true,
22139         'roundabout': true
22140     },
22141     'man_made': {
22142         'piste:halfpipe': true
22143     },
22144     'piste:type': {
22145         'downhill': true,
22146         'sled': true,
22147         'yes': true
22148     },
22149     'waterway': {
22150         'canal': true,
22151         'ditch': true,
22152         'drain': true,
22153         'river': true,
22154         'stream': true
22155     }
22156 };
22157
22158
22159 var osmPavedTags = {
22160     'surface': {
22161         'paved': true,
22162         'asphalt': true,
22163         'concrete': true,
22164         'concrete:lanes': true,
22165         'concrete:plates': true
22166     },
22167     'tracktype': {
22168         'grade1': true
22169     }
22170 };
22171
22172 var wikipedia = [
22173     [
22174         "Abkhazian",
22175         "Аҧсшәа",
22176         "ab"
22177     ],
22178     [
22179         "Achinese",
22180         "Acèh",
22181         "ace"
22182     ],
22183     [
22184         "Adyghe",
22185         "адыгабзэ",
22186         "ady"
22187     ],
22188     [
22189         "Afrikaans",
22190         "Afrikaans",
22191         "af"
22192     ],
22193     [
22194         "Akan",
22195         "Akan",
22196         "ak"
22197     ],
22198     [
22199         "Alemannisch",
22200         "Alemannisch",
22201         "als"
22202     ],
22203     [
22204         "Amharic",
22205         "አማርኛ",
22206         "am"
22207     ],
22208     [
22209         "Aragonese",
22210         "aragonés",
22211         "an"
22212     ],
22213     [
22214         "Old English",
22215         "Ænglisc",
22216         "ang"
22217     ],
22218     [
22219         "Arabic",
22220         "العربية",
22221         "ar"
22222     ],
22223     [
22224         "Aramaic",
22225         "ܐܪܡܝܐ",
22226         "arc"
22227     ],
22228     [
22229         "Egyptian Arabic",
22230         "مصرى",
22231         "arz"
22232     ],
22233     [
22234         "Assamese",
22235         "অসমীয়া",
22236         "as"
22237     ],
22238     [
22239         "Asturian",
22240         "asturianu",
22241         "ast"
22242     ],
22243     [
22244         "Avaric",
22245         "авар",
22246         "av"
22247     ],
22248     [
22249         "Aymara",
22250         "Aymar aru",
22251         "ay"
22252     ],
22253     [
22254         "Azerbaijani",
22255         "azərbaycanca",
22256         "az"
22257     ],
22258     [
22259         "تۆرکجه",
22260         "تۆرکجه",
22261         "azb"
22262     ],
22263     [
22264         "Bashkir",
22265         "башҡортса",
22266         "ba"
22267     ],
22268     [
22269         "Bavarian",
22270         "Boarisch",
22271         "bar"
22272     ],
22273     [
22274         "Samogitian",
22275         "žemaitėška",
22276         "bat-smg"
22277     ],
22278     [
22279         "Bikol Central",
22280         "Bikol Central",
22281         "bcl"
22282     ],
22283     [
22284         "Belarusian",
22285         "беларуская",
22286         "be"
22287     ],
22288     [
22289         "беларуская (тарашкевіца)‎",
22290         "беларуская (тарашкевіца)‎",
22291         "be-x-old"
22292     ],
22293     [
22294         "Bulgarian",
22295         "български",
22296         "bg"
22297     ],
22298     [
22299         "भोजपुरी",
22300         "भोजपुरी",
22301         "bh"
22302     ],
22303     [
22304         "Bislama",
22305         "Bislama",
22306         "bi"
22307     ],
22308     [
22309         "Banjar",
22310         "Bahasa Banjar",
22311         "bjn"
22312     ],
22313     [
22314         "Bambara",
22315         "bamanankan",
22316         "bm"
22317     ],
22318     [
22319         "Bangla",
22320         "বাংলা",
22321         "bn"
22322     ],
22323     [
22324         "Tibetan",
22325         "བོད་ཡིག",
22326         "bo"
22327     ],
22328     [
22329         "Bishnupriya",
22330         "বিষ্ণুপ্রিয়া মণিপুরী",
22331         "bpy"
22332     ],
22333     [
22334         "Breton",
22335         "brezhoneg",
22336         "br"
22337     ],
22338     [
22339         "Bosnian",
22340         "bosanski",
22341         "bs"
22342     ],
22343     [
22344         "Buginese",
22345         "ᨅᨔ ᨕᨘᨁᨗ",
22346         "bug"
22347     ],
22348     [
22349         "буряад",
22350         "буряад",
22351         "bxr"
22352     ],
22353     [
22354         "Catalan",
22355         "català",
22356         "ca"
22357     ],
22358     [
22359         "Chavacano de Zamboanga",
22360         "Chavacano de Zamboanga",
22361         "cbk-zam"
22362     ],
22363     [
22364         "Min Dong Chinese",
22365         "Mìng-dĕ̤ng-ngṳ̄",
22366         "cdo"
22367     ],
22368     [
22369         "Chechen",
22370         "нохчийн",
22371         "ce"
22372     ],
22373     [
22374         "Cebuano",
22375         "Cebuano",
22376         "ceb"
22377     ],
22378     [
22379         "Chamorro",
22380         "Chamoru",
22381         "ch"
22382     ],
22383     [
22384         "Cherokee",
22385         "ᏣᎳᎩ",
22386         "chr"
22387     ],
22388     [
22389         "Cheyenne",
22390         "Tsetsêhestâhese",
22391         "chy"
22392     ],
22393     [
22394         "Central Kurdish",
22395         "کوردیی ناوەندی",
22396         "ckb"
22397     ],
22398     [
22399         "Corsican",
22400         "corsu",
22401         "co"
22402     ],
22403     [
22404         "Cree",
22405         "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22406         "cr"
22407     ],
22408     [
22409         "Crimean Turkish",
22410         "qırımtatarca",
22411         "crh"
22412     ],
22413     [
22414         "Czech",
22415         "čeština",
22416         "cs"
22417     ],
22418     [
22419         "Kashubian",
22420         "kaszëbsczi",
22421         "csb"
22422     ],
22423     [
22424         "Church Slavic",
22425         "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22426         "cu"
22427     ],
22428     [
22429         "Chuvash",
22430         "Чӑвашла",
22431         "cv"
22432     ],
22433     [
22434         "Welsh",
22435         "Cymraeg",
22436         "cy"
22437     ],
22438     [
22439         "Danish",
22440         "dansk",
22441         "da"
22442     ],
22443     [
22444         "German",
22445         "Deutsch",
22446         "de"
22447     ],
22448     [
22449         "Zazaki",
22450         "Zazaki",
22451         "diq"
22452     ],
22453     [
22454         "Lower Sorbian",
22455         "dolnoserbski",
22456         "dsb"
22457     ],
22458     [
22459         "Divehi",
22460         "ދިވެހިބަސް",
22461         "dv"
22462     ],
22463     [
22464         "Dzongkha",
22465         "ཇོང་ཁ",
22466         "dz"
22467     ],
22468     [
22469         "Ewe",
22470         "eʋegbe",
22471         "ee"
22472     ],
22473     [
22474         "Greek",
22475         "Ελληνικά",
22476         "el"
22477     ],
22478     [
22479         "Emiliano-Romagnolo",
22480         "emiliàn e rumagnòl",
22481         "eml"
22482     ],
22483     [
22484         "English",
22485         "English",
22486         "en"
22487     ],
22488     [
22489         "Esperanto",
22490         "Esperanto",
22491         "eo"
22492     ],
22493     [
22494         "Spanish",
22495         "español",
22496         "es"
22497     ],
22498     [
22499         "Estonian",
22500         "eesti",
22501         "et"
22502     ],
22503     [
22504         "Basque",
22505         "euskara",
22506         "eu"
22507     ],
22508     [
22509         "Extremaduran",
22510         "estremeñu",
22511         "ext"
22512     ],
22513     [
22514         "Persian",
22515         "فارسی",
22516         "fa"
22517     ],
22518     [
22519         "Fulah",
22520         "Fulfulde",
22521         "ff"
22522     ],
22523     [
22524         "Finnish",
22525         "suomi",
22526         "fi"
22527     ],
22528     [
22529         "Võro",
22530         "Võro",
22531         "fiu-vro"
22532     ],
22533     [
22534         "Fijian",
22535         "Na Vosa Vakaviti",
22536         "fj"
22537     ],
22538     [
22539         "Faroese",
22540         "føroyskt",
22541         "fo"
22542     ],
22543     [
22544         "French",
22545         "français",
22546         "fr"
22547     ],
22548     [
22549         "Arpitan",
22550         "arpetan",
22551         "frp"
22552     ],
22553     [
22554         "Northern Frisian",
22555         "Nordfriisk",
22556         "frr"
22557     ],
22558     [
22559         "Friulian",
22560         "furlan",
22561         "fur"
22562     ],
22563     [
22564         "Western Frisian",
22565         "Frysk",
22566         "fy"
22567     ],
22568     [
22569         "Irish",
22570         "Gaeilge",
22571         "ga"
22572     ],
22573     [
22574         "Gagauz",
22575         "Gagauz",
22576         "gag"
22577     ],
22578     [
22579         "Gan Chinese",
22580         "贛語",
22581         "gan"
22582     ],
22583     [
22584         "Scottish Gaelic",
22585         "Gàidhlig",
22586         "gd"
22587     ],
22588     [
22589         "Galician",
22590         "galego",
22591         "gl"
22592     ],
22593     [
22594         "Gilaki",
22595         "گیلکی",
22596         "glk"
22597     ],
22598     [
22599         "Guarani",
22600         "Avañe'ẽ",
22601         "gn"
22602     ],
22603     [
22604         "Goan Konkani",
22605         "गोंयची कोंकणी / Gõychi Konknni",
22606         "gom"
22607     ],
22608     [
22609         "Gothic",
22610         "𐌲𐌿𐍄𐌹𐍃𐌺",
22611         "got"
22612     ],
22613     [
22614         "Gujarati",
22615         "ગુજરાતી",
22616         "gu"
22617     ],
22618     [
22619         "Manx",
22620         "Gaelg",
22621         "gv"
22622     ],
22623     [
22624         "Hausa",
22625         "Hausa",
22626         "ha"
22627     ],
22628     [
22629         "Hakka Chinese",
22630         "客家語/Hak-kâ-ngî",
22631         "hak"
22632     ],
22633     [
22634         "Hawaiian",
22635         "Hawaiʻi",
22636         "haw"
22637     ],
22638     [
22639         "Hebrew",
22640         "עברית",
22641         "he"
22642     ],
22643     [
22644         "Hindi",
22645         "हिन्दी",
22646         "hi"
22647     ],
22648     [
22649         "Fiji Hindi",
22650         "Fiji Hindi",
22651         "hif"
22652     ],
22653     [
22654         "Croatian",
22655         "hrvatski",
22656         "hr"
22657     ],
22658     [
22659         "Upper Sorbian",
22660         "hornjoserbsce",
22661         "hsb"
22662     ],
22663     [
22664         "Haitian Creole",
22665         "Kreyòl ayisyen",
22666         "ht"
22667     ],
22668     [
22669         "Hungarian",
22670         "magyar",
22671         "hu"
22672     ],
22673     [
22674         "Armenian",
22675         "Հայերեն",
22676         "hy"
22677     ],
22678     [
22679         "Interlingua",
22680         "interlingua",
22681         "ia"
22682     ],
22683     [
22684         "Indonesian",
22685         "Bahasa Indonesia",
22686         "id"
22687     ],
22688     [
22689         "Interlingue",
22690         "Interlingue",
22691         "ie"
22692     ],
22693     [
22694         "Igbo",
22695         "Igbo",
22696         "ig"
22697     ],
22698     [
22699         "Inupiaq",
22700         "Iñupiak",
22701         "ik"
22702     ],
22703     [
22704         "Iloko",
22705         "Ilokano",
22706         "ilo"
22707     ],
22708     [
22709         "Ido",
22710         "Ido",
22711         "io"
22712     ],
22713     [
22714         "Icelandic",
22715         "íslenska",
22716         "is"
22717     ],
22718     [
22719         "Italian",
22720         "italiano",
22721         "it"
22722     ],
22723     [
22724         "Inuktitut",
22725         "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22726         "iu"
22727     ],
22728     [
22729         "Japanese",
22730         "日本語",
22731         "ja"
22732     ],
22733     [
22734         "Jamaican Creole English",
22735         "Patois",
22736         "jam"
22737     ],
22738     [
22739         "Lojban",
22740         "la .lojban.",
22741         "jbo"
22742     ],
22743     [
22744         "Javanese",
22745         "Basa Jawa",
22746         "jv"
22747     ],
22748     [
22749         "Georgian",
22750         "ქართული",
22751         "ka"
22752     ],
22753     [
22754         "Kara-Kalpak",
22755         "Qaraqalpaqsha",
22756         "kaa"
22757     ],
22758     [
22759         "Kabyle",
22760         "Taqbaylit",
22761         "kab"
22762     ],
22763     [
22764         "Kabardian",
22765         "Адыгэбзэ",
22766         "kbd"
22767     ],
22768     [
22769         "Kongo",
22770         "Kongo",
22771         "kg"
22772     ],
22773     [
22774         "Kikuyu",
22775         "Gĩkũyũ",
22776         "ki"
22777     ],
22778     [
22779         "Kazakh",
22780         "қазақша",
22781         "kk"
22782     ],
22783     [
22784         "Kalaallisut",
22785         "kalaallisut",
22786         "kl"
22787     ],
22788     [
22789         "Khmer",
22790         "ភាសាខ្មែរ",
22791         "km"
22792     ],
22793     [
22794         "Kannada",
22795         "ಕನ್ನಡ",
22796         "kn"
22797     ],
22798     [
22799         "Korean",
22800         "한국어",
22801         "ko"
22802     ],
22803     [
22804         "Komi-Permyak",
22805         "Перем Коми",
22806         "koi"
22807     ],
22808     [
22809         "Karachay-Balkar",
22810         "къарачай-малкъар",
22811         "krc"
22812     ],
22813     [
22814         "Kashmiri",
22815         "कॉशुर / کٲشُر",
22816         "ks"
22817     ],
22818     [
22819         "Colognian",
22820         "Ripoarisch",
22821         "ksh"
22822     ],
22823     [
22824         "Kurdish",
22825         "Kurdî",
22826         "ku"
22827     ],
22828     [
22829         "Komi",
22830         "коми",
22831         "kv"
22832     ],
22833     [
22834         "Cornish",
22835         "kernowek",
22836         "kw"
22837     ],
22838     [
22839         "Kyrgyz",
22840         "Кыргызча",
22841         "ky"
22842     ],
22843     [
22844         "Latin",
22845         "Latina",
22846         "la"
22847     ],
22848     [
22849         "Ladino",
22850         "Ladino",
22851         "lad"
22852     ],
22853     [
22854         "Luxembourgish",
22855         "Lëtzebuergesch",
22856         "lb"
22857     ],
22858     [
22859         "лакку",
22860         "лакку",
22861         "lbe"
22862     ],
22863     [
22864         "Lezghian",
22865         "лезги",
22866         "lez"
22867     ],
22868     [
22869         "Ganda",
22870         "Luganda",
22871         "lg"
22872     ],
22873     [
22874         "Limburgish",
22875         "Limburgs",
22876         "li"
22877     ],
22878     [
22879         "Ligurian",
22880         "Ligure",
22881         "lij"
22882     ],
22883     [
22884         "Lombard",
22885         "lumbaart",
22886         "lmo"
22887     ],
22888     [
22889         "Lingala",
22890         "lingála",
22891         "ln"
22892     ],
22893     [
22894         "Lao",
22895         "ລາວ",
22896         "lo"
22897     ],
22898     [
22899         "Northern Luri",
22900         "لۊری شومالی",
22901         "lrc"
22902     ],
22903     [
22904         "Lithuanian",
22905         "lietuvių",
22906         "lt"
22907     ],
22908     [
22909         "Latgalian",
22910         "latgaļu",
22911         "ltg"
22912     ],
22913     [
22914         "Latvian",
22915         "latviešu",
22916         "lv"
22917     ],
22918     [
22919         "Maithili",
22920         "मैथिली",
22921         "mai"
22922     ],
22923     [
22924         "Basa Banyumasan",
22925         "Basa Banyumasan",
22926         "map-bms"
22927     ],
22928     [
22929         "Moksha",
22930         "мокшень",
22931         "mdf"
22932     ],
22933     [
22934         "Malagasy",
22935         "Malagasy",
22936         "mg"
22937     ],
22938     [
22939         "Eastern Mari",
22940         "олык марий",
22941         "mhr"
22942     ],
22943     [
22944         "Maori",
22945         "Māori",
22946         "mi"
22947     ],
22948     [
22949         "Minangkabau",
22950         "Baso Minangkabau",
22951         "min"
22952     ],
22953     [
22954         "Macedonian",
22955         "македонски",
22956         "mk"
22957     ],
22958     [
22959         "Malayalam",
22960         "മലയാളം",
22961         "ml"
22962     ],
22963     [
22964         "Mongolian",
22965         "монгол",
22966         "mn"
22967     ],
22968     [
22969         "Marathi",
22970         "मराठी",
22971         "mr"
22972     ],
22973     [
22974         "Western Mari",
22975         "кырык мары",
22976         "mrj"
22977     ],
22978     [
22979         "Malay",
22980         "Bahasa Melayu",
22981         "ms"
22982     ],
22983     [
22984         "Maltese",
22985         "Malti",
22986         "mt"
22987     ],
22988     [
22989         "Mirandese",
22990         "Mirandés",
22991         "mwl"
22992     ],
22993     [
22994         "Burmese",
22995         "မြန်မာဘာသာ",
22996         "my"
22997     ],
22998     [
22999         "Erzya",
23000         "эрзянь",
23001         "myv"
23002     ],
23003     [
23004         "Mazanderani",
23005         "مازِرونی",
23006         "mzn"
23007     ],
23008     [
23009         "Nauru",
23010         "Dorerin Naoero",
23011         "na"
23012     ],
23013     [
23014         "Nāhuatl",
23015         "Nāhuatl",
23016         "nah"
23017     ],
23018     [
23019         "Neapolitan",
23020         "Napulitano",
23021         "nap"
23022     ],
23023     [
23024         "Low German",
23025         "Plattdüütsch",
23026         "nds"
23027     ],
23028     [
23029         "Low Saxon",
23030         "Nedersaksies",
23031         "nds-nl"
23032     ],
23033     [
23034         "Nepali",
23035         "नेपाली",
23036         "ne"
23037     ],
23038     [
23039         "Newari",
23040         "नेपाल भाषा",
23041         "new"
23042     ],
23043     [
23044         "Dutch",
23045         "Nederlands",
23046         "nl"
23047     ],
23048     [
23049         "Norwegian Nynorsk",
23050         "norsk nynorsk",
23051         "nn"
23052     ],
23053     [
23054         "Norwegian",
23055         "norsk bokmål",
23056         "no"
23057     ],
23058     [
23059         "Novial",
23060         "Novial",
23061         "nov"
23062     ],
23063     [
23064         "Nouormand",
23065         "Nouormand",
23066         "nrm"
23067     ],
23068     [
23069         "Northern Sotho",
23070         "Sesotho sa Leboa",
23071         "nso"
23072     ],
23073     [
23074         "Navajo",
23075         "Diné bizaad",
23076         "nv"
23077     ],
23078     [
23079         "Nyanja",
23080         "Chi-Chewa",
23081         "ny"
23082     ],
23083     [
23084         "Occitan",
23085         "occitan",
23086         "oc"
23087     ],
23088     [
23089         "Livvi-Karelian",
23090         "Livvinkarjala",
23091         "olo"
23092     ],
23093     [
23094         "Oromo",
23095         "Oromoo",
23096         "om"
23097     ],
23098     [
23099         "Odia",
23100         "ଓଡ଼ିଆ",
23101         "or"
23102     ],
23103     [
23104         "Ossetic",
23105         "Ирон",
23106         "os"
23107     ],
23108     [
23109         "Punjabi",
23110         "ਪੰਜਾਬੀ",
23111         "pa"
23112     ],
23113     [
23114         "Pangasinan",
23115         "Pangasinan",
23116         "pag"
23117     ],
23118     [
23119         "Pampanga",
23120         "Kapampangan",
23121         "pam"
23122     ],
23123     [
23124         "Papiamento",
23125         "Papiamentu",
23126         "pap"
23127     ],
23128     [
23129         "Picard",
23130         "Picard",
23131         "pcd"
23132     ],
23133     [
23134         "Pennsylvania German",
23135         "Deitsch",
23136         "pdc"
23137     ],
23138     [
23139         "Palatine German",
23140         "Pälzisch",
23141         "pfl"
23142     ],
23143     [
23144         "Pali",
23145         "पालि",
23146         "pi"
23147     ],
23148     [
23149         "Norfuk / Pitkern",
23150         "Norfuk / Pitkern",
23151         "pih"
23152     ],
23153     [
23154         "Polish",
23155         "polski",
23156         "pl"
23157     ],
23158     [
23159         "Piedmontese",
23160         "Piemontèis",
23161         "pms"
23162     ],
23163     [
23164         "Western Punjabi",
23165         "پنجابی",
23166         "pnb"
23167     ],
23168     [
23169         "Pontic",
23170         "Ποντιακά",
23171         "pnt"
23172     ],
23173     [
23174         "Pashto",
23175         "پښتو",
23176         "ps"
23177     ],
23178     [
23179         "Portuguese",
23180         "português",
23181         "pt"
23182     ],
23183     [
23184         "Quechua",
23185         "Runa Simi",
23186         "qu"
23187     ],
23188     [
23189         "Romansh",
23190         "rumantsch",
23191         "rm"
23192     ],
23193     [
23194         "Romani",
23195         "Romani",
23196         "rmy"
23197     ],
23198     [
23199         "Rundi",
23200         "Kirundi",
23201         "rn"
23202     ],
23203     [
23204         "Romanian",
23205         "română",
23206         "ro"
23207     ],
23208     [
23209         "Aromanian",
23210         "armãneashti",
23211         "roa-rup"
23212     ],
23213     [
23214         "tarandíne",
23215         "tarandíne",
23216         "roa-tara"
23217     ],
23218     [
23219         "Russian",
23220         "русский",
23221         "ru"
23222     ],
23223     [
23224         "Rusyn",
23225         "русиньскый",
23226         "rue"
23227     ],
23228     [
23229         "Kinyarwanda",
23230         "Kinyarwanda",
23231         "rw"
23232     ],
23233     [
23234         "Sanskrit",
23235         "संस्कृतम्",
23236         "sa"
23237     ],
23238     [
23239         "Sakha",
23240         "саха тыла",
23241         "sah"
23242     ],
23243     [
23244         "Sardinian",
23245         "sardu",
23246         "sc"
23247     ],
23248     [
23249         "Sicilian",
23250         "sicilianu",
23251         "scn"
23252     ],
23253     [
23254         "Scots",
23255         "Scots",
23256         "sco"
23257     ],
23258     [
23259         "Sindhi",
23260         "سنڌي",
23261         "sd"
23262     ],
23263     [
23264         "Northern Sami",
23265         "sámegiella",
23266         "se"
23267     ],
23268     [
23269         "Sango",
23270         "Sängö",
23271         "sg"
23272     ],
23273     [
23274         "Serbo-Croatian",
23275         "srpskohrvatski / српскохрватски",
23276         "sh"
23277     ],
23278     [
23279         "Sinhala",
23280         "සිංහල",
23281         "si"
23282     ],
23283     [
23284         "Simple English",
23285         "Simple English",
23286         "simple"
23287     ],
23288     [
23289         "Slovak",
23290         "slovenčina",
23291         "sk"
23292     ],
23293     [
23294         "Slovenian",
23295         "slovenščina",
23296         "sl"
23297     ],
23298     [
23299         "Samoan",
23300         "Gagana Samoa",
23301         "sm"
23302     ],
23303     [
23304         "Shona",
23305         "chiShona",
23306         "sn"
23307     ],
23308     [
23309         "Somali",
23310         "Soomaaliga",
23311         "so"
23312     ],
23313     [
23314         "Albanian",
23315         "shqip",
23316         "sq"
23317     ],
23318     [
23319         "Serbian",
23320         "српски / srpski",
23321         "sr"
23322     ],
23323     [
23324         "Sranan Tongo",
23325         "Sranantongo",
23326         "srn"
23327     ],
23328     [
23329         "Swati",
23330         "SiSwati",
23331         "ss"
23332     ],
23333     [
23334         "Southern Sotho",
23335         "Sesotho",
23336         "st"
23337     ],
23338     [
23339         "Saterland Frisian",
23340         "Seeltersk",
23341         "stq"
23342     ],
23343     [
23344         "Sundanese",
23345         "Basa Sunda",
23346         "su"
23347     ],
23348     [
23349         "Swedish",
23350         "svenska",
23351         "sv"
23352     ],
23353     [
23354         "Swahili",
23355         "Kiswahili",
23356         "sw"
23357     ],
23358     [
23359         "Silesian",
23360         "ślůnski",
23361         "szl"
23362     ],
23363     [
23364         "Tamil",
23365         "தமிழ்",
23366         "ta"
23367     ],
23368     [
23369         "Tulu",
23370         "ತುಳು",
23371         "tcy"
23372     ],
23373     [
23374         "Telugu",
23375         "తెలుగు",
23376         "te"
23377     ],
23378     [
23379         "Tetum",
23380         "tetun",
23381         "tet"
23382     ],
23383     [
23384         "Tajik",
23385         "тоҷикӣ",
23386         "tg"
23387     ],
23388     [
23389         "Thai",
23390         "ไทย",
23391         "th"
23392     ],
23393     [
23394         "Tigrinya",
23395         "ትግርኛ",
23396         "ti"
23397     ],
23398     [
23399         "Turkmen",
23400         "Türkmençe",
23401         "tk"
23402     ],
23403     [
23404         "Tagalog",
23405         "Tagalog",
23406         "tl"
23407     ],
23408     [
23409         "Tswana",
23410         "Setswana",
23411         "tn"
23412     ],
23413     [
23414         "Tongan",
23415         "lea faka-Tonga",
23416         "to"
23417     ],
23418     [
23419         "Tok Pisin",
23420         "Tok Pisin",
23421         "tpi"
23422     ],
23423     [
23424         "Turkish",
23425         "Türkçe",
23426         "tr"
23427     ],
23428     [
23429         "Tsonga",
23430         "Xitsonga",
23431         "ts"
23432     ],
23433     [
23434         "Tatar",
23435         "татарча/tatarça",
23436         "tt"
23437     ],
23438     [
23439         "Tumbuka",
23440         "chiTumbuka",
23441         "tum"
23442     ],
23443     [
23444         "Twi",
23445         "Twi",
23446         "tw"
23447     ],
23448     [
23449         "Tahitian",
23450         "reo tahiti",
23451         "ty"
23452     ],
23453     [
23454         "Tuvinian",
23455         "тыва дыл",
23456         "tyv"
23457     ],
23458     [
23459         "Udmurt",
23460         "удмурт",
23461         "udm"
23462     ],
23463     [
23464         "Uyghur",
23465         "ئۇيغۇرچە / Uyghurche",
23466         "ug"
23467     ],
23468     [
23469         "Ukrainian",
23470         "українська",
23471         "uk"
23472     ],
23473     [
23474         "Urdu",
23475         "اردو",
23476         "ur"
23477     ],
23478     [
23479         "Uzbek",
23480         "oʻzbekcha/ўзбекча",
23481         "uz"
23482     ],
23483     [
23484         "Venda",
23485         "Tshivenda",
23486         "ve"
23487     ],
23488     [
23489         "Venetian",
23490         "vèneto",
23491         "vec"
23492     ],
23493     [
23494         "Veps",
23495         "vepsän kel’",
23496         "vep"
23497     ],
23498     [
23499         "Vietnamese",
23500         "Tiếng Việt",
23501         "vi"
23502     ],
23503     [
23504         "West Flemish",
23505         "West-Vlams",
23506         "vls"
23507     ],
23508     [
23509         "Volapük",
23510         "Volapük",
23511         "vo"
23512     ],
23513     [
23514         "Walloon",
23515         "walon",
23516         "wa"
23517     ],
23518     [
23519         "Waray",
23520         "Winaray",
23521         "war"
23522     ],
23523     [
23524         "Wolof",
23525         "Wolof",
23526         "wo"
23527     ],
23528     [
23529         "Wu Chinese",
23530         "吴语",
23531         "wuu"
23532     ],
23533     [
23534         "Kalmyk",
23535         "хальмг",
23536         "xal"
23537     ],
23538     [
23539         "Xhosa",
23540         "isiXhosa",
23541         "xh"
23542     ],
23543     [
23544         "Mingrelian",
23545         "მარგალური",
23546         "xmf"
23547     ],
23548     [
23549         "Yiddish",
23550         "ייִדיש",
23551         "yi"
23552     ],
23553     [
23554         "Yoruba",
23555         "Yorùbá",
23556         "yo"
23557     ],
23558     [
23559         "Zhuang",
23560         "Vahcuengh",
23561         "za"
23562     ],
23563     [
23564         "Zeelandic",
23565         "Zeêuws",
23566         "zea"
23567     ],
23568     [
23569         "Chinese",
23570         "中文",
23571         "zh"
23572     ],
23573     [
23574         "Classical Chinese",
23575         "文言",
23576         "zh-classical"
23577     ],
23578     [
23579         "Chinese (Min Nan)",
23580         "Bân-lâm-gú",
23581         "zh-min-nan"
23582     ],
23583     [
23584         "Cantonese",
23585         "粵語",
23586         "zh-yue"
23587     ],
23588     [
23589         "Zulu",
23590         "isiZulu",
23591         "zu"
23592     ]
23593 ];
23594
23595 var wikipedia$1 = Object.freeze({
23596         default: wikipedia
23597 });
23598
23599 var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23600
23601 var wikipedia$2 = require$$6;
23602
23603 var amenity = {"arts_centre":{"Świetlica wiejska":{"count":62},"Дом культуры":{"count":182}},"bank":{"ABANCA":{"count":83},"ABN AMRO":{"count":152},"ABSA":{"count":105},"AIB":{"count":85},"ANZ":{"count":378},"ASB Bank":{"count":51},"ATB Financial":{"count":68},"AXA":{"count":106},"Agribank":{"count":58},"Akbank":{"count":129},"Alior Bank":{"count":180},"Allahabad Bank":{"count":52},"Allied Bank":{"count":67},"Alpha Bank":{"count":329},"Andhra Bank":{"count":97},"Antonveneta":{"count":56},"Argenta":{"count":125},"Asia United Bank":{"count":57},"Askari Bank":{"count":71},"Associated Bank":{"count":55},"Axis Bank":{"count":198},"BAC":{"count":77},"BAWAG PSK":{"count":97},"BB&T":{"count":418},"BBBank":{"count":58},"BBK":{"count":122},"BBVA":{"count":1445},"BBVA Bancomer":{"count":157},"BBVA Compass":{"count":80},"BBVA Continental":{"count":74},"BBVA Francés":{"count":158},"BCA":{"count":135},"BCI":{"count":140},"BCP":{"count":226},"BCR":{"count":232},"BDO":{"count":538},"BGŻ BNP Paribas":{"count":74},"BMCE":{"count":53},"BMN":{"count":88},"BMO":{"count":339},"BMO Harris Bank":{"count":72},"BNA":{"count":70},"BNI":{"count":136},"BNL":{"count":159},"BNP Paribas":{"count":1165},"BNP Paribas Fortis":{"count":303},"BOC":{"count":95},"BPH":{"count":63},"BPI":{"count":579},"BPI Family Savings Bank":{"count":54},"BRD":{"count":276},"BRED":{"count":70},"BRI":{"count":209},"BW-Bank":{"count":95},"BZ WBK":{"count":156},"Banamex":{"count":356},"Banc Sabadell":{"count":175},"Banca Intesa":{"count":92},"Banca March":{"count":51},"Banca Popolare di Milano":{"count":99},"Banca Popolare di Novara":{"count":79},"Banca Popolare di Sondrio":{"count":105},"Banca Popolare di Verona":{"count":59},"Banca Popolare di Vicenza":{"count":119},"Banca Românească":{"count":61},"Banca Sella":{"count":56},"Banca Transilvania":{"count":167},"Banco Agrario":{"count":58},"Banco Azteca":{"count":119},"Banco BCI":{"count":74},"Banco Bradesco":{"count":226},"Banco Continental":{"count":64},"Banco Estado":{"count":153},"Banco Fassil":{"count":59},"Banco G&T Continental":{"count":84},"Banco General":{"count":53},"Banco Industrial":{"count":91},"Banco Internacional":{"count":62},"Banco Itaú":{"count":351},"Banco Nacional":{"count":143},"Banco Nación":{"count":149},"Banco Pastor":{"count":74},"Banco Pichincha":{"count":109},"Banco Popular":{"count":619},"Banco Provincia":{"count":138},"Banco Sabadell":{"count":189},"Banco Santander":{"count":112},"Banco Sol":{"count":74},"Banco de Bogotá":{"count":74},"Banco de Chile":{"count":175},"Banco de Costa Rica":{"count":123},"Banco de Desarrollo Banrural":{"count":85},"Banco de Occidente":{"count":67},"Banco de Venezuela":{"count":76},"Banco de la Nación":{"count":156},"Banco de la Nación Argentina":{"count":166},"Banco di Napoli":{"count":79},"Banco di Sardegna":{"count":79},"Banco do Brasil":{"count":1313},"Banco do Nordeste":{"count":56},"BancoEstado":{"count":121},"Bancolombia":{"count":170},"Bancomer":{"count":227},"Bancpost":{"count":77},"Banesco":{"count":209},"Bangkok Bank":{"count":69},"Bank Al Habib":{"count":52},"Bank Alfalah":{"count":63},"Bank Austria":{"count":123},"Bank BCA":{"count":71},"Bank BNI":{"count":67},"Bank BPH":{"count":56},"Bank BRI":{"count":196},"Bank Danamon":{"count":60},"Bank Mandiri":{"count":232},"Bank Mega":{"count":54},"Bank Spółdzielczy":{"count":395},"Bank Zachodni WBK":{"count":103},"Bank of Africa":{"count":59},"Bank of America":{"count":1787},"Bank of Baroda":{"count":122},"Bank of Ceylon":{"count":74},"Bank of China":{"count":152},"Bank of Commerce":{"count":69},"Bank of India":{"count":113},"Bank of Ireland":{"count":151},"Bank of Montreal":{"count":157},"Bank of New Zealand":{"count":63},"Bank of Scotland":{"count":122},"Bank of the West":{"count":173},"Bankia":{"count":613},"Bankinter":{"count":139},"Banner Bank":{"count":53},"Banorte":{"count":260},"Banque Atlantique":{"count":57},"Banque Nationale":{"count":137},"Banque Populaire":{"count":919},"Banrisul":{"count":101},"Banrural":{"count":84},"Barclays":{"count":1243},"Bcc":{"count":54},"Belfius":{"count":285},"Bendigo Bank":{"count":140},"Berliner Volksbank":{"count":73},"Bicentenario":{"count":173},"Bradesco":{"count":751},"Budapest Bank":{"count":56},"CBAO":{"count":53},"CEC Bank":{"count":121},"CGD":{"count":52},"CIB Bank":{"count":64},"CIBC":{"count":574},"CIC":{"count":742},"CIMB Bank":{"count":64},"CNEP":{"count":52},"Caisse Desjardins":{"count":69},"Caisse d'Épargne":{"count":1607},"Caixa":{"count":239},"Caixa Econômica Federal":{"count":573},"Caixa Geral de Depósitos":{"count":231},"CaixaBank":{"count":343},"Caja Círculo":{"count":68},"Caja Duero":{"count":90},"Caja España":{"count":74},"Caja Rural":{"count":216},"Caja Rural de Jaén":{"count":55},"CajaSur":{"count":73},"Cajamar":{"count":216},"Cajero Automatico Bancared":{"count":123},"Canara Bank":{"count":270},"Capital One":{"count":199},"Carige":{"count":57},"Cariparma":{"count":69},"Cassa di Risparmio del Veneto":{"count":102},"CatalunyaCaixa":{"count":107},"Central Bank of India":{"count":60},"Chase":{"count":1658},"China Bank":{"count":156},"China Bank Savings":{"count":54},"China Construction Bank":{"count":68},"Citibank":{"count":485},"Citizens Bank":{"count":248},"Clydesdale Bank":{"count":55},"Columbia Bank":{"count":79},"Comerica Bank":{"count":67},"Commerce Bank":{"count":61},"Commercial Bank":{"count":75},"Commercial Bank of Ceylon PLC":{"count":100},"Commerzbank":{"count":879},"Commonwealth Bank":{"count":376},"Corporation Bank":{"count":92},"Credem":{"count":77},"Credicoop":{"count":111},"Credit Agricole":{"count":104},"Credit Suisse":{"count":93},"Crelan":{"count":53},"Crédit Agricole":{"count":2544},"Crédit Mutuel":{"count":1129},"Crédit Mutuel de Bretagne":{"count":368},"Crédit du Nord":{"count":148},"Crédito Agrícola":{"count":87},"Cбербанк":{"count":74},"Danske Bank":{"count":157},"Davivienda":{"count":172},"De Venezuela":{"count":87},"Denizbank":{"count":58},"Desjardins":{"count":80},"Deutsche Bank":{"count":995},"Dubai Islamic Bank":{"count":71},"EastWest Bank":{"count":127},"Ecobank":{"count":197},"Erste Bank":{"count":200},"Eurobank":{"count":261},"Express Union":{"count":58},"FNB":{"count":143},"Federal Bank":{"count":88},"Fifth Third Bank":{"count":234},"Finansbank":{"count":68},"First Bank":{"count":91},"First Citizens Bank":{"count":88},"First National Bank":{"count":209},"Galicia":{"count":179},"Garanti":{"count":58},"Garanti Bankası":{"count":82},"Getin Bank":{"count":112},"Groupama":{"count":61},"HDFC Bank":{"count":219},"HNB":{"count":67},"HSBC":{"count":1748},"Halifax":{"count":367},"Halkbank":{"count":74},"Hamburger Sparkasse":{"count":159},"Handelsbanken":{"count":250},"Hong Leong Bank":{"count":51},"Hrvatska poštanska banka":{"count":54},"Huntington Bank":{"count":110},"HypoVereinsbank":{"count":408},"ICBC":{"count":158},"ICICI Bank":{"count":224},"IDBI Bank":{"count":73},"ING":{"count":654},"ING Bank Śląski":{"count":128},"IberCaja":{"count":209},"Indian Bank":{"count":98},"Indian Overseas Bank":{"count":108},"Interbank":{"count":131},"Intesa San Paolo":{"count":257},"Itaú":{"count":726},"K&H Bank":{"count":75},"KBC":{"count":273},"Kasa Stefczyka":{"count":65},"Key Bank":{"count":382},"Komerční banka":{"count":180},"Kreissparkasse":{"count":600},"Kreissparkasse Köln":{"count":69},"Kutxabank":{"count":68},"LCL":{"count":903},"La Banque Postale":{"count":124},"La Caixa":{"count":1144},"Laboral Kutxa":{"count":66},"Landbank":{"count":115},"Liberbank":{"count":164},"Lloyds Bank":{"count":612},"M&T Bank":{"count":184},"MCB":{"count":62},"MCB Bank":{"count":54},"MONETA Money Bank":{"count":92},"Macro":{"count":174},"Maybank":{"count":234},"Meezan Bank":{"count":63},"Mercantil":{"count":132},"Metro Bank":{"count":57},"Metrobank":{"count":434},"Millennium BCP":{"count":119},"Millennium Bank":{"count":386},"Monte dei Paschi di Siena":{"count":265},"Montepio":{"count":113},"NAB":{"count":205},"NSB":{"count":51},"NatWest":{"count":800},"National Bank":{"count":147},"Nationwide":{"count":337},"Nedbank":{"count":100},"Nordea":{"count":331},"Novo Banco":{"count":101},"OLB":{"count":57},"OTP":{"count":362},"Oberbank":{"count":103},"Occidental de Descuento":{"count":68},"Oldenburgische Landesbank":{"count":68},"One Network Bank":{"count":91},"Osuuspankki":{"count":89},"PBZ":{"count":65},"PKO":{"count":58},"PKO BP":{"count":561},"PNB":{"count":323},"PNC":{"count":52},"PNC Bank":{"count":639},"PSBank":{"count":108},"Patagonia":{"count":94},"Pekao SA":{"count":155},"Peoples Bank":{"count":254},"Philippine National Bank":{"count":69},"Piraeus Bank":{"count":96},"Popular":{"count":104},"Postbank":{"count":567},"Postbank Finanzcenter":{"count":65},"Provincial":{"count":135},"Public Bank":{"count":90},"Punjab National Bank":{"count":134},"RBC":{"count":487},"RBC Financial Group":{"count":59},"RBS":{"count":190},"RCBC":{"count":144},"RCBC Savings Bank":{"count":84},"Rabobank":{"count":557},"Raiffeisen Polbank":{"count":78},"Raiffeisenbank":{"count":2705},"Regions Bank":{"count":204},"Republic Bank":{"count":85},"Royal Bank":{"count":90},"Royal Bank of Canada":{"count":56},"Royal Bank of Scotland":{"count":129},"SEB":{"count":129},"SNS Bank":{"count":58},"Sabadell":{"count":97},"Sampath Bank":{"count":87},"Santander":{"count":3268},"Santander Consumer Bank":{"count":109},"Santander Río":{"count":239},"Santander Totta":{"count":201},"Sberbank":{"count":135},"Scotiabank":{"count":1144},"Security Bank":{"count":171},"Sicredi":{"count":94},"Slovenská sporiteľňa":{"count":165},"Société Générale":{"count":1136},"Sparda-Bank":{"count":277},"Sparkasse":{"count":4667},"Sparkasse Aachen":{"count":56},"Sparkasse KölnBonn":{"count":76},"Stadtsparkasse":{"count":68},"Stanbic Bank":{"count":63},"Standard Bank":{"count":165},"Standard Chartered":{"count":95},"Standard Chartered Bank":{"count":74},"State Bank of India":{"count":1013},"SunTrust":{"count":322},"Supervielle":{"count":72},"Swedbank":{"count":252},"Syndicate Bank":{"count":118},"TCF Bank":{"count":85},"TD Bank":{"count":425},"TD Canada Trust":{"count":675},"TEB":{"count":56},"TSB":{"count":259},"Takarékszövetkezet":{"count":120},"Targobank":{"count":279},"Tatra banka":{"count":70},"Türkiye İş Bankası":{"count":53},"UBS":{"count":169},"UCO Bank":{"count":51},"UCPB":{"count":122},"UOB":{"count":126},"US Bank":{"count":723},"Ulster Bank":{"count":100},"Umpqua Bank":{"count":103},"UniCredit Bank":{"count":548},"Unicaja Banco":{"count":182},"Unicredit Banca":{"count":496},"Union Bank":{"count":304},"United Bank":{"count":68},"VR-Bank":{"count":506},"Vakıfbank":{"count":85},"Veneto Banca":{"count":73},"Vijaya Bank":{"count":56},"Volks- und Raiffeisenbank":{"count":53},"Volksbank":{"count":2665},"Volksbank Mittelhessen":{"count":53},"Volksbank Raiffeisenbank":{"count":63},"VÚB":{"count":105},"Washington Federal":{"count":65},"Wells Fargo":{"count":1947},"Western Union":{"count":440},"Westpac":{"count":322},"Yorkshire Bank":{"count":95},"Yorkshire Building Society":{"count":69},"Zagrebačka banka":{"count":54},"Ziraat Bankası":{"count":172},"mBank":{"count":70},"ČSOB":{"count":211},"Česká spořitelna":{"count":243},"İş Bankası":{"count":112},"Εθνική Τράπεζα":{"count":103},"Πειραιώς":{"count":120},"Τράπεζα Πειραιώς":{"count":104},"Авангард":{"count":76},"Альфа-Банк":{"count":301},"Банк Москвы":{"count":176},"Банка ДСК":{"count":63},"Белагропромбанк":{"count":184},"Беларусбанк":{"count":570},"Белинвестбанк":{"count":78},"Бинбанк":{"count":114},"ВТБ":{"count":80},"ВТБ24":{"count":545},"Возрождение":{"count":81},"Газпромбанк":{"count":161},"Генбанк":{"count":83},"Казкоммерцбанк":{"count":74},"МДМ Банк":{"count":52},"Московский индустриальный банк":{"count":53},"Мособлбанк":{"count":54},"Народный банк":{"count":63},"ОТП Банк":{"count":54},"Открытие":{"count":92},"Ощадбанк":{"count":883},"ПУМБ":{"count":78},"Почта Банк":{"count":65},"ПриватБанк":{"count":1018},"Приватбанк":{"count":76},"Приднестровский Сбербанк":{"count":59},"Приорбанк":{"count":69},"Промсвязьбанк":{"count":133},"РНКБ":{"count":124},"Райффайзен":{"count":65},"Райффайзен Банк Аваль":{"count":125},"Райффайзенбанк":{"count":52},"Росбанк":{"count":218},"Россельхозбанк":{"count":374},"Русский стандарт":{"count":55},"Сбербанк":{"count":6921},"Совкомбанк":{"count":186},"УкрСиббанк":{"count":213},"Укрсоцбанк":{"count":57},"Уралсиб":{"count":130},"Хоум Кредит":{"count":53},"בנק הפועלים":{"count":112},"בנק לאומי":{"count":83},"بانک":{"count":219},"بانک آینده":{"count":58},"بانک اقتصاد نوین":{"count":78},"بانک انصار":{"count":99},"بانک تجارت":{"count":365},"بانک رفاه":{"count":138},"بانک رفاه کارگران":{"count":72},"بانک سپه":{"count":348},"بانک شهر":{"count":93},"بانک صادرات":{"count":492},"بانک قوامین":{"count":110},"بانک مسکن":{"count":263},"بانک ملت":{"count":428},"بانک ملی":{"count":561},"بانک ملی ایران":{"count":80},"بانک مهر اقتصاد":{"count":92},"بانک پارسیان":{"count":103},"بانک پاسارگاد":{"count":107},"بانک کشاورزی":{"count":277},"صادرات":{"count":85},"ملی":{"count":67},"پست بانک":{"count":71},"ธนาคารกรุงเทพ":{"count":121},"ธนาคารกรุงไทย":{"count":85},"ธนาคารกสิกรไทย":{"count":108},"ธนาคารออมสิน":{"count":71},"ธนาคารไทยพาณิชย์":{"count":95},"みずほ銀行":{"count":255},"りそな銀行":{"count":135},"三井住友銀行":{"count":204},"三菱東京UFJ銀行":{"count":235},"中国农业银行":{"count":198},"中国工商银行":{"count":181},"中国建设银行":{"count":158},"中国邮政储蓄银行":{"count":76},"中国银行":{"count":275},"交通银行":{"count":68},"京都中央信用金庫":{"count":53},"京都銀行":{"count":66},"农业银行":{"count":78},"北海道銀行":{"count":51},"合作金庫銀行":{"count":55},"土地銀行":{"count":54},"工商银行":{"count":160},"建设银行":{"count":89},"彰化銀行":{"count":53},"招商银行":{"count":94},"横浜銀行":{"count":92},"第一銀行":{"count":78},"華南銀行":{"count":52},"국민은행":{"count":199,"tags":{"name:en":"Gungmin Bank"}},"기업은행":{"count":53},"농협":{"count":148},"새마을금고":{"count":102},"신한은행":{"count":245,"tags":{"name:en":"Sinhan Bank"}},"우리은행":{"count":316,"tags":{"name:en":"Uri Bank"}},"하나은행":{"count":85}},"bar":{"Bar Centrale":{"count":141},"Bar Sport":{"count":90},"Beach Bar":{"count":80},"Pool Bar":{"count":54}},"bicycle_rental":{"Bicing":{"count":130},"Call a Bike":{"count":95},"Grid":{"count":51},"Mibici":{"count":116},"metropolradruhr":{"count":91}},"bureau_de_change":{"Abitab":{"count":55},"Change":{"count":51},"Travelex":{"count":75},"Western Union":{"count":189}},"cafe":{"85度C":{"count":128},"Bar Centrale":{"count":77},"Bar Kafe":{"count":253},"Barista":{"count":65},"Bistro":{"count":60},"Bonafide":{"count":63},"Cafe Coffee Day":{"count":239},"Cafe Nero":{"count":52},"Cafeteria":{"count":579},"Cafetería":{"count":61},"Caffè Nero":{"count":316},"Café Amazon":{"count":241},"Café Central":{"count":115},"Café de la Place":{"count":55},"Café des Sports":{"count":71},"Caribou Coffee":{"count":184},"Coffee Fellows":{"count":77},"Coffee House":{"count":71},"Coffee Island":{"count":51},"Coffee Time":{"count":133},"Costa":{"count":1403},"Country Style":{"count":58},"Dolce Vita":{"count":55},"Dunkin' Donuts":{"count":1662,"tags":{"cuisine":"donut"}},"Eiscafe Dolomiti":{"count":51},"Eiscafe Venezia":{"count":237},"Espresso House":{"count":122},"Havanna":{"count":81},"Internet Cafe":{"count":95},"Jamba Juice":{"count":86},"Kafe":{"count":55},"Krispy Kreme":{"count":63},"Le Pain Quotidien":{"count":59},"McCafé":{"count":72,"tags":{"amenity":"cafe","cuisine":"coffee_shop"}},"Peet's Coffee & Tea":{"count":82},"Pret A Manger":{"count":174},"Prime":{"count":51},"Second Cup":{"count":234},"Segafredo":{"count":103},"Starbucks":{"count":8463,"tags":{"cuisine":"coffee_shop"}},"Subway":{"count":114},"Tchibo":{"count":168},"The Coffee Bean & Tea Leaf":{"count":93},"The Coffee Club":{"count":81},"Tim Hortons":{"count":1945},"Traveler's Coffee":{"count":70},"Venezia":{"count":55},"Wayne's Coffee":{"count":52},"Берёзка":{"count":52},"Бистро":{"count":84},"Буфет":{"count":56},"Встреча":{"count":83},"Даблби":{"count":59},"Закусочная":{"count":101},"Кофе Хауз":{"count":119},"Кофейня":{"count":78},"Лакомка":{"count":62},"Летнее кафе":{"count":61},"Оазис":{"count":54},"Пельменная":{"count":63},"Пиццерия":{"count":60},"Рандеву":{"count":54},"Сказка":{"count":66},"Смак":{"count":62},"Старбакс":{"count":55},"Столовая":{"count":1181},"Теремок":{"count":64},"Уют":{"count":115},"Хуторок":{"count":59},"Шашлычная":{"count":153},"Шоколад":{"count":54},"Шоколадница":{"count":252},"ארומה":{"count":64},"مقهى":{"count":136},"คาเฟ่ อเมซอน":{"count":59},"エクセルシオール カフェ":{"count":61},"カフェ・ド・クリエ":{"count":80,"tags":{"name:en":"Cafe de CRIE"}},"カフェ・ベローチェ":{"count":105},"コメダ珈琲店":{"count":179},"サンマルクカフェ":{"count":156},"スターバックス":{"count":558,"tags":{"name:en":"Starbucks"}},"タリーズコーヒー":{"count":243},"ドトールコーヒーショップ":{"count":489},"星巴克":{"count":146},"스타벅스":{"count":52}},"car_rental":{"Alamo":{"count":57},"Avis":{"count":604},"Budget":{"count":218},"Enterprise":{"count":594},"Enterprise Rent-a-Car":{"count":51},"Europcar":{"count":611},"Hertz":{"count":654},"Localiza":{"count":59},"Sixt":{"count":323},"Thrifty":{"count":81},"U-Haul":{"count":94},"オリックスレンタカー":{"count":54},"トヨタレンタカー":{"count":57},"トヨタレンタリース":{"count":63},"ニッポンレンタカー":{"count":113}},"car_wash":{"Aral":{"count":88},"Autolavaggio":{"count":52},"BP":{"count":63},"Esso":{"count":55},"H-E-B Car Wash":{"count":71},"Intermarché":{"count":60},"Lavage Auto":{"count":60},"Lavazh":{"count":52},"Myjnia":{"count":54},"Myjnia bezdotykowa":{"count":93},"Myjnia samochodowa":{"count":66},"Shell":{"count":162},"Spălătorie Auto":{"count":69},"Spălătorie auto":{"count":52},"Автомийка":{"count":63}},"cinema":{"Cinema City":{"count":61},"Cinemark":{"count":87},"Cinemex":{"count":70},"Cinepolis":{"count":59},"Cineworld":{"count":64},"Odeon":{"count":81}},"clinic":{"ФАП":{"count":162}},"dentist":{"Aspen Dental":{"count":73},"Family Dentistry":{"count":51},"Vitaldent":{"count":54},"Стоматолог":{"count":72},"Стоматологія":{"count":66}},"doctors":{"Háziorvosi rendelő":{"count":54},"Инвитро":{"count":115},"ФАП":{"count":147}},"driving_school":{"Автодром":{"count":55}},"fast_food":{"A&W":{"count":614},"Ali Baba":{"count":101},"Angel's Burger":{"count":66},"Antalya":{"count":53},"Arby's":{"count":1432},"Asia Bistro":{"count":53},"Asia Wok":{"count":53},"Baskin-Robbins":{"count":262,"tags":{"amenity":"ice_cream"}},"Bistro":{"count":80},"Bob's":{"count":83},"Bojangles":{"count":89},"Booster Juice":{"count":76},"Boston Market":{"count":107},"Braum's":{"count":58},"Burger King":{"count":6601,"tags":{"cuisine":"burger"}},"Burger Machine":{"count":55},"Büfé":{"count":72},"Captain D's":{"count":56},"Carl's Jr.":{"count":593,"tags":{"cuisine":"burger"}},"Checkers":{"count":102},"Chick-fil-A":{"count":906,"tags":{"cuisine":"chicken"}},"Chicken Express":{"count":67},"Chipotle":{"count":688,"tags":{"cuisine":"mexican"}},"Chowking":{"count":250},"Church's Chicken":{"count":249},"CoCo壱番屋":{"count":218},"Cold Stone Creamery":{"count":72},"Cook Out":{"count":81},"Culver's":{"count":541},"DQ":{"count":66},"Dairy Queen":{"count":1485},"Del Taco":{"count":244},"Ditsch":{"count":55},"Domino's Pizza":{"count":2577,"tags":{"cuisine":"pizza"}},"Dunkin' Donuts":{"count":747,"tags":{"cuisine":"donut"}},"El Pollo Loco":{"count":132},"Everest":{"count":59},"Extreme Pita":{"count":58},"Fazoli's":{"count":53},"Firehouse Subs":{"count":147},"Fish & Chips":{"count":185},"Fish and Chips":{"count":55},"Five Guys":{"count":457},"Greenwich":{"count":83},"Habib's":{"count":87},"Hallo Pizza":{"count":98},"Hardee's":{"count":634,"tags":{"cuisine":"burger"}},"Harvey's":{"count":158},"Hesburger":{"count":164},"Hungry Jacks":{"count":261,"tags":{"cuisine":"burger"}},"In-N-Out Burger":{"count":211},"Istanbul":{"count":96},"Istanbul Kebab":{"count":59},"Jack in the Box":{"count":951,"tags":{"cuisine":"burger"}},"Jamba Juice":{"count":148},"Jersey Mike's Subs":{"count":88},"Jimmy John's":{"count":519,"tags":{"cuisine":"sandwich"}},"Jollibee":{"count":740},"KFC":{"count":6003,"tags":{"cuisine":"chicken"}},"KFC/Taco Bell":{"count":70},"Kebab House":{"count":74},"Kebabai":{"count":64},"Kochlöffel":{"count":78},"Kotipizza":{"count":89},"Krispy Kreme":{"count":63},"Krystal":{"count":53},"Little Caesars":{"count":567},"Little Caesars Pizza":{"count":82},"Long John Silver's":{"count":200},"Lotteria":{"count":67},"Max":{"count":54},"McDonald's":{"count":18327,"tags":{"cuisine":"burger"}},"Minute Burger":{"count":53},"Mr. Sub":{"count":153},"New York Pizza":{"count":65},"Nordsee":{"count":198},"Panda Express":{"count":593,"tags":{"cuisine":"chinese"}},"Panera Bread":{"count":120},"Papa John's":{"count":820,"tags":{"cuisine":"pizza"}},"Papa Murphy's":{"count":100},"Pinulito":{"count":58},"Pita Pit":{"count":150},"Pizza Hut":{"count":1503,"tags":{"cuisine":"pizza"}},"Pizza Hut Delivery":{"count":70},"Pizza King":{"count":56},"Pizza Nova":{"count":90},"Pizza Pizza":{"count":411},"Pollo Campero":{"count":134},"Pollo Granjero":{"count":66},"Popeye's":{"count":521,"tags":{"cuisine":"chicken"}},"Popeyes Louisiana Kitchen":{"count":51},"Qdoba":{"count":91},"Quick":{"count":434},"Quiznos":{"count":401},"Rally's":{"count":68},"Red Rooster":{"count":192},"Sbarro":{"count":65},"Schlotzsky's Deli":{"count":348},"Sibylla":{"count":74},"Sonic":{"count":1166,"tags":{"cuisine":"burger"}},"Starbucks":{"count":60,"tags":{"cuisine":"coffee_shop"}},"Steers":{"count":190},"Subway":{"count":11431},"Taco Bell":{"count":2947,"tags":{"cuisine":"mexican"}},"Taco Bueno":{"count":59},"Taco Cabana":{"count":57},"Taco Del Mar":{"count":57},"Taco John's":{"count":141},"Taco Time":{"count":171},"Telepizza":{"count":323},"Thai Express":{"count":63},"The Pizza Company":{"count":62},"Waffle House":{"count":86},"Wendy's":{"count":3036,"tags":{"cuisine":"burger"}},"Whataburger":{"count":815},"White Castle":{"count":149},"Wienerschnitzel":{"count":61},"Wimpy":{"count":168},"Zaxby's":{"count":185},"Γρηγόρης":{"count":59},"Бистро":{"count":61},"Бургер Кинг":{"count":181},"Крошка Картошка":{"count":77},"Макдоналдс":{"count":469,"tags":{"name:en":"McDonald's"}},"Робин Сдобин":{"count":131},"Русский Аппетит":{"count":129},"Сабвэй":{"count":73},"Стардог!s":{"count":66},"Теремок":{"count":155},"Шаверма":{"count":93},"Шаурма":{"count":265},"かっぱ寿司":{"count":84},"かつや":{"count":58},"くら寿司":{"count":99},"すき家":{"count":571,"tags":{"name:en":"SUKIYA"}},"なか卯":{"count":180},"ほっかほっか亭":{"count":57},"ほっともっと":{"count":168},"オリジン弁当":{"count":93},"ケンタッキーフライドチキン":{"count":334,"tags":{"cuisine":"chicken","name:en":"KFC"}},"サブウェイ":{"count":74},"スシロー":{"count":94},"マクドナルド":{"count":1261,"tags":{"cuisine":"burger","name:en":"McDonald's"}},"ミスタードーナツ":{"count":188},"モスバーガー":{"count":507,"tags":{"name:en":"MOS BURGER"}},"ロッテリア":{"count":97},"丸亀製麺":{"count":57},"吉野家":{"count":461},"幸楽苑":{"count":80},"摩斯漢堡":{"count":86},"松屋":{"count":574,"tags":{"name:en":"Matsuya"}},"肯德基":{"count":197},"麥當勞":{"count":224},"麦当劳":{"count":97},"롯데리아":{"count":83}},"fuel":{"76":{"count":603},"1-2-3":{"count":75},"7-Eleven":{"count":1013},"ABC":{"count":83},"ADNOC":{"count":76},"ANP":{"count":202},"ARAL":{"count":68},"Aegean":{"count":56},"Afriquia":{"count":134},"Agip":{"count":2348},"Agrola":{"count":99},"Alon":{"count":54},"Alpet":{"count":61},"Api":{"count":234},"Aral":{"count":1708},"Arco":{"count":585},"Asda":{"count":51},"Auchan":{"count":84},"Avanti":{"count":112},"Avia":{"count":1061},"BEBECO":{"count":77},"BFT":{"count":102},"BHPetrol":{"count":60},"BP":{"count":4069},"BR":{"count":165},"Bangchak":{"count":106},"Benzina":{"count":167},"Bharat Petroleum":{"count":230},"Bliska":{"count":141},"CAMPSA":{"count":420},"CARREFOUR":{"count":61},"CEPSA":{"count":892},"CNG":{"count":373},"Caltex":{"count":1574},"Campsa":{"count":64},"Canadian Tire":{"count":97},"Carrefour":{"count":372},"Casey's General Store":{"count":385},"Cenex":{"count":222},"Cepsa":{"count":305},"Ceypetco":{"count":70},"Chevron":{"count":1781},"Circle K":{"count":730},"Citgo":{"count":692},"Clark":{"count":56},"Co-op":{"count":52},"Coles Express":{"count":305},"Conoco":{"count":398},"Coop":{"count":71},"Copec":{"count":566},"Copetrol":{"count":119},"Cosmo":{"count":68},"Costco":{"count":82},"Costco Gas":{"count":62},"Costco Gasoline":{"count":59},"Couche-Tard":{"count":54},"Crodux":{"count":51},"Cumberland Farms":{"count":93},"Delta":{"count":157},"Diamond Shamrock":{"count":51},"Drummed Fuel":{"count":178},"E. Leclerc":{"count":136},"EKO":{"count":224},"ENEOS":{"count":1600},"ENI":{"count":92},"ERG":{"count":71},"Elan":{"count":208},"Eneos":{"count":130},"Engen":{"count":383},"Eni":{"count":681},"Erg":{"count":469},"Esso":{"count":4742},"Esso Express":{"count":176},"EuroOil":{"count":52},"Exxon":{"count":1064},"F24":{"count":67},"Firezone":{"count":66},"Flying V":{"count":175},"GALP":{"count":788},"Gazprom":{"count":68},"GetGo":{"count":54},"Goil":{"count":78},"Gulf":{"count":416},"H-E-B Fuel":{"count":51},"H-E-B Gas":{"count":155},"HEM":{"count":276},"HP":{"count":163},"HP Petrol Pump":{"count":53},"Helios":{"count":63},"Hess":{"count":195},"Hindustan Petroleum":{"count":82},"Holiday":{"count":156},"Husky":{"count":244},"IES":{"count":57},"IP":{"count":993},"Independent Fuel Station":{"count":52},"Indian Oil":{"count":416},"Indipend.":{"count":129},"Ingo":{"count":62},"Intermarché":{"count":556},"Intermarché Super":{"count":102},"Ipiranga":{"count":173},"Irving":{"count":194},"JA-SS":{"count":74},"JOMO":{"count":51},"Jet":{"count":707},"Jetti":{"count":61},"Kangaroo":{"count":115},"Kobil":{"count":87},"Kroger":{"count":59},"Kroger Fuel":{"count":68},"Kum & Go":{"count":136},"Kwik Trip":{"count":210},"LPG":{"count":349},"LPG Station":{"count":51},"LUKOIL":{"count":61},"Liberty":{"count":93},"Lotos":{"count":284},"Lotos Optima":{"count":71},"Love's":{"count":52},"Lukoil":{"count":908},"MEROIL":{"count":70},"MOL":{"count":436},"MRS":{"count":65},"Marathon":{"count":694},"Maverik":{"count":66},"Maxol":{"count":57},"Metano":{"count":248},"Migrol":{"count":71},"Minipump":{"count":140},"Mobil":{"count":1387},"Mobile":{"count":62},"Mol":{"count":64},"Morrisons":{"count":128},"Moya":{"count":62},"Murphy USA":{"count":190},"NP":{"count":63},"Neste":{"count":166},"OIL!":{"count":110},"OK":{"count":269},"OKQ8":{"count":218},"OMV":{"count":936},"Oilibya":{"count":127},"Opet":{"count":117},"Orlen":{"count":1185},"PETRONOR":{"count":182},"PSO":{"count":121},"PSO Petrol Pump":{"count":56},"PT":{"count":306},"PTT":{"count":423},"PV Oil":{"count":100},"Pacific Pride":{"count":54},"Pecsa":{"count":130},"Pemex":{"count":2023},"Pertamina":{"count":324},"Petro":{"count":54},"Petro-Canada":{"count":893},"Petrobras":{"count":487},"Petrochina":{"count":116},"Petroecuador":{"count":64},"Petrol Ofisi":{"count":237},"Petrolimex":{"count":325},"Petrom":{"count":381},"Petron":{"count":1485},"Petronas":{"count":387},"Petroperu":{"count":110},"Phillips 66":{"count":424},"Phoenix":{"count":210},"Pilot":{"count":69},"Pioneer":{"count":104},"Posto":{"count":52},"Posto Atem":{"count":68},"Posto BR":{"count":222},"Posto Ipiranga":{"count":177},"Posto Shell":{"count":104},"Primax":{"count":288},"Prio":{"count":52},"Puma":{"count":442},"Q1":{"count":53},"Q8":{"count":1467},"Q8 Easy":{"count":66},"QuikTrip":{"count":251},"REPSOL":{"count":1380},"RaceTrac":{"count":80},"Raiffeisenbank":{"count":130},"Repsol":{"count":1099},"Rompetrol":{"count":234},"Royal Farms":{"count":79},"Rubis":{"count":108},"SB Tank":{"count":62},"SPBU":{"count":203},"Safeway":{"count":74},"Sainsbury's":{"count":75},"Sam's Club":{"count":57},"Sasol":{"count":90},"Sea Oil":{"count":142},"Sheetz":{"count":304},"Shell":{"count":12317},"Shell Express":{"count":135},"Sinclair":{"count":201},"Sinopec":{"count":106},"Sinopec Fuel":{"count":116},"Slovnaft":{"count":259},"Socar":{"count":86},"Sokimex":{"count":85},"Speedway":{"count":556},"St1":{"count":141},"Star":{"count":419},"Star Oil":{"count":100},"Station Service E. Leclerc":{"count":423},"Statoil":{"count":495},"Stewart's":{"count":72},"Sunoco":{"count":853},"Super U":{"count":174},"Tamoil":{"count":959},"Tango":{"count":146},"Teboil":{"count":100},"Tela":{"count":191},"Terpel":{"count":367},"Tesco":{"count":218},"Texaco":{"count":1167},"Tinq":{"count":219},"Topaz":{"count":111},"Total":{"count":3591},"Total Access":{"count":226},"Total Erg":{"count":59},"TotalErg":{"count":267},"Turkey Hill":{"count":80},"Turmöl":{"count":80},"Ultramar":{"count":372},"United":{"count":197},"Uno":{"count":134},"Uno-X":{"count":69},"Valero":{"count":778},"Vito":{"count":91},"WOG":{"count":350},"Wawa":{"count":173},"Westfalen":{"count":94},"Woolworths Petrol":{"count":187},"Z":{"count":98},"bft":{"count":202},"eni":{"count":71},"ΕΚΟ":{"count":58},"АГЗС":{"count":1020},"АЗС":{"count":86},"Авіас":{"count":116},"БРСМ-Нафта":{"count":64},"Башнефть":{"count":272},"Белоруснефть":{"count":71},"Газовая заправка":{"count":57},"Газпромнефть":{"count":1242},"Гелиос":{"count":61},"ЕКА":{"count":78},"Заправка":{"count":63},"КазМунайГаз":{"count":150},"Лукойл":{"count":2327},"Макпетрол":{"count":108},"НК Альянс":{"count":105},"Нефтьмагистраль":{"count":66},"ОККО":{"count":316},"ОМВ":{"count":55},"Октан":{"count":53},"ПТК":{"count":104},"Петрол":{"count":124},"Пропан":{"count":83},"Роснефть":{"count":957},"Сибнефть":{"count":51},"Сургутнефтегаз":{"count":95},"ТНК":{"count":588},"Татнефтепродукт":{"count":58},"Татнефть":{"count":331},"Укрнафта":{"count":228},"דור אלון":{"count":126},"דלק":{"count":160},"סונול":{"count":159},"פז":{"count":209},"محطة وقود":{"count":221},"محطه وقود":{"count":98},"پمپ بنزین":{"count":559},"پمپ گاز":{"count":152},"บางจาก":{"count":214},"ป.ต.ท.":{"count":414},"เชลล์":{"count":90},"เอสโซ่":{"count":82},"エッソ":{"count":70},"エネオス":{"count":301},"コスモ石油":{"count":415},"ゼネラル":{"count":75},"中国石化":{"count":104},"中国石化 Sinopec":{"count":61},"中国石油":{"count":82},"中油":{"count":64},"出光":{"count":620,"tags":{"name:en":"IDEMITSU"}},"加油站":{"count":60},"台灣中油":{"count":257},"昭和シェル":{"count":274}},"hospital":{"Cruz Roja":{"count":93},"IMSS":{"count":64},"Инфекционное отделение":{"count":91},"Кожно-венерологический диспансер":{"count":57},"Районная больница":{"count":88},"Роддом":{"count":133},"Родильный дом":{"count":75},"Скорая помощь":{"count":75},"ФАП":{"count":108},"ЦРБ":{"count":122},"Центральная районная больница":{"count":144},"โรงพยาบาลส่งเสริมสุขภาพตำบล":{"count":69}},"ice_cream":{"Baskin-Robbins":{"count":69,"tags":{"amenity":"ice_cream"}},"Cold Stone Creamery":{"count":66},"Grido":{"count":163}},"kindergarten":{"Amado Nervo":{"count":64},"Anganwadi":{"count":85},"Arche Noah":{"count":67},"Benito Juarez":{"count":89},"CONAFE Preescolar":{"count":90},"Cuauhtemoc":{"count":54},"Cursos Comunitarios":{"count":74},"Educacion Inicial de CONAFE No Escolarizado":{"count":184},"Emiliano Zapata":{"count":60},"Estefania Casta�eda":{"count":53},"Evangelischer Kindergarten":{"count":320},"Federico Froebel":{"count":88},"Gabriela Mistral":{"count":129},"Jean Piaget":{"count":82},"Jose Vasconcelos":{"count":71},"Juan Escutia":{"count":82},"Katholischer Kindergarten":{"count":99},"Kindergarten Regenbogen":{"count":62},"Kindergarten St. Josef":{"count":55},"Kindergarten St. Martin":{"count":55},"Maria Montessori":{"count":93},"Miguel Hidalgo Y Costilla":{"count":57},"Ni�os Heroes":{"count":68},"PAUD":{"count":82},"Pusteblume":{"count":54},"Rosaura Zapata":{"count":68},"Sor Juana Ines De La Cruz":{"count":76},"Spatzennest":{"count":54},"Städtischer Kindergarten":{"count":103},"Villa Kunterbunt":{"count":88},"Waldkindergarten":{"count":111},"Waldorfkindergarten":{"count":71},"Óvoda":{"count":72},"Детсад":{"count":65},"Детский сад \"Солнышко\"":{"count":83},"Детский сад № 1":{"count":54},"Детский сад №1":{"count":150},"Детский сад №10":{"count":77},"Детский сад №11":{"count":81},"Детский сад №12":{"count":57},"Детский сад №13":{"count":57},"Детский сад №14":{"count":76},"Детский сад №15":{"count":72},"Детский сад №16":{"count":58},"Детский сад №17":{"count":67},"Детский сад №18":{"count":77},"Детский сад №19":{"count":62},"Детский сад №2":{"count":155},"Детский сад №22":{"count":60},"Детский сад №24":{"count":53},"Детский сад №25":{"count":56},"Детский сад №27":{"count":54},"Детский сад №29":{"count":57},"Детский сад №3":{"count":129},"Детский сад №33":{"count":55},"Детский сад №4":{"count":86},"Детский сад №5":{"count":106},"Детский сад №6":{"count":93},"Детский сад №7":{"count":98},"Детский сад №8":{"count":80},"Детский сад №9":{"count":80},"Дитячий садок":{"count":58},"Сказка":{"count":52},"Солнышко":{"count":99},"Теремок":{"count":59},"საბავშვო ბაღი":{"count":69},"中央保育所":{"count":56}},"library":{"Biblioteca Comunale":{"count":212},"Biblioteca comunale":{"count":187},"Biblioteka Publiczna":{"count":78},"Bibliothèque Municipale":{"count":299},"Bibliothèque municipale":{"count":247},"Bücherei":{"count":113},"Central Library":{"count":65},"Gemeindebücherei":{"count":150},"Gminna Biblioteka Publiczna":{"count":71},"Miejska Biblioteka Publiczna":{"count":66},"Médiathèque":{"count":287},"Městská knihovna":{"count":60},"Public Library":{"count":91},"Stadtbibliothek":{"count":232},"Stadtbücherei":{"count":289},"Городская библиотека":{"count":69},"Детская библиотека":{"count":260},"Центральная библиотека":{"count":83},"Центральная городская библиотека":{"count":61},"图书馆":{"count":65}},"pharmacy":{"36.6":{"count":57},"Adler-Apotheke":{"count":375},"Alte Apotheke":{"count":99},"Apollo Pharmacy":{"count":87},"Apotek":{"count":62},"Apotek Hjärtat":{"count":51},"Apotheke am Markt":{"count":83},"Bahnhof Apotheke":{"count":51},"Bahnhof-Apotheke":{"count":90},"Bartell Drugs":{"count":53},"Benavides":{"count":83},"Benu":{"count":61},"Boots":{"count":1348},"Botica":{"count":118},"Brunnen-Apotheke":{"count":77},"Burg-Apotheke":{"count":76},"Bären-Apotheke":{"count":111},"CVS":{"count":3228},"Camelia":{"count":54},"Catena":{"count":112},"Chemist Warehouse":{"count":82},"Clicks":{"count":123},"Cruz Azul":{"count":97},"Cruz Verde":{"count":223},"Dbam o Zdrowie":{"count":68},"Dr. Max":{"count":324},"Droga Raia":{"count":152},"Drogaria São Paulo":{"count":87},"Drogasil":{"count":157},"Duane Reade":{"count":91},"Eczane":{"count":88},"Engel-Apotheke":{"count":143},"Eurovaistinė":{"count":89},"Familiprix":{"count":70},"Farmacenter":{"count":65},"Farmacia Centrale":{"count":61},"Farmacia Comunale":{"count":196},"Farmacia Guadalajara":{"count":146},"Farmacia del Ahorro":{"count":65},"Farmacias Ahumada":{"count":182},"Farmacias Cruz Azul":{"count":134},"Farmacias Cruz Verde":{"count":162},"Farmacias Económicas":{"count":63},"Farmacias Guadalajara":{"count":107},"Farmacias SalcoBrand":{"count":140},"Farmacias Sana Sana":{"count":111},"Farmacias Similares":{"count":137},"Farmacias del Ahorro":{"count":187},"Farmacity":{"count":191},"Farmahorro":{"count":53},"Farmatodo":{"count":165},"Felicia":{"count":56},"Fybeca":{"count":52},"Generika Drugstore":{"count":52},"Gintarinė vaistinė":{"count":121},"Guardian":{"count":71},"Gyógyszertár":{"count":59},"H-E-B Pharmacy":{"count":239},"Hirsch-Apotheke":{"count":180},"Hubertus Apotheke":{"count":120},"Inkafarma":{"count":234},"Jean Coutu":{"count":132},"Kinney Drugs":{"count":74},"Kur-Apotheke":{"count":52},"Linden-Apotheke":{"count":224},"Ljekarna":{"count":77},"Lloyds Pharmacy":{"count":539},"Lékárna":{"count":52},"Löwen-Apotheke":{"count":397},"Marien-Apotheke":{"count":370},"Markt-Apotheke":{"count":207},"Mercury Drug":{"count":584},"Mifarma":{"count":195},"Mēness aptieka":{"count":64},"Neue Apotheke":{"count":129},"Pague Menos":{"count":74},"Panvel":{"count":77},"Park-Apotheke":{"count":54},"Pharmacie Centrale":{"count":218},"Pharmacie Principale":{"count":62},"Pharmacie de l'Hôtel de Ville":{"count":52},"Pharmacie de la Gare":{"count":114},"Pharmacie de la Mairie":{"count":71},"Pharmacie de la Poste":{"count":68},"Pharmacie du Centre":{"count":154},"Pharmacie du Marché":{"count":110},"Pharmacie du Parc":{"count":60},"Pharmaprix":{"count":99},"Pharmasave":{"count":129},"Punkt Apteczny":{"count":53},"Rathaus-Apotheke":{"count":181},"Rats-Apotheke":{"count":126},"Rexall":{"count":109},"Rite Aid":{"count":1481},"Rose Pharmacy":{"count":99},"Rosen-Apotheke":{"count":205},"Rowlands Pharmacy":{"count":127},"SalcoBrand":{"count":112},"Sana Sana":{"count":95},"Schloss-Apotheke":{"count":62},"Sensiblu":{"count":115},"Shoppers Drug Mart":{"count":713},"Sonnen-Apotheke":{"count":372},"South Star Drug":{"count":69},"Stadt-Apotheke":{"count":397},"Stern-Apotheke":{"count":83},"Superdrug":{"count":177},"São João":{"count":54},"The Generics Pharmacy":{"count":211},"Uniprix":{"count":63},"Walgreens":{"count":3314},"Walgreens Pharmacy":{"count":76},"Walmart Pharmacy":{"count":99},"Watsons":{"count":110},"Well Pharmacy":{"count":61},"centro naturista":{"count":123},"А5":{"count":94},"Айболит":{"count":88},"Аптека 36,6":{"count":285},"Аптека низких цен":{"count":65},"Аптека низьких цін":{"count":88},"Аптека от склада":{"count":83},"Аптека №1":{"count":92},"Аптечный пункт":{"count":285},"Арніка":{"count":124},"Бережная аптека":{"count":67},"Будь здоров":{"count":63},"Вита":{"count":140},"Горздрав":{"count":395},"Живика":{"count":105},"Здоровье":{"count":87},"Имплозия":{"count":84},"Классика":{"count":102},"Ладушка":{"count":53},"Мед-сервіс":{"count":59},"Мелодия здоровья":{"count":60},"Невис":{"count":151},"Норма":{"count":89},"Озерки":{"count":54},"Панацея":{"count":68},"Первая помощь":{"count":132},"Планета здоровья":{"count":140},"Радуга":{"count":139},"Ригла":{"count":215},"Семейная":{"count":52},"Социальная аптека":{"count":62},"Столички":{"count":83},"Фармакопейка":{"count":85},"Фармакор":{"count":106},"Фармация":{"count":187},"Фармленд":{"count":108},"Центральная аптека":{"count":57},"סופר-פארם":{"count":93},"داروخانه":{"count":264},"داروخانه شبانه روزی":{"count":54},"صيدلية":{"count":148},"くすりの福太郎":{"count":51},"さくら薬局":{"count":52},"ウエルシア":{"count":84},"カワチ薬品":{"count":52},"クリエイト":{"count":53},"サンドラッグ":{"count":130},"スギ薬局":{"count":134},"セイジョー":{"count":58},"ツルハドラッグ":{"count":185},"ドラッグてらしま (Drug Terashima)":{"count":58},"マツモトキヨシ":{"count":221},"丁丁藥局":{"count":75}},"pub":{"Black Bull":{"count":55},"Commercial Hotel":{"count":62},"Cross Keys":{"count":64},"Irish Pub":{"count":107},"Kings Arms":{"count":81},"Kings Head":{"count":65},"New Inn":{"count":100},"Prince of Wales":{"count":89},"Queens Head":{"count":55},"Red Lion":{"count":201},"Rose & Crown":{"count":63},"Rose and Crown":{"count":82},"Royal Hotel":{"count":64},"Royal Oak":{"count":172},"The Albion":{"count":51},"The Anchor":{"count":68},"The Angel":{"count":55},"The Beehive":{"count":52},"The Bell":{"count":128},"The Bell Inn":{"count":58},"The Black Horse":{"count":100},"The Bull":{"count":82},"The Castle":{"count":63},"The Chequers":{"count":74},"The Cricketers":{"count":56},"The Cross Keys":{"count":58},"The Crown":{"count":252},"The Crown Inn":{"count":88},"The Fox":{"count":76},"The George":{"count":119},"The Green Man":{"count":59},"The Greyhound":{"count":99},"The Kings Arms":{"count":65},"The Kings Head":{"count":68},"The New Inn":{"count":126},"The Plough":{"count":182},"The Plough Inn":{"count":57},"The Queens Head":{"count":61},"The Railway":{"count":112},"The Red Lion":{"count":271},"The Rising Sun":{"count":74},"The Royal Oak":{"count":223},"The Ship":{"count":92},"The Ship Inn":{"count":98},"The Star":{"count":72},"The Star Inn":{"count":53},"The Sun Inn":{"count":51},"The Swan":{"count":155},"The Swan Inn":{"count":59},"The Victoria":{"count":72},"The Wheatsheaf":{"count":126},"The White Hart":{"count":247},"The White Horse":{"count":234},"The White Lion":{"count":75},"The White Swan":{"count":55},"魚民":{"count":119},"鳥貴族":{"count":57}},"restaurant":{"Adler":{"count":228},"Adria":{"count":60},"Adyar Ananda Bhavan":{"count":60},"Akropolis":{"count":212},"Ali Baba":{"count":59},"Alte Post":{"count":68},"Applebee's":{"count":977},"Asia":{"count":78},"Athen":{"count":75},"Athos":{"count":61},"Autogrill":{"count":60},"Bahnhof":{"count":56},"Bella Italia":{"count":194},"Bella Napoli":{"count":88},"Big Boy":{"count":58},"Bistro":{"count":64},"Bob Evans":{"count":269},"Bonefish Grill":{"count":73},"Boston Market":{"count":91},"Boston Pizza":{"count":278},"Buffalo Grill":{"count":282},"Buffalo Wild Wings":{"count":454},"Bären":{"count":75},"Cafeteria":{"count":65},"California Pizza Kitchen":{"count":116},"Campanile":{"count":55},"Canteen":{"count":91},"Capri":{"count":56},"Captain D's":{"count":54},"Carluccio's":{"count":57},"Carpe Diem":{"count":60},"Carrabba's Italian Grill":{"count":62},"Casa Mia":{"count":64},"Casablanca":{"count":61},"Cheesecake Factory":{"count":52},"Chifa":{"count":86},"Chili's":{"count":698},"China Buffet":{"count":54},"China Garden":{"count":114},"China House":{"count":72},"China Town":{"count":117},"China Wok":{"count":100},"Chiquito":{"count":55},"Chuck E. Cheese's":{"count":54},"Cici's Pizza":{"count":51},"CoCo壱番屋":{"count":77},"Cold Stone Creamery":{"count":67},"Comedor":{"count":60},"Comida China":{"count":52},"Courtepaille":{"count":170},"Cracker Barrel":{"count":392},"Da Grasso":{"count":63},"Da Vinci":{"count":88},"Delphi":{"count":105},"Denny's":{"count":850},"Deutsches Haus":{"count":93},"Dionysos":{"count":75},"Dolce Vita":{"count":121},"Dorfkrug":{"count":60},"Dunkin' Donuts":{"count":94,"tags":{"cuisine":"donut"}},"East Side Mario's":{"count":53},"El Greco":{"count":112},"El Paso":{"count":60},"El Rancho":{"count":82},"Europa":{"count":61},"Famous Dave's":{"count":62},"Firehouse Subs":{"count":85},"Five Guys":{"count":91},"Flunch":{"count":179},"Frankie & Benny's":{"count":151},"Friendly's":{"count":113},"Gasthaus Krone":{"count":93},"Gasthaus zur Linde":{"count":59},"Gasthof zur Post":{"count":109},"Golden Corral":{"count":209},"Golden Dragon":{"count":62},"Great Wall":{"count":54},"Grüner Baum":{"count":122},"Gusto":{"count":74},"Hard Rock Cafe":{"count":96},"Hardee's":{"count":56,"tags":{"cuisine":"burger"}},"Harvester":{"count":75},"Hellas":{"count":66},"Hippopotamus":{"count":115},"Hirsch":{"count":83},"Hirschen":{"count":86},"Hong Kong":{"count":126},"Hooters":{"count":190},"IHOP":{"count":758},"IL Патио":{"count":51},"Jason's Deli":{"count":73},"Jimmy John's":{"count":150,"tags":{"cuisine":"sandwich"}},"Joe's Crab Shack":{"count":70},"Jägerhof":{"count":54},"Kantine":{"count":104},"Kelsey's":{"count":66},"Kirchenwirt":{"count":94},"Kreta":{"count":70},"Kreuz":{"count":85},"Krone":{"count":179},"Kudu":{"count":172},"L'Escale":{"count":66},"L'Osteria":{"count":80},"La Bodega":{"count":55},"La Boucherie":{"count":80},"La Cantina":{"count":105},"La Casa":{"count":66},"La Casona":{"count":62},"La Dolce Vita":{"count":129},"La Fontana":{"count":62},"La Gondola":{"count":60},"La Hacienda":{"count":54},"La Pataterie":{"count":116},"La Pergola":{"count":87},"La Perla":{"count":85},"La Piazza":{"count":123},"La Piazzetta":{"count":77},"La Place":{"count":55},"La Scala":{"count":62},"La Strada":{"count":74},"La Tagliatella":{"count":69},"La Tasca":{"count":56},"La Taverna":{"count":58},"La Terrasse":{"count":82},"La Terraza":{"count":56},"La Terrazza":{"count":57},"La Trattoria":{"count":91},"Lamm":{"count":69},"Linde":{"count":114},"Lindenhof":{"count":95},"Little Caesars":{"count":80},"Little Chef":{"count":62},"Little Italy":{"count":90},"Logan's Roadhouse":{"count":89},"LongHorn Steakhouse":{"count":183},"Lotus":{"count":87},"Léon de Bruxelles":{"count":63},"Löwen":{"count":141},"MK Restaurants":{"count":65},"Maharaja":{"count":52},"Mamma Mia":{"count":130},"Mandarin":{"count":90},"Mang Inasal":{"count":128},"Marco Polo":{"count":62},"Marco's Pizza":{"count":53},"McAlister's Deli":{"count":51},"Mediterraneo":{"count":55},"Mellow Mushroom":{"count":73},"Mensa":{"count":148},"Milano":{"count":77},"Mimi's Cafe":{"count":52},"Moe's Southwest Grill":{"count":79},"Mykonos":{"count":89},"Mythos":{"count":61},"Nando's":{"count":412},"Noodles & Company":{"count":106},"O'Charley's":{"count":61},"Oasis":{"count":73},"Ocean Basket":{"count":71},"Ochsen":{"count":94},"Old Chicago":{"count":54},"Olive Garden":{"count":504},"Olympia":{"count":86},"Osaka":{"count":52},"Outback Steakhouse":{"count":399},"P.F. Chang's":{"count":53},"Pancake House":{"count":79},"Panda":{"count":52},"Panera Bread":{"count":582},"Panorama":{"count":102},"Papa Murphy's":{"count":66},"Parrilla":{"count":62},"Peking":{"count":68},"Perkins":{"count":157},"Pinocchio":{"count":63},"Pizza Express":{"count":417},"Pizza Factory":{"count":59},"Pizza House":{"count":56},"Pizza Hut":{"count":2688,"tags":{"cuisine":"pizza"}},"Pizza Ranch":{"count":77},"Pizzeria Italia":{"count":65},"Pizzeria Milano":{"count":51},"Pizzeria Napoli":{"count":53},"Pizzeria Roma":{"count":86},"Pizzeria Venezia":{"count":54},"Poivre Rouge":{"count":56},"Pollo Campero":{"count":53},"Pomodoro":{"count":62},"Portofino":{"count":67},"Poseidon":{"count":145},"Prezzo":{"count":147},"Qdoba":{"count":81},"Qdoba Mexican Grill":{"count":54},"Ratskeller":{"count":161},"Red Lobster":{"count":419},"Red Robin":{"count":312},"Restaurante Universitário":{"count":53},"Rhodos":{"count":94},"Ristorante Del Arte":{"count":160},"Roma":{"count":85},"Rose":{"count":51},"Round Table Pizza":{"count":100},"Ruby Tuesday":{"count":303},"Rössle":{"count":54},"Rössli":{"count":93},"Saigon":{"count":51},"Sakura":{"count":139},"San Marco":{"count":88},"Santorini":{"count":59},"Schwarzer Adler":{"count":65},"Schützenhaus":{"count":151},"Shakey's":{"count":64},"Shalimar":{"count":53},"Shanghai":{"count":96},"Shari's":{"count":75},"Shoney's":{"count":55},"Sizzler":{"count":90},"Sonic":{"count":80,"tags":{"cuisine":"burger"}},"Sonne":{"count":121},"Sphinx":{"count":66},"Sportheim":{"count":113},"Spur":{"count":70},"Starbucks":{"count":54,"tags":{"cuisine":"coffee_shop"}},"Steak 'n Shake":{"count":86,"tags":{"cuisine":"burger"}},"Steak House":{"count":58},"Sternen":{"count":85},"Subway":{"count":1108},"Sunset Grill":{"count":55},"Sushi":{"count":88},"Sushi Bar":{"count":68},"Swiss Chalet":{"count":162},"Syrtaki":{"count":65},"TGI Friday's":{"count":364},"Taj Mahal":{"count":183},"Taste of India":{"count":68},"Taverna":{"count":69},"Telepizza":{"count":109},"Texas Roadhouse":{"count":232},"The Cheesecake Factory":{"count":52},"Tim Hortons":{"count":61},"Toby Carvery":{"count":51},"Tony Roma's":{"count":63},"Toscana":{"count":76},"Trattoria":{"count":70},"Traube":{"count":68},"Vapiano":{"count":136},"Venezia":{"count":68},"Village Inn":{"count":149},"Vips":{"count":109},"Waffle House":{"count":521},"Wagamama":{"count":111},"Waldschänke":{"count":52},"Warung":{"count":73},"Wasabi":{"count":70},"Wimpy":{"count":66},"Zaxby's":{"count":60},"Zizzi":{"count":102},"Zorbas":{"count":62},"Zum Hirschen":{"count":52},"Zum Löwen":{"count":80},"Zur Krone":{"count":96},"Zur Linde":{"count":228},"Zur Post":{"count":125},"Zur Sonne":{"count":77},"Евразия":{"count":93},"Ресторан":{"count":60},"Тануки":{"count":62},"Якитория":{"count":84},"رستوران":{"count":72},"مطعم":{"count":52},"すき家":{"count":61,"tags":{"name:en":"SUKIYA"}},"はま寿司":{"count":67},"びっくりドンキー":{"count":120},"やよい軒":{"count":71},"ガスト":{"count":512,"tags":{"name:en":"Gusto"}},"ココス":{"count":142},"サイゼリア":{"count":54},"サイゼリヤ":{"count":285},"ジョイフル":{"count":83},"ジョナサン":{"count":139},"ジョリーパスタ":{"count":75},"デニーズ":{"count":199},"バーミヤン":{"count":130},"ロイヤルホスト":{"count":108},"丸亀製麺":{"count":98},"八方雲集":{"count":145},"吉野家":{"count":61},"夢庵":{"count":67},"大戸屋":{"count":68},"大阪王将":{"count":68},"天下一品":{"count":70},"安楽亭":{"count":60},"牛角":{"count":107},"食堂":{"count":63},"餃子の王将":{"count":212},"바다횟집 (Bada Fish Restaurant)":{"count":52}},"school":{"Adolfo Lopez Mateos":{"count":137},"Agustin Ya�ez":{"count":57},"Albert-Schweitzer-Schule":{"count":81},"Amado Nervo":{"count":85},"Astrid-Lindgren-Schule":{"count":77},"Benito Juarez":{"count":294},"Brown School":{"count":54},"CEM":{"count":215},"Center School":{"count":115},"Central Elementary School":{"count":179},"Central High School":{"count":130},"Central School":{"count":215},"Colegio San José":{"count":74},"Collège Jean Moulin":{"count":68},"Collège privé Saint-Joseph":{"count":60},"Cuauhtemoc":{"count":152},"Curso Comunitario":{"count":57},"Cursos Comunitarios":{"count":116},"EPP":{"count":112},"Emiliano Zapata":{"count":286},"Fairview Elementary School":{"count":64},"Fairview School":{"count":164},"Francisco I Madero":{"count":86},"Francisco I. Madero":{"count":52},"Francisco Villa":{"count":116},"Franklin Elementary School":{"count":96},"Franklin School":{"count":126},"Garfield Elementary School":{"count":69},"Garfield School":{"count":58},"Gimnazjum nr 1":{"count":59},"Government School":{"count":60},"Gregorio Torres Quintero":{"count":53},"Groupe Scolaire":{"count":57},"Guadalupe Victoria":{"count":58},"Highland School":{"count":71},"Hillcrest Elementary School":{"count":63},"Holy Cross School":{"count":68},"Holy Family School":{"count":77},"Holy Trinity School":{"count":59},"Ignacio Allende":{"count":51},"Ignacio Zaragoza":{"count":98},"Immaculate Conception School":{"count":83},"Jackson Elementary School":{"count":53},"Jackson School":{"count":56},"Jefferson Elementary School":{"count":177},"Jefferson School":{"count":108},"Jose Clemente Orozco":{"count":59},"Jose Ma Morelos Y Pavon":{"count":120},"Jose Vasconcelos":{"count":73},"Josefa Ortiz De Dominguez":{"count":78},"Juan Escutia":{"count":121},"Justo Sierra":{"count":118},"Kumon":{"count":66},"Lazaro Cardenas":{"count":68},"Lazaro Cardenas Del Rio":{"count":153},"Leona Vicario":{"count":64},"Liberty Elementary School":{"count":56},"Liberty School":{"count":84},"Lincoln Elementary School":{"count":264},"Lincoln School":{"count":269},"Longfellow Elementary School":{"count":55},"Longfellow School":{"count":53},"Madison Elementary School":{"count":55},"Manuel Lopez Cotilla":{"count":107},"Maple Grove School":{"count":51},"McKinley Elementary School":{"count":62},"McKinley School":{"count":63},"Miguel Hidalgo":{"count":86},"Miguel Hidalgo Y Costilla":{"count":213},"Miller School":{"count":66},"Mount Pleasant School":{"count":61},"Mount Zion School":{"count":53},"Mountain View Elementary School":{"count":52},"New Hope School":{"count":51},"Nicolas Bravo":{"count":58},"Ni�os Heroes":{"count":155},"Nombre En Tramite":{"count":126},"North Elementary School":{"count":57},"Oak Grove School":{"count":148},"Pedro Moreno":{"count":69},"Pestalozzischule":{"count":84},"Pine Grove School":{"count":63},"Pleasant Hill School":{"count":110},"Pleasant Valley School":{"count":85},"Pleasant View School":{"count":61},"Primaria Comunitaria":{"count":59},"Ramon Corona":{"count":54},"Ricardo Flores Magon":{"count":91},"Riverside School":{"count":76},"Roosevelt Elementary School":{"count":112},"Roosevelt School":{"count":114},"SD":{"count":76},"SDN":{"count":290},"Sacred Heart School":{"count":206},"Saint Francis School":{"count":56},"Saint James School":{"count":83},"Saint Johns School":{"count":173},"Saint Joseph School":{"count":147},"Saint Josephs School":{"count":157},"Saint Kizito Primary School":{"count":61},"Saint Mary School":{"count":54},"Saint Marys School":{"count":256},"Saint Patricks School":{"count":80},"Saint Paul School":{"count":53},"Saint Pauls School":{"count":74},"Saint Peters School":{"count":81},"Schillerschule":{"count":61},"School Number 1":{"count":233},"School Number 2":{"count":206},"School Number 3":{"count":184},"School Number 4":{"count":126},"Smith School":{"count":60},"Sor Juana Ines De La Cruz":{"count":56},"South Elementary School":{"count":53},"Sunnyside School":{"count":60},"Szkoła Podstawowa nr 1":{"count":78},"Szkoła Podstawowa nr 2":{"count":75},"Szkoła Podstawowa nr 3":{"count":60},"Trinity School":{"count":85},"UNIDAD EDUCATIVA":{"count":106},"Union School":{"count":128},"Valentin Gomez Farias":{"count":71},"Venustiano Carranza":{"count":64},"Vicente Guerrero":{"count":159},"Volkshochschule":{"count":105},"Volksschule":{"count":366},"Washington Elementary School":{"count":192},"Washington School":{"count":213},"West Elementary School":{"count":58},"White School":{"count":51},"Wilson Elementary School":{"count":66},"Wilson School":{"count":80},"Általános iskola":{"count":105},"École Jules Ferry":{"count":51},"École Notre-Dame":{"count":61},"École Saint-Joseph":{"count":96},"École primaire Jean Jaurès":{"count":71},"École primaire Jules Ferry":{"count":82},"École primaire privée Notre-Dame":{"count":69},"École primaire privée Saint-Joseph":{"count":132},"École primaire privée Sainte-Marie":{"count":63},"École élémentaire Jules Ferry":{"count":52},"Școala Generală":{"count":51},"Școală":{"count":53},"Вечерняя школа":{"count":53},"Гимназия №1":{"count":96},"ДЮСШ":{"count":63},"Средняя школа №1":{"count":80},"Средняя школа №2":{"count":86},"Средняя школа №3":{"count":58},"Школа № 1":{"count":130},"Школа № 2":{"count":117},"Школа № 3":{"count":80},"Школа № 4":{"count":77},"Школа № 5":{"count":55},"Школа №1":{"count":576},"Школа №10":{"count":167},"Школа №11":{"count":148},"Школа №12":{"count":136},"Школа №13":{"count":129},"Школа №14":{"count":123},"Школа №15":{"count":129},"Школа №16":{"count":99},"Школа №17":{"count":117},"Школа №18":{"count":111},"Школа №19":{"count":98},"Школа №2":{"count":509},"Школа №20":{"count":100},"Школа №21":{"count":72},"Школа №22":{"count":72},"Школа №23":{"count":75},"Школа №24":{"count":78},"Школа №25":{"count":57},"Школа №26":{"count":64},"Школа №27":{"count":58},"Школа №28":{"count":53},"Школа №3":{"count":393},"Школа №31":{"count":55},"Школа №35":{"count":54},"Школа №4":{"count":281},"Школа №5":{"count":275},"Школа №6":{"count":217},"Школа №7":{"count":215},"Школа №8":{"count":188},"Школа №9":{"count":183},"مدرسة":{"count":92},"مدرسه":{"count":500},"市立南中学校":{"count":53},"市立南小学校":{"count":56},"市立東中学校":{"count":54}},"social_facility":{"Safe Haven":{"count":92},"Детский дом":{"count":70},"Социальный участковый":{"count":195}},"theatre":{"Amfiteatr":{"count":97},"Amphitheater":{"count":110},"Amphitheatre":{"count":109},"Freilichtbühne":{"count":78},"Teatro Comunale":{"count":56}}};
23604 var leisure = {"fitness_centre":{"Anytime Fitness":{"count":143},"Gold's Gym":{"count":61},"LA Fitness":{"count":126},"Planet Fitness":{"count":106},"Snap Fitness":{"count":67}},"playground":{"Çocuk Parkı":{"count":60},"놀이터":{"count":292}},"sports_centre":{"Anytime Fitness":{"count":152},"Complejo Municipal de Deportes":{"count":88},"Complexe Sportif":{"count":51},"Curves":{"count":91},"Fitness First":{"count":70},"Gold's Gym":{"count":82},"Kieser Training":{"count":90},"LA Fitness":{"count":72},"Life Time Fitness":{"count":76},"McFit":{"count":60},"Mrs. Sporty":{"count":76},"Orlik":{"count":82},"Pabellón Municipal de Deportes":{"count":109},"Palestra Comunale":{"count":81},"Planet Fitness":{"count":106},"Salle Omnisport":{"count":57},"Schützenhaus":{"count":79},"Snap Fitness":{"count":51},"Virgin Active":{"count":69},"YMCA":{"count":174},"ДЮСШ":{"count":82},"Ледовый дворец":{"count":54},"体育館":{"count":80}},"swimming_pool":{"Schwimmerbecken":{"count":57},"Yüzme Havuzu":{"count":51},"プール":{"count":56},"游泳池":{"count":55}}};
23605 var man_made = {"windmill":{"De Hoop":{"count":57}}};
23606 var shop = {"alcohol":{"Alko":{"count":170},"BC Liquor Store":{"count":66},"BWS":{"count":157},"Bargain Booze":{"count":140},"Beer Store":{"count":66},"Botilleria":{"count":121},"Dan Murphy's":{"count":61},"Gall & Gall":{"count":511},"LCBO":{"count":430},"Liquor Depot":{"count":53},"Liquor Store":{"count":72},"Liquorland":{"count":112},"Mitra":{"count":60},"Nicolas":{"count":253},"SAQ":{"count":169},"Systembolaget":{"count":271},"The Beer Store":{"count":231},"Vinmonopolet":{"count":66},"Алкомаркет":{"count":67},"Ароматный мир":{"count":196},"Бристоль":{"count":329},"Градус":{"count":52},"Живое пиво":{"count":182},"Красное & Белое":{"count":989},"Кристалл":{"count":56},"Норман":{"count":146},"Отдохни":{"count":75},"Пиво":{"count":73},"Разливное пиво":{"count":143}},"baby_goods":{"Aubert":{"count":56},"Babies R Us":{"count":80},"BabyOne":{"count":52},"西松屋":{"count":53}},"bakery":{"AILI":{"count":53},"Anker":{"count":85},"Awiteks":{"count":53},"Backshop":{"count":57},"Backwerk":{"count":161},"Baguette":{"count":72},"Bakers Delight":{"count":75},"Bakker Bart":{"count":97},"Banette":{"count":111},"Bäckerei Fuchs":{"count":62},"Bäckerei Grimminger":{"count":51},"Bäckerei Müller":{"count":68},"Bäckerei Schmidt":{"count":103},"Bäckerei Schneider":{"count":52},"Cooplands":{"count":63},"Dat Backhus":{"count":81},"Der Beck":{"count":114},"Der Mann":{"count":53},"Ditsch":{"count":70},"Dunkin' Donuts":{"count":55,"tags":{"cuisine":"donut"}},"Fornetti":{"count":113},"Goeken backen":{"count":53},"Goldilocks":{"count":124},"Greggs":{"count":613},"Hofpfisterei":{"count":134},"Ihle":{"count":108},"Julie's Bakeshop":{"count":57},"K&U":{"count":117},"K&U Bäckerei":{"count":54},"Kamps":{"count":268},"La Mie Câline":{"count":56},"Le Crobag":{"count":54},"Le Fournil":{"count":57},"Lila Bäcker":{"count":107},"Lipóti Pékség":{"count":54},"Marie Blachère":{"count":89},"Mlinar":{"count":80},"Musmanni":{"count":81},"Oebel":{"count":65},"Paul":{"count":186},"Red Ribbon":{"count":72},"Schäfer's":{"count":146},"Sehne":{"count":91},"Stadtbäckerei":{"count":60},"Steinecke":{"count":268},"Sternenbäck":{"count":89},"Ströck":{"count":62},"Wiener Feinbäcker":{"count":55},"von Allwörden":{"count":65},"Булочная":{"count":71},"Горячий хлеб":{"count":54},"Каравай":{"count":56},"Кулиничи":{"count":121},"Кулиничі":{"count":59},"Свежий хлеб":{"count":68},"Хлеб":{"count":177},"مخبز":{"count":72},"مخبزة":{"count":55},"نان لواش":{"count":54},"نانوایی":{"count":665},"نانوایی بربری":{"count":140},"نانوایی سنگک":{"count":68},"نانوایی سنگکی":{"count":52},"نانوایی لواش":{"count":63}},"beauty":{"Marionnaud":{"count":54},"Sally Beauty Supply":{"count":151},"Yves Rocher":{"count":654}},"bed":{"Dänisches Bettenlager":{"count":157},"Matratzen Concord":{"count":361},"Mattress Firm":{"count":173},"Sleepy's":{"count":52}},"beverages":{"50嵐":{"count":101},"Dursty":{"count":77},"Edeka Getränkemarkt":{"count":69},"Fristo":{"count":88},"Getränke Hoffmann":{"count":187},"Getränkeland":{"count":81},"Getränkemarkt":{"count":110},"Orterer Getränkemarkt":{"count":64},"Rewe Getränkemarkt":{"count":256},"Trinkgut":{"count":112},"茶湯會":{"count":56}},"bicycle":{"Giant":{"count":52},"Halfords":{"count":158},"Веломарка":{"count":51},"サイクルベースあさひ":{"count":87}},"bookmaker":{"Betfred":{"count":320},"Coral":{"count":466},"Ladbrokes":{"count":629},"Paddy Power":{"count":127},"William Hill":{"count":634},"ΟΠΑΠ":{"count":102}},"butcher":{"Boucherie Charcuterie":{"count":51},"Carnicería":{"count":78},"Fleischerei Richter":{"count":51},"Húsbolt":{"count":52},"Macelleria":{"count":84},"Vinzenzmurr":{"count":55},"Ариант":{"count":84},"Великолукский мясокомбинат":{"count":173},"Мясная лавка":{"count":226},"Мясницкий ряд":{"count":64},"Мясной":{"count":53},"Мясо":{"count":156},"Наша Ряба":{"count":60},"Свежее мясо":{"count":111}},"car":{"Audi":{"count":191},"BMW":{"count":216},"Chevrolet":{"count":259},"Citroën":{"count":445},"Dacia":{"count":56},"Fiat":{"count":167},"Ford":{"count":446},"Honda":{"count":348},"Hyundai":{"count":421},"Isuzu":{"count":66},"Kia":{"count":456},"Land Rover":{"count":54},"Lexus":{"count":76},"Mazda":{"count":193},"Mercedes-Benz":{"count":447},"Mitsubishi":{"count":176},"Mitsubishi Motors":{"count":60},"NISSAN":{"count":51},"Nissan":{"count":424},"Opel":{"count":218},"Peugeot":{"count":527},"Porsche":{"count":97},"Renault":{"count":701},"Seat":{"count":90},"Skoda":{"count":143},"Subaru":{"count":118},"Suzuki":{"count":178},"Toyota":{"count":597},"Volkswagen":{"count":371},"Volvo":{"count":180}},"car_parts":{"Advance Auto Parts":{"count":306},"AutoZone":{"count":759},"Brezan":{"count":95},"Halfords":{"count":95},"NAPA Auto Parts":{"count":250},"Napa Auto Parts":{"count":61},"O'Reilly Auto Parts":{"count":374},"Repco":{"count":77},"Tokić":{"count":61},"repuestos automotrices":{"count":56},"Автозапчастини":{"count":61},"Автомир":{"count":53},"イエローハット":{"count":80},"オートバックス":{"count":91},"タイヤ館":{"count":83}},"car_repair":{"A.T.U":{"count":457},"Advance Auto Parts":{"count":290},"Borracharia":{"count":56},"Bosch Car Service":{"count":65},"Carglass":{"count":234},"Citroën":{"count":108},"Euromaster":{"count":142},"Feu Vert":{"count":178},"Firestone":{"count":224},"Firestone Complete Auto Care":{"count":73},"Ford":{"count":61},"Garage Renault":{"count":84},"Gomeria":{"count":153},"Gomería":{"count":107},"Goodyear":{"count":97},"Grease Monkey":{"count":57},"Halfords":{"count":56},"Jiffy Lube":{"count":464},"Kwik Fit":{"count":249},"Lubricentro":{"count":83},"Meineke":{"count":52},"Mekonomen":{"count":59},"Midas":{"count":462},"Mr. Lube":{"count":56},"NAPA Auto Parts":{"count":82},"Norauto":{"count":257},"O'Reilly Auto Parts":{"count":227},"Pep Boys":{"count":79},"Peugeot":{"count":152},"Pit Stop":{"count":84},"Point S":{"count":59},"Renault":{"count":294},"Roady":{"count":82},"Sears Auto Center":{"count":59},"Speedy":{"count":192},"Stacja Kontroli Pojazdów":{"count":70},"Taller":{"count":63},"Toyota":{"count":63},"Valvoline":{"count":52},"Valvoline Instant Oil Change":{"count":92},"Wulkanizacja":{"count":84},"ÖAMTC":{"count":52},"Автомастерская":{"count":93},"Авторемонт":{"count":57},"Автосервис":{"count":799},"Автосервис+шиномонтаж":{"count":66},"Вулканизация":{"count":72},"Замена масла":{"count":98},"СТО":{"count":1058},"Шиномонтаж":{"count":3591},"шиномонтаж":{"count":173}},"carpet":{"Carpet Right":{"count":111},"Carpetright":{"count":53}},"charity":{"Age UK":{"count":116},"Barnardo's":{"count":56},"British Heart Foundation":{"count":189},"Cancer Research UK":{"count":129},"Goodwill":{"count":120},"Oxfam":{"count":216},"Salvation Army":{"count":63},"Scope":{"count":74},"Sue Ryder":{"count":83}},"chemist":{"7 Дней":{"count":55},"Bipa":{"count":485},"Budnikowsky":{"count":114},"CVS":{"count":58},"Etos":{"count":486},"Kruidvat":{"count":1169},"Matas":{"count":74},"Müller":{"count":350},"Rossmann":{"count":2516},"Schlecker":{"count":51},"Teta":{"count":120},"Trekpleister":{"count":185},"Walgreens":{"count":142},"Watsons":{"count":123},"dm":{"count":1877},"Бытовая химия":{"count":73},"Магнит Косметик":{"count":233},"Мила":{"count":70},"Остров чистоты":{"count":110},"Рубль Бум":{"count":68},"Улыбка радуги":{"count":110},"スギ薬局":{"count":51},"丁丁藥局":{"count":72},"屈臣氏":{"count":134},"康是美":{"count":81}},"clothes":{"AOKI":{"count":119},"AWG":{"count":95},"Ackermans":{"count":98},"Adidas":{"count":224},"Adler":{"count":83},"American Apparel":{"count":89},"American Eagle Outfitters":{"count":93},"Anthropologie":{"count":55},"Ardene":{"count":55},"Armand Thiery":{"count":89},"Banana Republic":{"count":120},"Benetton":{"count":190},"Bershka":{"count":166},"Bonita":{"count":315},"Bonobo":{"count":59},"Brooks Brothers":{"count":55},"Burberry":{"count":63},"Burlington Coat Factory":{"count":104},"Burton":{"count":94},"C&A":{"count":860},"Cache Cache":{"count":59},"Calvin Klein":{"count":78},"Calzedonia":{"count":264},"Camaïeu":{"count":167},"Caroll":{"count":75},"Carter's":{"count":64},"Cecil":{"count":119},"Celio":{"count":206},"Charles Vögele":{"count":133},"Chico's":{"count":96},"Cropp":{"count":68},"Cubus":{"count":65},"Desigual":{"count":175},"Devred":{"count":59},"Didi":{"count":72},"Diesel":{"count":77},"Dorothy Perkins":{"count":85},"Dress Barn":{"count":135},"Dressmann":{"count":67},"Eddie Bauer":{"count":54},"Edgars":{"count":117},"Engbers":{"count":64},"Ernsting's family":{"count":720},"Esprit":{"count":404},"Etam":{"count":121},"Express":{"count":56},"Fat Face":{"count":82},"Forever 21":{"count":124},"Gant":{"count":78},"Gap":{"count":258},"Gerry Weber":{"count":220},"Gina Laura":{"count":80},"Goodwill":{"count":65},"Guess":{"count":146},"Gymboree":{"count":60},"Gémo":{"count":99},"H&M":{"count":1467},"Hallhuber":{"count":63},"House":{"count":67},"Hugo Boss":{"count":109},"Humana":{"count":83},"Hunkemöller":{"count":224},"Intimissimi":{"count":173},"JBC":{"count":54},"Jack & Jones":{"count":174},"Jack Wolfskin":{"count":68},"Jeans Fritz":{"count":110},"Jennyfer":{"count":81},"Jet":{"count":68},"Jigsaw":{"count":51},"Jules":{"count":120},"Justice":{"count":81},"KappAhl":{"count":68},"KiK":{"count":1862},"Kiabi":{"count":276},"La Halle":{"count":148},"Lacoste":{"count":193},"Lane Bryant":{"count":86},"Levi's":{"count":197},"Lindex":{"count":120},"Loft":{"count":62},"Mango":{"count":339},"Marc O'Polo":{"count":82},"Mark's":{"count":76},"Marks & Spencer":{"count":53},"Marshalls":{"count":218},"Massimo Dutti":{"count":109},"Matalan":{"count":144},"Maurices":{"count":70},"Max Mara":{"count":55},"Men's Wearhouse":{"count":128},"Mexx":{"count":68},"Michael Kors":{"count":55},"Mim":{"count":57},"Monsoon":{"count":75},"Mr Price":{"count":99},"NKD":{"count":783},"New Look":{"count":280},"New Yorker":{"count":350},"NewYorker":{"count":54},"Next":{"count":313},"Nike":{"count":122},"Nordstrom Rack":{"count":57},"OVS":{"count":92},"Okaïdi":{"count":63},"Old Navy":{"count":361},"Only":{"count":94},"Orchestra":{"count":117},"Original Marines":{"count":60},"Orsay":{"count":168},"Outfit":{"count":51},"Outlet":{"count":63},"Palmers":{"count":78},"Peacocks":{"count":178},"Peek & Cloppenburg":{"count":69},"Pep":{"count":139},"Pepco":{"count":153},"Petit Bateau":{"count":67},"Pimkie":{"count":163},"Plato's Closet":{"count":53},"Primark":{"count":177},"Promod":{"count":195},"Pull & Bear":{"count":63},"Puma":{"count":65},"Reitmans":{"count":71},"Reserved":{"count":150},"River Island":{"count":125},"Ross":{"count":363},"Sela":{"count":58},"Sergent Major":{"count":77},"Shoeby":{"count":109},"Sisley":{"count":82},"Springfield":{"count":83},"Stefanel":{"count":63},"Steps":{"count":56},"Stradivarius":{"count":103},"Street One":{"count":153},"Superdry":{"count":82},"TJ Maxx":{"count":200},"TK Maxx":{"count":209},"Takko":{"count":843},"Talbots":{"count":54},"Tally Weijl":{"count":151},"Tati":{"count":64},"Terranova":{"count":63},"Tesha":{"count":76},"Tezenis":{"count":98},"The Children's Place":{"count":71},"The North Face":{"count":56},"The Sting":{"count":53},"Timberland":{"count":87},"Toko Pakaian":{"count":72},"Tom Tailor":{"count":120},"Tommy Hilfiger":{"count":206},"Topshop":{"count":62},"Triumph":{"count":132},"Truworths":{"count":72},"Ulla Popken":{"count":117},"Uniqlo":{"count":63},"United Colors of Benetton":{"count":210},"Urban Outfitters":{"count":130},"Vero Moda":{"count":222},"Victoria's Secret":{"count":143},"Vögele":{"count":191},"WE":{"count":68},"Wibra":{"count":99},"Winners":{"count":112},"Woolworths":{"count":119},"Yamamay":{"count":65},"Zara":{"count":540},"Zeeman":{"count":379},"mister*lady":{"count":59},"s.Oliver":{"count":103},"Детская одежда":{"count":59},"Женская одежда":{"count":65},"Липненски":{"count":81},"Московская ярмарка":{"count":51},"Одежда":{"count":163},"Смешные цены":{"count":86},"Спецодежда":{"count":85},"しまむら":{"count":213},"ユニクロ":{"count":201},"ワークマン":{"count":65},"洋服の青山":{"count":242},"西松屋":{"count":113}},"coffee":{"Café Amazon":{"count":212},"Nespresso":{"count":74},"Starbucks":{"count":264,"tags":{"cuisine":"coffee_shop"}},"Tchibo":{"count":197}},"computer":{"Apple Store":{"count":75},"DNS":{"count":234},"PC World":{"count":59},"ДНС":{"count":55}},"confectionery":{"Fagyizó":{"count":58},"Hussel":{"count":78},"Leonidas":{"count":84},"T. SN":{"count":77},"Thorntons":{"count":66}},"convenience":{"711":{"count":64},"777":{"count":58},"24 часа":{"count":85},"7-Eleven":{"count":11418},"8 à Huit":{"count":82},"99 Speedmart":{"count":85},"ABC":{"count":716},"AMPM":{"count":125},"Aibė":{"count":112},"Alepa":{"count":60},"Alfamart":{"count":427},"Alimentara":{"count":63},"Almacen":{"count":405},"Almacén":{"count":94},"Aral":{"count":93},"BP":{"count":273},"BP Shop":{"count":70},"Baqala":{"count":181},"Best One":{"count":57},"Best-One":{"count":63},"Biedronka":{"count":98},"Bodega":{"count":83},"Bonjour":{"count":71},"CBA":{"count":299},"COOP":{"count":470},"COOP Jednota":{"count":381},"CU":{"count":324},"Carrefour City":{"count":91},"Carrefour Express":{"count":255},"Casey's General Store":{"count":225},"Casino Shop":{"count":56},"Centra":{"count":139},"Central Convenience Store":{"count":69},"Chevron":{"count":110},"Circle K":{"count":790},"Citgo":{"count":73},"Co-Op":{"count":54},"Co-op":{"count":161},"Coles Express":{"count":217},"Coop":{"count":492},"Coop Jednota":{"count":128},"Corner Store":{"count":109},"Costcutter":{"count":435},"Couche-Tard":{"count":139},"Cumberland Farms":{"count":109},"Daisy Mart":{"count":57},"Delikatesy":{"count":148},"Delikatesy Centrum":{"count":182},"Dollar General":{"count":646},"Dollar Tree":{"count":67},"Dépanneur":{"count":53},"Esso":{"count":143},"Express":{"count":53},"Extra":{"count":86},"Exxon":{"count":51},"Family Dollar":{"count":85},"FamilyMart":{"count":919},"Food Mart":{"count":512},"Four Square":{"count":99},"Franprix":{"count":96},"Fresh":{"count":67},"Freshmarket":{"count":224},"GS25":{"count":343},"Groszek":{"count":254},"Hasty Market":{"count":87},"Holiday":{"count":67},"Hruška":{"count":89},"Indomaret":{"count":483},"Jednota":{"count":66},"Joker":{"count":56},"K-Market":{"count":104},"Kangaroo":{"count":54},"Kangaroo Express":{"count":51},"Kisbolt":{"count":94},"Konzum":{"count":229},"Kum & Go":{"count":127},"Kwik Trip":{"count":134},"Lawson":{"count":311},"Lewiatan":{"count":565},"Lifestyle Express":{"count":114},"Londis":{"count":505},"M&S Simply Food":{"count":72},"Mac's":{"count":295},"Mace":{"count":166},"Magazin":{"count":81},"Magazin Mixt":{"count":139},"Magazin Non-Stop":{"count":62},"Magazin mixt":{"count":57},"Marathon":{"count":59},"Maxikiosco":{"count":86},"Małpka Express":{"count":71},"McColl's":{"count":289},"Mercator":{"count":122},"Migrolino":{"count":63},"Mini ABC":{"count":77},"Mini Market":{"count":1312},"Mini Market Non-Stop":{"count":134},"Mini Mart":{"count":78},"Mini Stop":{"count":466},"Minimercado":{"count":77},"Mlin i pekare":{"count":63},"Mobil":{"count":82},"Nasz Sklep":{"count":92},"Nisa":{"count":70},"Nisa Local":{"count":164},"OK":{"count":107},"OK-Mart":{"count":51},"OK便利商店":{"count":96},"OK便利店 Circle K":{"count":92},"Odido":{"count":148},"On The Run":{"count":53},"On the Run":{"count":111},"One Stop":{"count":294},"Oxxo":{"count":2261},"Parduotuvė":{"count":102},"Petit Casino":{"count":297},"Plaid Pantry":{"count":69},"Potraviny":{"count":438},"Prehrana":{"count":88},"Premier":{"count":321},"Proxi":{"count":249},"Proxy":{"count":53},"Pulperia":{"count":56},"Pulpería":{"count":51},"QuikTrip":{"count":161},"Rite Aid":{"count":72},"Royal Farms":{"count":90},"Sainsbury's Local":{"count":208},"Sale":{"count":89},"Sari-sari Store":{"count":82},"Select":{"count":133},"Sheetz":{"count":137},"Shell":{"count":479},"Shell Select":{"count":71},"Shop & Go":{"count":80},"Siwa":{"count":157},"Sklep spożywczy":{"count":151},"Smíšené zboží":{"count":57},"Spar":{"count":1472},"Speedway":{"count":108},"Społem":{"count":199},"Spätkauf":{"count":60},"Statoil":{"count":62},"Stewart's":{"count":255},"Stores":{"count":70},"Stripes":{"count":63},"Studenac":{"count":113},"Sunkus":{"count":51},"Sunoco":{"count":65},"Słoneczko":{"count":61},"TESCO Lotus Express":{"count":55},"Tchibo":{"count":75},"Tesco":{"count":54},"Tesco Express":{"count":661},"Tesco Lotus Express":{"count":107},"The Co-operative Food":{"count":341},"Tom Market 89":{"count":232},"Total":{"count":172},"United Dairy Farmers":{"count":55},"Utile":{"count":63},"Valero":{"count":71},"Vegyesbolt":{"count":391},"Večerka":{"count":131},"Vival":{"count":381},"Volg":{"count":149},"Wawa":{"count":279},"Weltladen":{"count":64},"Woolworths Petrol":{"count":97},"abc":{"count":374},"ampm":{"count":152},"best-one":{"count":52},"odido":{"count":77},"Élelmiszer":{"count":59},"Élelmiszerbolt":{"count":65},"Żabka":{"count":1656},"Žabka":{"count":61},"АТБ":{"count":56},"Августина":{"count":52},"Авоська":{"count":115},"Агрокомплекс":{"count":79},"Альянс":{"count":51},"Апельсин":{"count":72},"Ассорти":{"count":118},"Белорусские продукты":{"count":58},"Берёзка":{"count":193},"Везунчик":{"count":66},"Верный":{"count":61},"Весна":{"count":101},"Ветеран":{"count":56},"Визит":{"count":99},"Виктория":{"count":164},"ВкусВилл":{"count":131},"Гастроном":{"count":383},"Гермес":{"count":68},"Гроздь":{"count":52},"Гурман":{"count":92},"Дикси":{"count":270},"Домашний":{"count":77},"Евроопт":{"count":152},"Елена":{"count":68},"Ермолино":{"count":51},"КазМунайГаз":{"count":117},"Калинка":{"count":61},"Каравай":{"count":52},"Квартал":{"count":57},"Кировский":{"count":86},"Колобок":{"count":51},"Колосок":{"count":58},"Копеечка":{"count":99},"Копейка":{"count":65},"Корзинка":{"count":54},"Крамниця":{"count":64},"Кристалл":{"count":57},"Кулинария":{"count":134},"Купец":{"count":64},"Ласточка":{"count":51},"Лидер":{"count":60},"Любимый":{"count":84},"Люкс":{"count":59},"Магазин при АЗС":{"count":54},"Магнит":{"count":1991},"Магнолия":{"count":88},"Мария-Ра":{"count":197},"Маяк":{"count":76},"Меркурий":{"count":77},"Мечта":{"count":103},"Минимаркет":{"count":424},"Мираж":{"count":56},"Монетка":{"count":165},"Надежда":{"count":115},"Ника":{"count":57},"Оазис":{"count":57},"Олимп":{"count":51},"Перекресток":{"count":157},"Подсолнух":{"count":69},"Престиж":{"count":58},"Продукти":{"count":1446},"Продуктовый":{"count":307},"Продуктовый магазин":{"count":803},"Продукты":{"count":8416},"Продукты 24":{"count":65},"Пятёрочка":{"count":1324},"Радуга":{"count":165},"Родны кут":{"count":90},"Ромашка":{"count":83},"Русь":{"count":61},"Светлана":{"count":96},"Сказка":{"count":62},"Смак":{"count":151},"Солнечный":{"count":54},"Солнышко":{"count":54},"Татьяна":{"count":68},"Теремок":{"count":105},"Тройка":{"count":62},"У Палыча":{"count":69},"Универсам":{"count":153},"Фортуна":{"count":97},"Хороший":{"count":55},"Центральный":{"count":73},"Чайка":{"count":57},"Шанс":{"count":60},"Эконом":{"count":72},"Юбилейный":{"count":56},"Юлия":{"count":58},"продукты":{"count":157},"მარკეტი":{"count":134},"მარკეტი (Market)":{"count":71},"サンクス":{"count":970,"tags":{"name:en":"sunkus"}},"サークルK":{"count":1109,"tags":{"name:en":"Circle K"}},"スリーエフ":{"count":228},"セイコーマート":{"count":449},"セブンイレブン":{"count":7859,"tags":{"name:en":"7-Eleven"}},"セブンイレブン(Seven-Eleven)":{"count":332},"セーブオン":{"count":71},"デイリーヤマザキ":{"count":421},"ファミリーマート":{"count":4457,"tags":{"name:en":"FamilyMart"}},"ポプラ":{"count":101},"ミニストップ":{"count":773,"tags":{"name:en":"MINISTOP"}},"ヤマザキショップ":{"count":106},"ローソン":{"count":4247,"tags":{"name:en":"LAWSON"}},"ローソンストア100":{"count":272},"全家":{"count":482},"全家便利商店":{"count":833},"萊爾富":{"count":405},"세븐일레븐":{"count":157}},"copyshop":{"FedEx Office":{"count":53},"FedEx Office Print and Ship Center":{"count":170}},"cosmetics":{"Douglas":{"count":58},"Lush":{"count":80},"Marionnaud":{"count":55},"Sephora":{"count":184},"The Body Shop":{"count":95},"Yves Rocher":{"count":111},"Л'Этуаль":{"count":111},"Магнит Косметик":{"count":116},"Магнит косметик":{"count":63},"Магнит-Косметик":{"count":55},"Мила":{"count":68},"Подружка":{"count":51}},"craft":{"Hobby Lobby":{"count":96},"Michaels":{"count":222}},"deli":{"ほっともっと":{"count":58}},"department_store":{"Argos":{"count":90},"Bed Bath & Beyond":{"count":72},"Big Lots":{"count":142},"Big W":{"count":120},"Canadian Tire":{"count":176},"Coppel":{"count":55},"Debenhams":{"count":118},"Dillard's":{"count":86},"Dollar General":{"count":62},"Dollar Tree":{"count":64},"El Corte Inglés":{"count":61},"Family Dollar":{"count":76},"Fred Meyer":{"count":51},"Galeria Kaufhof":{"count":60},"HEMA":{"count":248},"Harvey Norman":{"count":62},"JCPenney":{"count":365},"Karstadt":{"count":66},"Kmart":{"count":390},"Kohl's":{"count":371},"Lojas Americanas":{"count":63},"Macy's":{"count":292},"Marks & Spencer":{"count":136},"Marshalls":{"count":58},"Myer":{"count":51},"Nordstrom":{"count":54},"Sam's Club":{"count":103},"Sears":{"count":462},"Shopko":{"count":65},"Target":{"count":1104},"The Warehouse":{"count":68},"Walmart":{"count":847},"Walmart Supercenter":{"count":234},"Woolworth":{"count":153},"Магнит":{"count":88},"Универмаг":{"count":170}},"doityourself":{"Ace Hardware":{"count":300},"B&Q":{"count":229},"Bauhaus":{"count":223},"Biltema":{"count":64},"Brico":{"count":126},"Bricomarché":{"count":425},"Bricorama":{"count":117},"Bunnings Warehouse":{"count":210},"Canadian Tire":{"count":138},"Castorama":{"count":168},"Easy":{"count":53},"Gamma":{"count":133},"Globus Baumarkt":{"count":52},"Hagebaumarkt":{"count":132},"Hellweg":{"count":70},"Home Depot":{"count":1345},"Home Hardware":{"count":172},"Homebase":{"count":205},"Hornbach":{"count":134},"Hubo":{"count":107},"Karwei":{"count":77},"Lagerhaus":{"count":116},"Leroy Merlin":{"count":285},"Lowe's":{"count":1236},"Lowes":{"count":95},"Menards":{"count":132},"Mr Bricolage":{"count":112},"Mr.Bricolage":{"count":139},"OBI":{"count":501},"Point P":{"count":125},"Praktiker":{"count":54},"Praxis":{"count":61},"Rona":{"count":77},"Screwfix":{"count":80},"Sonderpreis Baumarkt":{"count":68},"Tekzen":{"count":112},"Toom Baumarkt":{"count":155},"Weldom":{"count":110},"Wickes":{"count":159},"Леруа Мерлен":{"count":54},"Мастер":{"count":59},"Сантехника":{"count":51},"Строитель":{"count":67},"Стройматериалы":{"count":506},"Хозтовары":{"count":137},"カインズホーム":{"count":51},"コメリ":{"count":137},"コーナン":{"count":77}},"dry_cleaning":{"Cleaners":{"count":103},"Pressing":{"count":58},"Диана":{"count":88},"Химчистка":{"count":73},"ホワイト急便":{"count":136}},"electronics":{"Apple Store":{"count":63},"BCC":{"count":54},"Batteries Plus Bulbs":{"count":74},"Bell":{"count":73},"Best Buy":{"count":706},"Boulanger":{"count":71},"Currys":{"count":109},"Currys PC World":{"count":70},"DNS":{"count":111},"Darty":{"count":168},"Elektra":{"count":64},"Elgiganten":{"count":67},"Euronics":{"count":247},"Expert":{"count":224},"Hartlauer":{"count":64},"Interdiscount":{"count":57},"La Curacao":{"count":69},"Maplin":{"count":114},"Media Expert":{"count":163},"Media Markt":{"count":422},"Musimundo":{"count":53},"Neonet":{"count":97},"RTV Euro AGD":{"count":68},"Radio Shack":{"count":485},"Rogers":{"count":61},"Samsung":{"count":164},"Saturn":{"count":155},"Sony":{"count":51},"The Source":{"count":91},"Unieuro":{"count":66},"М.Видео":{"count":121},"Фокстрот":{"count":76},"Эксперт":{"count":70},"Эльдорадо":{"count":313},"エディオン":{"count":74},"ケーズデンキ":{"count":136},"コジマ":{"count":53},"ヤマダ電機":{"count":162},"全國電子":{"count":72},"燦坤3C":{"count":52}},"erotic":{"Orion":{"count":85}},"fabric":{"Ткани":{"count":121}},"farm":{"Hofladen":{"count":63}},"florist":{"Blume 2000":{"count":94},"Blumen Risse":{"count":69},"Fleuriste":{"count":54},"Interflora":{"count":78},"Monceau Fleurs":{"count":69},"Virágbolt":{"count":64},"Квіти":{"count":86},"Цветочный магазин":{"count":57},"Цветы":{"count":1098}},"frame":{"rumah penduduk":{"count":316}},"funeral_directors":{"The Co-operative Funeralcare":{"count":82},"Ритуальные услуги":{"count":133}},"furniture":{"Aaron's":{"count":57},"Black Red White":{"count":79},"Bodzio":{"count":61},"But":{"count":162},"Casa":{"count":62},"Conforama":{"count":174},"DFS":{"count":52},"Dänisches Bettenlager":{"count":464},"Fly":{"count":53},"Harveys":{"count":58},"IKEA":{"count":234},"JYSK":{"count":431},"Kwantum":{"count":54},"Leen Bakker":{"count":72},"Pier 1 Imports":{"count":95},"Roller":{"count":99},"The Brick":{"count":68},"Меблі":{"count":70},"ニトリ":{"count":93}},"garden_centre":{"Dehner":{"count":59},"Gamm Vert":{"count":210},"Jardiland":{"count":124},"Point Vert":{"count":68},"Welkoop":{"count":97},"Семена":{"count":53}},"gift":{"Card Factory":{"count":116},"Hallmark":{"count":163},"Подарки":{"count":56}},"greengrocer":{"Frutería":{"count":60},"Овощи и фрукты":{"count":71}},"hairdresser":{"Berber":{"count":71},"Cost Cutters":{"count":69},"Fantastic Sams":{"count":53},"Figaro":{"count":79},"First Choice Haircutters":{"count":51},"Franck Provost":{"count":136},"Frizerie":{"count":59},"Great Clips":{"count":578},"Haarmonie":{"count":79},"Haarscharf":{"count":59},"Hair Cuttery":{"count":121},"Hairkiller":{"count":73},"Jean Louis David":{"count":90},"Jean-Louis David":{"count":59},"Klier":{"count":239},"Klipp":{"count":76},"Le Salon":{"count":55},"Marco Aldany":{"count":55},"Peluquería":{"count":165},"Salon fryzjerski":{"count":52},"Sport Clips":{"count":114},"Super Cuts":{"count":55},"Supercuts":{"count":359},"Tchip":{"count":62},"The Barber Shop":{"count":130},"Toni & Guy":{"count":77},"Top Hair":{"count":74},"Виктория":{"count":53},"Елена":{"count":53},"Локон":{"count":67},"Парикмахерская":{"count":798},"Перукарня":{"count":119},"Салон красоты":{"count":58},"Стиль":{"count":94},"Шарм":{"count":79},"حلاق":{"count":65}},"hardware":{"1000 мелочей":{"count":125},"Ferretería":{"count":295},"Harbor Freight Tools":{"count":57},"Home Hardware":{"count":94},"Lowe's":{"count":74},"Quincaillerie":{"count":105},"True Value":{"count":52},"Würth":{"count":51},"Промтовары":{"count":67},"Сантехника":{"count":87},"Стройматериалы":{"count":142},"Товары для дома":{"count":69},"Хозтовары":{"count":477}},"hearing_aids":{"Amplifon":{"count":124},"Geers":{"count":66},"Kind Hörgeräte":{"count":74},"amplifon":{"count":52}},"hifi":{"Bang & Olufsen":{"count":51}},"houseware":{"Blokker":{"count":264},"Marskramer":{"count":72},"Xenos":{"count":119}},"ice_cream":{"Мороженое":{"count":51}},"interior_decoration":{"Casa":{"count":65},"Depot":{"count":97}},"jewelry":{"585":{"count":94},"Apart":{"count":53},"Bijou Brigitte":{"count":172},"Christ":{"count":116},"Claire's":{"count":99},"Ernest Jones":{"count":53},"H Samuel":{"count":55},"James Avery Jewelry":{"count":99},"Julien d'Orcel":{"count":123},"Kay Jewelers":{"count":78},"Pandora":{"count":280},"Swarovski":{"count":240},"Адамас":{"count":60},"Золото":{"count":51}},"kiosk":{"Aral":{"count":76},"Edicola":{"count":94},"Esso":{"count":51},"KIOS":{"count":288},"Kiosko":{"count":62},"Kiosque":{"count":68},"Kolporter":{"count":88},"Lietuvos spauda":{"count":62},"Narvesen":{"count":188},"Pressbyrån":{"count":117},"Pulpería":{"count":61},"R-Kioski":{"count":352},"Relay":{"count":61},"Ruch":{"count":187},"Shell":{"count":122},"Tabak Trafik":{"count":83},"Tisak":{"count":245},"Trafik":{"count":221},"Trafika":{"count":64},"Trinkhalle":{"count":98},"Warung":{"count":73},"Белсоюзпечать":{"count":59},"Киоск":{"count":143},"Мороженое":{"count":56},"Продукты":{"count":212},"Роспечать":{"count":233},"Союзпечать":{"count":94},"მარკეტი (Market)":{"count":94}},"kitchen":{"Cuisinella":{"count":60},"Home Utensils":{"count":65}},"laundry":{"Launderette":{"count":51},"Lavandería":{"count":84},"コインランドリー":{"count":64}},"lottery":{"Loteria de la Provincia":{"count":63},"Lotería Nacional":{"count":221},"Lotería de la Provincia":{"count":349},"Lotto":{"count":192},"Lottózó":{"count":69},"ONCE":{"count":91}},"mall":{"Торговый центр":{"count":57}},"massage":{"Massage Envy":{"count":80}},"medical_supply":{"Pofam-Poznań":{"count":61}},"mobile_phone":{"3 Store":{"count":90},"AT&T":{"count":558},"Bell":{"count":140},"Bitė":{"count":66},"Boost Mobile":{"count":151},"Carphone Warehouse":{"count":357},"Claro":{"count":446},"Cricket Wireless":{"count":73},"Digicel":{"count":152},"EE":{"count":190},"MetroPCS":{"count":201},"Movistar":{"count":411},"O2":{"count":527},"Orange":{"count":730},"Personal":{"count":54},"Play":{"count":150},"Plus":{"count":122},"Rogers":{"count":52},"SFR":{"count":156},"Samsung":{"count":71},"Sprint":{"count":394},"T-Mobile":{"count":665},"TIM":{"count":67},"Telcel":{"count":52},"Tele2":{"count":186},"Telekom":{"count":148},"Telekom Shop":{"count":99},"Telenor":{"count":99},"Telus":{"count":69},"The Phone House":{"count":137},"Three":{"count":57},"Tim":{"count":51},"Télécentre":{"count":76},"Verizon":{"count":152},"Verizon Wireless":{"count":629},"Vodafone":{"count":1168},"Vodafone Shop":{"count":52},"Wind":{"count":156},"Yoigo":{"count":61},"au":{"count":136},"auショップ":{"count":340},"mobilcom debitel":{"count":63},"Алло":{"count":86},"Билайн":{"count":441},"Евросеть":{"count":1020},"Київстар":{"count":57},"МТС":{"count":1012},"Мегафон":{"count":687},"Связной":{"count":842},"Теле2":{"count":70},"ソフトバンクショップ":{"count":482},"ドコモショップ":{"count":426}},"money_lender":{"Money Mart":{"count":95}},"motorcycle":{"Harley Davidson":{"count":81},"Honda":{"count":238},"Suzuki":{"count":90},"Yamaha":{"count":235}},"music":{"HMV":{"count":81},"TSUTAYA":{"count":53}},"musical_instrument":{"Guitar Center":{"count":51}},"newsagent":{"Edicola":{"count":111},"Kolporter":{"count":56},"Maison de la Presse":{"count":132},"Relay":{"count":246},"Tabac Presse":{"count":82},"Trafika":{"count":60},"WHSmith":{"count":160},"Белсоюзпечать":{"count":52},"Витебскоблсоюзпечать":{"count":56},"Первая полоса":{"count":57},"Печать":{"count":74},"Роспечать":{"count":371},"Союзпечать":{"count":130}},"optician":{"Alain Afflelou":{"count":204},"Apollo":{"count":441},"Atol":{"count":124},"Boots Opticians":{"count":101},"Fielmann":{"count":477},"General Óptica":{"count":53},"Grand Optical":{"count":57},"Générale d'Optique":{"count":94},"Hakim Optical":{"count":73},"Hans Anders":{"count":105},"Krys":{"count":192},"Les Opticiens Mutualistes":{"count":103},"Optic 2000":{"count":281},"Optical Center":{"count":125},"Pearle":{"count":199},"Pearle Vision":{"count":52},"Specsavers":{"count":384},"Sunglass Hut":{"count":61},"Synoptik":{"count":55},"Vision Express":{"count":183},"แว่นท็อปเจริญ":{"count":97},"メガネスーパー":{"count":62},"眼鏡市場":{"count":206}},"outdoor":{"Jack Wolfskin":{"count":51},"Mountain Warehouse":{"count":74},"REI":{"count":77},"Рыболов":{"count":70}},"paint":{"Benjamin Moore":{"count":58},"Comex":{"count":68},"Jotun":{"count":51},"National Paints":{"count":53},"Sherwin Williams":{"count":323},"Sherwin-Williams Paints":{"count":59}},"pawnbroker":{"Cash Converters":{"count":83},"Lombard":{"count":55},"Palawan Pawnshop":{"count":52}},"pet":{"Das Futterhaus":{"count":158},"Fressnapf":{"count":620},"Global Pet Foods":{"count":54},"Maxi Zoo":{"count":65},"Pet Valu":{"count":112},"PetSmart":{"count":491},"Petco":{"count":377},"Pets at Home":{"count":170},"Бетховен":{"count":60},"Зоотовары":{"count":79},"Четыре лапы":{"count":56}},"second_hand":{"Goodwill":{"count":235},"Value Village":{"count":53}},"shoes":{"Adidas":{"count":51},"Aldo":{"count":74},"Bata":{"count":281},"Besson Chaussures":{"count":124},"Brantano":{"count":132},"CCC":{"count":245},"Camper":{"count":51},"Chaussea":{"count":102},"Clarks":{"count":268},"Converse":{"count":58},"Crocs":{"count":64},"DSW":{"count":52},"Deichmann":{"count":1231},"Dosenbach":{"count":58},"Ecco":{"count":185},"Famous Footwear":{"count":178},"Foot Locker":{"count":240},"Geox":{"count":151},"Kari":{"count":66},"La Halle aux Chaussures":{"count":158},"Mephisto":{"count":57},"Minelli":{"count":55},"New Balance":{"count":52},"Payless":{"count":56},"Payless Shoe Source":{"count":316},"Payless ShoeSource":{"count":133},"Quick Schuh":{"count":116},"Rack Room Shoes":{"count":51},"Reno":{"count":233},"Rieker":{"count":83},"Salamander":{"count":103},"San Marina":{"count":54},"Scapino":{"count":67},"Shoe Carnival":{"count":66},"Shoe Zone":{"count":161},"Siemes Schuhcenter":{"count":69},"Skechers":{"count":83},"Tamaris":{"count":99},"Timberland":{"count":51},"vanHaren":{"count":98},"Éram":{"count":88},"Ремонт обуви":{"count":71},"ЦентрОбувь":{"count":76},"Юничел":{"count":73},"東京靴流通センター":{"count":81}},"sports":{"Adidas":{"count":132},"Aktiesport":{"count":61},"Big 5 Sporting Goods":{"count":93},"Decathlon":{"count":409},"Dick's Sporting Goods":{"count":222},"Hervis":{"count":66},"Intersport":{"count":737},"JD Sports":{"count":58},"Nike":{"count":95},"Sport 2000":{"count":209},"Sports Authority":{"count":108},"Sports Direct":{"count":217},"Спортмастер":{"count":208},"Спорттовары":{"count":68}},"stationery":{"Bureau Vallée":{"count":64},"Libro":{"count":73},"McPaper":{"count":158},"Office Depot":{"count":378},"Office Max":{"count":169},"Officeworks":{"count":73},"Pagro":{"count":64},"Paperchase":{"count":54},"Ryman":{"count":85},"Staples":{"count":671},"Канцтовары":{"count":140}},"supermarket":{"7-Eleven":{"count":60},"A&O":{"count":67},"A101":{"count":388},"AD Delhaize":{"count":80},"ADEG":{"count":85},"Ahorramás":{"count":66},"Albert":{"count":245},"Albert Heijn":{"count":766},"Albertsons":{"count":316},"Aldi":{"count":6323},"Aldi Nord":{"count":356},"Aldi Süd":{"count":916},"Alfamart":{"count":109},"Alimerka":{"count":96},"Alnatura":{"count":97},"Asda":{"count":474},"Atac":{"count":53},"Atacadão":{"count":80},"Auchan":{"count":229},"BM":{"count":52},"Biedronka":{"count":2348},"Big C":{"count":53},"Billa":{"count":1592},"Bim":{"count":678},"Biocoop":{"count":159},"Bodega Aurrera":{"count":264},"Budgens":{"count":77},"Bulk Barn":{"count":54},"Bunnpris":{"count":69},"CBA":{"count":236},"CONAD":{"count":67},"COOP":{"count":255},"COOP Jednota":{"count":177},"CRAI":{"count":66},"CU":{"count":64},"Caprabo":{"count":144},"Cargills Food City":{"count":79},"Carrefour":{"count":2544},"Carrefour City":{"count":349},"Carrefour Contact":{"count":270},"Carrefour Express":{"count":921},"Centra":{"count":63},"Centre Commercial E. Leclerc":{"count":385},"Checkers":{"count":140},"Chedraui":{"count":80},"Co-Op":{"count":62},"Co-op":{"count":352},"Co-operative":{"count":51},"Coles":{"count":583},"Colmado":{"count":103},"Colruyt":{"count":212},"Combi":{"count":127},"Comercial Mexicana":{"count":59},"Conad":{"count":560},"Conad City":{"count":95},"Condis":{"count":126},"Consum":{"count":236},"Continente":{"count":111},"Coop":{"count":1665},"Coop Extra":{"count":88},"Coop Jednota":{"count":101},"Coop Konsum":{"count":96},"Costco":{"count":295},"Costcutter":{"count":93},"Coto":{"count":65},"Countdown":{"count":135},"Coviran":{"count":124},"Covirán":{"count":51},"Crai":{"count":119},"Cub Foods":{"count":57},"Dagli'Brugsen":{"count":135},"Deen":{"count":55},"Delhaize":{"count":228},"Delikatesy Centrum":{"count":209},"Denner":{"count":412},"Despar":{"count":209},"Despensa Familiar":{"count":81},"Dia":{"count":1329},"Dia %":{"count":181},"Dia Market":{"count":60},"Dino":{"count":298},"Dirk van den Broek":{"count":66},"Disco":{"count":74},"Diska":{"count":68},"Dollar General":{"count":106},"Dollar Tree":{"count":52},"Dunnes Stores":{"count":72},"E-Center":{"count":66},"E. Leclerc":{"count":186},"E. Leclerc Drive":{"count":97},"EKO":{"count":78},"EMTÉ":{"count":74},"Edeka":{"count":2231},"Ekom":{"count":64},"Ekono":{"count":68},"El Árbol":{"count":86},"Eroski":{"count":351},"Esselunga":{"count":106},"EuroSpin":{"count":81},"Eurospar":{"count":340},"Eurospin":{"count":328},"Extra":{"count":149},"Famiglia Cooperativa":{"count":89},"Famila":{"count":167},"Family Dollar":{"count":72},"Fareway":{"count":51},"Farmfoods":{"count":141},"Feneberg":{"count":64},"Food Basics":{"count":116},"Food Lion":{"count":425},"Foodland":{"count":192},"Foodworks":{"count":90},"Franprix":{"count":401},"Fred Meyer":{"count":70},"Freshmarket":{"count":86},"Froiz":{"count":97},"Føtex":{"count":74},"G20":{"count":71},"GS25":{"count":72},"Gadis":{"count":126},"Game":{"count":59},"Giant":{"count":276},"Giant Eagle":{"count":134},"Grand Frais":{"count":70},"Grocery Outlet":{"count":128},"Géant Casino":{"count":75},"H-E-B":{"count":274},"HIT":{"count":64},"Hannaford":{"count":95},"Harris Teeter":{"count":158},"Hemköp":{"count":87},"Heron Foods":{"count":55},"Hofer":{"count":484},"Hoogvliet":{"count":66},"Hruška":{"count":54},"Hy-Vee":{"count":121},"ICA":{"count":255},"ICA Kvantum":{"count":51},"IDEA":{"count":52},"IGA":{"count":568},"Iceland":{"count":538},"Indomaret":{"count":124},"Intermarché":{"count":1477},"Intermarché Contact":{"count":122},"Intermarché Super":{"count":261},"Interspar":{"count":117},"Irma":{"count":69},"Jewel-Osco":{"count":72},"Jumbo":{"count":476},"K+K":{"count":119},"Kaufland":{"count":1172},"King Soopers":{"count":99},"Kiwi":{"count":178},"Konsum":{"count":144},"Konzum":{"count":370},"Kroger":{"count":627},"Kvickly":{"count":60},"La Vie Claire":{"count":65},"Landi":{"count":54},"Leader Price":{"count":502},"Leclerc Drive":{"count":120},"Lewiatan":{"count":255},"Lider":{"count":78},"Lidl":{"count":8927},"Londis":{"count":52},"Lupa":{"count":79},"M&S Simply Food":{"count":52},"MPREIS":{"count":187},"Makro":{"count":226},"Markant":{"count":98},"Market Basket":{"count":57},"Marktkauf":{"count":117},"Match":{"count":139},"Maxi":{"count":198},"Maxi Dia":{"count":52},"Maxima":{"count":111},"Maxima X":{"count":158},"Maxima XX":{"count":69},"Mega Image":{"count":97},"Mego":{"count":52},"Meijer":{"count":129},"Meny":{"count":105},"Mercado Municipal":{"count":52},"Mercado de Abastos":{"count":57},"Mercadona":{"count":1228},"Mercator":{"count":155},"Merkur":{"count":132},"Metro":{"count":395},"Migros":{"count":641},"Mila":{"count":90},"Mini Market":{"count":81},"Minipreço":{"count":213},"Mix Markt":{"count":60},"Monoprix":{"count":283},"More":{"count":61},"Morrisons":{"count":443},"NORMA":{"count":144},"NP":{"count":251},"Nah & Frisch":{"count":107},"Nahkauf":{"count":324},"Netto":{"count":4429},"Netto Marken-Discount":{"count":706},"New World":{"count":89},"No Frills":{"count":177},"Norfa XL":{"count":66},"Norma":{"count":1162},"Oxxo":{"count":278},"PENNY":{"count":89},"PLUS":{"count":92},"POLOmarket":{"count":172},"Palí":{"count":69},"Pam":{"count":77},"Penny":{"count":2819},"Penny Markt":{"count":77},"Petit Casino":{"count":146},"Pick n Pay":{"count":268},"Piggly Wiggly":{"count":103},"Pingo Doce":{"count":308},"Piotr i Paweł":{"count":112},"Plaza Vea":{"count":68},"Plodine":{"count":67},"Poiesz":{"count":53},"Price Chopper":{"count":132},"Prix":{"count":53},"Profi":{"count":203},"Proxi":{"count":75},"Proxy Delhaize":{"count":63},"Publix":{"count":645},"Punto Simply":{"count":54},"Puregold":{"count":75},"Pão de Açúcar":{"count":76},"QFC":{"count":54},"REMA 1000":{"count":89},"Ralphs":{"count":81},"Real":{"count":210},"Real Canadian Superstore":{"count":69},"Reliance Fresh":{"count":95},"Rema 1000":{"count":394},"Rewe":{"count":2808},"Rewe City":{"count":78},"Rimi":{"count":115},"S-Market":{"count":110},"Safeway":{"count":619},"Sainsbury's":{"count":595},"Sainsbury's Local":{"count":248},"Sam's Club":{"count":303},"Santa Isabel":{"count":174},"Save-A-Lot":{"count":100,"tags":{"shop":"supermarket"}},"ShopRite":{"count":53},"Shoprite":{"count":337},"Sigma":{"count":107},"Simply Market":{"count":541},"Sky":{"count":113},"Smith's":{"count":56},"Sobeys":{"count":186},"Soriana":{"count":194},"Spar":{"count":3381},"Społem":{"count":120},"Sprouts Farmers Market":{"count":71},"Stokrotka":{"count":227},"Stop & Shop":{"count":147},"Super C":{"count":57},"Super U":{"count":654},"SuperBrugsen":{"count":183},"SuperValu":{"count":80},"Superama":{"count":51},"Supersol":{"count":51},"Superspar":{"count":54},"Tegut":{"count":118},"Tengelmann":{"count":155},"Tesco":{"count":1373},"Tesco Express":{"count":566},"Tesco Extra":{"count":200},"Tesco Lotus":{"count":95},"Tesco Metro":{"count":153},"The Co-operative":{"count":79},"The Co-operative Food":{"count":1261},"Tommy":{"count":56},"Tottus":{"count":82},"Trader Joe's":{"count":345},"Treff 3000":{"count":134},"U Express":{"count":129},"Unimarc":{"count":256},"Unimarkt":{"count":104},"Utile":{"count":68},"Vea":{"count":67},"Vival":{"count":80},"Volg":{"count":231},"Waitrose":{"count":301},"Walmart":{"count":1164},"Walmart Neighborhood Market":{"count":171},"Walmart Supercenter":{"count":688},"Wasgau":{"count":51},"Wegmans":{"count":89},"Wellcome":{"count":51},"Whole Foods Market":{"count":379,"tags":{"shop":"supermarket"}},"Willys":{"count":89},"WinCo Foods":{"count":53},"Winn Dixie":{"count":168},"Woolworths":{"count":816},"denn's Biomarkt":{"count":147},"fakta":{"count":296},"real":{"count":58},"tegut":{"count":89},"Şok":{"count":271},"Żabka":{"count":88},"ΑΒ Βασιλόπουλος":{"count":82},"Γαλαξίας":{"count":54},"Μασούτης":{"count":85},"Σκλαβενίτης":{"count":92},"АТБ":{"count":618},"Абсолют":{"count":51},"Авоська":{"count":60},"Азбука Вкуса":{"count":66},"Атак":{"count":85},"Ашан":{"count":80},"Верный":{"count":226},"Виктория":{"count":74},"Вопак":{"count":59},"Гастроном":{"count":54},"Гроздь":{"count":63},"Десяточка":{"count":52},"Дикси":{"count":1670},"Евроопт":{"count":201},"Карусель":{"count":68},"Квартал":{"count":77},"Кировский":{"count":54},"Командор":{"count":75},"Красный Яр":{"count":58},"Лента":{"count":165},"Магнит":{"count":4289},"Магнолия":{"count":121},"Мария-Ра":{"count":159},"Монетка":{"count":363},"Народная 7Я семьЯ":{"count":199},"Перекресток":{"count":501},"Покупочка":{"count":73},"Полушка":{"count":213},"Пятёрочка":{"count":3622},"Радеж":{"count":64},"Рукавичка":{"count":78},"Светофор":{"count":73},"Седьмой континент":{"count":69},"Семейный":{"count":52},"Семья":{"count":85},"Супермаркет":{"count":65},"Сільпо":{"count":203},"Таврія‑В":{"count":66},"Универсам":{"count":77},"Фора":{"count":162},"Фуршет":{"count":86},"Хүнсний дэлгүүр":{"count":63},"Эдельвейс":{"count":55},"хүнсний дэлгүүр":{"count":73},"بقالة":{"count":74},"سوپر مارکت":{"count":75},"سوپرمارکت":{"count":79},"いなげや":{"count":66},"まいばすけっと":{"count":162},"イオン":{"count":95},"イトーヨーカドー":{"count":67},"カスミ":{"count":56},"マックスバリュ":{"count":143},"マルエツ":{"count":99},"ライフ":{"count":125},"全聯":{"count":74},"全聯福利中心":{"count":241},"惠康 Wellcome":{"count":57},"業務スーパー":{"count":176},"美廉社":{"count":74},"西友":{"count":137}},"tailor":{"Atelier de couture":{"count":63}},"ticket":{"Boutique Grandes Lignes":{"count":60},"Guichet Transilien":{"count":243},"Касса":{"count":61},"Проездные билеты":{"count":65}},"tobacco":{"Dohánybolt":{"count":109},"Estanco":{"count":134},"Nemzeti Dohánybolt":{"count":926},"Tabacos":{"count":62},"Табакерка":{"count":73}},"toys":{"Dráčik":{"count":63},"Intertoys":{"count":242},"King Jouet":{"count":102},"La Grande Récré":{"count":112},"Maxi Toys":{"count":63},"Toys R Us":{"count":410,"tags":{"shop":"toys"}},"Детский мир":{"count":186},"Игрушки":{"count":95}},"travel_agency":{"D-reizen":{"count":64},"DER Reisebüro":{"count":52},"First Reisebüro":{"count":57},"Flight Centre":{"count":159},"Reiseland":{"count":52},"TUI":{"count":262},"The Co-operative Travel":{"count":58},"Thomas Cook":{"count":298},"Thomson":{"count":144}},"tyres":{"Borracharia":{"count":98},"Bridgestone":{"count":65},"Discount Tire":{"count":94},"Euromaster":{"count":76},"Firestone":{"count":57},"Gomeria":{"count":71},"Les Schwab Tire Center":{"count":59},"Vianor":{"count":52},"Вулканизация":{"count":113},"Шиномонтаж":{"count":419}},"variety_store":{"Action":{"count":147},"Bazar":{"count":56},"Big Bazar":{"count":60},"Big Lots":{"count":65},"Dollar General":{"count":345},"Dollar Tree":{"count":753},"Dollarama":{"count":404},"EuroShop":{"count":59},"Family Dollar":{"count":590},"Fix Price":{"count":97},"Fix price":{"count":127},"FixPrice":{"count":62},"GiFi":{"count":229},"Home Bargains":{"count":68},"Mäc-Geiz":{"count":59},"NOZ":{"count":82},"Poundland":{"count":197},"Poundworld":{"count":70},"Tedi":{"count":611},"ダイソー":{"count":226}},"video":{"Blockbuster":{"count":75},"Family Video":{"count":113},"TSUTAYA":{"count":122},"World of Video":{"count":53},"ゲオ":{"count":81}},"video_games":{"EB Games":{"count":101},"Game":{"count":76},"GameStop":{"count":676},"Micromania":{"count":83}}};
23607 var tourism = {"alpine_hut":{"КОШ":{"count":105}},"apartment":{"Двухкомнатная квартира на сутки":{"count":52}},"attraction":{"Arch":{"count":51},"Kursächsische Postmeilensäule":{"count":54},"Maibaum":{"count":52},"Moab trail":{"count":55},"Moai":{"count":702},"OWŚ":{"count":102},"Sommerrodelbahn":{"count":54},"path contiunes":{"count":75},"white blaze":{"count":53},"Кладбище еврейское":{"count":89},"Колесо обозрения":{"count":69},"Приусадебный парк":{"count":69},"Усадьба":{"count":53},"Хозяйственный двор":{"count":72},"Часовня":{"count":64},"дольмен":{"count":86}},"camp_site":{"Camping Municipal":{"count":198},"Camping municipal":{"count":80}},"guest_house":{"Casa":{"count":61},"Home":{"count":68},"OW \"Bielanka\"":{"count":54}},"hostel":{"Albergue de Peregrinos":{"count":67},"Hospedaje":{"count":70},"Hostal":{"count":124}},"hotel":{"B&B Hôtel":{"count":104},"B&b Hôtel":{"count":78},"Best Western":{"count":242},"Campanile":{"count":145},"Central Hotel":{"count":51},"City Hotel":{"count":74},"Comfort Inn":{"count":283},"Comfort Inn & Suites":{"count":67},"Comfort Suites":{"count":148},"Country Inn & Suites":{"count":83},"Courtyard by Marriott":{"count":155},"Crowne Plaza":{"count":85},"Days Inn":{"count":245},"Econo Lodge":{"count":70},"Embassy Suites":{"count":68},"Extended Stay America":{"count":102},"Fairfield Inn":{"count":60},"Fairfield Inn & Suites":{"count":67},"Formule 1":{"count":74},"Grand Hotel":{"count":90},"Hampton Inn":{"count":376},"Hampton Inn & Suites":{"count":96},"Hilton Garden Inn":{"count":183},"Holiday Inn":{"count":411},"Holiday Inn Express":{"count":479},"Holiday Inn Express & Suites":{"count":72},"Homewood Suites":{"count":61},"Hotel Central":{"count":92},"Hotel Europa":{"count":91},"Hotel Ibis":{"count":67},"Hotel Krone":{"count":58},"Hotel Panorama":{"count":61},"Hotel Plaza":{"count":62},"Hotel Post":{"count":60},"Hotel Royal":{"count":62},"Hotel Victoria":{"count":71},"Hotel zur Post":{"count":60},"Hôtel Ibis":{"count":70},"Hôtel de France":{"count":61},"Ibis":{"count":215},"Ibis Budget":{"count":188},"Ibis Styles":{"count":53},"Krone":{"count":68},"Kyriad":{"count":65},"La Quinta":{"count":54},"Marriott":{"count":57},"Mercure":{"count":109},"Motel 6":{"count":83},"Novotel":{"count":180},"Palace Hotel":{"count":54},"Park Hotel":{"count":88},"Parkhotel":{"count":64},"Premier Inn":{"count":400},"Première Classe":{"count":62},"Quality Inn":{"count":178},"Quality Inn & Suites":{"count":80},"Ramada":{"count":97},"Residence Inn":{"count":89},"Royal Hotel":{"count":94},"Sheraton":{"count":56},"Sleep Inn":{"count":68},"Staybridge Suites":{"count":54},"Super 8":{"count":229},"Travelodge":{"count":284},"Гостиница":{"count":166},"Уют":{"count":58},"東横イン":{"count":57}},"motel":{"Best Western":{"count":59},"Budget Inn":{"count":76},"Comfort Inn":{"count":131},"Days Inn":{"count":103},"Econo Lodge":{"count":117},"Motel 6":{"count":214},"Quality Inn":{"count":113},"Rodeway Inn":{"count":102},"Super 8":{"count":173},"Travelodge":{"count":68}},"museum":{"Heimatmuseum":{"count":336},"Stadtmuseum":{"count":86},"Tájház":{"count":93},"Краеведческий музей":{"count":247},"Музей":{"count":99}}};
23608 var dataSuggestions = {
23609         amenity: amenity,
23610         leisure: leisure,
23611         man_made: man_made,
23612         shop: shop,
23613         tourism: tourism
23614 };
23615
23616 var dataAddressFormats = [{"format":[["housenumber","street"],["city","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":["au","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"]]}];
23617
23618 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"}}];
23619
23620 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,"yh:LINE_NAME":true,"yh:LINE_NUM":true,"yh:STRUCTURE":true,"yh:TOTYUMONO":true,"yh:TYPE":true,"yh:WIDTH":true,"yh:WIDTH_RANK":true,"SK53_bulk:load":true};
23621
23622 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":false},"cs":{"rtl":false},"cy":{"rtl":false},"da":{"rtl":false},"de":{"rtl":false},"dv":{"rtl":true},"el":{"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":true},"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},"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}};
23623
23624 var dataPhoneFormats = {"us":"+1-202-555-1234","ca":"+1-226-555-1234","bs":"+1-242-555-1234","bb":"+1-246-555-1234","ai":"+1-264-555-1234","ag":"+1-268-555-1234","vg":"+1-284-555-1234","vi":"+1-340-555-1234","ky":"+1-345-555-1234","bm":"+1-441-555-1234","gd":"+1-473-555-1234","tc":"+1-649-555-1234","ms":"+1-664-555-1234","mp":"+1-670-555-1234","gu":"+1-671-555-1234","as":"+1-684-555-1234","sx":"+1-721-555-1234","lc":"+1-758-555-1234","dm":"+1-767-555-1234","vc":"+1-784-555-1234","pr":"+1-787-555-1234","do":"+1-809-555-1234","tt":"+1-868-555-1234","kn":"+1-869-555-1234","jm":"+1-876-555-1234","za":"+27 11 907 1111","nl":"+31 42 123 4567","fr":"+33 1 23 45 67 89","es":"+34 989 12 34 56","pt":"+351 211 123456","ie":"+353 20 912 3456","fi":"+358 40 123 4567","hu":"+36 1 123 45 67","hr":"+385 01 123 4567","si":"+386 31 123 4567","it":"+39 01 123 456","va":"+39 01 123 456","gb":"+44 1632 961234","gg":"+44 1632 961234","im":"+44 1632 961234","je":"+44 1632 961234","se":"+46 31 123 4567","no":"+47 22 12 34 56","sj":"+47 22 12 34 56","pl":"+48 42 123 4567","de":"+49 89 1234567","br":"+55 11 0982 1098","ru":"+7 495 1234567","kz":"+7 495 1234567","vn":"+84 1 234 5678","hk":"+852 1234 5678","cn":"+86 10 12345678","tw":"+886 1 2345 6789","tr":"+90 312 123 4567","ua":"+380 44 123 4567","at":"+43 1 123 45 67","ci":"+225 20 12 34 56","bj":"+229 20 12 34 56"};
23625
23626 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":["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":["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.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"}]}]}];
23627
23628 var type$2 = "FeatureCollection";
23629 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]]]}}];
23630 var dataImperial = {
23631         type: type$2,
23632         features: features
23633 };
23634
23635 var type$3 = "FeatureCollection";
23636 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]]]}}];
23637 var dataDriveLeft = {
23638         type: type$3,
23639         features: features$1
23640 };
23641
23642 var en = {"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."},"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."}},"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":{"point":"Connected a way to a point.","vertex":"Connected a way to another.","line":"Connected a way to a line.","area":"Connected a way to an area."}},"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 at least one is a member of a \"{relation}\" relation.","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"}}},"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":"login","logout":"logout","loading_auth":"Connecting to OpenStreetMap...","report_a_bug":"Report a bug","help_translate":"Help translate","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","version":"Version","last_edit":"Last Edit","edited_by":"Edited By","changeset":"Changeset","unknown":"Unknown","link_text":"History 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"},"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:"},"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","custom_button":"Edit custom background","custom_prompt":"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}","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"}},"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."}},"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":{"edited_osm":"Edited OSM!","just_edited":"You just edited OpenStreetMap!","view_on_osm":"View on OSM","facebook":"Share on Facebook","twitter":"Share on Twitter","google":"Share on Google+","help_html":"Your changes should appear in the \"Standard\" layer in a few minutes. Other layers, and certain features, may take longer.","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"},"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","gpx":{"local_layer":"Local file","drag_drop":"Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse","zoom":"Zoom to layer","browse":"Browse for a file"},"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"},"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."},"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 [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","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","place_point":"Place a point","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","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}"},"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-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 permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}},"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"},"boules":{"label":"Type"},"boundary":{"label":"Type"},"brand":{"label":"Brand"},"brewery":{"label":"Draft Beers"},"bridge":{"label":"Type","placeholder":"Default"},"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..."},"castle_type":{"label":"Type"},"clothes":{"label":"Clothes"},"club":{"label":"Type"},"collection_times":{"label":"Collection Times"},"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"},"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"}}},"date":{"label":"Date"},"delivery":{"label":"Delivery"},"denomination":{"label":"Denomination"},"denotation":{"label":"Denotation"},"description":{"label":"Description"},"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"},"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"},"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"}},"fitness_station":{"label":"Equipment Type"},"fixme":{"label":"Fix Me"},"ford":{"label":"Type","placeholder":"Default"},"frequency":{"label":"Operating Frequency"},"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"},"hoops":{"label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"label":"IATA"},"icao":{"label":"ICAO"},"incline_steps":{"label":"Incline","options":{"up":"Up","down":"Down"}},"incline":{"label":"Incline"},"indoor":{"label":"Indoor"},"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..."},"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":{"label":"Location"},"man_made":{"label":"Type"},"manhole":{"label":"Type"},"map_size":{"label":"Coverage"},"map_type":{"label":"Type"},"maxheight":{"label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},"maxspeed":{"label":"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"}},"payment_multi":{"label":"Payment Types"},"phases":{"label":"Phases","placeholder":"1, 2, 3..."},"phone":{"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"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/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"}},"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"},"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"},"seasonal":{"label":"Seasonal"},"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"},"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"},"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"}},"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_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"},"vending":{"label":"Type 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)"},"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":""},"highway":{"name":"Highway","terms":""},"place":{"name":"Place","terms":""},"power":{"name":"Power","terms":""},"railway":{"name":"Railway","terms":""},"roundabout":{"name":"Roundabout","terms":""},"waterway":{"name":"Waterway","terms":""},"address":{"name":"Address","terms":""},"advertising/billboard":{"name":"Billboard","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":"airplane,airport,aerodrome"},"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"},"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/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":"Beer Garden","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/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/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/library":{"name":"Library","terms":"book"},"amenity/love_hotel":{"name":"Love Hotel","terms":""},"amenity/marketplace":{"name":"Marketplace","terms":""},"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":"Car Parking","terms":""},"amenity/pavilion":{"name":"Pavilion","terms":""},"amenity/pharmacy":{"name":"Pharmacy","terms":"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":{"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/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/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/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/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/condoms":{"name":"Condom Vending Machine","terms":"condom"},"amenity/vending_machine/drinks":{"name":"Drink Vending Machine","terms":"drink,soda,beverage,juice,pop"},"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/newspapers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{"name":"Parcel Pickup/Dropoff Vending Machine","terms":"parcel,mail,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/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/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/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/gate":{"name":"Gate","terms":""},"barrier/hedge":{"name":"Hedge","terms":""},"barrier/kerb":{"name":"Kerb","terms":""},"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":""},"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/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/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/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":""},"embankment":{"name":"Embankment","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_hydrant":{"name":"Fire Hydrant","terms":"fire plug"},"emergency/life_ring":{"name":"Life Ring","terms":"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/phone":{"name":"Emergency Phone","terms":""},"emergency/water_tank":{"name":"Emergency Water Tank","terms":"water tank,cistern,reservoir"},"entrance":{"name":"Entrance/Exit","terms":""},"footway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"footway/crossing":{"name":"Street Crossing","terms":""},"footway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"footway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"footway/sidewalk":{"name":"Sidewalk","terms":""},"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/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"},"highway/bus_guideway":{"name":"Bus Guideway","terms":""},"highway/corridor":{"name":"Indoor Corridor","terms":"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"highway/crossing":{"name":"Street Crossing","terms":""},"highway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"highway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"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/give_way":{"name":"Yield Sign","terms":"give way,yield,sign"},"highway/living_street":{"name":"Living Street","terms":""},"highway/mini_roundabout":{"name":"Mini-Roundabout","terms":""},"highway/motorway_junction":{"name":"Motorway Junction / Exit","terms":""},"highway/motorway_link":{"name":"Motorway Link","terms":"ramp,on ramp,off ramp"},"highway/motorway":{"name":"Motorway","terms":"autobahn,expressway,freeway,highway,interstate,parkway,thruway,turnpike"},"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":"ramp,on ramp,off ramp"},"highway/primary":{"name":"Primary Road","terms":""},"highway/raceway":{"name":"Racetrack (Motorsport)","terms":"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{"name":"Residential Road","terms":""},"highway/rest_area":{"name":"Rest Area","terms":"rest stop"},"highway/road":{"name":"Unknown Road","terms":""},"highway/secondary_link":{"name":"Secondary Link","terms":"ramp,on ramp,off ramp"},"highway/secondary":{"name":"Secondary Road","terms":""},"highway/service":{"name":"Service Road","terms":""},"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/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":"ramp,on ramp,off ramp"},"highway/tertiary":{"name":"Tertiary Road","terms":""},"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":"ramp,on ramp,off ramp"},"highway/trunk":{"name":"Trunk Road","terms":""},"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":""},"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":""},"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":""},"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":"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":"air force,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/bird_hide":{"name":"Bird Hide","terms":"machan,ornithology"},"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/dog_park":{"name":"Dog Park","terms":""},"leisure/firepit":{"name":"Firepit","terms":"fireplace,campfire"},"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/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/baseball":{"name":"Baseball Diamond","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/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"},"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"},"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/embankment":{"name":"Embankment","terms":""},"man_made/adit":{"name":"Adit","terms":"entrance,underground,mine,cave"},"man_made/breakwater":{"name":"Breakwater","terms":""},"man_made/bridge":{"name":"Bridge","terms":""},"man_made/chimney":{"name":"Chimney","terms":""},"man_made/crane":{"name":"Crane","terms":""},"man_made/cutline":{"name":"Cut line","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/monitoring_station":{"name":"Monitoring Station","terms":"weather,earthquake,seismology,air,gps"},"man_made/observation":{"name":"Observation Tower","terms":"lookout tower,fire tower"},"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":""},"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_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/surveillance":{"name":"Surveillance","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/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":"escarpment"},"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/peak":{"name":"Peak","terms":"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"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/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":{"name":"Piste/Ski Trail","terms":"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{"name":"Farm","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/generator":{"name":"Power Generator","terms":"hydro,solar,turbine,wind"},"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/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":""},"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/charity":{"name":"Charity Store","terms":"thrift,op shop,nonprofit"},"shop/cheese":{"name":"Cheese Store","terms":""},"shop/chemist":{"name":"Drugstore","terms":"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/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":{"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":{"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/pastry":{"name":"Pastry Shop","terms":"patisserie,cake shop,cakery"},"shop/pawnbroker":{"name":"Pawn Shop","terms":""},"shop/perfumery":{"name":"Perfume Store","terms":""},"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":""},"shop/seafood":{"name":"Seafood Shop","terms":"fishmonger"},"shop/second_hand":{"name":"Consignment/Thrift Store","terms":"secondhand,second hand,resale,thrift,used"},"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/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/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"},"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":"Left Turn Only","terms":""},"type/restriction/only_right_turn":{"name":"Right Turn Only","terms":""},"type/restriction/only_straight_on":{"name":"No Turns","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/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":{"Bing":{"description":"Satellite and aerial imagery.","name":"Bing aerial imagery"},"DigitalGlobe-Premium":{"attribution":{"text":"Terms & Feedback"},"description":"Premium DigitalGlobe satellite imagery.","name":"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{"attribution":{"text":"Terms & Feedback"},"description":"Standard DigitalGlobe satellite imagery.","name":"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 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"},"US-TIGER-Roads-2012":{"name":"TIGER Roads 2012"},"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"},"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 goverment 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"},"hike_n_bike":{"attribution":{"text":"© OpenStreetMap contributors"},"name":"Hike & Bike"},"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)"},"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"},"stamen-terrain-background":{"attribution":{"text":"Map tiles by Stamen Design, under CC BY 3.0"},"name":"Stamen Terrain"},"tf-cycle":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest OpenCycleMap"},"tf-landscape":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest Landscape"}}};
23643
23644 var dataImagery = [{"id":"sjcgis.org-Aerials_2013_WM","name":"2013 aerial imagery for San Juan County WA","type":"tms","template":"http://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","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"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":"http://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","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"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","polygon":[[[-3.046968,54.839473],[-3.058641,55.2415704],[-4.0446639,55.2329572],[-4.0707564,55.6365416],[-4.6190429,55.6253005],[-4.6492553,56.0283381],[-4.4896102,56.0321747],[-4.5239425,56.4367031],[-3.8675094,56.4458128],[-3.8417602,56.049435],[-3.445909,56.0498185],[-3.4349227,55.6442923],[-2.7949691,55.6504917],[-2.8080153,56.0574872],[-3.2066131,56.0532696],[-3.2141662,56.4568175],[-3.7380767,56.4507463],[-3.7418532,56.8617541],[-5.0766921,56.8317131],[-5.0365233,56.4294897],[-5.1601195,56.4249331],[-5.1299071,56.0179772],[-5.9260726,55.994559],[-5.8551764,55.2333487],[-5.2280974,55.2513559],[-5.2102447,55.027647],[-4.659555,55.0418131],[-4.6454787,54.8163344],[-3.046968,54.839473]],[[-1.7483497,57.7642809],[-1.7406468,57.3599979],[-2.5802193,57.3553698],[-2.5743689,57.0452643],[-2.0840782,57.0479899],[-2.0765057,56.6427564],[-2.734497,56.6390587],[-2.737815,56.8171751],[-3.2388513,56.8143725],[-3.2489563,57.351683],[-3.7562947,57.3488858],[-3.7621877,57.6586785],[-4.7658688,57.6447324],[-4.810078,58.2698422],[-5.2511001,58.2654711],[-5.2737594,58.6676722],[-3.5581778,58.6988712],[-3.566072,58.9316035],[-3.3765578,58.9344382],[-3.3858372,59.2017095],[-3.187134,59.2021481],[-3.1874677,59.2417623],[-3.0675673,59.2420266],[-3.0785537,59.4213467],[-2.3713088,59.4276337],[-2.3685622,59.0221982],[-2.678926,59.0207845],[-2.6734328,58.8393493],[-2.8656936,58.8365068],[-2.8602004,58.5353109],[-3.0346084,58.5331604],[-3.0195022,58.1315879],[-3.6155983,58.1198177],[-3.6127639,57.9775439],[-3.7109154,57.9756153],[-3.699316,57.7536442],[-1.7483497,57.7642809]],[[-7.0749164,56.7631857],[-7.7347099,56.7356573],[-7.7911007,57.1399384],[-7.7066243,57.1434261],[-7.7629881,57.5431114],[-7.6021787,57.5496778],[-7.6213373,57.6845215],[-7.724988,57.6803049],[-7.7301746,57.7167278],[-7.6026437,57.7219106],[-7.5996413,57.7008338],[-7.4863439,57.7054402],[-7.49528,57.7681282],[-7.3749316,57.7730121],[-7.3933722,57.9020139],[-7.2359063,57.9083804],[-7.2432312,57.9594843],[-7.1391571,57.9636854],[-7.1450794,58.0049464],[-7.2374247,58.001223],[-7.2329687,57.9701789],[-7.3113276,57.9670164],[-7.3153794,57.9952475],[-7.2490415,57.9979228],[-7.2808211,58.218564],[-7.0735459,58.2268701],[-7.0827038,58.2901845],[-6.807432,58.3011927],[-6.8276802,58.4407359],[-6.5030498,58.4536624],[-6.5153194,58.5379206],[-6.1647379,58.5518417],[-6.1063084,58.1489361],[-6.3346892,58.139764],[-6.2775862,57.7414459],[-6.9613783,57.7136632],[-6.9333168,57.5161471],[-7.100168,57.5093277],[-7.0521806,57.169002],[-7.1311072,57.1657457],[-7.0749164,56.7631857]],[[0.4107642,50.8208689],[0.9810233,50.8061178],[0.9943731,51.0117337],[1.4506241,50.9999804],[1.4771216,51.4055151],[0.8961869,51.4203486],[0.882435,51.2103932],[0.5050041,51.2200721],[0.5227271,51.4904202],[-0.6339669,51.5106322],[-0.6367135,51.4456291],[-1.0995126,51.4524759],[-1.1148479,51.0481357],[-0.5298744,51.0394048],[-0.5275085,51.10203],[0.4280611,51.0877836],[0.4107642,50.8208689]],[[-5.3945661,51.9618998],[-4.7958112,51.9805124],[-4.7887332,51.8940308],[-4.2026458,51.9122773],[-4.2294099,52.2382823],[-3.6551984,52.2560218],[-3.6222764,51.8548323],[-4.2134157,51.836405],[-4.1855134,51.4934202],[-4.776615,51.4748465],[-4.7847576,51.5752482],[-5.0879928,51.5657379],[-5.0942224,51.6424172],[-5.3678001,51.6338498],[-5.3945661,51.9618998]],[[-1.2389016,54.0353696],[-0.6277871,54.0281103],[-0.6200376,54.2525704],[-0.5726819,54.2520109],[-0.5586479,54.6554165],[-1.17998,54.6626853],[-1.1878192,54.4378771],[-1.2322093,54.4383992],[-1.2389016,54.0353696]],[[-2.6722741,50.9767709],[-2.0996118,50.9802295],[-2.1057212,51.3794917],[-1.5887659,51.3825866],[-1.594992,51.7858908],[-2.1756313,51.7889106],[-2.1715392,51.3839176],[-2.6784576,51.3808828],[-2.6722741,50.9767709]],[[-2.6015496,53.2715461],[-3.2297251,53.2685042],[-3.2352183,53.6723131],[-2.6070428,53.6753262],[-2.6015496,53.2715461]],[[-0.0394177,51.7727994],[-0.6156335,51.7757705],[-0.6046472,52.5841377],[-0.0284314,52.5812201],[-0.0394177,51.7727994]],[[-2.9152892,54.0352257],[-3.5322877,54.0286638],[-3.5448438,54.4339736],[-2.9278454,54.4404713],[-2.9152892,54.0352257]],[[-6.3058305,57.1968949],[-6.3538957,57.6001458],[-5.6911121,57.6229455],[-5.643047,57.2199469],[-6.3058305,57.1968949]],[[1.171145,52.5723589],[1.1986505,52.9759408],[1.7978754,52.9610616],[1.7703699,52.5573411],[1.171145,52.5723589]],[[-2.4022508,55.5631737],[-2.4008775,55.9656986],[-1.7608445,55.965011],[-1.7622178,55.562479],[-2.4022508,55.5631737]],[[-6.3257432,56.3853727],[-7.0196021,56.3574652],[-7.0731605,56.7638392],[-6.3793015,56.7914485],[-6.3257432,56.3853727]],[[-2.422577,54.4430983],[-2.4257397,54.841885],[-1.7993058,54.8435404],[-1.7961431,54.4447701],[-2.422577,54.4430983]],[[-3.0270123,51.3793548],[-3.6058877,51.370168],[-3.6223672,51.7730401],[-3.0434918,51.7821458],[-3.0270123,51.3793548]],[[-3.0537915,52.1897924],[-3.0661511,52.5937352],[-2.4836401,52.600342],[-2.4712805,52.1964599],[-3.0537915,52.1897924]],[[-5.676726,51.7042466],[-5.6788616,51.731006],[-5.4635982,51.7375973],[-5.4614627,51.7108418],[-5.676726,51.7042466]],[[-5.8442675,59.1088192],[-5.8469031,59.1357806],[-5.7955763,59.1371015],[-5.7929408,59.1101412],[-5.8442675,59.1088192]],[[-8.648442,57.7786066],[-8.6659651,57.87717],[-8.4664946,57.8872093],[-8.4489714,57.7886733],[-8.648442,57.7786066]],[[-4.5271098,59.0153156],[-4.5285904,59.0331938],[-4.4762337,59.034342],[-4.4747531,59.0164644],[-4.5271098,59.0153156]],[[-7.6806151,58.2583811],[-7.6865455,58.2938023],[-7.5344535,58.3008387],[-7.5285231,58.2654246],[-7.6806151,58.2583811]],[[-6.1910235,59.080087],[-6.1954619,59.1158563],[-6.125424,59.1181472],[-6.1209857,59.0823803],[-6.1910235,59.080087]],[[-4.4266879,59.0711219],[-4.4280472,59.0886998],[-4.3762055,59.089758],[-4.3748462,59.0721806],[-4.4266879,59.0711219]]]},{"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.9849448,50.7072276],[5.9849448,50.7671973],[5.9107871,50.8227527],[5.7556052,50.8353303],[5.7542319,50.8626424],[5.8331961,50.9332328],[5.8551688,51.026611],[5.9094138,51.0775439],[5.9121604,51.1822548],[5.8785147,51.2080728],[5.7741446,51.2368858],[5.684194,51.2407548],[5.6230826,51.2699769],[5.6230826,51.2978925],[5.5399985,51.34724],[5.4473013,51.3485267],[5.3985495,51.321071],[5.3120322,51.3232166],[5.2667136,51.3618196],[5.1994223,51.3725369],[5.1829428,51.3961061],[5.1589102,51.4923992],[5.0833792,51.5308596],[5.0325675,51.539829],[4.9556632,51.5052229],[4.9014182,51.5056503],[4.8382468,51.5436725],[4.7709555,51.5586163],[4.711904,51.5470886],[4.6404929,51.4966741],[4.6144003,51.4971016],[4.5656485,51.5317139],[4.4825644,51.5304324],[4.4262595,51.5218884],[4.3006034,51.4697351],[4.2951102,51.4256575],[4.181127,51.4243731],[4.1371817,51.3952492],[4.138555,51.3506709],[4.0520377,51.3004685],[3.933248,51.272984],[3.8652701,51.2708361],[3.8632102,51.2901637],[3.7629599,51.3240748],[3.5933585,51.359247],[3.4773154,51.3313688],[3.425817,51.3973913],[3.2356162,51.3515286],[3.2260031,51.3656781],[3.1779379,51.3618196],[3.1600852,51.3322268],[3.0625815,51.3021857],[2.7508444,51.1702014],[2.4700064,51.0745241],[2.4926657,50.9937771],[2.5311179,50.9557299],[2.5091452,50.9115907],[2.5304312,50.8214514],[2.5990958,50.7641572],[2.6650138,50.7645915],[2.7700705,50.66677],[2.8970999,50.6589354],[2.991857,50.7254874],[3.1133933,50.7263567],[3.2369895,50.7059231],[3.3626456,50.6585001],[3.4711356,50.7020092],[3.6393637,50.6672052],[3.6984152,50.681565],[3.727941,50.7124454],[3.8185782,50.6841754],[3.8748831,50.6415206],[4.0925498,50.642827],[4.150228,50.6632881],[4.2065329,50.6441333],[4.3136496,50.642827],[4.452352,50.6876557],[4.5347495,50.6780842],[4.6130271,50.6954855],[4.6768851,50.6959204],[4.7270102,50.732007],[4.7805686,50.732007],[4.7997946,50.7128802],[4.8622794,50.7128802],[4.8856253,50.6954855],[4.9611563,50.6954855],[5.0311942,50.6576295],[5.1074118,50.6502288],[5.2007956,50.6489227],[5.2358145,50.6654643],[5.3250784,50.6658995],[5.3669638,50.6820001],[5.4212088,50.6641586],[5.5221457,50.6746032],[5.622396,50.7241834],[5.6752677,50.69853],[5.7398123,50.6972252],[5.7727713,50.6719923],[5.8125968,50.6602413],[5.9080405,50.659806],[5.9849448,50.7072276]]],"terms_text":"Orthophoto Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"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","polygon":[[[112.28778,-28.784589],[112.71488,-31.13894],[114.11263,-34.178287],[113.60788,-37.39012],[117.17992,-37.451794],[119.31538,-37.42096],[121.72262,-36.708394],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.727398],[130.07031,-33.24166],[130.10913,-33.888704],[131.00214,-34.049705],[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.368294],[142.3783,-40.64702],[142.49478,-42.074874],[144.009,-44.060127],[147.23161,-44.03222],[149.05645,-42.534313],[149.52237,-40.99959],[149.9494,-40.852921],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.667706],[156.20052,-20.10109],[156.62761,-17.417627],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.256768],[152.27905,-13.4135],[151.3472,-12.391767],[149.48354,-12.05024],[146.9598,-9.992408],[135.9719,-9.992408],[130.3032,-10.33636],[128.09016,-12.164136],[125.91588,-12.315912],[124.3239,-11.860326],[122.03323,-11.974295],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.596033],[112.28778,-28.784589]]],"terms_text":"AGRI"},{"id":"alagoas_litoral","name":"Alagoas Litoral 2006","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.523842344,-9.48089222803],[-35.52360077082,-9.44514935417],[-35.51571944592,-9.44517914145],[-35.51584023251,-9.44228976382],[-35.50542238925,-9.44237912638],[-35.50518081607,-9.43064264549],[-35.4933437304,-9.43073201107],[-35.49304176392,-9.39820141319],[-35.48929737968,-9.39817162186],[-35.48920678974,-9.38628467767],[-35.4854020122,-9.38634426236],[-35.48525102896,-9.37809168429],[-35.48126507154,-9.37812147735],[-35.48114428495,-9.36986870367],[-35.47697714765,-9.36995808494],[-35.47685636106,-9.36385031181],[-35.47459161253,-9.36388010609],[-35.47447082594,-9.36152635042],[-35.47211548746,-9.36140717249],[-35.47205509417,-9.35917257881],[-35.46976014899,-9.35920237349],[-35.46966955904,-9.35681879126],[-35.46652910774,-9.3567592015],[-35.46640832115,-9.35288584487],[-35.46387180279,-9.35276666399],[-35.46387180279,-9.35118751337],[-35.44134510403,-9.3513066948],[-35.44125451409,-9.34540716508],[-35.43177276689,-9.34537736922],[-35.4317123736,-9.33602134361],[-35.39463089092,-9.33631931008],[-35.39441951439,-9.30124690873],[-35.38164633265,-9.30142570645],[-35.38146515277,-9.28637657868],[-35.37799253835,-9.28625737508],[-35.3779623417,-9.28110178087],[-35.36941669056,-9.28122098621],[-35.36920531403,-9.27260829561],[-35.35966317354,-9.2727573059],[-35.35969337019,-9.2646510545],[-35.35051358946,-9.26474046271],[-35.35036260622,-9.25562070859],[-35.34115262885,-9.25565051209],[-35.34118282549,-9.24501050089],[-35.31775022732,-9.24518932726],[-35.31759924408,-9.22566691185],[-35.30292367358,-9.22578613599],[-35.30283308363,-9.2113001083],[-35.307936317,-9.2113597228],[-35.30784572706,-9.19979432149],[-35.29102619461,-9.19988374615],[-35.29090540802,-9.19660482728],[-35.29018068849,-9.19669425274],[-35.28996931196,-9.16515547298],[-35.27758868663,-9.16521509525],[-35.27749809669,-9.16417170413],[-35.27541452804,-9.16420151535],[-35.27535413474,-9.16151849576],[-35.27375371245,-9.16148868432],[-35.2736631225,-9.15838828064],[-35.27182112703,-9.15841809234],[-35.27185132368,-9.15728524588],[-35.27148896391,-9.15728524588],[-35.27142857062,-9.15469161013],[-35.26964696844,-9.1546319861],[-35.26958657514,-9.15361837601],[-35.26919401873,-9.15361837601],[-35.26907323214,-9.13158654923],[-35.26403039207,-9.13164617712],[-35.26400019542,-9.12317891652],[-35.26055777765,-9.12320873117],[-35.260527581,-9.11781223884],[-35.25599808393,-9.11784205394],[-35.25572631411,-9.08945695375],[-35.25113642374,-9.08954640613],[-35.25107603045,-9.08650501259],[-35.25026072098,-9.08647519487],[-35.25029091762,-9.08474576336],[-35.24449316137,-9.08477558121],[-35.24449316137,-9.07988541975],[-35.24092995701,-9.07997487452],[-35.24080917042,-9.0731166106],[-35.237336556,-9.0731166106],[-35.23718557277,-9.06321662455],[-35.23655144318,-9.06321662455],[-35.23652124653,-9.04654705576],[-35.23322981199,-9.04651723473],[-35.23332040193,-9.04344565539],[-35.23060270369,-9.04347547668],[-35.23060270369,-9.04013547745],[-35.22897208475,-9.04007583433],[-35.22900228139,-9.03834617941],[-35.22504652062,-9.03825671427],[-35.22501632397,-9.03166605486],[-35.22229862573,-9.03160641033],[-35.22232882238,-9.02012465516],[-35.21834286496,-9.02009483194],[-35.21831266831,-9.01341436936],[-35.21671224601,-9.01341436936],[-35.21668204936,-9.00998461959],[-35.21175999588,-9.00998461959],[-35.21172979923,-9.00646536424],[-35.20970662388,-9.00652501292],[-35.20973682052,-9.00437765419],[-35.20765325187,-9.00431800516],[-35.20768344852,-9.00226010741],[-35.20566027316,-9.00226010741],[-35.20563007651,-8.99987412434],[-35.20390886763,-8.99987412434],[-35.20393906427,-8.99784602637],[-35.20212726545,-8.99790567647],[-35.20212726545,-8.9957880918],[-35.1984432745,-8.99581791702],[-35.1984432745,-8.99361084394],[-35.19433653049,-8.99361084394],[-35.19427613719,-8.99122480384],[-35.19065253954,-8.99131428063],[-35.19062234289,-8.98833170914],[-35.18766307147,-8.98842118664],[-35.18763287482,-8.98543859134],[-35.1847339967,-8.98540876526],[-35.1846736034,-8.98254545043],[-35.18237865822,-8.98251562411],[-35.18234846157,-8.9805172554],[-35.17950997674,-8.98060673484],[-35.1794797801,-8.97741528813],[-35.17809073433,-8.97744511486],[-35.17803034103,-8.97306055853],[-35.17558441262,-8.97303073144],[-35.17549382268,-8.96912336076],[-35.17292710767,-8.96909353334],[-35.17283651773,-8.96291920489],[-35.17063216249,-8.96288937697],[-35.17048117925,-8.95579026036],[-35.16851839719,-8.95564111777],[-35.16851839719,-8.94806459361],[-35.16794466089,-8.94800493531],[-35.16791446424,-8.9399509755],[-35.16244887111,-8.9399509755],[-35.16241867447,-8.92977886806],[-35.15870448687,-8.9298086987],[-35.15873468352,-8.92661680615],[-35.15547344563,-8.92667646795],[-35.15550364227,-8.92378285946],[-35.15348046692,-8.92381269059],[-35.15338987697,-8.92065057698],[-35.15130630832,-8.92062074559],[-35.15121571838,-8.91193970728],[-35.1526349608,-8.91193970728],[-35.1526349608,-8.90821067559],[-35.15438636633,-8.908240508],[-35.15429577639,-8.90215464709],[-35.15592639533,-8.90212481419],[-35.15592639533,-8.90051383392],[-35.15767780087,-8.90048400089],[-35.15773819416,-8.89905201236],[-35.15958018964,-8.89908184551],[-35.15954999299,-8.89747085185],[-35.16139198846,-8.89750068513],[-35.16133159517,-8.89624768526],[-35.16362654035,-8.89624768526],[-35.1635963437,-8.89526318235],[-35.16552892912,-8.89526318235],[-35.16549873247,-8.89314500045],[-35.16794466089,-8.89314500045],[-35.16791446424,-8.89147431313],[-35.17023960607,-8.89153398066],[-35.17026980272,-8.89040029582],[-35.17301769761,-8.89043012968],[-35.17301769761,-8.88875942997],[-35.17790955445,-8.88875942997],[-35.17793975109,-8.88795391132],[-35.17893624045,-8.88792407726],[-35.17893624045,-8.8889085999],[-35.17966095998,-8.88893843387],[-35.17978174657,-8.88858042598],[-35.18098961245,-8.88861025998],[-35.18098961245,-8.88816274965],[-35.1851869464,-8.88816274965],[-35.1851869464,-8.88896826785],[-35.18591166594,-8.88899810182],[-35.18591166594,-8.88971411645],[-35.18932388706,-8.88971411645],[-35.1894748703,-8.88929644142],[-35.19013919653,-8.88926660747],[-35.19016939318,-8.88831191982],[-35.19071293283,-8.88831191982],[-35.19077332612,-8.8878942432],[-35.1915282423,-8.88792407726],[-35.19155843895,-8.88619369772],[-35.19753737508,-8.8860743609],[-35.19756757173,-8.88729756147],[-35.19968133703,-8.88729756147],[-35.19974173032,-8.88777490693],[-35.20079861297,-8.88777490693],[-35.20079861297,-8.88822241773],[-35.20330493468,-8.88822241773],[-35.20336532798,-8.88869976198],[-35.20563007651,-8.88861025998],[-35.20556968322,-8.88983345208],[-35.20741167869,-8.88980361818],[-35.20744187534,-8.89022129263],[-35.21124665288,-8.8902511265],[-35.21127684953,-8.8876854047],[-35.21245451877,-8.88777490693],[-35.21248471541,-8.88861025998],[-35.21622909966,-8.88858042598],[-35.21622909966,-8.88747656609],[-35.21870522472,-8.887446732],[-35.21870522472,-8.88896826785],[-35.22136252967,-8.88896826785],[-35.22263078885,-8.88792407726],[-35.22401983462,-8.88747656609],[-35.22453317762,-8.88762573654],[-35.22643556639,-8.88717822501],[-35.22706969598,-8.88598485826],[-35.2331090254,-8.88446331002],[-35.23932953471,-8.88338927217],[-35.24129231678,-8.88416496649],[-35.25010973774,-8.88514949923],[-35.25623965711,-8.88505999636],[-35.26167505359,-8.88294175546],[-35.2616146603,-8.88094284086],[-35.26406058872,-8.88109201397],[-35.26877126567,-8.87930193267],[-35.27420666215,-8.87748200772],[-35.27810202963,-8.87518471252],[-35.28498686518,-8.87506537212],[-35.28501706183,-8.875811249],[-35.28809711983,-8.87578141395],[-35.29404585932,-8.87545322829],[-35.30781553041,-8.87208184942],[-35.31756904744,-8.86960550716],[-35.32783590746,-8.86715898394],[-35.33206343806,-8.8661445671],[-35.34103184226,-8.86375769289],[-35.34710136833,-8.86244490546],[-35.3522046017,-8.86113211335],[-35.35256696146,-8.86390687298],[-35.34903395375,-8.86611473127],[-35.34495740639,-8.87205201407],[-35.34326639415,-8.87488636144],[-35.3431758042,-8.8756919088],[-35.34380993379,-8.87667646429],[-35.34480642315,-8.87679580417],[-35.34888297051,-8.87721349344],[-35.35042299952,-8.87781019157],[-35.35253676482,-8.87891408057],[-35.35398620388,-8.88010747033],[-35.35576780606,-8.88252407272],[-35.35754940824,-8.88395612587],[-35.36035769642,-8.88511966494],[-35.36114280925,-8.88508983065],[-35.36120320254,-8.88586552137],[-35.36174674219,-8.8858953556],[-35.36177693884,-8.88777490693],[-35.36253185502,-8.88783457507],[-35.36247146172,-8.89099697249],[-35.36310559131,-8.89111630771],[-35.36310559131,-8.89481568015],[-35.36440404714,-8.89487534714],[-35.36506837338,-8.8966951857],[-35.3663668292,-8.90021550347],[-35.36754449844,-8.90427277684],[-35.36793705485,-8.90782285411],[-35.36863157774,-8.90916531133],[-35.37207399551,-8.91155188976],[-35.37409717087,-8.91349097325],[-35.37276851839,-8.91599685052],[-35.37261753516,-8.91817456324],[-35.37083593298,-8.92229129973],[-35.37062455645,-8.92485677869],[-35.37234576533,-8.93037548043],[-35.37153045586,-8.93192666805],[-35.37153045586,-8.93362700074],[-35.37171163574,-8.93386564329],[-35.37171163574,-8.94362002373],[-35.36817862803,-8.94376917125],[-35.36814843138,-8.9450518374],[-35.36926570733,-8.94511149618],[-35.36920531403,-8.94863134694],[-35.37077553968,-8.94872083423],[-35.37080573633,-8.95182304658],[-35.3721947821,-8.9517633889],[-35.37222497875,-8.9552831753],[-35.37319127145,-8.95531300385],[-35.37313087816,-8.95737116808],[-35.37439913734,-8.95737116808],[-35.37445953063,-8.96011536892],[-35.37566739652,-8.96017502523],[-35.37569759317,-8.96205419397],[-35.3768752624,-8.96208402197],[-35.3769356557,-8.964440426],[-35.37781135847,-8.964440426],[-35.37775096517,-8.96617043441],[-35.38074043324,-8.96617043441],[-35.38074043324,-8.96330696774],[-35.38288439518,-8.96327713984],[-35.38291459183,-8.95981708722],[-35.38542091354,-8.9598469154],[-35.38542091354,-8.95722202613],[-35.38723271237,-8.95722202613],[-35.38720251572,-8.95406020253],[-35.38946726426,-8.95409003118],[-35.38946726426,-8.9508386936],[-35.39158102956,-8.95086852252],[-35.39158102956,-8.94791544785],[-35.39586895345,-8.94791544785],[-35.39580856016,-8.94651347472],[-35.39719760593,-8.94654330399],[-35.39710701598,-8.94472371393],[-35.39837527516,-8.94469388451],[-35.39837527516,-8.93914556972],[-35.4010741005,-8.93915302719],[-35.40106277676,-8.93895167547],[-35.4016667097,-8.93893676052],[-35.40172710299,-8.93687849204],[-35.40236123258,-8.93687849204],[-35.40236123258,-8.9362818903],[-35.40323693535,-8.93640121073],[-35.40329732865,-8.93583443836],[-35.40426362135,-8.93580460821],[-35.40420322806,-8.93362700074],[-35.40574325706,-8.93359717041],[-35.40577345371,-8.93124056665],[-35.40809859554,-8.93133005821],[-35.40803820225,-8.92927174677],[-35.40936685472,-8.92930157745],[-35.40927626478,-8.92739240878],[-35.41084649043,-8.92742223962],[-35.41084649043,-8.92542356812],[-35.41238651943,-8.92545339912],[-35.41235632279,-8.92390218397],[-35.41335281214,-8.92387235285],[-35.41329241885,-8.92193332448],[-35.41522500426,-8.92196315577],[-35.41522500426,-8.91999428582],[-35.41655365674,-8.92002411726],[-35.41655365674,-8.91754809927],[-35.4196035181,-8.91754809927],[-35.41966391139,-8.91963630832],[-35.42183806999,-8.91963630832],[-35.42186826663,-8.92264927462],[-35.42389144199,-8.92267910584],[-35.42392163864,-8.92512525801],[-35.4253710777,-8.92512525801],[-35.4253710777,-8.92766088623],[-35.42724326982,-8.92766088623],[-35.42727346647,-8.92986835998],[-35.42814916924,-8.92983852934],[-35.42817936588,-8.93159853276],[-35.42987037812,-8.93153887177],[-35.42990057477,-8.93407445539],[-35.43141040713,-8.93407445539],[-35.43141040713,-8.9355957971],[-35.43225591325,-8.93556596693],[-35.43228610989,-8.93586426851],[-35.43340338584,-8.93583443836],[-35.43340338584,-8.94001063511],[-35.4343394819,-8.94004046492],[-35.4343394819,-8.94096518765],[-35.43530577461,-8.94096518765],[-35.43533597125,-8.94260581897],[-35.43566813437,-8.94263564856],[-35.43569833102,-8.94329189897],[-35.43627206732,-8.94332172851],[-35.43624187067,-8.94421661344],[-35.43729875332,-8.94421661344],[-35.43726855667,-8.94520098434],[-35.43823484938,-8.94520098434],[-35.43826504603,-8.94684159657],[-35.4390199622,-8.94687142582],[-35.4390199622,-8.94797510616],[-35.44025802474,-8.94797510616],[-35.44031841803,-8.94952621882],[-35.44158667721,-8.94955604785],[-35.4416470705,-8.95152475808],[-35.4427341498,-8.95152475808],[-35.4427341498,-8.95334431412],[-35.44436476875,-8.95334431412],[-35.44436476875,-8.95498488964],[-35.44569342122,-8.95501471821],[-35.44563302793,-8.9567447715],[-35.44720325358,-8.95680442836],[-35.44717305693,-8.95865378627],[-35.44895465911,-8.95871344282],[-35.44892446246,-8.95999605627],[-35.45100803112,-8.95993639993],[-35.45097783447,-8.96101021254],[-35.45469202207,-8.96095055636],[-35.45466182542,-8.96235247383],[-35.46048977832,-8.96235247383],[-35.46055017161,-8.96557388071],[-35.46652910774,-8.96548439758],[-35.46658950104,-8.9688549139],[-35.46770677698,-8.96882508646],[-35.46773697363,-8.97052524668],[-35.47389708964,-8.97052524668],[-35.47398767958,-8.97529758369],[-35.47791324371,-8.97520810295],[-35.47797363701,-8.97816095576],[-35.48410355637,-8.97813112908],[-35.48416394967,-8.98200857638],[-35.49083740868,-8.98194892366],[-35.49083740868,-8.98561754775],[-35.49720890123,-8.98561754775],[-35.49720890123,-8.99068794266],[-35.5022517413,-8.99056864006],[-35.50234233124,-8.99566879088],[-35.5064792719,-8.99566879088],[-35.50650946855,-8.99856182695],[-35.51203545497,-8.99850217696],[-35.51206565162,-9.00163378838],[-35.51662534534,-9.00166361312],[-35.51665554198,-9.00616712068],[-35.52118503905,-9.00613729631],[-35.5212152357,-9.00738991769],[-35.5312707192,-9.00733026915],[-35.5312707192,-9.01064074815],[-35.54818084159,-9.01049162813],[-35.54818084159,-9.01359331193],[-35.56968085435,-9.01344419313],[-35.56974124764,-9.01738090893],[-35.58574547062,-9.01732126204],[-35.58577566727,-9.01994571582],[-35.60957062521,-9.01982642288],[-35.60954042856,-9.02301749544],[-35.62910785591,-9.02286838053],[-35.62904746261,-9.02507527493],[-35.65220829096,-9.02489633805],[-35.65223848761,-9.02758038195],[-35.67552010255,-9.02740144631],[-35.6755502992,-9.03056262951],[-35.68294847774,-9.03056262951],[-35.68297867439,-9.03435004835],[-35.69128275235,-9.03432022631],[-35.69128275235,-9.03766027947],[-35.69949624037,-9.03760063593],[-35.69949624037,-9.04034422831],[-35.70668304239,-9.04031440677],[-35.70671323904,-9.04517528582],[-35.71115214617,-9.04517528582],[-35.71133332605,-9.06691424164],[-35.70870621775,-9.06691424164],[-35.70876661104,-9.07869268732],[-35.7065622558,-9.07872250568],[-35.7065622558,-9.08653483029],[-35.70429750727,-9.08653483029],[-35.70432770391,-9.09103727588],[-35.69991899343,-9.09106709321],[-35.69988879679,-9.09559929877],[-35.69535929972,-9.09556948181],[-35.69541969301,-9.1000121806],[-35.69092039259,-9.10013144692],[-35.69101098253,-9.10206951907],[-35.63366754962,-9.10245713224],[-35.63369774627,-9.10540894182],[-35.62584661802,-9.10552820634],[-35.62590701131,-9.10964280796],[-35.6223136103,-9.10964280796],[-35.62234380695,-9.11202806257],[-35.61989787853,-9.11199824698],[-35.61989787853,-9.11500960843],[-35.61473425187,-9.11506923909],[-35.61473425187,-9.11706686056],[-35.61177498045,-9.11700723023],[-35.6118051771,-9.11819983493],[-35.60960082186,-9.11825946506],[-35.60963101851,-9.12571315292],[-35.59975671489,-9.12583241066],[-35.59978691154,-9.12923123948],[-35.59634449377,-9.12926105363],[-35.59640488706,-9.13501513686],[-35.59196597993,-9.13507476418],[-35.59208676652,-9.14899746988],[-35.59018437775,-9.14896765739],[-35.5901541811,-9.15108433815],[-35.60159871037,-9.15105452583],[-35.60153831707,-9.14911671983],[-35.60552427449,-9.14911671983],[-35.60549407785,-9.14556901687],[-35.61183537375,-9.14553920409],[-35.61183537375,-9.14234922223],[-35.61760293335,-9.14237903528],[-35.6175727367,-9.13853313161],[-35.62400462254,-9.13853313161],[-35.62397442589,-9.13465737274],[-35.63176516085,-9.13465737274],[-35.63164437426,-9.13063250159],[-35.6392237327,-9.13060268756],[-35.63919353605,-9.12878402702],[-35.66386419676,-9.12869458446],[-35.66380380346,-9.12610074043],[-35.71278276511,-9.12577278179],[-35.71275256846,-9.12407335495],[-35.72425749102,-9.12401372579],[-35.71963740401,-9.15323081845],[-35.72111703972,-9.15320100631],[-35.72123782631,-9.17257836825],[-35.72066409001,-9.17254855774],[-35.72081507325,-9.18557551362],[-35.71211843887,-9.18566494187],[-35.71329610811,-9.34415573683],[-35.69040704959,-9.34433451257],[-35.69064862276,-9.3718946735],[-35.68898780717,-9.3718946735],[-35.68901800382,-9.37597637093],[-35.68756856476,-9.37597637093],[-35.6876591547,-9.38232227231],[-35.6849716531,-9.38235206501],[-35.6850320464,-9.39093225328],[-35.68168021856,-9.39099183718],[-35.68177080851,-9.39936327296],[-35.67715072149,-9.39933348173],[-35.67724131144,-9.40889633403],[-35.6729231909,-9.40892612443],[-35.67301378084,-9.41753544361],[-35.6697223463,-9.41759502292],[-35.66978273959,-9.42498277846],[-35.66721602459,-9.42498277846],[-35.66727641788,-9.43269804791],[-35.6607539421,-9.43287677797],[-35.6607539421,-9.43704711987],[-35.65130239155,-9.43707690785],[-35.65142317814,-9.44211103864],[-35.64514227553,-9.44217061371],[-35.64523286547,-9.44651956613],[-35.63644564116,-9.44660892759],[-35.63644564116,-9.44991528532],[-35.62711487719,-9.4500046459],[-35.62726586043,-9.46504667925],[-35.62086417124,-9.46510625035],[-35.62092456453,-9.47219513764],[-35.60938944533,-9.47222492257],[-35.60938944533,-9.47529275674],[-35.59673705018,-9.47535232607],[-35.59673705018,-9.47350567221],[-35.57843788202,-9.47371416589],[-35.57846807866,-9.47594801874],[-35.57267032241,-9.47603737255],[-35.57270051906,-9.48041568084],[-35.56823141529,-9.48047524927],[-35.56826161193,-9.48881472807],[-35.54168856246,-9.48893386201],[-35.54162816916,-9.48071352291],[-35.523842344,-9.48089222803]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"arapiraca_al","name":"Arapiraca AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.60875162133,-9.83071802463],[-36.60783704041,-9.74047303963],[-36.61718167158,-9.74051223078],[-36.61630685505,-9.65075247124],[-36.70736730351,-9.64977242883],[-36.70832164882,-9.74043384847],[-36.69897701764,-9.74047303963],[-36.69997112734,-9.82967973955],[-36.60875162133,-9.83071802463]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"CRAIG-Auvergne-2016","name":"Auvergne - 2016 - 25 cm - CRAIG","type":"tms","template":"http://tiles.craig.fr/ortho/tms/1.0.0/ortho_2016/webmercator/{zoom-1}/{x}/{-y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","polygon":[[[2.493891,46.6682909],[2.7136176,46.8414109],[3.6474555,46.8075834],[4.0484565,46.4832686],[4.0374701,46.2482538],[4.4604438,46.2596487],[4.4934028,46.1455925],[4.3835395,46.0922853],[4.4549506,45.6908367],[4.7625678,45.5717589],[4.8120063,45.344428],[4.2242377,44.8441895],[3.8616889,44.6959969],[3.3782905,44.8052283],[3.3343451,44.8909082],[3.1805365,44.8247122],[3.0322211,44.6061167],[2.927851,44.6022057],[2.7191108,44.8519786],[2.5103705,44.6022057],[2.125849,44.5826468],[2.0049994,44.9725746],[2.3071235,45.4678399],[2.4334662,45.4408666],[2.4114936,45.7291949],[2.3455756,45.8240183],[2.5488227,45.9797905],[2.4609321,46.2216563],[2.2137397,46.3393472],[2.2782844,46.5390305],[2.5488227,46.5664179],[2.493891,46.6682909]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{"id":"CRAIG-Auvergne-2013","name":"Auvergne 2013 25cm CRAIG","type":"tms","template":"http://tiles.craig.fr/osm/tms/1.0.0/ortho_2013/webmercator/{zoom-1}/{x}/{-y}.jpeg","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","polygon":[[[2.9401192,44.6338837],[2.9971896,44.633931],[2.9971676,44.6473385],[3.0159744,44.6473541],[3.0159305,44.6741168],[3.0349486,44.6741326],[3.0349036,44.7015216],[3.0536338,44.7015371],[3.0535675,44.7418954],[3.0723301,44.741911],[3.0722196,44.8091687],[3.0921583,44.8091852],[3.092137,44.8221252],[3.1301398,44.8221567],[3.1300495,44.8770722],[3.1485587,44.8770875],[3.1485807,44.8636964],[3.1682313,44.8637126],[3.1682538,44.8500261],[3.2064,44.8500576],[3.2063789,44.8628393],[3.2439492,44.8628704],[3.2439263,44.8767893],[3.2631452,44.8768052],[3.2630782,44.9175197],[3.3200437,44.9175667],[3.3200227,44.9303336],[3.3390815,44.9303493],[3.3390586,44.9441978],[3.3769989,44.9442292],[3.3770218,44.9302879],[3.396031,44.9303036],[3.39612,44.8762713],[3.4148252,44.8762867],[3.4148923,44.8355255],[3.4333371,44.8355408],[3.4333819,44.8082784],[3.4525549,44.8082943],[3.4525774,44.7946344],[3.5089262,44.7946811],[3.508904,44.8081469],[3.604265,44.8082258],[3.6042213,44.8348239],[3.6236136,44.83484],[3.6235695,44.8616583],[3.6424823,44.8616739],[3.642549,44.821102],[3.6610055,44.8211172],[3.6610275,44.8077696],[3.6992999,44.8078013],[3.6992782,44.820994],[3.7361139,44.8210245],[3.7361819,44.7797075],[3.7751058,44.7797397],[3.775151,44.7522344],[3.8118352,44.7522648],[3.8118567,44.7392021],[3.8311822,44.7392181],[3.8312061,44.7246766],[3.887824,44.7247235],[3.8878019,44.7381833],[3.925626,44.7382146],[3.9256039,44.7516682],[3.9454097,44.7516846],[3.9453656,44.7784691],[3.9643737,44.7784848],[3.9643516,44.7919273],[4.0033183,44.7919596],[4.0032964,44.8052575],[4.0216937,44.8052727],[4.0216718,44.8185687],[4.0596515,44.8186001],[4.0596082,44.8449216],[4.0798132,44.8449383],[4.0797928,44.8573502],[4.173882,44.857428],[4.1738604,44.8705468],[4.1932576,44.8705628],[4.193235,44.8842744],[4.2140385,44.8842916],[4.2139961,44.9100242],[4.2324138,44.9100394],[4.2323689,44.9373093],[4.2715486,44.9373416],[4.2715273,44.9502971],[4.3288672,44.9503445],[4.3287793,45.0036659],[4.3489259,45.0036825],[4.3489038,45.0170656],[4.4060793,45.0171127],[4.4059904,45.0710024],[4.3884707,45.0709879],[4.3884482,45.0845976],[4.407943,45.0846137],[4.4079231,45.09663],[4.4843608,45.0966929],[4.4842941,45.1370472],[4.4663631,45.1370324],[4.4663413,45.1502035],[4.4864469,45.15022],[4.4864022,45.1772415],[4.5065524,45.177258],[4.5064402,45.2450058],[4.4881342,45.2449908],[4.4881106,45.2592077],[4.4698588,45.2591927],[4.469836,45.2729835],[4.4508849,45.2729679],[4.4508626,45.2864203],[4.3936753,45.2863733],[4.3936303,45.3135182],[4.3750893,45.3135029],[4.3750662,45.3274054],[4.3950734,45.3274218],[4.3950283,45.3545849],[4.3767871,45.35457],[4.3767639,45.3685486],[4.3576564,45.3685329],[4.3576335,45.3823359],[4.2814576,45.3822734],[4.2814334,45.3968834],[4.2444556,45.3968531],[4.2444325,45.4107893],[4.1481178,45.4107104],[4.1481388,45.3980659],[4.1291913,45.3980504],[4.1292145,45.3840899],[4.0902138,45.3840579],[4.0902351,45.3712093],[4.0135507,45.3711464],[4.0135259,45.3860975],[3.9170932,45.3860185],[3.9170704,45.3997355],[3.9375703,45.3997523],[3.9375481,45.4131142],[3.975277,45.4131451],[3.9752552,45.4262061],[3.9953725,45.4262226],[3.9956999,45.5209568],[3.9777821,45.5209421],[3.977693,45.5743873],[3.9581755,45.5743714],[3.9581522,45.5883658],[3.9396019,45.5883506],[3.9395781,45.6026212],[3.9202279,45.6026054],[3.9202048,45.6164603],[3.8818916,45.616429],[3.8818468,45.643276],[3.8441329,45.6432453],[3.8441098,45.6570896],[3.8261689,45.657075],[3.8261241,45.6838865],[3.8072175,45.6838711],[3.8071277,45.7375802],[3.7882101,45.7375648],[3.7881863,45.7517966],[3.7688482,45.7517809],[3.7688028,45.7789651],[3.750719,45.7789504],[3.7505822,45.8606554],[3.7696692,45.8606709],[3.7695793,45.914333],[3.751661,45.9143185],[3.7516379,45.9280879],[3.7328974,45.9280727],[3.7328527,45.9547155],[3.8101795,45.9547782],[3.8101569,45.9682278],[3.8495994,45.9682598],[3.8495098,46.0216192],[3.8318849,46.0216049],[3.8317936,46.0759058],[3.8505037,46.0759209],[3.8504583,46.1029545],[3.8324727,46.10294],[3.8323353,46.1845598],[3.8142194,46.1845452],[3.8141522,46.2244234],[3.8336864,46.2244392],[3.8336634,46.2381001],[3.8528929,46.2381156],[3.8528703,46.2514729],[3.8931424,46.2515054],[3.8931205,46.2644677],[3.9130562,46.2644838],[3.9130335,46.2779317],[3.9518926,46.2779631],[3.9518709,46.2908227],[3.971523,46.2908386],[3.9715012,46.3036947],[4.0105021,46.3037261],[4.0104784,46.3177638],[4.0298278,46.3177794],[4.029783,46.3442827],[4.0116018,46.344268],[4.0114647,46.4253437],[4.031532,46.4253598],[4.0314635,46.4657978],[4.0132435,46.4657832],[4.0132204,46.479378],[3.9943703,46.4793629],[3.9943461,46.4936113],[3.9745971,46.4935955],[3.9745735,46.5075278],[3.8775423,46.5074499],[3.8774959,46.5347758],[3.8583577,46.5347605],[3.8583347,46.5483156],[3.8186897,46.5482838],[3.8187114,46.5355316],[3.7992386,46.535516],[3.7992156,46.5490706],[3.7610377,46.5490399],[3.7609226,46.6168059],[3.7423295,46.616791],[3.7422834,46.6439624],[3.7228558,46.6439468],[3.7228098,46.6710357],[3.7038706,46.6710206],[3.7038474,46.6846709],[3.6841096,46.6846551],[3.6840631,46.711998],[3.6648359,46.7119826],[3.6647898,46.7390375],[3.6457623,46.7390222],[3.6457158,46.7663375],[3.6257542,46.7663216],[3.6257314,46.7797093],[3.5672301,46.7796626],[3.5672528,46.7663082],[3.5471462,46.7662922],[3.5471922,46.7392824],[3.5271621,46.7392664],[3.5272308,46.6988967],[3.4877399,46.6988651],[3.4877618,46.685943],[3.4679636,46.6859272],[3.4679407,46.6994059],[3.4679179,46.7127907],[3.4486497,46.7127753],[3.4486258,46.7267878],[3.350433,46.7267092],[3.3504786,46.6999004],[3.3303913,46.6998843],[3.3303448,46.7271984],[3.2327174,46.7271203],[3.2327406,46.7135148],[3.2129042,46.7134989],[3.212927,46.7001302],[3.1735446,46.7000987],[3.173498,46.7275094],[3.1541227,46.7274939],[3.1541002,46.7407271],[3.1147772,46.7406957],[3.114754,46.7542756],[3.0753432,46.7542441],[3.0752971,46.7813548],[3.05597,46.7813394],[3.055924,46.8083069],[2.99704,46.8082598],[2.9970166,46.8219593],[2.9379443,46.8219121],[2.9379675,46.8082604],[2.8986634,46.808229],[2.8986872,46.7942392],[2.878991,46.7942234],[2.8790134,46.7810427],[2.8594188,46.781027],[2.8594415,46.7677056],[2.8400446,46.7676901],[2.8400671,46.754466],[2.7414032,46.7543871],[2.741382,46.7668245],[2.7023351,46.7667932],[2.7023571,46.7538869],[2.6826621,46.7538711],[2.6826849,46.7404752],[2.6634875,46.7404599],[2.6635123,46.7258966],[2.6434164,46.7258805],[2.6434382,46.7130938],[2.6241432,46.7130784],[2.6241658,46.6998093],[2.6039699,46.6997931],[2.6039936,46.6858433],[2.5651245,46.6858122],[2.5651469,46.6726126],[2.5459278,46.6725972],[2.5459966,46.6321534],[2.5659222,46.6321694],[2.565946,46.6181104],[2.5456397,46.6180941],[2.5456862,46.5907192],[2.5664225,46.5907358],[2.5664449,46.5775417],[2.5854963,46.577557],[2.5855181,46.5647199],[2.5661318,46.5647044],[2.5661557,46.5506246],[2.468279,46.5505461],[2.4683039,46.5358205],[2.3321246,46.5357112],[2.3321701,46.5088566],[2.3126474,46.5088409],[2.3126703,46.4953444],[2.2928767,46.4953285],[2.2928996,46.4818182],[2.2748687,46.4818037],[2.2749151,46.4544154],[2.2553921,46.4543997],[2.255529,46.3734888],[2.275948,46.3735052],[2.276037,46.3208741],[2.3145615,46.3209052],[2.3145849,46.3070421],[2.3537075,46.3070737],[2.3537313,46.2929669],[2.3938428,46.2929992],[2.3938862,46.2672854],[2.4515727,46.267332],[2.451596,46.2534921],[2.4709353,46.2535077],[2.4709807,46.2265552],[2.4915062,46.2265718],[2.4915521,46.199329],[2.5108806,46.1993446],[2.5109254,46.1727799],[2.5311728,46.1727963],[2.5313772,46.051352],[2.5516349,46.0513684],[2.5516577,46.0377665],[2.5705635,46.0377818],[2.5706774,45.9699434],[2.5514356,45.9699278],[2.551458,45.9566151],[2.5322621,45.9565995],[2.5322849,45.9430066],[2.5130653,45.942991],[2.513134,45.9020279],[2.4749412,45.9019969],[2.4749633,45.8888235],[2.4361947,45.888792],[2.4362172,45.8753288],[2.417209,45.8753133],[2.4172548,45.8479368],[2.3784736,45.8479053],[2.378497,45.8339746],[2.3595157,45.8339592],[2.3595606,45.8070849],[2.3787254,45.8071005],[2.3787481,45.7935783],[2.3986981,45.7935945],[2.3987203,45.7803477],[2.4182486,45.7803636],[2.4183161,45.7400007],[2.4572171,45.7400324],[2.4572394,45.7266956],[2.4758919,45.7267107],[2.4759144,45.7132391],[2.49533,45.7132549],[2.4954204,45.6591268],[2.4576942,45.659096],[2.4577622,45.618343],[2.4391188,45.6183278],[2.4391866,45.5776619],[2.4585044,45.5776777],[2.4585496,45.5505348],[2.4780887,45.5505508],[2.4781108,45.5372464],[2.4975506,45.5372623],[2.4975949,45.5106757],[2.4785536,45.5106601],[2.4786444,45.4561337],[2.4597798,45.4561183],[2.4598701,45.401757],[2.4224876,45.4017264],[2.4224651,45.4152816],[2.4023154,45.4152651],[2.4022929,45.4288193],[2.3256006,45.4287565],[2.3256684,45.3879609],[2.3456182,45.3879773],[2.3456629,45.3611091],[2.326256,45.3610932],[2.326279,45.3472146],[2.3073819,45.3471991],[2.3074045,45.3335972],[2.2881095,45.3335813],[2.2881307,45.3208191],[2.2696332,45.3208039],[2.2696574,45.306212],[2.2506602,45.3061964],[2.2506828,45.2925147],[2.2316866,45.2924992],[2.2317086,45.2792355],[2.2130009,45.2792202],[2.213046,45.2520355],[2.1937387,45.2520197],[2.1937617,45.2381134],[2.1756091,45.2380985],[2.1757423,45.1576822],[2.1573543,45.157667],[2.1574448,45.1029478],[2.1202408,45.1029172],[2.1202629,45.0895468],[2.1006669,45.0895306],[2.1006902,45.0754441],[2.0824591,45.0754291],[2.082548,45.0215961],[2.1025534,45.0216126],[2.1025982,44.994453],[2.0457406,44.9944061],[2.0458508,44.9275321],[2.0657794,44.9275486],[2.0658912,44.8596881],[2.0856964,44.8597044],[2.0857193,44.8458126],[2.1055593,44.8458291],[2.1056029,44.8193264],[2.124743,44.8193422],[2.1247657,44.805512],[2.1435067,44.8055275],[2.143551,44.778597],[2.1256091,44.7785822],[2.1256984,44.7242739],[2.1066459,44.7242581],[2.1067116,44.6842263],[2.1263414,44.6842426],[2.1263635,44.670735],[2.14598,44.6707513],[2.146069,44.6164441],[2.1839622,44.6164756],[2.183983,44.6037819],[2.2404173,44.6038288],[2.2403728,44.6309515],[2.25948,44.6309674],[2.2594571,44.644934],[2.316678,44.6449815],[2.3167011,44.6308801],[2.3361516,44.6308963],[2.3361734,44.6175824],[2.3724238,44.6176125],[2.3724009,44.6315823],[2.4110495,44.6316144],[2.4110701,44.6190741],[2.4492173,44.6191058],[2.4491956,44.6323197],[2.5048575,44.6323659],[2.5048126,44.6597555],[2.5246119,44.6597719],[2.524567,44.6871739],[2.5422544,44.6871886],[2.5422313,44.70122],[2.5807101,44.701252],[2.5805999,44.7683374],[2.61769,44.7683681],[2.6176235,44.808838],[2.6367564,44.8088539],[2.6366899,44.8492948],[2.6733105,44.8493251],[2.6732888,44.8625164],[2.6933766,44.862533],[2.6933323,44.8894303],[2.7305201,44.8894611],[2.7304757,44.9164461],[2.7499202,44.9164622],[2.7500519,44.8364688],[2.8073346,44.8365162],[2.8073139,44.8491017],[2.8263796,44.8491175],[2.8264007,44.8362845],[2.8457039,44.8363004],[2.8457707,44.7957107],[2.8642166,44.795726],[2.8642611,44.7686452],[2.8839885,44.7686615],[2.8840323,44.7419697],[2.9020315,44.7419846],[2.9021426,44.6743192],[2.9219777,44.6743357],[2.9220221,44.6472986],[2.9400972,44.6473136],[2.9401192,44.6338837]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"Orthophotographie CRAIG/Sintegra/IGN 2013"},{"id":"BANO","name":"BANO","type":"tms","template":"http://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)","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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"basemap.at","description":"Basemap of Austria, based on goverment data.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"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","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"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-DOP80","name":"Bavaria DOP 80cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,18],"polygon":[[[10.1235886,50.568462],[10.1428576,50.5507804],[10.2028056,50.5574195],[10.2520485,50.5179575],[10.3269835,50.4934473],[10.4104825,50.4184762],[10.6031724,50.3310874],[10.6224414,50.2271041],[10.7252093,50.2106649],[10.7294913,50.2476451],[10.8515282,50.2435376],[10.7187863,50.3201525],[10.7123633,50.3652428],[10.8558102,50.3966441],[10.9371682,50.3966441],[10.9906932,50.3666085],[11.1277171,50.3666085],[11.1791011,50.3133169],[11.1619731,50.294172],[11.24119,50.2928042],[11.249754,50.3734364],[11.24119,50.479825],[11.358945,50.5234025],[11.4381619,50.5097889],[11.4424439,50.4893611],[11.425316,50.4771001],[11.425316,50.4416618],[11.4895459,50.4225686],[11.4916869,50.3980089],[11.5195199,50.3980089],[11.5259429,50.3761673],[11.5987369,50.4034677],[11.6372748,50.3884544],[11.7935678,50.4212045],[11.8363877,50.3925494],[11.9220277,50.4280246],[11.9862577,50.3870894],[11.9841167,50.3570478],[12.0483466,50.3310874],[12.0933076,50.3297207],[12.1297046,50.2982751],[12.1404096,50.2722826],[12.1061536,50.255859],[12.1125766,50.2353216],[12.1489736,50.236691],[12.1982166,50.2010728],[12.2239086,50.1640565],[12.2046396,50.1434795],[12.2067806,50.1077916],[12.2431775,50.0995522],[12.2774335,50.0720772],[12.4936744,49.985428],[12.4979564,49.9413559],[12.5557634,49.9220616],[12.5493404,49.8682726],[12.4808284,49.7881677],[12.4101755,49.7577484],[12.4615594,49.7065456],[12.5471994,49.6802313],[12.5878784,49.552613],[12.6542493,49.534553],[12.6628133,49.4330153],[12.7527353,49.4107323],[12.7976963,49.3466124],[12.9047462,49.3563752],[12.9968092,49.3368477],[13.0546161,49.2754251],[13.1316921,49.2195199],[13.1916401,49.1439475],[13.236601,49.1215335],[13.296549,49.1229347],[13.371484,49.0808823],[13.414304,49.0289687],[13.414304,48.9798112],[13.5791609,48.9699739],[13.6348268,48.9432629],[13.6776468,48.8869823],[13.7375948,48.8926132],[13.7846968,48.8334571],[13.8403627,48.774231],[13.8168118,48.7064584],[13.8446447,48.7008065],[13.8425037,48.6003807],[13.7654278,48.5422972],[13.7525818,48.5040106],[13.6712238,48.5054291],[13.6433908,48.5437146],[13.4571239,48.5508013],[13.4571239,48.4159838],[13.40574,48.3605338],[13.283703,48.2751083],[13.0931541,48.2694081],[12.9582712,48.1909669],[12.8769132,48.1852574],[12.7720043,48.0938188],[12.8640672,48.0136764],[12.8983232,47.9549216],[12.9454252,47.9563555],[12.9968092,47.8846147],[13.0139372,47.834337],[12.9347202,47.7321953],[13.0588981,47.7249947],[13.1188461,47.6385093],[13.0653211,47.5692178],[13.0567571,47.473792],[13.0032322,47.4520801],[12.7677223,47.5504355],[12.7698633,47.6327385],[12.7398893,47.6731207],[12.6670953,47.6702373],[12.5750324,47.621195],[12.4808284,47.6197519],[12.4144575,47.6702373],[12.2431775,47.6774455],[12.2132036,47.6918589],[12.1917936,47.6817699],[12.2132036,47.6659119],[12.2110626,47.603875],[12.1746656,47.5952129],[12.1382686,47.603875],[11.8920537,47.603875],[11.8513747,47.5793285],[11.6394158,47.5822169],[11.5944549,47.5489905],[11.5901729,47.5128508],[11.5173789,47.498388],[11.4403029,47.5041736],[11.395342,47.4752392],[11.427457,47.4448409],[11.346099,47.4433929],[11.279728,47.3955873],[11.2133571,47.3883402],[11.247613,47.4318076],[11.1020251,47.3926886],[10.9650012,47.3897897],[10.9778472,47.4361524],[10.9178992,47.4752392],[10.8707972,47.4752392],[10.8558102,47.4940484],[10.9007712,47.5142969],[10.8729382,47.5359831],[10.8108493,47.5128508],[10.6438513,47.5489905],[10.5946084,47.5547705],[10.5796214,47.5287553],[10.4618664,47.5403192],[10.4661484,47.4839212],[10.4875584,47.4781333],[10.4875584,47.4129762],[10.4597254,47.4028333],[10.4597254,47.375293],[10.4104825,47.3738431],[10.4083415,47.3433862],[10.3205605,47.2867768],[10.2820225,47.2780622],[10.2841635,47.2620819],[10.1471396,47.2620819],[10.1921006,47.3027497],[10.1942416,47.3738431],[10.1664086,47.3738431],[10.1664086,47.3462876],[10.1000376,47.3433862],[10.0614996,47.3636928],[10.0679226,47.4187712],[10.0936146,47.426014],[10.0957556,47.4419449],[9.9780007,47.485368],[9.9565907,47.5273097],[9.8945017,47.5287553],[9.8559637,47.5085124],[9.8174258,47.544655],[9.8217078,47.5764399],[9.7746058,47.5822169],[9.7382088,47.525864],[9.6739788,47.5345376],[9.5840569,47.564884],[9.6397228,47.6053186],[9.7167988,47.603875],[9.8559637,47.6760039],[9.9780007,47.6558179],[10.0293846,47.6817699],[10.1000376,47.6673537],[10.1321526,47.6760039],[10.1428576,47.7019459],[10.0614996,47.7725005],[10.1128836,47.8098988],[10.0829096,47.8530173],[10.1086016,47.9090177],[10.0764866,47.9649577],[10.1300116,48.020837],[10.1342936,48.1066872],[10.1000376,48.1281274],[10.0550766,48.2622821],[9.9694367,48.3676462],[10.0315256,48.4259299],[10.0293846,48.461436],[10.1235886,48.4770509],[10.1535626,48.4514968],[10.2349205,48.5125212],[10.3162785,48.516776],[10.2991505,48.6187835],[10.2456255,48.6682961],[10.2734585,48.7064584],[10.3698035,48.6838472],[10.4318924,48.6993935],[10.4511614,48.7276471],[10.4019185,48.7460035],[10.4404564,48.8489571],[10.4340334,48.9587289],[10.3376885,49.0205451],[10.2499075,49.0359872],[10.2499075,49.0738701],[10.2006646,49.1033147],[10.2520485,49.1327418],[10.1235886,49.1971401],[10.1193066,49.2628519],[10.1514216,49.2893915],[10.1043196,49.3452175],[10.1407166,49.3940134],[10.1086016,49.445545],[10.1107426,49.5053651],[10.0722046,49.5331635],[10.0165387,49.4761598],[9.9266167,49.478942],[9.9244757,49.5567797],[9.8987837,49.5817727],[9.8559637,49.5387213],[9.8067208,49.5567797],[9.8666687,49.6067529],[9.8538227,49.6441991],[9.8174258,49.6608327],[9.8345537,49.6899277],[9.7960158,49.7203895],[9.7574778,49.7079302],[9.7403498,49.6857723],[9.7060938,49.7162368],[9.6782608,49.7162368],[9.6825428,49.6885426],[9.6204539,49.6913127],[9.6461458,49.78955],[9.5583649,49.7743431],[9.5712109,49.7356133],[9.5069809,49.7522156],[9.4919939,49.7798735],[9.4684429,49.7605146],[9.425623,49.7784909],[9.404213,49.7646636],[9.33356,49.770195],[9.329278,49.7342295],[9.408495,49.725926],[9.427764,49.6982374],[9.414918,49.6441991],[9.380662,49.6386533],[9.359252,49.6497443],[9.339983,49.6372668],[9.31215,49.648358],[9.277894,49.626173],[9.284317,49.6081403],[9.241497,49.5748315],[9.0980501,49.5720547],[9.0659351,49.6081403],[9.1001911,49.6511305],[9.0916271,49.6926978],[9.1301651,49.7120837],[9.1387291,49.7425316],[9.1087551,49.7563653],[9.1365881,49.7909322],[9.1001911,49.78955],[9.0723581,49.8282367],[9.0359611,49.8351418],[9.0166922,50.0267091],[8.9631672,50.0308352],[8.9567442,50.0597083],[9.0017052,50.0707031],[9.0209742,50.1105378],[9.1216011,50.1228936],[9.1558571,50.1132838],[9.1965361,50.1187753],[9.1858311,50.1352462],[9.235074,50.1475956],[9.37638,50.1270115],[9.408495,50.0816953],[9.5219679,50.095432],[9.5048399,50.1421073],[9.5326729,50.1640565],[9.4898529,50.1695422],[9.4941349,50.2435376],[9.6140309,50.221625],[9.6654148,50.2353216],[9.6354408,50.2490142],[9.6675558,50.2722826],[9.7424908,50.3092151],[9.7296448,50.3584137],[9.7703238,50.4293885],[9.8688097,50.4007384],[9.9180527,50.4089259],[10.0358076,50.479825],[10.0379486,50.5111504],[10.1235886,50.568462]]],"best":true},{"id":"route500hydro","name":"BD Carthage","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png","scaleExtent":[6,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,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","overlay":true},{"id":"fr.ign.bdortho","name":"BDOrtho IGN","type":"tms","template":"https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg","scaleExtent":[2,21],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]],[[-61.2750098,14.9021787],[-60.7236843,14.9010106],[-60.7248947,14.3668637],[-61.2762202,14.3680347],[-61.2750098,14.9021787]],[[-61.9280191,16.5861824],[-61.9268639,15.7393966],[-60.8812792,15.7407152],[-60.8824344,16.5874955],[-61.9280191,16.5861824]],[[-53.8934381,6.0040017],[-52.4652154,5.4464962],[-51.5203912,4.5107197],[-51.5368707,4.1163329],[-52.2345025,3.1021265],[-52.6409967,2.251623],[-52.9266412,2.0759672],[-53.7286431,2.2186891],[-54.2010552,2.0320501],[-54.8053033,2.2735786],[-54.3109185,2.8058902],[-54.3164117,3.2008539],[-54.124151,3.4640797],[-54.1296441,3.5956655],[-54.4207818,4.0012658],[-54.5800836,4.9596205],[-53.8934381,6.0040017]],[[55.088162,-20.7793549],[55.9595858,-20.7728126],[55.9657599,-21.4900002],[55.0943361,-21.496511],[55.088162,-20.7793549]],[[44.9205447,-12.5736261],[45.3482619,-12.5702887],[45.3527389,-13.116298],[44.9250218,-13.1196281],[44.9205447,-12.5736261]],[[-178.577276,-14.7058162],[-178.4256804,-14.0033368],[-176.3415582,-12.8385765],[-175.7153375,-12.9189012],[-175.9185845,-13.587255],[-177.8463838,-14.6498253],[-178.577276,-14.7058162]]],"terms_url":"http://openstreetmap.fr/bdortho","terms_text":"BDOrtho IGN","best":true,"icon":"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{"id":"GRB","name":"Belgium AGIV GRB Flanders","type":"tms","template":"http://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}","scaleExtent":[0,21],"polygon":[[[5.9849448,50.7072276],[5.9849448,50.7671973],[5.9107871,50.8227527],[5.7556052,50.8353303],[5.7542319,50.8626424],[5.8331961,50.9332328],[5.8551688,51.026611],[5.9094138,51.0775439],[5.9121604,51.1822548],[5.8785147,51.2080728],[5.7741446,51.2368858],[5.684194,51.2407548],[5.6230826,51.2699769],[5.6230826,51.2978925],[5.5399985,51.34724],[5.4473013,51.3485267],[5.3985495,51.321071],[5.3120322,51.3232166],[5.2667136,51.3618196],[5.1994223,51.3725369],[5.1829428,51.3961061],[5.1589102,51.4923992],[5.0833792,51.5308596],[5.0325675,51.539829],[4.9556632,51.5052229],[4.9014182,51.5056503],[4.8382468,51.5436725],[4.7709555,51.5586163],[4.711904,51.5470886],[4.6404929,51.4966741],[4.6144003,51.4971016],[4.5656485,51.5317139],[4.4825644,51.5304324],[4.4262595,51.5218884],[4.3006034,51.4697351],[4.2951102,51.4256575],[4.181127,51.4243731],[4.1371817,51.3952492],[4.138555,51.3506709],[4.0520377,51.3004685],[3.933248,51.272984],[3.8652701,51.2708361],[3.8632102,51.2901637],[3.7629599,51.3240748],[3.5933585,51.359247],[3.4773154,51.3313688],[3.425817,51.3973913],[3.2356162,51.3515286],[3.2260031,51.3656781],[3.1779379,51.3618196],[3.1600852,51.3322268],[3.0625815,51.3021857],[2.7508444,51.1702014],[2.4700064,51.0745241],[2.4926657,50.9937771],[2.5311179,50.9557299],[2.5091452,50.9115907],[2.5304312,50.8214514],[2.5990958,50.7641572],[2.6650138,50.7645915],[2.7700705,50.66677],[2.8970999,50.6589354],[2.991857,50.7254874],[3.1133933,50.7263567],[3.2369895,50.7059231],[3.3626456,50.6585001],[3.4711356,50.7020092],[3.6393637,50.6672052],[3.6984152,50.681565],[3.727941,50.7124454],[3.8185782,50.6841754],[3.8748831,50.6415206],[4.0925498,50.642827],[4.150228,50.6632881],[4.2065329,50.6441333],[4.3136496,50.642827],[4.452352,50.6876557],[4.5347495,50.6780842],[4.6130271,50.6954855],[4.6768851,50.6959204],[4.7270102,50.732007],[4.7805686,50.732007],[4.7997946,50.7128802],[4.8622794,50.7128802],[4.8856253,50.6954855],[4.9611563,50.6954855],[5.0311942,50.6576295],[5.1074118,50.6502288],[5.2007956,50.6489227],[5.2358145,50.6654643],[5.3250784,50.6658995],[5.3669638,50.6820001],[5.4212088,50.6641586],[5.5221457,50.6746032],[5.622396,50.7241834],[5.6752677,50.69853],[5.7398123,50.6972252],[5.7727713,50.6719923],[5.8125968,50.6602413],[5.9080405,50.659806],[5.9849448,50.7072276]]],"terms_text":"GRB Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"AGIV","name":"Belgium AGIV Orthophoto Flanders","type":"tms","template":"http://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}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"Orthophoto Flanders most recent © AGIV","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"Benin_cotonou_pleiade_2016","name":"Benin: Cotonou Pleiade 2016","type":"tms","template":"http://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}","scaleExtent":[0,21],"polygon":[[[2.31953818544,6.55745092536],[2.33645249928,6.56023631702],[2.36377172444,6.56211241002],[2.36737717181,6.56067658005],[2.37777373205,6.54939665325],[2.3777926612,6.53484752744],[2.36994151563,6.4933195729],[2.37038356708,6.45527010853],[2.36958186167,6.45269435578],[2.36188103586,6.44177160245],[2.35391742884,6.40545220189],[2.3674929737,6.40149524022],[2.39525870424,6.40071623744],[2.40128040262,6.40374371884],[2.40587684694,6.40340733291],[2.42045897749,6.39382909301],[2.42485054154,6.3979366042],[2.42949152505,6.39887495342],[2.43625257397,6.39628121034],[2.43958410532,6.40041525877],[2.44439433776,6.40189359345],[2.45375647532,6.39899446003],[2.47144744127,6.3963166199],[2.48162019208,6.3910582748],[2.49453210303,6.38739776192],[2.50893162289,6.38888498676],[2.50719014059,6.39228876781],[2.50120407357,6.39162040687],[2.4963025358,6.39521449649],[2.49509997769,6.40123077776],[2.49543290813,6.40400928653],[2.49830345887,6.41022131795],[2.50191336015,6.41281720321],[2.5108701911,6.41321333458],[2.52218648559,6.40849403999],[2.53352059576,6.4051656109],[2.53809922441,6.40960941297],[2.5411100736,6.41090182623],[2.54650822333,6.41099034757],[2.54654385468,6.40651114868],[2.57638511144,6.40723702943],[2.57642074279,6.41176933466],[2.58575615684,6.41196408125],[2.58867792765,6.41095493903],[2.60877400982,6.39413560832],[2.62569890171,6.39487921149],[2.64554556441,6.39728706193],[2.65039142819,6.39339200408],[2.6536650586,6.36823275735],[2.6431181786,6.3665949733],[2.61251084779,6.3628944474],[2.56867983171,6.3607044406],[2.54682890549,6.36055393954],[2.54687344468,6.35546343647],[2.50206702036,6.35461353888],[2.47064016846,6.35595920942],[2.46777184468,6.35202842507],[2.46422652522,6.35020467258],[2.45253944198,6.35006302163],[2.4511320036,6.34813302357],[2.44737289603,6.34629155079],[2.43757427441,6.34653944174],[2.43297783009,6.33841209773],[2.43016295333,6.33706638135],[2.42244876576,6.33706638135],[2.39236031651,6.34114999999],[2.39315311407,6.34114999999],[2.3652849434,6.34445228474],[2.35386064137,6.34529777247],[2.34377474198,6.34457844399],[2.34093759563,6.34533982549],[2.31086028117,6.36567095094],[2.28434610184,6.37465215648],[2.28146887022,6.37761782314],[2.27599054995,6.39517244756],[2.27611525968,6.39819996182],[2.31528747657,6.4926104105],[2.31579967725,6.5530659484],[2.31953818544,6.55745092536]],[[1.69563043958,6.25076170066],[1.70009994721,6.24711901182],[1.70417862346,6.24697179839],[1.75874803806,6.25835802546],[1.77079143482,6.25995187823],[1.81712109941,6.27161341959],[1.84456614779,6.27656750346],[1.85767848509,6.27944518918],[1.88843363033,6.28325588467],[1.90481876292,6.28594870029],[1.90617692982,6.29435189983],[1.90083111364,6.29721233234],[1.89880903445,6.29953873942],[1.89404334121,6.30085024405],[1.89047742238,6.29969866569],[1.88747882146,6.29636150888],[1.88344050885,6.29622344016],[1.86969682855,6.29226563906],[1.8564007671,6.29198230539],[1.85206654725,6.28674503171],[1.84991419093,6.28906373821],[1.84691224958,6.29202989661],[1.8435272712,6.29332703219],[1.84040507404,6.29315437611],[1.83626738336,6.29129499924],[1.83409832485,6.28733273348],[1.83416513363,6.2851988527],[1.83229560117,6.28456355663],[1.82785949792,6.28644177291],[1.82182443779,6.2908379014],[1.81562903657,6.28997904337],[1.81211044063,6.29143113241],[1.80757635117,6.29570768815],[1.80471693522,6.29692955475],[1.80073513171,6.29709778253],[1.79775991387,6.29612383144],[1.79625448928,6.29491967121],[1.79490049792,6.28965143736],[1.79641483036,6.28608317469],[1.80097564333,6.28338261222],[1.79566657198,6.28013306439],[1.79156005874,6.28174455931],[1.78498607441,6.28122215216],[1.78092410036,6.27752986974],[1.77588226414,6.27550220232],[1.76744654171,6.27696318619],[1.75653444036,6.27496207997],[1.74833032171,6.27238985028],[1.74761769468,6.27726423691],[1.74572477914,6.27938486862],[1.73948038482,6.27984972411],[1.73680357955,6.27761398678],[1.73572127725,6.27891558552],[1.72901812928,6.27911038233],[1.72435487617,6.27422273126],[1.72449294765,6.2678607472],[1.72555966124,6.26683029328],[1.69933944056,6.26159387355],[1.69572953928,6.25725948175],[1.69563043958,6.25076170066]]],"best":true},{"id":"Bing","name":"Bing aerial imagery","type":"bing","template":"http://www.bing.com/maps/","scaleExtent":[0,22],"default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,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"},{"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","scaleExtent":[0,20],"polygon":[[[-0.5992269128228901,45.041932410852176],[-0.542312560140509,45.02756808640373],[-0.509790072893434,45.006014839274926],[-0.4772675856463589,45.002062530648324],[-0.47066145542429677,44.97366975755017],[-0.4554165395272304,44.95101733966983],[-0.4645634890654702,44.91792155099146],[-0.47320227474047455,44.91936089493768],[-0.48793902677430534,44.90928473014602],[-0.49810230403901634,44.89056716544938],[-0.48946351836401203,44.87796537368711],[-0.46659614451841236,44.87076311041642],[-0.4762512579198878,44.84734952959955],[-0.4950533208596031,44.839783107079846],[-0.4909880099537187,44.83185531284354],[-0.46964512769782574,44.825368124499924],[-0.4970859763125452,44.80445999547304],[-0.5245268249272648,44.80013322923096],[-0.5102982367566694,44.76767213918935],[-0.5346901021919757,44.76514662270613],[-0.5621309508066953,44.75107386670688],[-0.5600982953537531,44.7416901252491],[-0.5728023919346418,44.741329181695264],[-0.5946534380537702,44.760095258488434],[-0.6342902193861429,44.73988538494593],[-0.650043299146445,44.7770516622697],[-0.6790086393508712,44.77488729214841],[-0.688155588889111,44.779215951267936],[-0.7150882736405949,44.76839369504671],[-0.7516760717935543,44.74710400814933],[-0.7633638406479719,44.755765166198834],[-0.7384638113494302,44.77560875786918],[-0.7420209583920789,44.785708331523864],[-0.7277923702214837,44.81239155746571],[-0.7399883029391369,44.828611809936305],[-0.7643801683744431,44.82933260413425],[-0.8030006219803447,44.821763815493405],[-0.8400965839965395,44.82753060173851],[-0.8390802562700685,44.840143435448645],[-0.875668054423028,44.8502317148731],[-0.8853231678245034,44.85851719417739],[-0.88684765941421,44.887686999278294],[-0.8660129410215526,44.88696693520083],[-0.8456863864921306,44.8966870397005],[-0.8334904537744775,44.92763642292355],[-0.818245537877411,44.92763642292355],[-0.8019842942538735,44.92223947466319],[-0.7984271472112248,44.94849985224626],[-0.7872475422200427,44.948140202171814],[-0.7557413826994388,44.97007473283782],[-0.7216944038626572,44.95784996320919],[-0.6957780468376442,44.930874348504034],[-0.6886637527523465,44.93447182951288],[-0.6713861814023379,44.93267311717697],[-0.6693535259493957,44.940946727451696],[-0.6251432698479031,44.95065770536977],[-0.6322575639332009,44.95892872413991],[-0.6312412362067297,44.96719855081702],[-0.6002432405493613,44.967558081456815],[-0.5514595096787488,44.97834295278015],[-0.5407880685508023,44.97726455691398],[-0.5545084928581621,44.99739126890938],[-0.5936371103272993,45.01751091397198],[-0.6078656984978945,45.0340324785955],[-0.5992269128228901,45.041932410852176]]],"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","scaleExtent":[14,20],"polygon":[[[-0.5992269128228901,45.041932410852176],[-0.542312560140509,45.02756808640373],[-0.509790072893434,45.006014839274926],[-0.4772675856463589,45.002062530648324],[-0.47066145542429677,44.97366975755017],[-0.4554165395272304,44.95101733966983],[-0.4645634890654702,44.91792155099146],[-0.47320227474047455,44.91936089493768],[-0.48793902677430534,44.90928473014602],[-0.49810230403901634,44.89056716544938],[-0.48946351836401203,44.87796537368711],[-0.46659614451841236,44.87076311041642],[-0.4762512579198878,44.84734952959955],[-0.4950533208596031,44.839783107079846],[-0.4909880099537187,44.83185531284354],[-0.46964512769782574,44.825368124499924],[-0.4970859763125452,44.80445999547304],[-0.5245268249272648,44.80013322923096],[-0.5102982367566694,44.76767213918935],[-0.5346901021919757,44.76514662270613],[-0.5621309508066953,44.75107386670688],[-0.5600982953537531,44.7416901252491],[-0.5728023919346418,44.741329181695264],[-0.5946534380537702,44.760095258488434],[-0.6342902193861429,44.73988538494593],[-0.650043299146445,44.7770516622697],[-0.6790086393508712,44.77488729214841],[-0.688155588889111,44.779215951267936],[-0.7150882736405949,44.76839369504671],[-0.7516760717935543,44.74710400814933],[-0.7633638406479719,44.755765166198834],[-0.7384638113494302,44.77560875786918],[-0.7420209583920789,44.785708331523864],[-0.7277923702214837,44.81239155746571],[-0.7399883029391369,44.828611809936305],[-0.7643801683744431,44.82933260413425],[-0.8030006219803447,44.821763815493405],[-0.8400965839965395,44.82753060173851],[-0.8390802562700685,44.840143435448645],[-0.875668054423028,44.8502317148731],[-0.8853231678245034,44.85851719417739],[-0.88684765941421,44.887686999278294],[-0.8660129410215526,44.88696693520083],[-0.8456863864921306,44.8966870397005],[-0.8334904537744775,44.92763642292355],[-0.818245537877411,44.92763642292355],[-0.8019842942538735,44.92223947466319],[-0.7984271472112248,44.94849985224626],[-0.7872475422200427,44.948140202171814],[-0.7557413826994388,44.97007473283782],[-0.7216944038626572,44.95784996320919],[-0.6957780468376442,44.930874348504034],[-0.6886637527523465,44.93447182951288],[-0.6713861814023379,44.93267311717697],[-0.6693535259493957,44.940946727451696],[-0.6251432698479031,44.95065770536977],[-0.6322575639332009,44.95892872413991],[-0.6312412362067297,44.96719855081702],[-0.6002432405493613,44.967558081456815],[-0.5514595096787488,44.97834295278015],[-0.5407880685508023,44.97726455691398],[-0.5545084928581621,44.99739126890938],[-0.5936371103272993,45.01751091397198],[-0.6078656984978945,45.0340324785955],[-0.5992269128228901,45.041932410852176]]],"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.96968237108,-9.29279539826],[-35.97062650865,-9.20260556139],[-35.97726765817,-9.20263733363],[-35.98365131562,-9.20270087809],[-35.98765317147,-9.20265851512],[-35.99159065431,-9.20274324105],[-36.00498024171,-9.20283855771],[-36.01473275369,-9.20293387434],[-36.01651374048,-9.20295505581],[-36.01871315187,-9.20293387434],[-36.02487150377,-9.20285973919],[-36.02891627496,-9.20296564655],[-36.03307906335,-9.2028915114],[-36.03769246286,-9.20294446508],[-36.04581419175,-9.20299741875],[-36.05160776323,-9.20305037241],[-36.05456892198,-9.20300800948],[-36.06022301858,-9.20303978168],[-36.06190744584,-9.20303978168],[-36.06180015748,-9.21318555747],[-36.06167141145,-9.21805712081],[-36.06156412309,-9.21914791817],[-36.06162849611,-9.22156248675],[-36.06143537706,-9.22276976485],[-36.06139246171,-9.22716464584],[-36.06133881753,-9.23226899309],[-36.06140319055,-9.23391041686],[-36.06144610589,-9.23493762655],[-36.06130663102,-9.23646255088],[-36.0613280887,-9.23773331611],[-36.06142464822,-9.23904643537],[-36.06144610589,-9.24133379272],[-36.0613602752,-9.24229744345],[-36.06141391938,-9.24357877714],[-36.06139246171,-9.24530486392],[-36.06126371568,-9.24726390922],[-36.06123152917,-9.24948767715],[-36.06127444452,-9.25106548492],[-36.0612100715,-9.25517410549],[-36.06118861383,-9.25794845615],[-36.06107059663,-9.2594521027],[-36.0610920543,-9.26183462807],[-36.06105986779,-9.26492659247],[-36.06085601991,-9.27145986606],[-36.06083456224,-9.27510235154],[-36.06073800271,-9.28273662427],[-36.06080237573,-9.29234011263],[-36.06073800271,-9.29363185173],[-36.05477276986,-9.29356832368],[-36.04621115869,-9.29349420762],[-36.03940907663,-9.29348361961],[-36.03501025384,-9.29338832751],[-36.02978531068,-9.29340950353],[-36.02167431062,-9.29332479942],[-36.01278010553,-9.29328244736],[-36.0046798343,-9.29320833124],[-35.99678341096,-9.29314480312],[-35.98969165033,-9.29312362708],[-35.98483148759,-9.29304951092],[-35.98305050081,-9.29289069053],[-35.98173085397,-9.29294363067],[-35.97884479707,-9.29281657433],[-35.96968237108,-9.29279539826]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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","scaleExtent":[9,20],"polygon":[[[-123.3176032,49.3272567],[-123.4405258,49.3268222],[-123.440717,49.3384429],[-123.4398375,49.3430357],[-123.4401258,49.3435398],[-123.4401106,49.3439946],[-123.4406265,49.3444493],[-123.4404747,49.3455762],[-123.4397768,49.3460606],[-123.4389726,49.3461298],[-123.4372904,49.3567236],[-123.4374774,49.3710843],[-123.4335292,49.3709446],[-123.4330357,49.373725],[-123.4332717,49.3751221],[-123.4322847,49.3761001],[-123.4317482,49.3791736],[-123.4314264,49.3795927],[-123.4307826,49.3823866],[-123.4313405,49.3827358],[-123.4312118,49.3838533],[-123.4300415,49.3845883],[-123.4189858,49.3847087],[-123.4192235,49.4135198],[-123.3972532,49.4135691],[-123.3972758,49.4243473],[-123.4006929,49.4243314],[-123.4007741,49.5703491],[-123.4000812,49.570345],[-123.4010761,49.5933838],[-123.3760399,49.5932848],[-123.3769811,49.6756063],[-123.3507288,49.6756396],[-123.3507969,49.7086751],[-123.332887,49.708722],[-123.3327888,49.7256288],[-123.3007111,49.7255625],[-123.3009164,49.7375384],[-123.2885986,49.737638],[-123.2887823,49.8249207],[-123.2997955,49.8249207],[-123.3011721,49.8497814],[-123.3218218,49.850669],[-123.3273284,49.8577696],[-123.3276726,49.9758852],[-123.3008279,49.9752212],[-123.3007204,50.0997002],[-123.2501716,50.100735],[-123.25091,50.2754901],[-123.0224338,50.2755598],[-123.0224879,50.3254853],[-123.0009318,50.3254689],[-123.0007778,50.3423899],[-122.9775023,50.3423408],[-122.9774766,50.3504306],[-122.9508137,50.3504961],[-122.950795,50.3711984],[-122.9325221,50.3711521],[-122.9321048,50.399793],[-122.8874234,50.3999748],[-122.8873385,50.4256108],[-122.6620152,50.4256959],[-122.6623083,50.3994506],[-122.5990316,50.3992413],[-122.5988274,50.3755206],[-122.5724832,50.3753706],[-122.5735621,50.2493891],[-122.5990415,50.2494643],[-122.5991504,50.2265663],[-122.6185016,50.2266359],[-122.6185741,50.2244081],[-122.6490609,50.2245126],[-122.6492181,50.1993528],[-122.7308575,50.1993758],[-122.7311583,50.1244287],[-122.7490352,50.1245109],[-122.7490541,50.0903032],[-122.7687806,50.0903435],[-122.7689801,49.9494546],[-122.999047,49.9494706],[-122.9991199,49.8754553],[-122.9775894,49.8754553],[-122.9778145,49.6995098],[-122.9992362,49.6994781],[-122.9992524,49.6516526],[-123.0221525,49.6516526],[-123.0221162,49.5995096],[-123.0491898,49.5994625],[-123.0491898,49.5940523],[-123.0664647,49.5940405],[-123.0663594,49.5451868],[-123.0699906,49.5451202],[-123.0699008,49.5413153],[-123.0706835,49.5392837],[-123.0708888,49.5379931],[-123.0711454,49.5368773],[-123.0711069,49.5358115],[-123.0713764,49.532822],[-123.0716458,49.5321141],[-123.07171,49.5313896],[-123.0720308,49.5304153],[-123.0739554,49.5303486],[-123.0748023,49.5294992],[-123.0748151,49.5288079],[-123.0743403,49.5280584],[-123.073532,49.5274588],[-123.0733652,49.5270423],[-123.0732882,49.5255932],[-123.0737116,49.5249602],[-123.0736218,49.5244938],[-123.0992583,49.5244854],[-123.0991649,49.4754502],[-123.071052,49.4755252],[-123.071088,49.4663034],[-123.0739204,49.4663054],[-123.07422,49.4505028],[-123.0746319,49.4500858],[-123.074651,49.449329],[-123.0745999,49.449018],[-123.0744619,49.4486927],[-123.0743336,49.4479899],[-123.0742427,49.4477688],[-123.0743061,49.4447473],[-123.0747103,49.4447556],[-123.0746384,49.4377306],[-122.9996506,49.4377363],[-122.9996506,49.4369214],[-122.8606163,49.4415314],[-122.8102616,49.4423972],[-122.8098984,49.3766739],[-122.4036093,49.3766617],[-122.4036341,49.3771944],[-122.264739,49.3773028],[-122.263542,49.2360088],[-122.2155742,49.236139],[-122.0580956,49.235878],[-121.9538274,49.2966525],[-121.9400911,49.3045389],[-121.9235761,49.3142257],[-121.8990871,49.3225436],[-121.8883447,49.3259752],[-121.8552982,49.3363575],[-121.832697,49.3441519],[-121.7671336,49.3654361],[-121.6736683,49.3654589],[-121.6404153,49.3743775],[-121.5961976,49.3860493],[-121.5861178,49.3879193],[-121.5213684,49.3994649],[-121.5117375,49.4038378],[-121.4679302,49.4229024],[-121.4416803,49.4345607],[-121.422429,49.4345788],[-121.3462885,49.3932312],[-121.3480144,49.3412388],[-121.5135035,49.320577],[-121.6031683,49.2771727],[-121.6584065,49.1856125],[-121.679953,49.1654109],[-121.7815793,49.0702559],[-121.8076228,49.0622471],[-121.9393997,49.0636219],[-121.9725524,49.0424179],[-121.9921394,49.0332869],[-122.0035289,49.0273413],[-122.0178564,49.0241067],[-122.1108634,48.9992786],[-122.1493067,48.9995305],[-122.1492705,48.9991498],[-122.1991447,48.9996019],[-122.199181,48.9991974],[-122.234365,48.9994829],[-122.234365,49.000173],[-122.3994722,49.0012385],[-122.4521338,49.0016326],[-122.4521338,49.000883],[-122.4584089,49.0009306],[-122.4584814,48.9993124],[-122.4992458,48.9995022],[-122.4992458,48.9992906],[-122.5492618,48.9995107],[-122.5492564,48.9993206],[-122.6580785,48.9994212],[-122.6581061,48.9954007],[-122.7067604,48.9955344],[-122.7519761,48.9956392],[-122.7922063,48.9957204],[-122.7921907,48.9994331],[-123.0350417,48.9995724],[-123.0350437,49.0000958],[-123.0397091,49.0000536],[-123.0397444,49.0001812],[-123.0485506,49.0001348],[-123.0485329,49.0004712],[-123.0557122,49.000448],[-123.0556324,49.0002284],[-123.0641365,49.0001293],[-123.064158,48.9999421],[-123.074899,48.9996928],[-123.0750717,49.0006218],[-123.0899573,49.0003726],[-123.109229,48.9999421],[-123.1271193,49.0003046],[-123.1359953,48.9998741],[-123.1362716,49.0005765],[-123.153851,48.9998061],[-123.1540533,49.0006806],[-123.1710015,49.0001274],[-123.2000916,48.9996849],[-123.2003446,49.0497785],[-123.2108845,49.0497232],[-123.2112218,49.051989],[-123.2070479,49.0520857],[-123.2078911,49.0607884],[-123.2191688,49.0600978],[-123.218958,49.0612719],[-123.2251766,49.0612719],[-123.2253874,49.0622388],[-123.2297088,49.0620316],[-123.2298142,49.068592],[-123.2331869,49.0687301],[-123.2335031,49.0705945],[-123.249313,49.0702493],[-123.2497346,49.0802606],[-123.2751358,49.0803986],[-123.2751358,49.0870947],[-123.299483,49.0873018],[-123.29944,49.080253],[-123.3254508,49.0803944],[-123.3254353,49.1154662],[-123.2750966,49.1503341],[-123.275181,49.1873267],[-123.2788067,49.1871063],[-123.278891,49.1910741],[-123.3004767,49.1910741],[-123.3004186,49.2622933],[-123.3126185,49.2622416],[-123.3125958,49.2714948],[-123.3154251,49.2714727],[-123.3156628,49.2818906],[-123.3174735,49.2818832],[-123.3174961,49.2918488],[-123.3190353,49.2918488],[-123.3190692,49.298602],[-123.3202349,49.2985651],[-123.3202786,49.3019749],[-123.3222679,49.3019605],[-123.3223943,49.3118263],[-123.3254002,49.3118086],[-123.3253898,49.3201721],[-123.3192695,49.3201957],[-123.3192242,49.3246748],[-123.3179437,49.3246596],[-123.3179861,49.3254065],[-123.3176032,49.3272567]]],"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:900913","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[19.047674,47.487889],[19.051565,47.489898],[19.064336,47.479203],[19.066498,47.476323],[19.067662,47.473428],[19.068374,47.470774],[19.06846,47.468765],[19.067223,47.465006],[19.056829,47.452588],[19.054896,47.449065],[19.05176,47.434991],[19.048625,47.428997],[19.043844,47.429684],[19.040234,47.429319],[19.035087,47.438181],[19.032205,47.437794],[19.025205,47.442004],[19.020705,47.445763],[19.019153,47.446579],[19.015447,47.447588],[19.01347,47.443613],[19.012663,47.44271],[19.011776,47.442473],[19.011903,47.441883],[19.009799,47.439443],[19.005705,47.431105],[19.000464,47.430974],[18.995338,47.428211],[18.975454,47.428179],[18.973426,47.429037],[18.973615,47.429982],[18.975482,47.430671],[18.977187,47.434024],[18.978227,47.438171],[18.977329,47.446572],[18.970039,47.449876],[18.968611,47.451422],[18.975678,47.455063],[18.975859,47.455563],[18.976247,47.455842],[18.97658,47.455945],[18.977633,47.455967],[18.980167,47.456049],[18.981619,47.460669],[18.977933,47.468574],[18.968669,47.476431],[18.977448,47.481943],[18.980348,47.481687],[18.985653,47.478204],[18.989075,47.478377],[18.991166,47.47898],[18.991766,47.481021],[18.992875,47.481817],[18.998357,47.482378],[18.999022,47.483001],[19.003999,47.481886],[19.004156,47.483992],[19.010272,47.485348],[19.012373,47.484043],[19.0138,47.483506],[19.016739,47.484651],[19.016303,47.485392],[19.016889,47.485946],[19.018085,47.486054],[19.021081,47.484921],[19.021239,47.486124],[19.023013,47.487414],[19.026373,47.488854],[19.029954,47.489037],[19.031349,47.488554],[19.031889,47.487587],[19.032855,47.48712],[19.03364,47.487018],[19.035138,47.487249],[19.035851,47.487292],[19.03616,47.487507],[19.036651,47.487668],[19.037475,47.487738],[19.038474,47.487368],[19.039179,47.486793],[19.041049,47.486492],[19.04181,47.487373],[19.04387,47.488104],[19.045423,47.488169],[19.046945,47.488104],[19.047674,47.487889]]],"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:900913","startDate":"2017-03-01T00:00:00.000Z","polygon":[[[19.047674,47.487889],[19.051565,47.489898],[19.064336,47.479203],[19.066498,47.476323],[19.067662,47.473428],[19.068374,47.470774],[19.06846,47.468765],[19.067223,47.465006],[19.056829,47.452588],[19.054896,47.449065],[19.05176,47.434991],[19.048625,47.428997],[19.043844,47.429684],[19.040234,47.429319],[19.035087,47.438181],[19.032205,47.437794],[19.025205,47.442004],[19.020705,47.445763],[19.019153,47.446579],[19.015447,47.447588],[19.01347,47.443613],[19.012663,47.44271],[19.011776,47.442473],[19.011903,47.441883],[19.009799,47.439443],[19.005705,47.431105],[19.000464,47.430974],[18.995338,47.428211],[18.975454,47.428179],[18.973426,47.429037],[18.973615,47.429982],[18.975482,47.430671],[18.977187,47.434024],[18.978227,47.438171],[18.977329,47.446572],[18.970039,47.449876],[18.968611,47.451422],[18.975678,47.455063],[18.975859,47.455563],[18.976247,47.455842],[18.97658,47.455945],[18.977633,47.455967],[18.980167,47.456049],[18.981619,47.460669],[18.977933,47.468574],[18.968669,47.476431],[18.977448,47.481943],[18.980348,47.481687],[18.985653,47.478204],[18.989075,47.478377],[18.991166,47.47898],[18.991766,47.481021],[18.992875,47.481817],[18.998357,47.482378],[18.999022,47.483001],[19.003999,47.481886],[19.004156,47.483992],[19.010272,47.485348],[19.012373,47.484043],[19.0138,47.483506],[19.016739,47.484651],[19.016303,47.485392],[19.016889,47.485946],[19.018085,47.486054],[19.021081,47.484921],[19.021239,47.486124],[19.023013,47.487414],[19.026373,47.488854],[19.029954,47.489037],[19.031349,47.488554],[19.031889,47.487587],[19.032855,47.48712],[19.03364,47.487018],[19.035138,47.487249],[19.035851,47.487292],[19.03616,47.487507],[19.036651,47.487668],[19.037475,47.487738],[19.038474,47.487368],[19.039179,47.486793],[19.041049,47.486492],[19.04181,47.487373],[19.04387,47.488104],[19.045423,47.488169],[19.046945,47.488104],[19.047674,47.487889]]],"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","scaleExtent":[12,22],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,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 : 2015","description":"French land registry","icon":"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png","overlay":true},{"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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.10752645677,-9.43884254591],[-36.10751572793,-9.43420690643],[-36.10766593164,-9.42959237236],[-36.10779467767,-9.42361243708],[-36.10768738931,-9.41927295015],[-36.10780540651,-9.41390672873],[-36.10803071206,-9.41094309933],[-36.10809508508,-9.40965179571],[-36.10810581392,-9.40747138685],[-36.1081594581,-9.40693157477],[-36.1081916446,-9.4041795785],[-36.10810581392,-9.40175568673],[-36.10817018693,-9.40001978874],[-36.10826674646,-9.39952230418],[-36.10826674646,-9.39646328763],[-36.10833111947,-9.39474853296],[-36.10832039064,-9.39272680513],[-36.10836330598,-9.39039809877],[-36.10840622133,-9.38447041196],[-36.10847059434,-9.38165472521],[-36.10845986551,-9.37767461773],[-36.10835257714,-9.37572688892],[-36.10844913667,-9.37431901292],[-36.10849205201,-9.37233950842],[-36.10844913667,-9.36970368011],[-36.10867444223,-9.36278056588],[-36.10863152688,-9.36102330087],[-36.10872808641,-9.35927661299],[-36.10873881524,-9.35736053922],[-36.10854569619,-9.35478811418],[-36.1086958999,-9.35230035993],[-36.10870662873,-9.34996079609],[-36.10872808641,-9.34893392374],[-36.11268702691,-9.34908213231],[-36.11725751107,-9.3491244776],[-36.12137738412,-9.34905037333],[-36.12806144899,-9.34910330495],[-36.1321705932,-9.34906095966],[-36.13694492524,-9.34914565024],[-36.14024940675,-9.34913506392],[-36.14134374803,-9.34931503136],[-36.14458385652,-9.34915623657],[-36.14683691209,-9.34913506392],[-36.14842477983,-9.34905037333],[-36.1527592296,-9.34907154598],[-36.15400377458,-9.34921975449],[-36.15626755899,-9.34923034081],[-36.160258686,-9.34920916817],[-36.16085950082,-9.34929385872],[-36.16599861329,-9.34932561767],[-36.16937819665,-9.34942089451],[-36.17175999826,-9.34935737662],[-36.17627683824,-9.34945265345],[-36.18027869409,-9.34936796294],[-36.1822742576,-9.34946323976],[-36.18826094812,-9.34937854925],[-36.19038525766,-9.34945265345],[-36.19353953546,-9.34946323976],[-36.19552437013,-9.3494103082],[-36.19918290323,-9.34950558501],[-36.19925800508,-9.35146404706],[-36.19912925904,-9.35234270483],[-36.19911853021,-9.35352836],[-36.19919363206,-9.35646072192],[-36.19921508973,-9.35770987942],[-36.19930092042,-9.35832387044],[-36.19933310693,-9.3611185745],[-36.19921508973,-9.36177490326],[-36.19918290323,-9.36257943359],[-36.19931164926,-9.36399794306],[-36.19925800508,-9.36499301341],[-36.19921508973,-9.36562816321],[-36.19927946275,-9.36660205731],[-36.19917217439,-9.36795703586],[-36.19917217439,-9.36867686607],[-36.19921508973,-9.36911088062],[-36.19911853021,-9.37016945042],[-36.19887176698,-9.37149265813],[-36.19886103814,-9.37263590554],[-36.19902197068,-9.37321811341],[-36.19915071672,-9.37503882993],[-36.19910780137,-9.37688070785],[-36.19895759767,-9.37747349407],[-36.19898978418,-9.37914599257],[-36.19917217439,-9.38053267826],[-36.19919363206,-9.38124189704],[-36.19925800508,-9.38174999318],[-36.19927946275,-9.38302023029],[-36.19912925904,-9.38374002925],[-36.19907561486,-9.38592058756],[-36.19878593629,-9.38786825912],[-36.19880739396,-9.3893501758],[-36.19902197068,-9.39091676655],[-36.19904342836,-9.39199643982],[-36.19898978418,-9.39347833885],[-36.19879666513,-9.39450507945],[-36.19866791909,-9.39704545549],[-36.19845334237,-9.39949054982],[-36.19863573259,-9.40313169724],[-36.19865719026,-9.40476173338],[-36.19864646142,-9.40836048727],[-36.19875374978,-9.40901672659],[-36.19857135957,-9.41058322831],[-36.19859281724,-9.4127318644],[-36.19874302095,-9.41445711425],[-36.19867864793,-9.41711377049],[-36.19860354608,-9.41901892972],[-36.19846407121,-9.41965398046],[-36.19849625772,-9.42235293308],[-36.19871083444,-9.42428981548],[-36.19858208841,-9.42696756397],[-36.19839969819,-9.42894675602],[-36.19857135957,-9.43412223664],[-36.19871083444,-9.43470434105],[-36.19864646142,-9.43595321629],[-36.19857135957,-9.43626014256],[-36.19859281724,-9.43667290505],[-36.19876447862,-9.43748784493],[-36.19889322465,-9.43905421746],[-36.1988181228,-9.43995382008],[-36.1784977073,-9.43977389974],[-36.17717806047,-9.43967864776],[-36.17265049165,-9.43966806421],[-36.17098752206,-9.43971039843],[-36.16396013444,-9.43962572998],[-36.15386429971,-9.43949872728],[-36.13983098214,-9.43929763957],[-36.12874809449,-9.43912830247],[-36.11497226899,-9.43891663097],[-36.10752645677,-9.43884254591]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"osm-cambodia_laos_thailand_vietnam-bilingual","name":"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual","type":"tms","template":"http://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[92.1023798,20.8135629],[93.5690546,24.0975527],[94.1733026,23.9269484],[95.1950312,26.707274],[96.7550898,27.5286657],[97.5845575,28.5805966],[98.738122,27.514051],[98.7436151,25.8799151],[97.6779413,24.7577376],[97.9635858,24.042382],[98.8205194,24.1627239],[99.5236444,22.9593356],[100.3695917,21.5051376],[101.7923212,22.4830518],[105.3628778,23.3331079],[106.8185663,22.8480137],[108.1973505,21.3619661],[107.4389505,18.8539792],[117.1453714,7.4656173],[119.6172953,5.2875389],[118.1231546,4.0502277],[117.2552347,4.3624942],[115.8654642,4.3460623],[115.5084085,3.0249771],[114.552598,1.5100953],[113.5418558,1.2574836],[112.9650736,1.5704982],[112.2454691,1.5100953],[111.67418,1.0158321],[110.4546976,0.9004918],[109.4988871,1.9218969],[103.2256937,1.1256762],[100.4626322,3.2388904],[97.6721048,8.0588831],[93.892808,15.9398659],[92.1023798,20.8135629]]],"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://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.30642834848,-9.82332496055],[-36.30602585634,-9.78597356977],[-36.30602065271,-9.78263262201],[-36.30608502572,-9.7816810657],[-36.30604211038,-9.78081408979],[-36.30590263551,-9.77530556809],[-36.30585972017,-9.76496494896],[-36.3054520244,-9.73335957439],[-36.39633599466,-9.73248189831],[-36.39627162164,-9.73744126654],[-36.39635745233,-9.74336280376],[-36.39644328302,-9.7553535947],[-36.39660421556,-9.75855741026],[-36.3966471309,-9.75979451892],[-36.39655057138,-9.76243789809],[-36.39661494439,-9.76489093519],[-36.39658275789,-9.76647694093],[-36.39661494439,-9.76683643452],[-36.39659348672,-9.76959606352],[-36.39670077508,-9.77896382877],[-36.39675441926,-9.78464145418],[-36.39684024995,-9.7906678778],[-36.39692608064,-9.79681048826],[-36.397033369,-9.80298470156],[-36.39719430154,-9.82033320249],[-36.39721575921,-9.82234180629],[-36.39392200654,-9.82233123473],[-36.35375324434,-9.8227858118],[-36.34821716493,-9.82285981267],[-36.31697479432,-9.82316638748],[-36.3119107837,-9.82324038826],[-36.30878869241,-9.82327210287],[-36.30642834848,-9.82332496055]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Canvec","name":"Canvec","type":"wms","template":"http://wms.sst-sw.rncan.gc.ca/wms/toporama_fr?REQUEST=GetMap&SERVICE=wms&VERSION=1.1.1&EXCEPTIONS=application/vnd.ogc.se_inimage&SRS={proj}&FORMAT=image/png&transparent=true&layers=SCW-Toporama&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:900913","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.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-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://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.03320780938,-9.4574082918],[-36.03321853822,-9.45581025359],[-36.03335801309,-9.45482602768],[-36.03340092843,-9.45291048318],[-36.0332721824,-9.45140767284],[-36.03335801309,-9.44286692894],[-36.03349748796,-9.43821017639],[-36.03352967447,-9.42881181147],[-36.03362623399,-9.42027050777],[-36.03389445489,-9.41091399212],[-36.03389445489,-9.40031880838],[-36.03401247209,-9.38880239663],[-36.03413048928,-9.38527753599],[-36.03428069299,-9.38265239127],[-36.03417340463,-9.37849234301],[-36.03444162553,-9.3668799342],[-36.05245534127,-9.36710223556],[-36.05790558999,-9.36711282133],[-36.0715955848,-9.36727160792],[-36.08621898835,-9.367313951],[-36.10299888795,-9.36750449479],[-36.11651722139,-9.36754683784],[-36.12515393441,-9.36768445271],[-36.12521830743,-9.37473449571],[-36.12520757859,-9.37721150385],[-36.12511101907,-9.38037654408],[-36.12514320558,-9.38528812121],[-36.12504664605,-9.39026313917],[-36.12503591722,-9.39477234906],[-36.12505737489,-9.40171599404],[-36.12499300187,-9.40382234661],[-36.12479988282,-9.40678603705],[-36.12462822145,-9.41123152509],[-36.12473550981,-9.41360242867],[-36.12456384843,-9.41630142857],[-36.1245853061,-9.42460998216],[-36.12466040796,-9.42690670628],[-36.12464967912,-9.42924575062],[-36.12457457727,-9.42970085695],[-36.12463895028,-9.4353843436],[-36.12438145822,-9.44108890357],[-36.12445656007,-9.44387235589],[-36.12452093309,-9.44578795069],[-36.12438145822,-9.4473648688],[-36.12447801774,-9.44856078174],[-36.12447801774,-9.45095259517],[-36.12436000055,-9.45391588079],[-36.12433854287,-9.45790569291],[-36.11757937616,-9.45783161194],[-36.10889974778,-9.45777869695],[-36.10418978875,-9.45779986294],[-36.10116425699,-9.45772578195],[-36.09529558366,-9.45772578195],[-36.08460966295,-9.45767286695],[-36.07361260598,-9.45756703691],[-36.05726185983,-9.4574082918],[-36.04816380685,-9.45747178985],[-36.04176942056,-9.45738712578],[-36.03767100518,-9.45738712578],[-36.03320780938,-9.4574082918]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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.8846298,28.4460601],[-17.8939535,28.5225529],[-18.0212548,28.7481927],[-18.0224091,28.8038375],[-17.9424017,28.8726124],[-17.8911792,28.8737099],[-17.8903302,28.8515102],[-17.7675902,28.8537764],[-17.7669837,28.8312183],[-17.7412714,28.8319975],[-17.7394926,28.7642235],[-17.7139824,28.7649677],[-17.7129312,28.7303731],[-17.7574427,28.6931782],[-17.7570788,28.6741254],[-17.7457913,28.6743524],[-17.7457266,28.6165627],[-17.7519687,28.5833675],[-17.7622536,28.5591958],[-17.7833086,28.541667],[-17.7831575,28.4936643],[-17.808611,28.4925024],[-17.8060072,28.4468974],[-17.8846298,28.4460601]],[[-18.1661033,27.7851643],[-18.163494,27.6949247],[-18.0889827,27.6963366],[-18.0873398,27.6738724],[-18.0364092,27.6753701],[-18.0350079,27.6302571],[-17.9589987,27.6323976],[-17.8603269,27.7926025],[-17.8630328,27.8368793],[-17.8884015,27.8364947],[-17.8891263,27.8590536],[-17.9906491,27.8567467],[-18.0386803,27.7655831],[-18.1146412,27.7637873],[-18.1154627,27.7863613],[-18.1661033,27.7851643]],[[-17.36038,28.0639801],[-17.3629657,28.1757247],[-17.3375583,28.1763688],[-17.3384577,28.2213012],[-17.1857883,28.2238767],[-17.0820788,28.1351849],[-17.0808422,28.0679977],[-17.1315446,28.0668073],[-17.1563337,28.0214628],[-17.2321063,28.0203711],[-17.2319938,27.9980388],[-17.2576823,27.9978403],[-17.257851,28.0199741],[-17.3086658,28.0192298],[-17.36038,28.0639801]],[[-16.9278171,28.3275779],[-16.9286591,28.3721879],[-16.8776666,28.3729288],[-16.8780707,28.3954191],[-16.5214259,28.4226146],[-16.4457117,28.491135],[-16.4462506,28.535972],[-16.4205859,28.5362679],[-16.4209227,28.5588419],[-16.3443329,28.5597589],[-16.3446023,28.5822095],[-16.1912541,28.5837179],[-16.1916246,28.6068435],[-16.1279344,28.6078193],[-16.1277997,28.5921762],[-16.0995079,28.5925015],[-16.0993395,28.5163822],[-16.1648148,28.5161158],[-16.1647474,28.4938583],[-16.2385755,28.4484704],[-16.2653516,28.4476116],[-16.2658569,28.4030038],[-16.3167484,28.4017594],[-16.3163105,28.380189],[-16.3420763,28.3795075],[-16.3408301,28.2892963],[-16.415837,28.1976134],[-16.415096,28.1311312],[-16.5153297,28.0164796],[-16.6168433,28.01532],[-16.6168096,27.9930469],[-16.7184243,27.9919168],[-16.7190979,28.0371426],[-16.7446952,28.0367859],[-16.7453351,28.0818146],[-16.7706967,28.0816065],[-16.8223966,28.1259036],[-16.8231712,28.1708652],[-16.8487012,28.1707464],[-16.8502842,28.260791],[-16.8756457,28.2605537],[-16.8760836,28.2832162],[-16.9015125,28.2827713],[-16.9023882,28.3279337],[-16.9278171,28.3275779]],[[-15.8537427,27.9008901],[-15.8542032,27.9901812],[-15.828953,27.9906555],[-15.8291065,28.035578],[-15.7782992,28.0363232],[-15.7532793,28.0814298],[-15.7278756,28.0815652],[-15.7282593,28.1718567],[-15.4989741,28.1728039],[-15.4987438,28.1504075],[-15.4497785,28.1507459],[-15.4501622,28.1961425],[-15.3972827,28.1961425],[-15.3964385,28.0383554],[-15.3710348,28.0380167],[-15.3706511,28.0153212],[-15.3457847,28.0153212],[-15.3454777,27.9254406],[-15.3708046,27.9252372],[-15.3705743,27.8352137],[-15.395978,27.8347387],[-15.4209979,27.7879673],[-15.4718052,27.7893932],[-15.471882,27.7666454],[-15.522766,27.7667813],[-15.5477092,27.7216112],[-15.6236132,27.7213395],[-15.6241504,27.741991],[-15.7007451,27.7433495],[-15.801669,27.8110501],[-15.8537427,27.9008901]],[[-14.5215621,28.0467778],[-14.5224358,28.1184131],[-14.4157526,28.1156076],[-14.2168794,28.2278805],[-14.2153651,28.33903],[-14.1641672,28.4528287],[-14.1115132,28.4747955],[-14.0335806,28.7226671],[-13.9565217,28.7449351],[-13.9561722,28.7665857],[-13.8290221,28.7664325],[-13.8289639,28.7879765],[-13.8000741,28.7879255],[-13.8012972,28.7189894],[-13.827566,28.719347],[-13.8278572,28.6517968],[-13.8025786,28.651899],[-13.8033941,28.5384172],[-13.8288474,28.5384684],[-13.8315061,28.3970177],[-13.9158189,28.2241438],[-13.9856445,28.2235696],[-14.0369588,28.1795787],[-14.1387139,28.1799894],[-14.1386556,28.1579103],[-14.2153651,28.1578076],[-14.2147244,28.1118888],[-14.2913173,28.0452356],[-14.3319673,28.0368713],[-14.4457846,28.0469834],[-14.4466583,28.0657961],[-14.4962835,28.0682631],[-14.495934,28.0458525],[-14.5215621,28.0467778]],[[-13.800662,28.8456579],[-13.8009273,28.8231121],[-13.775688,28.8230539],[-13.69729,28.8898184],[-13.69729,28.9127744],[-13.6072498,28.9117991],[-13.4388551,29.0002417],[-13.4374559,29.1351289],[-13.4117005,29.1349931],[-13.4105556,29.2229789],[-13.4592801,29.255586],[-13.4597392,29.2942023],[-13.5091254,29.2945638],[-13.5100581,29.3163453],[-13.5635382,29.3172941],[-13.5640564,29.2713764],[-13.5389228,29.2711956],[-13.5389747,29.2500375],[-13.5661293,29.2501279],[-13.5665956,29.2030039],[-13.5156549,29.2022349],[-13.5156549,29.1820579],[-13.5398038,29.1827819],[-13.5408921,29.137528],[-13.65782,29.1368528],[-13.713222,29.0935079],[-13.7663353,29.0934533],[-13.8502463,29.0165937],[-13.8518224,28.983425],[-13.8524443,28.914861],[-13.9013122,28.89245],[-13.9024005,28.8469779],[-13.800662,28.8456579]],[[1.6479916,38.9990693],[1.7321668,38.9993635],[1.7314703,39.0441733],[1.6489512,39.0431944],[1.6481552,39.1276358],[1.3948608,39.1265691],[1.3954412,39.0864199],[1.2281145,39.0852615],[1.2291095,39.0028958],[1.1448657,39.0018003],[1.1452803,38.8319988],[1.3113632,38.8331615],[1.3121924,38.7906483],[1.3946949,38.7916178],[1.3951924,38.7529597],[1.3112803,38.7519251],[1.3125919,38.6238804],[1.6489036,38.6251112],[1.6480745,38.7111504],[1.58456,38.7101152],[1.5811604,38.7005387],[1.5491544,38.7002798],[1.5197188,38.7092094],[1.50355,38.7253185],[1.4813282,38.9155064],[1.5518906,38.9254411],[1.5667328,38.9566554],[1.6487378,38.9583318],[1.6479916,38.9990693]],[[2.5450749,39.4166673],[2.43933,39.4161122],[2.438714,39.4846853],[2.439022,39.4993424],[2.3122308,39.4993424],[2.3119228,39.5417911],[2.2290722,39.5409994],[2.2283536,39.6260571],[2.3460076,39.6270851],[2.9270445,39.9601558],[3.1456647,39.9600498],[3.1460753,40.0019797],[3.2313899,40.0019797],[3.2312872,39.8329231],[3.1482313,39.8331596],[3.1484366,39.7935717],[3.4814817,39.7931773],[3.4803472,39.5959027],[3.3150618,39.4784606],[3.3146179,39.3785504],[3.0830178,39.2499355],[2.9798608,39.2501482],[2.9790395,39.3334971],[2.7287424,39.3334177],[2.7288451,39.4581361],[2.6456865,39.4577397],[2.6453785,39.4996593],[2.5452802,39.4994216],[2.5450749,39.4166673]],[[3.8120402,40.0434431],[3.729082,40.0437979],[3.7286185,39.9584155],[3.8126633,39.9576011],[3.8122771,39.9164393],[3.9608975,39.9159813],[4.1938142,39.791308],[4.3150279,39.7905799],[4.3159934,39.8329294],[4.3987393,39.8320396],[4.3973664,39.9185834],[4.3158003,39.9193274],[4.3161865,40.0433985],[4.2318959,40.0443594],[4.2324752,40.0847793],[4.1491501,40.086109],[4.1490623,40.1255157],[4.0627981,40.1272166],[4.0624217,40.0849941],[3.8128687,40.085294],[3.8120402,40.0434431]],[[-8.8910646,41.8228891],[-9.1092038,42.5751065],[-9.0365469,42.730656],[-9.0883419,42.7269569],[-9.1466113,42.7750272],[-9.2185488,42.9016271],[-9.2760988,42.8605106],[-9.3099094,42.9311297],[-9.2789763,42.9821991],[-9.3099094,43.0600377],[-9.2523594,43.1041725],[-9.2314975,43.1703151],[-9.1473307,43.210176],[-9.06748,43.1991644],[-9.0336694,43.2426748],[-8.99842,43.2447709],[-8.9998588,43.2955793],[-8.9372732,43.3055265],[-8.92936,43.326986],[-8.8638969,43.3290792],[-8.8761263,43.3740655],[-8.8221732,43.3735426],[-8.785485,43.3191358],[-8.7063538,43.305003],[-8.6099575,43.3296025],[-8.5509688,43.3233227],[-8.5243519,43.3364048],[-8.5250713,43.3646525],[-8.45745,43.3918416],[-8.3610538,43.4111803],[-8.3603344,43.4634161],[-8.3344369,43.5797394],[-8.2776063,43.5708796],[-8.0646713,43.7239184],[-7.9992081,43.7233986],[-7.9171994,43.7826357],[-7.8560525,43.7914643],[-7.83591,43.7374337],[-7.6628443,43.809819],[-7.3188932,43.6782695],[-7.1997467,43.5830817],[-6.2488228,43.6075032],[-6.1229322,43.5790105],[-5.8520425,43.6798953],[-5.6036334,43.5708672],[-5.2855347,43.5619084],[-5.1787525,43.4991591],[-4.9089869,43.4836655],[-4.6156167,43.4192021],[-4.1839917,43.4249168],[-3.8029478,43.5195394],[-3.7400025,43.4869277],[-3.5612827,43.5423572],[-3.1083013,43.3816347],[-2.9385737,43.4624573],[-2.7452417,43.4755094],[-2.3046245,43.3170625],[-1.9854018,43.3563045],[-1.8552841,43.3972545],[-1.769802,43.3964383],[-1.7700492,43.3760501],[-1.7100474,43.3756908],[-1.7113451,43.3312527],[-1.7225915,43.3131806],[-1.6890375,43.3129108],[-1.6881106,43.3341294],[-1.6446695,43.3337248],[-1.6449785,43.3133155],[-1.6029903,43.3129528],[-1.6034352,43.2926624],[-1.5635905,43.2921227],[-1.5630468,43.3133844],[-1.4779905,43.3128355],[-1.3667723,43.2761368],[-1.3568809,43.2381533],[-1.3703692,43.1712972],[-1.4423067,43.0833554],[-1.4198262,43.0603647],[-1.3730668,43.051166],[-1.3640746,43.1115893],[-1.3020285,43.135217],[-1.2354864,43.1332484],[-1.2795481,43.0774443],[-1.1923239,43.0649635],[-1.0061856,43.0077821],[-0.942341,42.9748951],[-0.7562028,42.9821318],[-0.7148387,42.9610774],[-0.6968543,42.9031405],[-0.5511809,42.8220693],[-0.5044215,42.8484456],[-0.4288871,42.8200906],[-0.3164848,42.8655842],[-0.1456332,42.810856],[-0.0314324,42.7124874],[0.1861785,42.7540985],[0.3021777,42.7177729],[0.3642238,42.7428729],[0.4487504,42.7144695],[0.6276949,42.7223973],[0.6411832,42.8576747],[0.7149192,42.882718],[0.9675996,42.8181119],[1.108777,42.7989808],[1.1753192,42.7342872],[1.3632559,42.7415521],[1.4113736,42.7093914],[1.4806054,42.7103407],[1.4813006,42.5010664],[1.6443591,42.5020345],[1.6432777,42.5424539],[1.730407,42.5434214],[1.7316429,42.5011803],[2.0638621,42.5016359],[2.0645572,42.4590247],[2.3969309,42.4599364],[2.3976786,42.4178363],[2.4804823,42.4179732],[2.4809767,42.3759441],[2.6447922,42.3762636],[2.6444832,42.4592447],[2.8113266,42.4596094],[2.8112648,42.5010358],[3.063878,42.5008535],[3.063878,42.4591535],[3.2307832,42.4593359],[3.2304935,42.3764363],[3.3141469,42.3760369],[3.3141243,42.3339864],[3.397855,42.3340435],[3.3973912,42.290094],[3.3138923,42.2908368],[3.3139695,42.2070151],[3.1475896,42.2073012],[3.1475896,42.1260612],[3.2305478,42.1260039],[3.2466753,41.9529359],[3.1945206,41.8558943],[3.060537,41.7647419],[2.7835777,41.6371796],[2.26293,41.4271601],[2.1649151,41.2989297],[1.86008,41.2232228],[1.3763003,41.116273],[1.1793714,41.0464585],[1.0858526,41.048493],[0.758537,40.8195599],[0.9114042,40.733761],[0.8781331,40.6751363],[0.6650182,40.5358666],[0.5580112,40.5502166],[0.433919,40.3757589],[0.2675635,40.1919192],[0.1641534,40.0647234],[0.0751307,40.0144671],[0.010387,39.8952188],[-0.0939224,39.8116904],[-0.1847435,39.6311716],[-0.2908513,39.5036254],[-0.2863552,39.333431],[-0.1856427,39.1774612],[-0.2135185,39.1558487],[-0.1110076,38.9722246],[0.0094878,38.8826835],[0.1218901,38.872183],[0.2342925,38.798636],[0.2558737,38.7264162],[0.0958128,38.6133825],[-0.0022021,38.6070586],[-0.0570544,38.5269073],[-0.2719677,38.4762395],[-0.379874,38.3931234],[-0.3834708,38.3381297],[-0.4509122,38.3310763],[-0.5048654,38.2830943],[-0.4823849,38.1948095],[-0.429331,38.1658287],[-0.4545091,38.148859],[-0.5839966,38.1721913],[-0.6136708,38.1198599],[-0.6370505,37.9612228],[-0.6811123,37.9456238],[-0.7323677,37.8810656],[-0.7215771,37.7830562],[-0.688306,37.7340026],[-0.6641461,37.6231485],[-0.7193941,37.5878413],[-0.9196258,37.5375806],[-1.1107098,37.5164093],[-1.3383246,37.5286671],[-1.4408917,37.3903714],[-1.6766966,37.2765189],[-1.8540816,36.9122889],[-2.0683486,36.6929117],[-2.2158766,36.6619233],[-2.3721861,36.7801753],[-2.6812926,36.6591056],[-2.9201476,36.6675585],[-3.09402,36.712625],[-3.4610839,36.6548788],[-3.7280395,36.6929117],[-4.3743529,36.6633322],[-4.6571151,36.4404171],[-4.9188018,36.4531321],[-5.1699508,36.3513541],[-5.2841094,36.1970201],[-5.2680911,36.1241812],[-5.3524784,36.1224654],[-5.3516094,36.0401413],[-5.4365759,36.0388921],[-5.4353207,36.0034384],[-5.6888562,36.0036518],[-5.6899635,36.0405317],[-5.85506,36.0385595],[-5.8566821,36.1242077],[-5.9384817,36.1221487],[-5.9400265,36.1655625],[-5.9983445,36.1645024],[-6.0357297,36.1780957],[-6.0775178,36.2224132],[-6.1506113,36.2864561],[-6.231541,36.3770075],[-6.3358504,36.5310643],[-6.3214629,36.5816265],[-6.404191,36.6234958],[-6.4743301,36.7489673],[-6.4158808,36.7993866],[-6.490516,36.9173818],[-6.6298949,37.0194012],[-6.8744824,37.1083766],[-7.0426363,37.1850699],[-7.2647434,37.1843535],[-7.3753473,37.1535419],[-7.408316,37.1682196],[-7.4202886,37.2118318],[-7.4249231,37.2350505],[-7.4380543,37.2451969],[-7.4459717,37.3326142],[-7.4480958,37.3909382],[-7.4696271,37.4075829],[-7.4647029,37.4530494],[-7.5019723,37.516411],[-7.5191587,37.5229203],[-7.5219588,37.5723727],[-7.4501271,37.6695835],[-7.4249019,37.7599222],[-7.316662,37.839974],[-7.268329,37.988952],[-7.1536786,38.0155235],[-7.1177098,38.0553626],[-7.0142997,38.0243785],[-6.9963153,38.1075633],[-6.9614706,38.201254],[-7.080617,38.1570753],[-7.3402665,38.4402363],[-7.2638329,38.7380741],[-7.0435243,38.8729667],[-7.0615086,38.907962],[-6.9693387,39.0198308],[-7.0008114,39.0887867],[-7.1536786,39.0957658],[-7.1525545,39.1602899],[-7.2447245,39.1968854],[-7.2559647,39.2813308],[-7.3368944,39.3535074],[-7.3279022,39.4559917],[-7.5144901,39.5886496],[-7.5527069,39.6795427],[-7.0502684,39.6752171],[-6.9951913,39.8195433],[-6.9221297,39.8790868],[-6.886161,40.0229854],[-7.0412762,40.1347927],[-7.0176717,40.266146],[-6.8086034,40.3450071],[-6.8681766,40.4451649],[-6.8535643,40.6066433],[-6.837828,40.8757589],[-6.9536024,41.0370445],[-6.8018592,41.0395879],[-6.7681385,41.138706],[-6.6411239,41.2655616],[-6.5624422,41.2630269],[-6.217367,41.5791017],[-6.3162811,41.644652],[-6.5152332,41.6412921],[-6.5871707,41.6883151],[-6.5478299,41.8559743],[-6.6298836,41.9112057],[-7.1334461,41.9404756],[-7.1682909,41.8718791],[-7.4256922,41.7847727],[-7.9539833,41.8459271],[-8.130455,41.7805819],[-8.2518495,41.9078597],[-8.1293309,42.0348842],[-8.2484774,42.1008034],[-8.3676239,42.0557521],[-8.6070409,42.0340493],[-8.8910646,41.8228891]]]},{"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","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"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","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"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":"Czech_CUZK-KM","name":"Czech CUZK:KM","type":"wms","template":"http://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.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]]},{"id":"Czech_CUZK-KM-tms","name":"Czech CUZK:KM tiles proxy","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png","scaleExtent":[13,18],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"overlay":true},{"id":"Czech_RUIAN-budovy","name":"Czech RUIAN budovy","type":"tms","template":"http://tile.poloha.net/budovy/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Czech_RUIAN-parcely","name":"Czech RUIAN parcely","type":"tms","template":"http://tile.poloha.net/parcely/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Duna_2013","name":"Danube flood orthophoto 2013","type":"tms","template":"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg","scaleExtent":[10,20],"polygon":[[[19.0773152,47.6959718],[19.0779881,47.6959835],[19.0946205,47.6944562],[19.0805603,47.595874],[19.0743376,47.5890907],[19.0795196,47.5888284],[19.07717,47.5724109],[19.0577884,47.5720924],[19.0773152,47.6959718]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fotótérkép.hu"},{"id":"Delaware2012Orthophotography","name":"Delaware 2012 Orthophotography","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/0/https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer","polygon":[[[-75.01770587603,38.45188674427],[-75.74173524589,38.4499581145],[-75.80699639658,39.73907123636],[-75.75558784863,39.80106251053],[-75.64692187603,39.8563815616],[-75.47114773904,39.84645578141],[-75.37725787603,39.81477822231],[-75.48746302671,39.6718115509],[-75.50901151986,39.43446011595],[-75.39326532808,39.27784018498],[-75.30707135548,39.01666513594],[-75.1931721774,38.82218696272],[-75.05341480753,38.80875503297],[-75.01770587603,38.45188674427]]],"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":"delmiro_gouveia","name":"Delmiro Gouveia AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.94962469285,-9.42956855866],[-37.94833723253,-9.33972104942],[-38.03902808374,-9.33834478757],[-38.04033700174,-9.42845725102],[-37.94962469285,-9.42956855866]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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.94577071764,-21.31403802661],[-40.62309586758,-20.86277859527],[-40.38881524148,-20.65176928183],[-40.22208792475,-20.29831315792],[-39.80383232847,-19.66412347768],[-39.69603449437,-19.42573412636],[-39.6730376231,-19.30437313323],[-39.70537697333,-18.61383779319],[-39.65291536073,-18.33096390659],[-40.22280657698,-17.97586605847],[-40.34282149894,-17.91980423648],[-40.45277528971,-17.91501764849],[-40.46499237758,-17.92048802421],[-40.48367733549,-17.90407639054],[-40.50164364117,-17.90681176832],[-40.51601668572,-17.8890310587],[-40.53326433917,-17.8890310587],[-40.54548142703,-17.90134097056],[-40.5893192129,-17.91501764849],[-40.5893192129,-17.93211201178],[-40.61519069308,-17.9341632245],[-40.62956373763,-17.98680287756],[-40.64609273886,-17.98680287756],[-40.65902847895,-18.00730758632],[-40.68777456804,-18.00594067991],[-40.70574087372,-18.01755904646],[-40.71364604822,-18.00183989709],[-40.72155122272,-17.9977390189],[-40.75101596404,-18.00252336752],[-40.76754496527,-17.99842250522],[-40.76754496527,-17.98133455271],[-40.80922679445,-17.94852104795],[-40.82431849123,-17.96014319437],[-40.8315050135,-17.94988839894],[-40.86528166818,-17.9827016498],[-40.88396662609,-17.9676629996],[-40.90911945405,-17.98475227559],[-40.77760609645,-18.1077461392],[-40.77832474868,-18.15145652556],[-40.79054183654,-18.15350518192],[-40.83509827463,-18.14531041238],[-40.89546506173,-18.10364773093],[-40.93283497755,-18.12755376077],[-40.95583184882,-18.12550480038],[-40.95295723991,-18.14462749757],[-40.96014376218,-18.1500907413],[-40.96373702332,-18.14326165996],[-40.97954737232,-18.13643231189],[-40.99248311241,-18.1500907413],[-40.99104580796,-18.16306526069],[-41.00901211364,-18.16306526069],[-41.0578804651,-18.16579661567],[-41.0578804651,-18.17535602159],[-41.09596903314,-18.19242508686],[-41.09596903314,-18.20539645898],[-41.10890477323,-18.21290575936],[-41.09812498982,-18.22997114669],[-41.1053115121,-18.23270145336],[-41.09884364205,-18.25590732904],[-41.1290270356,-18.27501572272],[-41.16136638583,-18.30572123183],[-41.15058660242,-18.37393619787],[-41.16424099474,-18.3793922314],[-41.16424099474,-18.40189654461],[-41.15058660242,-18.407351693],[-41.15849177692,-18.41144294087],[-41.17358347369,-18.41144294087],[-41.18867517046,-18.44485115689],[-41.0212292015,-18.46666526175],[-41.04638202946,-18.60362157901],[-41.03775820273,-18.61451885232],[-41.0578804651,-18.6267774504],[-41.04710068169,-18.64856833073],[-41.03488359382,-18.65401561396],[-40.99895098246,-18.67716461675],[-40.94505206541,-18.69418392578],[-40.94433341318,-18.76972898283],[-40.92133654191,-18.81055006856],[-40.93714689091,-18.82347468178],[-40.94720802209,-18.82143401943],[-40.97092354559,-18.83571813552],[-41.08375194528,-18.83231726565],[-41.10674881655,-18.83571813552],[-41.11752859996,-18.80782897078],[-41.13118299228,-18.79286214638],[-41.23610621747,-18.79490315535],[-41.25119791424,-18.81667237761],[-41.2476046531,-18.85544182257],[-41.22029586847,-18.8799231739],[-41.2080787806,-18.8799231739],[-41.20664147615,-18.86632286449],[-41.16424099474,-18.86700290617],[-41.15633582024,-18.88876278307],[-41.1290270356,-18.90440094845],[-41.1211218611,-18.92411655188],[-41.03919550719,-18.98664720231],[-41.07584677078,-19.00567361403],[-41.06506698737,-19.06341902698],[-40.96876758891,-19.12725524781],[-40.96158106664,-19.15101775756],[-40.92996036864,-19.20599786475],[-40.94648936987,-19.2229633254],[-40.94792667432,-19.24264106543],[-40.92564845527,-19.262994866],[-40.94936397877,-19.27859773554],[-40.92277384636,-19.31047723804],[-40.94361476096,-19.352521543],[-40.934272282,-19.38099701507],[-40.95726915327,-19.39184350499],[-40.9737981545,-19.42641186672],[-40.95439454437,-19.46165046782],[-40.97882872009,-19.50297829748],[-41.013324027,-19.50297829748],[-41.04638202946,-19.48333195583],[-41.05428720396,-19.48400945558],[-41.04135146387,-19.56664313353],[-41.09237577201,-19.58966465422],[-41.14627468905,-19.6560023745],[-41.16495964696,-19.65870945459],[-41.17933269151,-19.69389733589],[-41.19658034496,-19.74598826039],[-41.16999021255,-19.80617607525],[-41.18939382269,-19.82375473895],[-41.18867517046,-19.88526474348],[-41.21239069396,-19.89742873112],[-41.22963834742,-19.90215891837],[-41.24688600088,-19.93323948769],[-41.25479117538,-19.92918584689],[-41.26988287215,-19.93796860383],[-41.30653413574,-19.93391508438],[-41.31515796247,-19.9697175726],[-41.32450044142,-19.97647184801],[-41.31300200579,-20.01226467389],[-41.33671752929,-20.05547534637],[-41.34821596492,-20.08652567207],[-41.3554024872,-20.12094384129],[-41.37768070624,-20.1580529872],[-41.3870231852,-20.1863849412],[-41.4107387087,-20.19447883957],[-41.42079983988,-20.2025723174],[-41.7635969523,-20.20459562113],[-41.78515651912,-20.28483210523],[-41.8505538718,-20.32459783588],[-41.86348961189,-20.37513273815],[-41.85127252403,-20.38186947551],[-41.84336734953,-20.40948702116],[-41.80887204262,-20.4249776227],[-41.80671608594,-20.47211333219],[-41.83115026167,-20.4788458242],[-41.8110279993,-20.54211679742],[-41.83115026167,-20.55086497994],[-41.86205230744,-20.61814193832],[-41.82108913048,-20.64437190401],[-41.85342848071,-20.68068284947],[-41.87139478639,-20.72101815833],[-41.86780152526,-20.73849345818],[-41.88001861312,-20.73983762845],[-41.88289322203,-20.76739048664],[-41.85414713294,-20.77478186241],[-41.83330621835,-20.79829746931],[-41.80887204262,-20.80904624047],[-41.78443786689,-20.80568733178],[-41.75137986444,-20.82382454951],[-41.74706795107,-20.87486573082],[-41.72335242757,-20.87553720984],[-41.74131873325,-20.92723207622],[-41.72335242757,-20.97756707786],[-41.74347468994,-21.09763138917],[-41.72910164539,-21.12578887114],[-41.59399502666,-21.16332386392],[-41.57243545984,-21.18677840236],[-41.49050910593,-21.18878861828],[-41.48332258366,-21.20084933958],[-41.43948479779,-21.22094835332],[-41.41289466538,-21.20955924815],[-41.34965326938,-21.21290907619],[-41.27994400333,-21.24640317418],[-41.24473004419,-21.2323365795],[-41.17717673483,-21.25511039335],[-41.09237577201,-21.22429792287],[-41.04853798614,-21.25912893631],[-41.01547998369,-21.25578015812],[-41.00254424359,-21.28725566578],[-40.94577071764,-21.31403802661]]],"terms_url":"https://der.es.gov.br/","terms_text":"Departamento de Estradas de Rodagem do Estado do Espírito Santo"},{"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","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Premium DigitalGlobe satellite imagery.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAgAElEQVR4nMy9a7Bl2VEm9uU5595bt6puvd9dVa1+6k3rgRCSQLKMEDCBAHsEGptAGE948Bgz88Nhw0w4bBzjmBl7HDE2EzM4PGZgAIMNNkYEDKDBIARIAoQeLSG1uumu7uqq7nq/bt1b9738Y6/M/DL32vdWYzw6u6PrnLP2Wrkyc2V+meux95WFd31fAQR6FdRfRYuF7ujvAhSpdQsgUusLSikQ6e6hfkcpKOJ9AIBo/VBaINRfqd8jd17Lf8HqgspCy8pm6K0Km4pNCYUqimQukHrs/mn1kcuoi979QNsGo02rRNVXjTGf3e9ePRoj2bZe/Oz1a+0j41omLR53+vwqyzBqDoR9casohe6WTmrroPiHVKcA3BkgYgMsXN9csXT3itBNN+lKDp37CUSZLahKIPrGp1FGIQYLeaBIdWhSQnGmjIoqXukYYIQr4IoXCfVPl8oQnaEow/qBUoZl0KZhHKoM3QAL3S9WjwGro+P1CtHLn8a7lhMfYgXFxqtU+mx83m0JKpsWGUadSZCFEdNqHGrodk+otoj9dmSQrhK5paKx+5WQkmpLikjqG2agQrwpkmQEQHHe2AZL11c22FJxxepKsahVTCvFBpadjEe4pHtqyPpbqtu5casuitdXPs2r6XNABuOwqB7EeFMDLUX5T9G4Wg3zqarOZd0n91VcBi1HB2gWu4WjqttXMGiZPhlGqKFGUFCKCyAiHpoCDyV0CL1vdat5mGEWQ0o1GTKrDvOLO5wyZ3XFfN946OxCjK7dFa/p5WpYETn0rnQj6b/pm1LreCjkky6Dyizqt8Y3NJDaIIoAUgqhktQ2xXkWgXDvso0M4nX0vusZNeIqx8S/RnCAxpiN1cdd6Qn15WMSy9lQAv8SywKETJkMk5hjVRhns0ioChLUWfLymJu5ZCWTMWQWiFDmKNRAnaT+o4KZaTBzAsCpIJp48Win6Z71UarlKiB4lLDhU4dlRDNnrTWlmMyayypN0xWlj2Te1BOXlV55loGCB1AEnnGqx1XaharTgMd8Xex3Yd2bIgsNIkd3Zlvp+fxS4dZl6I/rNMkwcu+IA9NLkY2MG4Xxqy0FYaA6BZFwxjQRkxgzDHlpzAOuEGOOIqlOjxUx5HUfLarnwEPEMUIym8go0zQIhdsb/Ft/wTlrbsCmnl2CuShlWIYuChVjS5iizduU7443Q0YNYdXZu2o+mKZ7YVmE+CpG3/otfSlQXIZSaXCEmDYZRoZVRf9hB+w80OYTNFg296Q2yrCFd2png671henVT8rVJd9TmpQWmYqkjbU6Go5Z8b4k/LKQa23E5dGvqkDTDzwkB9rcR5WNUjPWSXFzCXqSUjq5t5FB5xYEZZZmaWTLE0udbzEGampDawrk28XLRdOSKoP4yo5Uw7ZITuUC1R8h+BTKYKtMKkkpahQgb4rLjm4QnYGqpxvcWhsaPpvEqNc7dGqELKpFSih4IspCRkT2ZVZH1IhIpVBkMqJdiFXa6mxhibhEgCqmJ5gzMYqXGgVsUqd9WB4pKFJCVGFJTIaqVNVZUwYwcKH+Fr8tcOmMp84xi8lF4FV1qfM+BzafT6LWs/FnHmiQOHXuutE2KoMvVkyTDKMSDN4N33cB1IPcpW0gCQn4N4qia/XsoqHKL7M581oPaW4c7mgWlUqxfsycKFTHeYaVOu8WSqSmZVrbhikglcGOMSz24askhfrs2nB+avMY0g3zWSyOaAPPi/uxkgyFFV89t6gMjmqdsYlYWqxjY3pQjy/eq42H9ekg5cjqJQrVtjonJcmPYEM2J5syGUYRo/qmFASAV+N1cSgSFL4PsrPCTcElTFZv6GpXCDpmbtFhlIYqMfCMzoEUDTxgEYxBEUNqyiaOOEazGMq7IzJzTK/v0DbxE6mG4sut+VI0DMg6IIONiVYW3aPxSMLqdYMszrJryhkm3hQ9LdoTYLJh6Vexwff83xYTGFegwDBdMozisPiASs9SYzWhQVPyERWJxwaDlnblcsDnC7nfZI0c/qIRuw8VQ66WECHOOF3h+s4k79h0BbTsB5UzqjnL7OimDFbdpVUM5mBIhhYIUG91jNjJ8yyk2DiE4RbltY+ongsGwRAm10a+OOFk5NMqwygyuY0TmIwlerkEetYDCxrNqLImbQQw9Gv3Hipq2NXvITwCKGqw3LqDXRRDsk4IM2jaLbfAbJM6Rxb3Tv9lfIU7ceIehyajq0vOSdiQDApMEXQKdFM0c6a0HECkjkMySbMXDvV8n1d6SC8+cTK9NuNgBbEyhTKMAAR0yrt5bOh+fqREaIeGP0Vm6Q94ECcJV0os5VyzytIJ5hl//xSU/6tteMXfB6nUsOwrRVJ14ImMt2N9eE+KVjqgJEN1Nkc1501qOqD27BtuQm2K67UgGlWSgcvVSHgu6I7E+XgloTNKINSzjnuLJUzH2WmOMKcKTRkqSEyhDJPKghOtlX0y7MR0ct1tu9OGCC8poMTJqtIA7ECf1hfycFUSlBNykpBiwI1KlIdKz42sJnSlqkngxk8TNRRXjq4C2dyuis9Xgdkv2NhNbwWkbFqxA+lSvF8bDLYLEK/meEMyIPZJ48TpikCoHf2GL5Z0KYeYg3fD6vf4CnagSGv5ry5FU59hMk1gS4qdFhkmmiJ4B13rEoh42NKczp0BPriiNWB1IWREDSYy/dI1NCq+XOdKcxRxLWuZGxn3VZXFDieaNhVXoonEjuIDqW3jwIRRNd2oUUBTA9aMpD6MHsU06q+r05ehN80Lk7ioK0/FGJ2ZHnenoMjjg6BzIZ2bBnjcuD7zZW3b0eWrLcOo1I51EIq4Y5TCDWH/x3CoaFaoAoECexYZta1G8ESp1ChSnBaZMBSS2U+L1SeH5rbkqFFvDWcoZJwqOzm+NstoZgfPDNW5K4kIWmnyGR2PBLX/kvodkqHE76IRmnL5YCwl9uX0qQ316X0orOvvalwl0Tb5uu/OB3oOzuM0TTJMzJDrgHW8q3cxQXY8CUKyxxeUcFjPxjVHhhbipggTCEgXxzR6ZMTkf912I6VSFcHHVTzb0xUjR6EYJt1xWmkjy6e5a754taSjI2ZF8QiN1yWw68sgPAg+dlL54fSMQ2Bh/iTYh6vcEIpQXulqDKzMBTWpjJnxMA5VR0L1p0SGUVjXr0ZJm8gKvh1fZNwaGbRO1IdE5uBe3ZtwgYRtas/BQFR1hOjR6xEmyZkOO5A5jRq4Cql1FdmpXx8TdT93Q04PRPlKl9HT9Eg6hMoRx/pv6KKX+lX5ewsTia9sK1wQ+lJ65rwNGRRxVX5C8yBDQwdBNp0fTZEMI5+EOsfOrA5AqeWOZiV80vhz7s36qRZVQA4n1huCYyK3C/rkc3UdTa5j6V9r74F0o6mWsiyqwNin7266VzqPHDqJrvhCxaCfD5T3mjRAtvCXCmIZg3oT72wYLcsDbPyCEWZeqzUWBSIzAGfE7K3Rl+tNpk6GkU4EAfXQevCKiOlqfqE1ehWMHSmuDFX9FAqKhdA2y6TGWb3bEKCzL6vTob/fK+m3nXy1eVB0MQdyGgE9MUmIzwos6bvzTu21TOrxNfOHfqQyPgY81lPVTqghGdhYfKmbeVZhQYPQl6krCK1DX7pnEOYEKqNUYpryhlUdIXouT9z0nS4ZRqUaQuibBSNezMq1I3o8zQzMmGX0zIwkQzUjU8VGYYLnp/xMuB/Wv02WJbZlhWnqh9SWUsJOLHcudlTSq7djnjhFrPcTplg9k0sSbcg2MqheiKSlLamepEmnokkYJ74dx9ZWdUrdrymBUlsfPQajjUyjDCPPodnAkbxYx6pGEsVSRgcgGD0vKVrHAlrGdJwtBou8LR8PSjgjOnFFdR4x46WmVR/eXidofOSsOMlqs+ogQn11ii1Eu1iY8s/urJOOJaVt6lyVX2G+jF4ylDTRHpTBQ4mnGyZ/to40nhV4er6pdAmEijpy/S2apjqxRneJttlmNvLpkmGkDGjeTOAXPiv29dmixE/YWC3C6OS0sxZFWkZNLevSbw6vsO9k2jBjJmczUOI0g0jYRDilN0pSKq8qktLU1a9uIsby1whEOpGKgJL5B3yiXWhlSu/RDwcEFd3ptGTwianSIR6pbdz3MYoISQrpP0d0j4wlTn5LvMdAp+mvH8UGRcw4vtMiw0jqAEk1om7JVIeluoE2AJ1R4vFmcOPwXu8xoheNHooCInasVxT1a8QIKzcmoLj1JxTwaEVr/6QY0jvpz4TrnBLFxoAn1CYD1K4L0Sr0DEXplmNpYqf9AtJ41qLmtpoOEK8UfJsyFK5Ao2uRjuVXsGJoSemnRd00fnEJXaJRMqrniybL4b6O+xTKMPKQxSZvFkffNa0q4GdfC+gTBNrFBzEwD0UNr1MfCqtlvoPMwUIdSesrWxpZzEGoXzVcR5Dq6IRaira2Np4XDkpdkoWQPLobXWz5Lk7soyOaMwt9NyeJ0ckjriZeMihDb9OQZeD5DhTcQDpNR28YKUrUUbhYPYy8yjvivaa3aLsplGESYAjKIFm1OUUnQVe9cwodYAhoj6gyKR2tOJjuqRL6Ux6Ll9gEUoKee5uAhMwdAhNNZY77LtqONeSbakX7oPDMRyvCBqOpwXWoBh/2F1QXLR0oLeXBb7j2ZUgGBzGmxX1wvZ4e69h0m1yk/WoCvGcUj6TY4JEKq7FqyiiIdYmG/RYnMS0y+MZcHYnOMWtoV19wCHAES14WpzbulTx54V1dUyDrM+XGcYUGFiqE7nsIlfCKF4cRNC5R9dc6XT8BqTMf1Fblstq0mlHUEYKiCVqKn6lFGPhKl6KK7CBD1FMCNdJ/0AdTEJcb7MBE3iISAZeWR4rKfyppoHnxwqmTYWTVhb1PjZWbDoyLtVXGggc5AylF4HsepFibEtpUqKTyaJgx4YYjTXXcODllXXnMZBeNS50g1GLmqW0htri/KkOvWYrMgTnlIoFPlqEHwaaugjQE/bHbLo3I/Aw5JBuojk+jGrfvrUROmQwjHizDLhGfqWcmaweWsqWOdKy7ex4JIrPRadz2KCIAPYVsf5G3MT27GySgPF7MsIMzs1wKFiyPokgH9dVXnYe0xeQfNtGMqBd0NSB6lsFCTykRmgldUSftnlmW2FblilbbY9159Dp5JznS074rR5YmUkpVpk+GiaU7EpevSs3hLa9VJvUbAajnA95JXiLzTS06chuciaAQ/bmHy196xmQQbLLAJruJbeO3lQbZ1xKL2JDtd2Y5kbJ8Wagwy2aWQQ7UAoPET4gOpXWT6SQttpJnpaOG1Uo7LK2h/lTHNvbUyLEzGCA4onPfUyLDSOoSoR67tYsMWgBbetXVFHVIB8pmTEqCed+mo0rY7ZcMT6lm+dWhk8N1VZIismFltAi3KZplvnPkUpmDszjS9M7daEN1RpIxfOf+e/f7MvSuHs8llvMKFw8EA1RJ9cN9GgyVOfdpPJMiVU9KPwHwtMhgz1T31t8pl+UVraIELM1wx+z6VCeKhtmtODkjfsbJETLn3bWUFBIjFkcBTifiUpySLCa8v7GyrixVBTt6kFDZESyVjKtQOsiuq+Kf8HEYBI5kG8YXO31DBq4fELLUPRXTiwth53rI2YbAoYTvRN/KxAGtqMwtRyAa+j28WnI6ZBgVtXjx5c2wTAp3LIsQqN5tRwzMghEkpN8MEF0jPz3rfYl3wiRp8qU2oqtL5hPVUPRepm6IzeG3OqIeAbC+WAoybr5v+xXhUVoHHMeN6Jw5jQS19Rk5bE4SJtJZBgJEPUtmTiQqG92nurrzHiJrMOaOZ4HLEPZKbFGjFqlta66vv3WsGCjD9+mSYeSTwaLwH84A+WDwD/UuX/ktwYI8ghiCZ0RzK3aDtifwJTJODNguehXIJ1pQTzFZbU+lKkaRwXfOWTAyTFYc8lyoIQPTUTLkpMYvXyWVKaspP95WBtMDkxG3RENCEsxoIfKl/h1AMSM98x/R3dpQ2uLgEA20ycOUyDCyAGHeFVFL2TdWFJqqE+QdVN9ijx3ZikKt23qAhyJiaktHd/VhCiNVopUab4kYrQKECSzT4r7ZUVRxvNLBY9jHD6sfIDAPQBqgFhkLBYMylL7uMkiYHCCDdecKvFi+rf9XfbJT9mQtbjucPzMdTgHDK2amS4aRepTzUpHJA4a3ScR6E3k2mEqH1+/dJwzCqePqSNy8oomFR+Yk8ZatU+h7trQwea7/G29NqwQpNtZTcZx4od3yGD1CXUFPBmG+8tWSgVILNzquS0wGI/BBD/oGnB4ciLrhChoN9bxIGJ6TgcSde9fldMkw4pTDowXgB4zgKJyXswKyqjLEfpqSgsJUcBeiM8bYzq2HvVUFSBAk6TfxY2RKUkQSQYyFDOE9pgJbmd14yM+bFNLFkM+1+OqQdECGnIZZCpn4FlJnKu+fHnUG7IAkMRwWHlywaLBZhbn+gMzTIEO3U615NwoxI2TjbojBZhIqUwjoyV9SoUWb0k1/g/Fk+k3kMDZjGy3XlaPqxxDEoxBm2wWmg6rxcLKUaPX7oAiokUnbSN3crLoXk82PnvQUY8qiY/IiO8rg7VWxcTLeHARKU/LqjOrV5Jfcno7fSywP85xalFIQ02VzafqrLMOoupEnGgXwZa4Y612ubLnsvbWtGkr67OrSQS4A/uggSc1OXK1BI5f7nRtHXNkofhYLdTxsblOYTZMZVNY/8yJNJOrGWnXEh9Iqz1VhFjirEcRz+j6oLoA6DkfXhgzspUX1qTzQ2CnvOvDqXToWDYSNfWjfrvLQQuh/Lub5nQFX8aCu6DpFMozsL3gqkfAjrKJbWaQCtV9CUjZ+ekbb0NStNxpn7Mr2IFLqIxX6zcNjb66wMN8RN8geLHX3I/gUioyRryy+fudTluavqY4PrETHVSStHpSf5WjLoJbFXaR2dDssNBhYcIUkl2IFg4Hpg1GoUFuXwdLWLEPob7pkGPHNXjiPEFsdmB7sIBE6XhxJGWW1zyBZNYieIL3Y6Chb2DmgfTCK+KOb3gcp0pSUFMh6ykiXVNFL5/hSxIOjWS+UpwbSE5d1RKjYkMEm1tq35mbqnKD+C53b0fEgtAzyljrONUo1ZWD0Ntm1P7pX8rJ1ROtpk2FkD1FUVFKj5/r8Q9GeD0VZiOtxxZ+NSyOH0tD+w71i/bqDM2wXBEMEbE7Eodj3NRCNsGXYpIPsIHl+DfCAaQdep3kgL3Tkn81B20YGizShWUJbvc8gwaz0nM2dTp2xy/Wpk2CEhPAlK9SQjOZaDpp23m2KZBjxfQD2HKz2JkW3n+p3YVruOBYAijqIxNQhyZmPJbgTqkEJ2YLuQDf0NbBKUYICB/TdNG7c1xXjI4cYBHmZ5QAbDVQLObMWbyNDqQgc0FJlqIah38NCAUqilx7cIb0rOxne/BxXR7szm7hRanUVbIsnq/6g1XTJMOpNSETozX3xpKuegAVNTIM8OmFS6YQNPFpA79yQLgeUAl6CtajYq6sMdL8La5J9zWQurhUjlTyWvvPgNaMBj7jxTcNT+zGwoDHvGOI+QTfrPeW7lEEZnLYWCoIe2Q1DaPN6hesVgzJLny3a1ojrWCLGp4534I/SYZtcSycDR/Bpk2ESxgHKt1uUljmw5eMS8Lpq5DQhFPUcuuydqBw2mSSFQJtIpuhiP4lPb0+/RFenYpiNEzZHYT5saAQp4tncKIFIEAB9HdpgWIiVrBbYkfH0eK7TSP0Ui9EU9fisFh+zr7qgMTKg0TEjz9WJe++wJhmc/7kEehpOXAZjV5QCjQd59DTJMCoiYW7byeKRQZ9VJV7JoPTgFC2FshakDq4RrrymP5Log0zr7wUWZv12MVRBQT0tqf/3nanniLUPjVy9B5LYUVgfZJUWZun/EL1IUYVpW//0q1R61pWfPA4MDMhg/XC0Cs5OTw1SdM+TyVL1FZ5TKToZJZ6FAIfmd5pHM99NGeKLkCKfUyLDKCjXWQUnS0UZJvn8ZCKi1yeF8F/q7ISqTIV8EMGa3UkIUVkIQ1AVipDY0i3d4whsU3iufHUeHerASXY8sNEqP/5uHpqAE5xTWhnb0shI6MaaSh6QIRkYnWmlIJgd6aEYSOnNrm04GmM4QjoVI03znFrRuuXnalyG5pyMZJ02GUaWtgSOg0UYAkuwXlAuaJybBoSplK6kt3zGvlgrWmsp5CwJPah/NYze3kIpMfIZi65cD6FkyJUvo+0e7H3mNrmfojKgEXXyEqAPSMt2WlfYM+EUTPlVVLVxc3bcWFwGm0sR+DB7irYuX1/XjuTZSULFXptpk6H7+xCS+kj0bE6gPznH3elqGT8LxUbvXbnBJuNS+fgzf7c2vRtEt9WY7D/MIXSwwNEg1u9dxGQ8/kw0Ut/SEmw7GXIdGsTm+Z4Buj1aua6kgh7thm5aHYb7A31+lWWoZ5mk37ZGBAH8fI5ZZAPLCqInZaVIHxE03bJq4nR0ky8YHD9uamhANDV6iNcNPLEMneDhXj7dG1CiFQkSOaMnhFitq6T/h8qH6lhISZ8ptS0DiBhPEmxfp3meSOsWqltiu4DIOUoy31MmQ3d0QyJvHWPwyCC6/+DWoRtpsT4o1A3FLWdMArMS6nCkUOZKoWcwFMBT6BOG2awIlcmQiKIAWilWLmgolsUiffhDV8k5JP0PKqfv/LjooAy9VSd+ei894iqx3HhSEEn+a1rkFIhTVdMjrRJSNhD5o5Q8dCJTJ4O9l8n5rwY5AG9qxGE7nI23MmDg5jI0nKSfTlhksN/FFMe2bO3DBKt3sxmZO290BPA+ksxJrmi09IBLi746nCAsDOx4tdKFIRnIEWn1PVTRFI1XbYykvmAipzyFnnwmskENJStFDdZaBgRucB+/TIkMtlOt8xld+rNXwMONVjuQXF58a96cApRugVdq/IENV0oxzo21sPpVggaNVtGmSfHKz+CAMDz7+ZhCfXTtVG5SnGq4PubqJyi5L4mpHcKXZjpV8g+mNSBDDxjS6HCEiZtaSpfRN3ZvGiL75NU0f7dv1bMZLK8IMRG4AYogczMtMoxCWKY3aWRUir4Ub9qafqClN3XrnY6YO0/xbyWke4qytthjYU7ApDIChzdsZ3Qt9BkmVvREV8vYggLExiIiV+6LB0mNoh0xJNlBAIMBGRgYepfRct7D3kztg3dzDY1zfqD8FC6i6GdddZXSUKrQQQe2ejRlMozoOB2UPR7fHBUKw14spBDEX4WMprpEjym6b/MF91xbbWoZnHKoLAi1oWXgoJjC7ROsULXQTwPS1P87A6AHi7TcJvrUlg09d5SNQiF2SIa8UsLOyZNCs5+E1NQuGG++1Cgk3y6RDwsJjHguQ3x0tzEPnQIZRuAOdFVJq5rHuRdLdf94jJeF8+MYPMvvHXVgpFbjUSOGb7LEpbzUjuobf/W/YDQWYViBDT4k3S+JRsspSR47IsD9CfqTdTMS/p14DDg1IAMqaATVkjHmCWsDcfubioSabIyBFjPMekD/oj5DZOQJ8xTJ4KddOXSIGzpPZEXLKxO8TR5PfLqB8GZNb23fGE1oaQNfFUZKbMzLo0FZe61LqBA2+9AwPpoLwdt2MsRB8zCgfXLo0DQxh4cUYbVAfboketZ8QAbA/o6CAxfP50rsg4U3HZdYbmzpuCVQBAKKN7A4ysZ1mBYZ6zTJMFIi9clmvymehXFOrl4eUD84np8s9MN5yZh6Rk1LaFxHyZvx5a35fl0WOKRE1VF1IzLkO+KEFLOcRm2lDhQMPDHBkdRoFOvbAxohfiBBgKH1sY0MUHQV7wOUOiQdFPhvT1EZhb1/G30RhAmO+H1jg4ytUB1fDSrOByN1iBDTIUN9c5+Ews7+tFMfM7aFkAKZcw6sN3NRAMdin/FZgELAoF+ov14kQZhQRfQv8Tsty4W5S7jvz2Ko0YpGsjTYQRZDsDq49of7GMG0n6QTcqawJKw0WzJA7aXKIFSoxGwxI93TdCQMo9IpJoIpgfzdHFnIAcz4VReK9PDHCUj1maVpkWEU6NUOunuMSuQU6mgl/SZGfQlMgvMIE9I+SupLUVC92FCE+kS6tB4J2clPCmODU4O2uQ7xr8CeQ28IWR09jmqdLDxA0fHYiIvRhB2DMefUtmE+MiCDsk23HBAqoGlBKfZL7SU4GhSX6aEd5V95DYNOjxwnnoQGQcE5bt6hd02LDHVjjislgyPgDVmCxApWR9iYK+2A2J0xhIN5GTIKIy7YPkh5JTbolcHbV74MJeBlIa0D8SuUxjEd0wNN3uH8NnlACgCipwNKiAZhNS5EiG1kqMoJ8z9VPjoDcbDQZ0OKO2HvT/4ouDAKq2YqOIkbe5in8XcGlIDMDW+YIhlGoCsgedfMaOmR8K6tDpojMz8zUYqYUKIMJ4O2VSXusSgWpCMADYdpT+JB6BJJ9xE1V0BFIDdye8DEcSnwwIYb6XBHSaeUAjKSGm/aRp2V+MkyqO96uaJgalDQjU4SwfXI9dCoJ4Gqv9jY9ocZEa2NITm1zdFt2mSYpGbqP7UCISBAE2RRkHSWS56wVkqKnFo/5cCo5YrUliIU9efqjmoc1N7QXdubAYPaWMfejhyOZfDl2u5XRGcfAG/o/bEM7sk6Qq7H2ZkJ9szvwu5ds9g1N4tdszOYnUwwOzPBaCwYjwJGYWNjE+ubm1hb38Dq6jrura1j6d4KFpdWsLG5GfVp6VfUc6k89PRpoOPgIqEdbEGjO/NWaMC0H9ZHGl8CNNNv/Wa0s018lWWYlIryMUWR+uyDBCQNTqGVzUkqNzRBNgWExyWpPdlO76ivsD87j2ZmMejYXMAcgJSl69zCfamm9Cg7O0vlzZ0J/pRfRXDlpXfmiAZHRLBv724cP7wfxw/tx9GD+3Dy6EGcPn4Yxw/tx7FD+3Fo317sX9iN/Xt3Y25mBrMzY0qdgOWVNSzdW8Htu8u4fmsRV27ewYXLN/D8S1dw8coNvHT1Ji5cuY5rNxexubkJc9IG6LCTmj7JgS2iV7KCoAIAACAASURBVB2oYal90bE7T4fpOx/lsYd1qo34imUPMxOvkZd/4zLsfdeHLbiQL8IP70kz7cvOHRA6NTC8TOhRyEj1d6c/RliiQ5PgZirauhKjtixsYQsRaTTKhZDAaK/ao3K6PRoJzp48gtc/cgaPnT2Bhx44jjPHD+P08UM4eeQg9u2ZDwPJ+zosp17haAj9LgW4fnsRL7x8Fc9duIKnnr+IJ595AX/8xWdx685dOOAwaKVPICrS9JH0m9tU2iGlS2qygc3loH45umhGwOVfBRlk4V0fpiBAiGn0C6UN6TGMYLcaUeC5PN8zhKUb7rbGYzA0oK/MjO5wdGo5I3kjNBqG28EZaFAyz+at3Lj7MR6P8ODJI/j6r3kcb3/Do3j07AmcPnYYxw7tw+5dc1V1ET25fxN1B0cZai8iWLq3ipev3sTT51/G7/3pl/Cbn/gczl28Qipgvesw96zYPxuo47UJGJDGK9VseESjfm7t9A3h/w3JIAvv+nBx4s5yvrhZZIGDUGJLo4b06wywuKOqeqhjsvEmYGOgMrqwg7RCzsA48qrU/PwcvvUdb8Jf+cY344nHH8Th/QvYv3c3ZibjQUPOBs9XdoTtIsVQm61ScHtxGecvXcNv/OFn8bO/9nG8ePl6xZN6CM5S4ipUAoy88hbycdYPkCJB/g4Dku4OWViKEHG+Z0qzMSvW5v9fGWqEiA9ihGO2wYu6zpv2QxHO+gopUk1VdAWK65NDo3q9T40d4XT1Slj5QcjOsz31YqUysYwAKVKxtshhxqMR5nfN4uEHjuM73/u1+ND734ljB/djZjLGaCRxIAau7VKkncq0vNVP6/fG5iZeunoTP/l//w5+9tc/jpt3lrC1teUyqYY5MrPOSA0Y1GWqn0Gr9YlS3+aSaIbyRr9AGq+/fBlsDmHi0LyhKLWC6DCcf3VuHUBB7+mAhs2PAaMxupw7Bp5SYBwwulC34bWGVA0gag9swczMBKePH8YTjz2ID37z1+Pf+trXYd+e3YP9b5WC5XurWF5Zw73VNayur2N9fQPrG5vY3Nqq41gwGo0wHo0wOzPB3OwM5udmsXd+Drvn52y1qSVnC8CGHEivT3z+K/iHP/UR/OmXn8Pi0r0eLQMVS1EKJCILoW9SbQI+vhmzhTgm8WgPT3xbGYWCWD+P+MuUQRbe+WENSKFG6LKUupFRzYkDB/OqdTHUKRHP34fK0PiO9r0mOmcmGBG0Ye67tpuZmeDRMyfwjq95HP/Ov/02fN0bHsP83GzPIDc2t3D99iIuXbuFKzdu4/L123j+pat46eoNvHz9Fq7fWsStxSXcuXsPK2vr2CrdxuRcdYQDC3tw7NB+nDh8AK86dRSvOnUUZ44fxgPHD+HBk0dDnzmNGrpa6dWl67fwz3/5d/BL//qTOH/pGspWhTx7e51RjspS8Kv3THNCOuf0Q42jVOMWpjk0NH1Dh1umy2vOwznEX54MXcrkHLgXVqE8ykUUyBGj8SI6kiudVcrGTLQH07eck21ztRyxE0uRIwKNTqK0zWQ8wmNnT+J9b38j3vf2N+IdX/M45mZnOlXWwdjcKjh38TK+8Mx5PPPiJTz74iWcu3gFL16+jsvXb2Nza6sOqLj6ydHDipnyaf2PceroATx65iSeePxBvPV1D+Mtr3kYp44dhCA6wk6rVXnecmfpHn7zDz+Hf/ZLv4Unnz6Pjc1NbDfPy7qJem4vYoTFjWTn3c+G8de+JBuSB+qQ6TCImpb/EmToJtWJ78yurdX2cva2UnwuFFFqO0QLMvLEqVWhWZAhvk28Nf9hMiePHsR3v+/r8a3vfBPe+NhZWyYFgK2tgpev3cQffu4pfPILz+Arz7+E51+6iis3bmNtfQNu3cLCpDSsfrMBasjg4Rbj0Rinjx/C6x4+jfe+7Q34wLvfgpNHD/UcY7srg8zq+gb++IvP4L/957+MP/7in3fzCqAPSjx+5lhWUMXNluogGRxf0yC1tpbNAGbk0QBLpVU31uj1kwTzfyky0KS6VjBeQtyAu0M1dAFjH9WtocvCGjOfoEIVELSZlBK9D70osZ0ftICoNyBdpZEI/uo3vR1/44Pvw+MPnsL+vbut6dZWwWeeOodf/b1P49kXL2EyGWN+bhazMzNY2D2HmZkJNje3sLh8D9duLuLFy9fwzPlLWFpejaGoxWwzYvbLRiLYv7Abj589iR/4zvfiQ+9/Z5jIA20HGUqxNja38PQLL+GH/sFP4k+/9Fy7X/2itqF2YmKk1ZzGJDbMDXPUCJNgpHFNWYMSbNlEa5L8F5RBFt75fV13Tafrp0mWbljwYzQgL4crI55NYg9XZiUpp4E6Gk5b9bEDraDI2n+tOzszwRsfPYv//Pu/A+9+y2uxe34uoO+txSV8+dxFjEcjPPTAMczNTDAajcwYdUe2VHm3tgq2trawsrqOL527gI99+s/wrz/1JJ67eAX3VtY8lRLeRaUJp90D6dRlEAC75mbxTW9/I/7e3/wQHjx5BJPJuBephybeXAYAz128gu/9u/8TvnzuooFprBdMQG0IoGHs3SNVN8A70WzxqcPPu9+ASNxLslSJMpJWuv1KZLCUycg3vI/2ru2bSh3cIgFFW2BULVUCNFnvXQyozTmE9g7oHzgcCAm98pnJGA+fPo7v+eZ34Ps/8B4cO7Q/IO2wctvLniyv0tBrdW0dn3ryafzMr/8+PvH5r+DStVudYzSvFC0BhOU7uh49cwI/8gPfiW9955vCDjj3v90ycKmT1s98+Rz+03/4k/jScxeo36jP3jywkSol7uOEWwZ4sQaZULJikXbV1oQx2Ncrk2E8d/aJH+tuCd3XyQ1beOeNlgeKE9FORGJ7neToPN2VUw07CBKVUZSuFuv3hlY6e5EgvIfLyijB1aEDC/j2b3wLfvQHvgsffN/XY+/uXY72acBaZVreQlytz/fGoxEePHUU3/7ut+LR0yewvLKKa7cWcW91NcqeE2nOvZMMgODGnbv49Jeeg4jg0TMnsXvXbBiPIV6VX/199OACjh7ch888dQ637y4bDx7FdOxKHA8ethAFKmwGJFe+ksNXsOOIyRmCITjfB0fRWD/y9cplMIfo2rulK/2eoREdpSK1vjuP/nYmwiD1jIlWAKpQjCw8iDDFMj30eHShI9Ovf+QM/ta/9234oQ99C1770OlgwEo7G8/a+gaWllewvLKGra2Cydg34vjiti0nGo1GeOTMCXz9Gx/Dnvk5vHjpOm4tLpsxdYsIrJPSBwX9rIh7d3kFf/bsi9jc2sIbHj2D+bnZZqTIcvHneDzGyaMHsbq+ji88cx6ra+s07Ix89Z9WxNFqbJSA20ArfaAUyCe2DgpFCJihZbU+20Y2bOLplcoge9/1YTrl7KFZiu49sAN5wpSdWZsbhTpgzhDcwNsZgNfJ93JG1cqwBrIuvTe/axZ/5RvejO//wHvwDW96DcZj3/jiiefa+gaeu3gFT527iOcuXsFLV2/g5p0lrK6vo2wVTCZj7J3fhRNHDuB1D5/G217/KM6eONx0qtal9xaX7uGjn3oS//1PfwRfeeElbG01ji6wXKQXB0q/eWj/An7wg+/Df/Z9H8DMZNzjY2gjj/l67sJl/J1/8vP46Cef9JQu9NtaJOEUBcjGYbOAEElq9CuAsIBiHXkDjSCmGonGF/gB4goU2d19yjDpjLjUkAR/BqAnaxTcwSoyn49V8CDElIeYM8H7/TgRroOe0uywRzim3dU5fmQ//sa/+z78tW95J04dPYTRKKJmKQVfPncRv/WJz+H3P/sULl65gTtL97C4vIJ7K6vY2NwKChYRzM/NYP/e3Thx5CDe/ZbX4nu/7Rvw6ledMnbz+j+XAcC+vbvx7e9+K/btmcff/kc/hYuXb9DgkLwWqt0INHr62Auu317ET/zSR/HQA8fwofe/c7DfIScBgAdPHcWHv/09+LNnL+D8pWuuR+WKkY9Qmz/8e7UpHj7L+CSIpjJA55jqLNq3RhDEVE/nrTDeiqeYIRLdvww+qQ4cgwinAaKzSCkyordEHATevj77Qet3ITQISqbvaixaPh6N8IZHTuO//I/+Kt7zta/H3Iw/D7WxuYVbi0v4vT/9Ev63f/X7+PzTL+Du8gpW1zfMQLbLu0Eyzc5McOb4Yfwn3/Mt+J73v2PwiHc3HtEIN7e28Nt/9AV879/9J1hbX6/jMiCk8mAIFysUAU4fO4Rf+Ad/G088/uC2c4fWZ6eXTfwX/+PP4Wd+7eNY29iMOg1RQNmrWYOBXFcqPQHiOSU7hZGE7D0SUO/nyTk48hi9hORQgL9/GWwOYcXqupa7SuycvFeXZbsJc2RSEjM0JAE5OGJp1CxUbnTEnpOq9+MhsI5lH+Ddu2bxgfe8Ff/07/x1vOW1D2My7k6grq6t49kXL+MXfvMP8KM//vP4F7/yuzh38QqWV9a6J9BQHMFMc9oHo7Ub9+bWFm7eXsLvfvqLWFlbxxOPP4g9837sO0/YGaFHoxEeOX0cm1ub3SaZOQ8hSAA1RULiSXVeCpbureL5l6/im77uDdi9a645z8m/ed4zrvz8qz/4LG4tLpsOGEwLj7fEHWAR7oO92eeV5jBSgTfJECIlCCDMJ6TSgNkkPyUH4cUIvCIZfJVJFH39OIHlqVVZ3bJsDLeBYUY2gYW53sTQ0D9utaty8nqzIYSoYApHLKAP6qmjB/G93/aN+Ps//O/jyMF9ALq5wVdeeAkf+b1P47/+iV/EL/32p3D91iKFKphCu76IuD1qV+tayIavdADYKgV/+qXnMDs7wdvf+BjGo1ETpbP+AOCxsyfx2aeexwsvX4sRwRyfQ25d7zPU8M8tFNy6s4y9e3bhra99uDf5z6thmZdSCg4fWMDl67fxqSefqRYe01MIz3dSCFPNkJGXSoMNO+g6yWDpr9ldxAZzCrbwBB5qL8bnfcoQIoS/EsVRnNE9e5p1KpJWikrfeBGI1FSJFaS8SRVXqJwhKAumX7v+X/vQA/hbf+3b8B9/9/sNpV++dgu/8rt/gh//hd/Az/76x3Hp+q3EDynUcj6JitTbKme9L2mkCgq+8Mx5vPHRB/HomROmpyGnUAPdNTeD3bvm8PHPfBkrK2vQKG1zMhFyClqWzqNTBCtr67i3soY3v+YhHD+8f9t+W1GrlIIHjh/G//HRT2B1dc3pk65rQk56IzbC6xXdjmpHrnMbyr4MsT+OGrwiFfkyPrRqKLw/GcazZ574MdeXe6kwKbZBNpYwyJyTspB6mweRBiN0EB0kC8cPAZlDVdqj8Qhve/2j+JH/4Dvxgfe8FXt378LG5ib+4HNfwT/+uV/Hz/767+NLz13A5qZuiFlCGs9MBcCIkSPPw+y5c/1eeVtb38DVW3fw/nd8DfbM72ou6ea5xWg0wt7du/Dsi5fwlRdeMn1pNOhFiGTk2bZuLS7jxJH9ePNrHsIM7WSHyD4QtUQEC7vn8fmnX8BTz79kwBdiAUf9CgQRkf2TT0KDnTibCMtA/YVnJMQNuAjZn84j2LeYzn3KMJ4788SPcZixNWFowqMUnFQ3Ln4swxzIBhru0RVRCw8Gh8LAGFmc5SN+3x0oDuZ4PMa73vQa/L2/+SG884lXY37XHNbWN/Dj//tv4B/99K/ij77w51hc7p4BiMck9DPvk+jg+X3jMa83G4YQPQB3l1fwyOkTeP0jZzB0ZYPcM78LtxaX8AefewrrG5vdWFg/bkThbA/xyyt2axsbEABve90jOHpwXz9SN/jgaDESwWQyxq987NM2HgE0tNBSOG0v4CgQeXV9mS63kUEIBHryAnGCrPXIwGHzWhqnHWQYuYeQIWpHpf4oXSN7UxocnS2lqgauxiHKCssQwlgEiELG5AqSVEvZdF5FBO/92tfjn/7of4i3vu5hzEzGOHfxCv76f/MT+B/+5a/i2QuX62QZxm9mIEwCTcleVmwUOTfWsoRKVV83F5fw23/8JDY2Nl1PZHit/H1mMsYTjz+I17zqFIoNRN+QQ5rGMoiOV1f2J196Fl+sm3YAkFe7hvjQ8jc+9iBe//Dp2Fd1SN8DIH0ofYoC5iQ8lCzSdjIYb9Q3G5ECRTU8yXRzJLoPGbrdKeqjgDbkROz1KzaprQwURnBzktpex5Jva1gtyowOkHlfbeOfKrwvgypqdD92zc3gO979Vvzc3/9hPHjyKO6trOEjH/s0PvQj/xi/+rFPY/neGsmWFElXVE5kqUKVjkYiRUZAI1FEsLm5hecuXMFzFy83c3aWiw3zsbMn8dqHTlekSvw0ZXAdaYqlBrC0vILf/8xTuHnnblhezZty/Ju/H9q3B9/wltdAB9PtncBCUdB4SuNZ1eSpcd/gt5PB9evgU8wAsy6inkr45/5kmACIa7jEiwrjWxGFwlREb8tRMwFKR3wZTMOgp02dQxMi2hvVuF3XbynAvj3z+K73fh3+qx/8IObnZnHlxm38/G/8If6X/+u3cfHqDeN9POqOJkzG3eOak/EY4/GoLsN2uXu33NgtgWo/o9Goe/HtwFXQPSnH8uvjoVtbW9jcKhiPRrh8/TYeO3sy1At0Urp2YGEPHjlzArvn57B0T8866QA0+BHSjemumFF96ovP4Pqtuzi8f6Fp+EPzChHB3vldePOrH8LMZIL1jQ0aLR8HUSQ2oIJH99bR9/BiJq2/vQyhndlFcWMPqRrJYt1XMJOyowyTYny62ZX6r62oaDoEn0DGJyFooAw0+4jo3qoi6e6yKyWTnZ1MsGtuBrvmZrF71yzm52axZ34O73zi1fjBD34zjh3ch43NLZx76Squ3LyNb3r7GzA7M8FkPMbszAQzkzFmZ2YwOzPB7GSM2dlJfVPeDEYjsTdkTMYjTCZjzTgxmYx7b9Hja6tOnu33VsH65ga2tgo2N7ewvrGJPfNzOHPiSGiXI0SeXAPAQ6eO4uC+vVhaXonoVyNj0+BCPVfgsy9ewsUrN/DY2ZO2Q5+voZO94/HIHmd97uIVQ0YDsVb/wSR4nlj/oWHubHlnGQBa+HCD4Y5C8HR6zKz2v70Mky73klCpJGq9yAdaK2YlBFmkn03UupPxCAt75nFg7x7s2zuP/Xt3Y2FP97lvzzz27ZnH3t27sGd+zl73ODc7g12z7hgPnjyKIwcW0G1uCV7zqlN4/MPfgcl4hJnJGOPxuHmmJ//mlZ+h3duh7zu1B/pG3/qdaZ062r3QLM5X4AgYUBgIA6RXrbu+voEnnzmPb3jzazAj48DXTvoQERw5sICHTx/HcxevOGhrBlnISFPKqRhnLKUjDMb2fciAQk5F9VwGW96h/rq2eYVrJxnCu125P95BbPHrIlGgK4CMBAu7d+HowX04dmgfjh06gOOH9uHoof04dnAfjhxYwMKe+e6dprMzmJvp3ms6OzOpr3Lsvs/MjDEzHlsas90xivFohAMLezB0DR20Yzr3m1e3aA0ZfMv4duJHRHDk4D7bQ2nyjLih6WkDaEgU5ASfe/p5bGxuYnam9yrfkCJlOUUEBxb24Mzxw1o5ZiqBExobA0vSQwDNjsmYZWwvg4T9IOWZ+xX2t65cv+f5xjYymIaMUK0UcjGdfUvX7cxkjGOH9uPsySM4c/wwzhw/3IXWE0dw/PB+7J3fFXL1yXhk38fjLjffbhmwtYmVr53u57o7bYy9EuTfbud5J4dp8Z7bHNi7G7tmZ2LIFgdTJwRHYwBsX/4cQcFTz18M850hPlrLrwcW9uDsySOYjEfY2ip2HCd1FxjrltSLPwNjgsL3j1KavJMMMWPRJf8IC6kTZoj4gftVrirARFOODqkdoXfNzuDgwh686oGjeNWp43jo1FGcPXkED548ipNHDmB2ZrJjemDKafweyltNrFSWDa6F6kOhP/++n4gx9LvVT67XcpydUjFuNzc7g8lkHEMz3JACbUF6ETN8wGvRs+cvY70eWmxFhBa46L3JeITv//b34G2vfwTnLl7F8y9dxbMXLuH8pWu4dWepeyv5+gbW1jewsraONe2ndq5THmXGncF5vR8ZisntfuTpkf8IizrUj0WpMC+gtL/Wn7z3a1+PwwcWcPrYITxw7BBOHz+M08cP48yJwzi0b29zgIcMaicDZlpDAzB0DQ3ekLFu53D3K8PQvfuJYENXlqNlmDOTMcZSJ/T1nJUvcCQ+C1kD2Dbc2lbW1nDt1iIOH1gIfOwEQnodObgP7z74Onzjm11nW6Xg9t1lXLxyAy9euo4XL1/H8xev4MKV67h5ZwmLy/ewuLSCxaV7uL20jJXV9ZiGsCnehwy9NKtQWp9DS/3p8QT0ehvNl2DpE+VWmPzLv/dD3RsmtjFgWPv2IO5kfFw+ZEhDqy9D9bcb0KE5wU5OkXloyTfE63ZX5qulKy7b2NzqTr3aDDClSiHWx5vOSuT38o3bvec1WjLsFN31Govg0L69OLRvL97wyBmru7VVcGtxCZeu38Kla7fw8rWb3buqbtzGtZuLuHbrDq7dWsSVG3dwa3HJeb0PGcJNjTYmg6dDfTpULgQuWk4OMhlyhmzA2Ui3SxWyoltovNPKzv2kTPy7xfeQwfHvITocaTLPuT7T2e7aLr1kvtbWN7rddYsC6AGqcOznJVjli8cBwG0zvj4/2+k51891sq7HY8HhAws4tH+vHVsppWB1bR3Xb9/F9VuLuH57EVdvLnbOcuk6Xrx8DRcud1Hm9t17KOk9UaYCRf0QZDr5exHT6qR5Rj6EahGo+02T6riTOZT7Dxla/p7bDA3CTpEgXztFnJ2Q/H6ixJCxb5d3D0XS3H/upyX30soq1jf0xWce6v1JM4I10wenVH2ad5b8LFfms+Xo243vTo6Uo7RINy964NghnDp60O5tbG7hztIy7ty91z2huHQPL1+7iaeefwlPnbuIr7zwEs6/fA0ra+uqxdq2ZjthbtAV6n7FUHbmtl9Ijx59zCGyIQylLa9kPrFT6tNCmFZakem26AwNTL7WNzaxurqOLRSs1ZcQbxVgeWWVHs6J1+bmFpZXVu0FZXyNRLB71xzinpdgftcsxqPuZQRzsxOMR6NtUVd5L6VLOe6trvOow/JnLrMg4cuc/gwwrK6ge0IwZwCtyf0QKA6loUPtW/1wO5FuM/Tw/oWwi765tYWVtXWsrq5jZW0dtxeX8PT5S3jymRfwmS8/h89+5XncvH3X9VGq3CSrRQX2HNJHbVGZqf/UexNmcMgpwlDvEAVy9FCF6Juvu2MNW9jcLPZ9a6vQvYLNzU0srazi7vIKFpdXcHf5Hu4ur2Dp3hqWV1Zwt74BY3llFYtLK1heXcPK6hpW19a7z/UN3Ftdw8raOlZWut8ra+sum2UXldeMIr3ftLTBk7lUv0mP2s7vmsVkNMbs7BhzM91G4/zcbPcsxPwc5ma6TcfFpXv2x05aaI8ez5w4138KgkHkB4XuN7L+Rept157LWvUm4zH2zncvcgCAB44dwuseOYPveu/bAHSAdv7SVXzmy+fwmafO4bNPncOFyzewvLJqY94d8c/gwU6Zogrtm0xaqZFeGUXyvdW1dayub/jn6jpW17ult7X1DaxtbGJtfR13l1dwa3EZt+8u487dZQuPd5bv4e6SGz1/bm2RAMq45s4BHXv6jsbYMW88c4g1JwbiI4hu4XD06crtfUC1mr331vLY6E0FWr/g3spaJ8Ny7MYndeg7F8d/Bh8ba9YNqQwsn+DQ/r1h7IZSvu0i8P2mta1rp1Rzp371+8xkjEdOn8DDDxzHd3/zOwAAl67dwpPPvIAvPHMeXzp3ERcuX8eNO3dx4/Zd3LyzhI3NzToOPMaw77bJzCkTMwDA0Hfp3gru3lvB0vIqFu+tVKRexfK9FdxZ6nK/29XIby8u1+W2zqiXlleweG8Fm5tbPmBsc8aYl9mkyX5zxAG6P3hIdbINBroRxYUJ50STjVnrJf+wolq31MHqoXX4Y45RyDDuLd4tndWIFKMTy6CH7F1ZtW9dfyE8OFLTEga2oblgjvhL91bx9PmXsbK6hoXd81jYM4+F3buwZ/cuzG2zHzVEL/c31G4oTcsynDhyACeOHMD73/EENje3cPXWHTz74mU88+LLePr5l3H+Ujdpv3DlBq7fWrTXiZpy1OhKweSzT53D9epJN+/cxc3FJdxedBS/W52gS1/umUOsrK13qwFZmIH0w+zNxq4OaEn12AgEvmFDuZ6kNi1lRi0C8SQtaqiMWB6QGoD9DTuzs2TN4s3cv1iQyhchUFz37vjKewymAlCfLRlQ+uCgOk3R7uihfT3D3W7Sz2WXrt/C//x/fhRfevYCFupZM3WKfXt248C+PTi4sAeH9u/FwYU9OLCwBwf3dZ+75+fCqeGhifzQ2LXmotvJMB6PcOLwARw/tB/vetOrsbm5hSs3buPFuor1wstX8ecvXsKXn7uIZy9c7pZ+TX+CyQ//d//C/tLNvfqp+TYPtCNkh0T6+J7eMsbyoLKP5IHrlZkaYsoAOOrGao6CLW2qEYUUq58aSeYF0ab8KIsbrw0OSq0X4d6QjOmaw0lMA82xHFQiiwMymLMR6706wMzMGPvTXzxqrSYNIfTS8gqev3gVTz79gvdUnXMyHmHXXHcKeb6eRub/9y/sxqmjB3HqyEGcOHIAJ+3zQO8PUjJvOaLcT5rXkmE8HlkE+bo3PIq19Q3cvHMXV27cweUbt/HM+ZdtLvLshcuYPPn0+QoqES+FJhqsbQ/UA2icr6YhDhhwrd+etLJzUH1Btt50T9Rja5nE+4AjLzt+M5WRHhk6t+nshkFRRJfEm2rX+ZZ+h7FtUwaNSBkwvO6pIwftDeHefXsPpHUtr3ZAaWouzuL6xiY2Nldwd2nF+SHHH4lgRg9wTsbd90l3LP/owX148NRRnD1+GKdPHMHZekLiwZNH7WhQyzH+IjJo+cxkjOOHD+DYof14A87gG978GnzP+9+BpXuruHTtFiaWtRRf1iuaUpQSUmyzaRo3ixfxjQAAIABJREFU71+Nygv9XU3dZy9MQvrGT8yHteLmKwp3+E5lsW8dWDVSlbm7achPRmVSGkk3ZJ/z9j02/LkAVh3pUtMj1UXvD8WYWFkGvYEAGGYcteDxV53CZNx/tqO1qtjSv6bJlhGwzhKPqGOKKsNWKd0S6upaL+159sJl/NEXnrG6CgqTyRhnTxzBI6eP49EzJ/Dw6eN49MxxPHjyKHbNzWCmOpR+smxDMgztr8zNTDA3sxeH9y/gzPHDvA/hw6UpgaOYvu5ePCcWGuyA0LTioYxIiio0mPkYeXA2TT9UYSW+/a0fDkwYqstpkW9u6byaJ54aJ01hltZ4WtRLZdBfXRKbF7B+SvdG9KpPm2/xokFI/2pqWus3ZTD+NToUVyPx/+jZE/aOqE6N2+8xuRq7OjcXl2xjzzfElUYfkX2cq/6IH6kIIDRG2NLHhQXAFja3NvH0Cy/hmfMvB3DTP3559sSR7v962vqBY4ewsHsX9u7unqNZ2L3L5i7ZCXu8JmeZqFYLGaYasw1HUlJPeRzdG5Mlcy6ztr4K2dFyHX43kRmxstukh16EsJSHw1pehrNopmmImGN2/HF/Ka3hUFHUiI35Ss9cpt9ceTbStX6cwPVkCBFWn39nLy8Fr37wFMbj+Cqa7XLzXH7j9l3cvrvkPChYBVBh4ycZlB8FsBBd718GQLC+sYnnLlzBuQuXHagAzM7O4NSRg3jgeHc49czxwzh19CCOHNiHowcXcGj/Ag7v34uD+/ZgZuILq61oUh8hFe8X1WvTpI/MJCC8DyAqAlBZVjIQF0oyUhWvFCavEIQcnD8ZsVqeoQZV+cvOwOgfUyyE9NBQO0dEUq5oH50lxzQP6PUddAJSNB3ayc+79+ZiQn1TlFaNz++aw+MPntw2rWhdOi4ra+u4dvMOVtc2+ilzYMdcnXQKFNPBMA7tJEPIOtCvs7a+gedfvornX75qdMajMQ7u24Pjhw/4w2oH9+P4kf04deQQTh/vjpEcP3QAc7MTk3li3kwdSOjUPwoLY4ZIvGsYNAOXlB5FZfqKSuxLHdTuFQRn6oFrdlCl0vqbTyxrcEgtQ7U976WHotUwLZ6K85nCSCMKKaBWtA7zGO3H+Q7LvT0ZAjsIY1kN6aEHjuHYwf1RL9I/umGt0qT17vIKrty8XfvhQdcP5c15YmDK0QJZl1GlTRkskS1qh93SewAp00X3ZWNzE9dudidrVW+j0Qi75+ewf+9uHFjYg/17d+PIgQWcPXkEj545gUdPH69HN2wuQGGPeLI0kW+kCvZ8h6ZalvoV30vQ6lVAdbyewRUKoyyvAi2ykXaV2oZbP4lWnuOE+QKK/ZGOkMax7HWAt412zAN8sAvUAIs7otJj5wwRYhsZQiqm95yH1z18Gvv2ztvYMK/6PadSnFLdubuMl6/dAlmJzeNEFBTY6RNiAvwn/XrgYExvI4MEA9CU3pSCuACCIGv9AaBgq2xhcanbU7tw5UaVoXs4TpeM4zPV2RmQjc64rUZCp1YDotZ0B2nFhgzaBpel0ElWcoYeyjIyVT7CODDZzL6RJDQ2unEeI6Ts3nPMmuYY+qV7WqQ71tQHavRsmga16e3FJBkUrNwx1WDqmIjgTa9+VXjeRctb3/U3G+O124v1XJXza9mgHaWmsbRI4M7cS69NgJ1lcAQA+I9RMr2wqNGjp/XiONgq9VaXFq6sreNmWcKIw154k0bgGjUXFEsVAvRph6XUkJiE5xDISjOBnI4oP6VUbWkOqf3U8nqv1N/FQlm9Vw0qDgClAyA0Np7Y+Ao8/LszGB/VEGIGlp2mgP4IQmBD38xnLBYVraYIhbQ/IEP3J6cQh8LsouDE4f143cOneyd0+eLUKciH7tU6V2/ewYXL16uhueydVorx7gAAu6O+oiXGG/3NkZ1kIHRKWy26vFtl6NVzeyk6DvchQ91VVxOnQWclATaw+pC4MmNOot8buaLPEYQEd8P1e0KoLoGegTD3UcO8fap35TlLQq+Od17ZoI+MdMYLyUQ278unhFSEdIaeJqeSc7nMF2s7IT2UbWSIcyR40K2g8vpHzuDsiSPB6PkzO0JO91bX1vDn5y9heWUt8FwbOI6Tgau+LA1Vsya9iYKnYEcZHAi7fhyvGHw8TbdxKWruyrfclwyjbgGDI4GPmr2WEoCuiXsa43Qtn/bKwTGYuKK2GnKeKJozEt8qtAeGiLqwNmmtWX8T6quCmNXCfLJsJX3PUQIl0kcXS7r77DgUzYo6COuF+lGnKj6UQzJwxDBIq2M/Ho3w+kfO4IFjB3tzB54zdF1K7zcA3L23iiefOe86rvKajYS3DSONmY5H3jOpsguB6oAMzIuNS0nlqjLWN4GqgeJ9yjBSm+zstASCYvHHOQlKC06hCqgEegPcFzbMNANbEo3EtFWIL1eQKrK1ps65KAGYGwlo0w1sfL3OrUOPqr5ZFmTIjlkVapNpLSM8UHWYM9HNIRmCxsRrlFJw7NB+vPGxs9i9a8544bEbWnplvheX7+GzT51ToaCbs6IvJO4hI+tL+wqwHe8FC+7LwEBFOG1dsBshfDd0DWB/PzKMNH2IhsaRwRGkQ6fIhpNyoQhM/R55LTNoTQWInVJZL73Sf4oZd3/+k5XkCMhRSRIPbiDMs94X+BvJGaEdnXQ+FBYjWBbhMSKAqOXRzolGSwYCKuekq/PomeN486tfZfc4Slj9bdKnrVJw7sIVPP/yVWjEEusXidHsFGbZSYZk0UpvQAZWgdC/+pXLSt/oEhjfnwwj3fSye+YAyl004LhrG3M65UztpKdwZYQHgCa+xYRoISz7ixpDXU9H6Rl7aJ+912RTfTkDOvkrlrbQmJXSTcqonoV+7iOMuVhbcyiWQ+tlmxr6TTJYpAECIMzNTPDE4w/ikdPHuxoS9x2Gdqf52trcwv/zx1+sf0qg81Y7cSDxyEaMcmzcpV0HBXa0fkAGjRLBFgqXw8a+k5H74zZSJ9L3J8Oo71geHYrob2ebJzMhVqTQUNKIsjN2dkSQKkQ3h/JqcGZnGkprOxFaopN68KJQtAiwS3k8Iz9ttNhGm8lEBwy1L6nRlK0z0dNVJCsLwOK89TKkHDW3kcEnri5DQcGBfXvwxOOvsjebuyo8wuT9hlxvZX0dv/XJz9NUJxp3S5zed5FoBZwCivPQkkGjhPPmNhjmPgE8HRQ1awDwimRovA9ald8NqJhnwTw2CFzHXcObejCnWb77KrVuRHNLXSoRS8tq9GDlQLIh8P/Urw52I5e39EXbG7k+X4Y2lfcQDXj+o11pWsS5USGabCKFNuGgEV5hhhxqQAaPqDwsgl2zMzha/9jk0NWaO7CTfOXcS/jzF18OVuOGmHRkTgYDJaXpsrFTe9mQDA2O3cisM71D9etYFbWzBEY7yWB/MIUn1DpGPJnjXNcGw8KPh0pbPXIOXEadsErrnt9XRDD5ya5cERLpsQ6rI/TSAmOthL6lkHzGlxhdtmveuOtM1vkUU35yRFdjdCKw/ORo2k/LMEiGgMYqcyXFfzUor8pxCtU8RiGCj/zen0Q/DIMARCOOiY+rUdwUeqkI7VU0ZGhdeQUxsGagLL3br0SGkZWXdAISDrxxvZfpO1KHkEsiY6B+MAAzbPZ0CQ5QkhCc92uY8s0Zdkrqk1Mc66c4X3n+QXOVbqC8vKA6EvHgrGj/VYNFzSTqI8ggAgjJEAx5exks1aqGvryyiguXrweDbx3VyJc6yp2le/joJ58kXfAYlF676Nhtc+63kmBNWYZ+OzpuYv+ShTVwKGQa9ynDKDqdo5c1LLRuS/870LJxpb7UUFoCcghlCNbONVJomiWRv4jilIsTHVeEuG2bWG5YXa3YOGaHHj2JYp0fOw+O6dkRAAnL0nVWZOlF1bOlQsXlM3p9GfhytQhuLS7js1953l883EgZWt9VJ3/4uadw8coNQ3WXAT5WKkO+xO+GYjLY3j5SQwaOOmHH2r51+jENWpVC9eQVy2DPf/v5cw11aoidUYqktImEN2nqvSAYTeRcWFQDSKMr8HydL4l1TAP0PcwrOBJWxzOHIhkrzHtwqgJ6qKdIo/dMhg7hnFXqm+ZMHRkfUO1HFxCcx1q3+KKFB7m2DNpvTs83NjfxR194Bn/wuafQsj1OmfLkenF5BT/9qx/r/mqr+jrLZ18jwvPVO8JiHaso+V5fBgYDyVEnoHzUFTuT9fkKZBgZmqoxJvTUfwutAESiXtUnwVSFo0PKAdWDC71tTm1fJ6i8fEaEGtGifrYmxMEoCGaF6CbZObQ627QCp/WtTuQvKj/zpewK0VKemE7sqykDUopRZXjq3EX81Ec+hqfPv2TzCb56x2oALC7dwz/7xd/CJ598uvtbEAQ6wbEkF3AGEE/SBq4TYDGWt2Swytl/xP4Z6EPi71cgw3ju7BM/1t2n80AV+UQiU+YenNL0+CRm4IOsyBqX2pQiRQXhk6USaRppUlKOEgES4pKpt1UZ6F79HlbG7N1KXl+q4/vEnzYFqV4XfMT4cLlMUTZgvCKl49T5Ox+xaMhg6gjZOHT179zFy7h+6y5OHD6AE4cPhEcqQeOxtVXw4uXr+Jlf+zh+6iO/i6s3F+l+jEw2NpR26DKzL4EXlMaL29xRLOjtKEOI9hGnK510ZF0i5r9SGcazZ77mx/pr1dy3H+y29WEVrpTGA/GBnY6eEfBjEkrRjJEQ0pboLO/mdiQQnEzPadjgA8oQErvlwVMdgwSiVT+qLIEXNQIy1vhXacjZrJ4DgsoaJsCge8RRTwaI69SONzt4bdVI8eVzF7C4dA+j0cj+Xp+I4O69FTx74TI++qnP43/95d/BL370E7h6azH0SaLqiBILOn7phLMIgVwETVUJO8p2MnTqKaCz5M6bDjnpN/wRxb+ADLLwrg97QsBGWb0cTKzhgUrYdwzj3TAlKOyd3ie5I8AGC/+Zy7O9Oy1xmNX6itq9VAvu1MWNLm8Y2Z+BSnriyNHRQd0EUjrMIzOK/n0g9k31WGCWwV72RlWHVpD2zM/h8bMncfLoQezdvQsjEaysruPyjdt49sIlXLlxp9emf20jA3xsG2xvQ/H+ZeiXF4sSodP/DzLI3nd+uKiXSB1U1DdGlAB12hrJ4xInNPi8fNsa5DD5MsPYRjI2Hq5nhtTx7nU9tjUjQsdE/MlDqjQkaa034jB0i/WobYg4mR929pL6ENdLkkEdQuc7OSVxMoXK+3W0Jt/PV8xWdrK+lNtoi+2caEpkGFlupWlHcYOgPUc73h2ioKKh/rQJTFemO5F9VIbdDzwJyFWJtADdiweKl1taBfhEzstMHvZeyzOJX7oHDcPMl0j8ZJGL0mT5WVYSoNemhE/7rsZRx8L7a8hQYH7CV4g6SrPq24/hlNAmIC031fo5khePlP25qZ9gsPZ+M2DAtMkw8omvHpKDDXLRmrpJVo2Ppedfzc0ejgAmfcmVTPpS0spwANtOk72d10Y603O0nObAfMD5FpWpVLm9n6T6rp7ZqCSbTyPCY2RdOWgoRZ9DSKg7JIMBSolyMbfS6y8QNB5baYeBQ3b02rxPsy9fhPmke2DqZBjxLrReBsRkKLb2zl6llWu4S1YDMy77qZBejUDblu6en4Hi5Vak3JEmm9oWzpMhSCmk26wMktl4pwHIiK4R0groJvGpfYRJWzXkjAHB2EkOu6cyWJ0hGTTi1YhjAKfNIkgVe0CJ+2s4oMneL7dzVsKVUkMCwG54lS9ptJkeGUZsEJwkOappaNF2FHREU4xangcZtggXmcroUBt4OJS+MwbQJXr9oARdzXHspTZkfeG4MDHnswodPKGoRo4Z2vltllezMgMP/nSJ4Gd6lQ5HnWEZQscqe/Rm78VSXpalYZyBZAk+b+lLzzG5OUeHsIAe09Te9dWXYeRnxfkWD5yGiwpQtLKRiTVkIwGDVPETMA/vpV0kt+bO2UEs3DZ5qM5BYbYAPqGvCgtTBNa19dWgX2K7JArUyTsHJxoc4fS3tHZ+yaMaMiRm0DcMbePR0wWjZrnPHg2B60iavbeb+zh7BNeigcjyVZZhZA+sFH3YBoij7J5qUSI7bzBOQuA8H9D7QgNdKqImA++jKDlWsX+cRc35M09UZkvDAHTDplRjj7vBjGaxr4D0pCc+qOe1SVEqbuCTz4glkChVfyZbX4augA2E+eFrCJGBlkeHVJNoOLj7KYPW5e3FPvI5OeHUaIpkGHnK45MSe7WistUwlmFeXSjJqFeYeYpKkuvAkbkVEUH3+Xcjj7TDd+A0TPpNaorCq1D+qXGTdqR77Hjfvoxod8mQpXv3VJXR9J9407+/YWnZgAz9yUk9n9TjcOjqt2+BMHcZVvu4ZYoCnnXwuDjie/n0yDDqA3E9xcnHFhCF5By+F/okO2U/n4uM0m8yRvfkUgMJG6pGssw59VfpSeXRAbh4XU4srZl7oL7KxCrxKww5eBAa5eClSO+beCpWmjAnvgy9tpEhCE6A1Vt14+jDbVmJQY4h2soPDRIvRgyUc8rUzJSmSIZRH+z0aAZ15GEkZkvFQ2F4loIdJYeuxHDmW5m3rEpXn8jTSpH4FpcqVLcCRsqx5ckqAuX84Z2p6njGAB/LVnqUd3LkEpATikVXIceMO9qdcxdqVitFvgzBhmXwts5PSaPfpSY0jmGyxGQUcDxy+x9q6WTyY+muBj8bSYsCzqzrhXL4/sR6emQYmYOQcbgxeJ+F7nX0S2SG0qSAZBziszNoWLRQSwZKUOu5XnRKdx4xJdxXmK20+6dMnV+jwxGnR7w4+oQFCHJKks9JSjLqjo+SdToIpwj6ccJVV4F4HqcGzYygzcsxW6uKeGkvPa5tnKw7gW7YlimUYWQHs2gC2f0U9+aS7EGSddSfnkrRKc2wkqRtiyPngMfb7jN5dukZJykqfzJaqYeR43j+LlE7pCyWU11TyztkUf4k6YT4VDpCO8wZxer9cO4/TnDaMqSXSLcdKJup81hCUTYV7TLS7J89S22SVca6hh4QpKM2UyLDyCaAhGoWtdWrq12bQwf6bipuk25kVp3bNKJFXCHKB9zo1CyovvZTFRnStJQLFnpE1pd2OsH07SIWqUhxhctKFD7jYWG+VGm1rPmcQP5kUGmBYJaBnN9eJbrttSOEwgBAuwkAwydw+238+1A/UlNaspYpk2Hkh+L8hqgRBEsmYyCn6qVHhraApjO9E7mZDzVgRszIpwkTbrBuOWRzNeMnnpnnpT6xRhLaSFVeId2oE0qgDQpWZPQilrPynxf2JUcKa9SnpU4ZNLIM9V7J/ISmTMRXu3rPtKkzcmBlfhpPrTUW1Y1YbyndWGg4/BTJMPLB6AtnL/yundFH/eFOwKsoXWrug2pr6dxLBhKOFDm8VAYcgVUa1l5sZ4oxhvt89jqngGPyAQYYPhBRJ+Gqssq2ilM3pHmDReS4gBDbJhn0HqWhyp8al+MJuWvpq98E1ZdahzRDAv+2QdpUAFwGSXQk6WMKZRjp5JiXVwv8vKt2K/U/fdS01MGueKhD2+vb1u7tVjXk4J1uhsW15cZS21jgaOSEdLPjtyrY5kDk9IUjmTmR9+yrSTFSeSxhmYLXeuWKhj6YfVm7moYgDQOjgW3JoHpJ9UX7MwNk+FWLK15U25q5FWpnLQaiQSvnb1atvAY1TZ8Mo0Lhmu+pA9dxJaE0lVD6tOWkS4QmLLsMG664ExYVg+rzfEJpVdpstqGNKcLr2nKfVa/OXVxn1jfDjdCufTEx3cs5pbPoxQ5Z6VOaVFjvjBxAGqZ+2aAMpIP4PfEY6jAd5bPEtnQ7PNuMHZ43UBwhWqEmp8VgutMjg0WIGF7IK9A9UdYZCB/m00+NHYnxEn92/JPVUUrTY01XXRKtojQkF6KBVKLg4yRKHqwSx8eBpy4jFopwDf3QIMRxrjOErCceRIoUEgioCsQdcxsZ+srrX1E1HImpr9C5ddQzSl15LLbMLNZHWrk2WmysDgzTKcNI/+Qup0w6kewMxjfqWnwra4yiKm+Qga2D6hjzbNQhIhWrFx80UufSB4eIweI0CURq18X7yqgf9eMRxin0v/NtUn4+PCbWJ0dJoZsS6Vk72UaGoCzXRY7oTJPz8HzFAauglG7yCqAxMXRUolMwPxseMMHITo8MI5vsMnBXBpSvYuV0GK3S7wZJHOXcfvu6oY6CcZtxZqOQpAmmp07AkYQjG9NmRxOqJ+keOUtuG8INaZ1lCJEqy0eOkHQReSR+cvssQy+0UIqoPGT1bYfG2yI1Oy+SQQ01vI/Op0yGkWJZv/9quGZjxFhGf/7FyMWD3HuegNux0NnbqNRWsTrjCs8dIJXB67mjMZ/Jbf11GgiC6rJrP1eMUSkpe7i/ThqnqW29fS8dHpLBFNO/WnPdXv/tW7X9tgR27OM+mnsfUyTDyHKtXkbgnuqhWqB/UcgdO4U3wF5UYHMPEQtzQ0YeURscluBHLPiVNAiRgXcTzJmFf+lddRzqmxkr4C2K+qFPfUGzgEQXJkNRGYJeOCrRfaNSXJdofbZl4J+hot7OixP5fhaiAPpXfuIDPdSwRSxfZaDcbqd7UyTDyGy6xNwtrrnX/9TwhDNkQi/O7UTHPjtCsf6sNqFlYcfQlIjyQDu3xDKaE6V0g/rxA2POo5FgpUt9eo11ojYYDLfYBqbzofG2epVFLD7Z2v3T26dQApbfOgAMyWBOJ6y3TgZzzPqdj9X4+LWBkN+20t9ENCEgZAeFv4S5l/atPbolCwPHlMgwKsoYI3fp0LeYkVUjpLxfghYQDCdczC8bgCElQruwEgX+SuWFfppOVdHqSPpViAePKODfgEU+fe5bakTU5xFC+0pc9zNURYVDS0CvtMMQutd1LBu9yqIbzaAMKndWeon9BTMIE1KKioUYsy7UuTMltgPlk7CWh88c3HvMupgmGUZ+uyJxPezn3ldXmUKaZDxUBdCsXbysJwl5Ru+YRagXVKYe2peJwkQ8KdtwVCYn+koT7Y6MMfNrRdnT4Ue9A9s+QMZXdv4knySerYwHtSGDB2d3mn5dQmNKN4kSySD1e0VPbpuNtuHh0rvHqzmpPYHCNMlgDwj5J0UGSlWK9B6D91QmpFDJc5MCwmSyxHuxjMOnCuk04+50oseRzOYR3taOzRty1MhgPBYbmJzvhoUndQApoW04tsL8soxGW0zXxlKhz21kMI9VGYTq9v3X9BjvV4sUP30A8Pur3LRMa73VNuILfKuPLv5cQyyfFhlGvPrJ3sfnZYxudtzgbKkD4QpKx+nzA0XZd1TwwDS/GS/xF5mk7/l+YtvzTD3OrTx2zm/pSuWHWGPBPatUvjj9IX55/AokGjojo0YmH/tBGQIjVq30avicqCGDkabTvazf1C/z3Z8gS39MVTai1V4B+urLMLIxyGHdEnTUQXdDgTLFzpRzn9IoS6L3lki9IUkJNxJNnZJGQtwytovfKxF19DxVNGydJHuIVbRnRYfgxtHABYFOyp2Os6X0uG+xl8RRbLUIUoZlYGUG3fWPOEt2cKptB90kPeSTwJEswnTROgLhiyA+pp7uiP0OIz0lMtgjpIbY8AeEzNtoMHSVKfiOcafeGG/oIb2wgSYShGsHCY0KVb3CivKcQkTSyV49d099atBUxw/KLvXV9d0cysqMx65zRhxhGXJqkMjXaG68ijk1Db7mWNRID1cOykBlgDuu/1Fyr6JL4FRUAaAkGUrQLe/1BJtlYGrEq3gpcjIM9g/0TYMM9gipnbMvjq0a/jWtKghtA7Phh9lrCfeLMaJIR+FTktIs0hUimw2PQhQz6CxQqKTwSeVhqY8iRH5bnK5tW58JvdzAC2zDwuErKqm4bv25AR0hqPK6n7r61ZIh9A2jSSHVVNOEHU7vlI7Ee3xwktmIz4oM6QI12+WTywJ7g+MUymCvoTE1K2IHhE+MS/qtdRJzIapYLTfEsJipEhsaI7ZNAJqYolyfBKayMHD0vSPbNzSxZdgqYxhEOsKiiOad+sA7tQbfJTp5SAPEfIrl78tQNSTOQRSD9F5S1NK6xI85KYFBCfe3RUIirpNnH/+Ox5gu8inUaZFhxMQ19+sMVKB5NvtrHo+wmx0koe9sq5xLsiezzWRbEnVEQkvVhgDIzmAhqdTB6fkq7Ub7SlmIOGTc4diKtlH0Vk9uIYiSUx4LfWeaNrJebH1W5lsyeF+esxu4qPxA1HUoZ3oMZE48qCQgZ+038xNcodIiHmMqGQFqGmTo/iwvR3Nul4zfUL0o02R42og0YdEfjUuRlzqwsJmUYZs7ahw0qdZjHbbbXNMeT8NKz4Yg8F3mzJykMnW60hdEeOhLqm8RINNpKUM7zn3D+m7JED5hovedJl09FhppGBPnf6O1Zrqe2DR5HWJsimQILyrrP93mZHSeoTN1oxzy/xIZY2NiSRh586AnZ9Bowmv25oyDSkhtmB/ro708GAT2H1BnD8c8ihoB/F4ICyURtUbkyH1c8T5y2yjD4HPLqPdS1OKoblPbUs+ahXrOEO/0lsRPUVswFbgd9PdvSuRtSmWoq0zFBTLmnctufGvn1ZBtkqROot89QfQ5hKU0HkGMSY6tnJ9ZyiJ2G7kPXaWy1aoS2+g/hfowRdO8g/0k1XVeSKYc9gt9N5kI6tgvRcm5XJZB1XZCegi+lWTwP+rooqsMAoqkBeDHWXn+pqPJRqlvLCygKEg8VyKw6Sq/OKDqy1fk9GEp51X0r7IKpk6GLkLwhM5GoO5MGxp6CtQL/SL2F4aCZOAyuLcWmCFH1CZn7IVMMcDtbepYm7RRJCkKFFcQs1qYT5atpO8MGLWwt8gAikzipS67OgjrhfpRpyo+lEMycEg1SDNAYSCKffC6u7DDa101ahfZjbvQbnA+0h/GTMdDghq6evVeAI/pkGGkNlk4nDCK2US2BEYYGYOQ2lFvgPvCxnSL2ZJoJKatQny5glSRfpCM6Tn8EIBZvW5DzGu68fU6tw49qtI0ejibAAAPLklEQVT+QfDDvIMrMNQ0LXcy5AzT0zy/OSRD0Jh4DU8DyNCC3qMJ9mWEj40LBd1dF15MCDSYlvIVYDveCxY8HTKMNH2IhsaRAfATl36aKXUdhCIw9XvktcygNRUXXg3fynrplf5TzLjz/KevJNrhpKgkiQd3KOZZ7wt8+ZUR2tFJKs/hUBvLIjxGBBC1PNo50WjJQEDlnOhmoTcXMC1mV0gdSXsByLq+xPpFYjQ7hVl2kiFZtHU+PTJ0f1IrhTXfnVWi3oHmdYqvDvYuoNoJb7xZKlQAn+gQc6a/Tml9hGV/UWPQlx+UnrH3DtPxp8mm+nIGdJKnR1SMpPItJdSz0M99hDEXa2sOxXJovWxTQ79JBos0QAAERdigx8LlML0BCmJO2NsI/A/q0MqdDK3zR73HozmI5Xr6YMpkGPUdi3aJRX872zyZCbEihYZwvoi7ELUjglQhutoX3Vex1bsLtQtb9lIP6RWKFgF2KY9n5KfX3GuUFJOJHtjRvgSIRy369ApbuUaXrAxNMStwhvmcxHotGeLhNTYqOhIjzqeQXlVvvDmGql9ewYl/W8+qNMXpfZd0XolTQB3zKZNhxALYLYV4MxBJ+S0JXMddw5t6MKdZth1fnUaIceXTVyHicprWZweJSuT/qV9Fg0YuXz3b2xu5Pl+GNpX3EA14/qNdaVqk8hqPGeKVXy8S4is41IAMBgzEei9t0DKhe0Qvr7roWFv6HCavaohJRzofs4ip5ArJJj3WzGGmSIaRFuQDUCV0VEKua4Nh4cdDpa0eOQcuo05YpXXP79uJSL1HduWKkEiPdVgdoXcS01groW8pJJ/xJUaX7Zp3rTuTdT7FlJ8c0dUYnQgsPzma9tMyDJIhoLHK3G9RVcLEEzQaoEnvdk8IBgMrjomPq5F2gXupSAkp0rTIMLJyerO0phyKUXG9l+k7UodlMBIZA/WDAZhhs6dLcICShOC8X8OUP3zCTkl9copj/RTnK88/aK7SDZSXF8CfIixe1rGi/VcNFjWTqI8ggwi6Z4cdAUMqsI0MlmqJIObw/s1X1Yzh6JfJh0OUtu+Rql/s2G1z7reSYE3TIkPYqealVGtYaN2W/negZeNKfamhtATkEMoQrJ1rpNA0SyJ/EcUpFyc6rghhe69iuWF1tWLjmB169CSKdX7sPDimZ0cAJCxL11mRpRdVz5YKFZfP6PVl4MvV4o4nUKPIYNXRlp6sheqproVk0H9IhnyJ3w3FZLC9faQpkmHiUaNSFI8DOhcofL8hvEkj8WvrWQdeDSrWl/fd2ktwQcmJeFakfFIKZ80CD37Dj434RBqsNK8I88gWzeA0kY7/dOVIvS8gWYkey+9Bri2D9tvTFzlS2Ak2Nm2EQj9uiMR/CQ3pa8oWuIvWGCo9oBFFpkeGkaFpNcaMnvpvoRWAwBjx75NgqsLRIeWAapT6MJL1qEjI0SX8pRk67Be14RCqyJBy8xBXhegm2Tm0FlKoZ1MaAbRO5C90+v82dyYLEtsgEBX9//9MDlYVDyRPcov70tO2xCYo0GJPTrkkbgFPyUQ6nddVhzVKjDl+Vz8DX1LtaXFxh/yY17cL4M/S5kp/NZ/8mg6/CqQ4oqs9tQTU9PrvDcjbeLog2PTmc9KmWB2Dm2xvKHS5mtWnvrBkyr4MHAsR1V6TbLwKRjk5WhZ70CvH/MKlEJEpuBTbQYIrUhynWmN/0cE/O3xq9a9xmjGafTycXcnFJR6Ct9lrE8b8Uxlf9JvbO1Csxed0+M0I08pA8S53laOGFM9rFUlqDz37XkLebaxY5aAyqsoe193JvLfa0qcM1VYMbC3dHI2zeF4yjZ0Z9uL1MfdvDt3DewSb20nf0pXjoINqbbf7poNsCnvwhHKAVr1qRDaWaCVbHEa9gTPgXWis/1PozEVaJ3gF5PiaDj/WbtpRTgsRQKutb5cEJc4ZHEa7ll1Wja+cnenx+K3gW4sBk2ZQ9I/SwsyBICtWHbDbQS1BBwhLltyBqQzolB6xn61eGxwe5fSKmKTh+dm8iXyct3ke5AZ3HTj5rmdXJvyGZe43Rjk603vLtBScTfj4Ze0p0Ede5s8m/DUdfhpc+9UlO5tQTx24rswitK3BCwptNF24v3EghiIHn2j853HfZPZhxshG4f4D5ZNLTtCIPhqrbRQWw0IefxXdPpHM835DvQ0Kl//HduLt8nzr6R/NCfdIuNSrPtzslO6v3qtQr1+FiZBN9pr6NLe4BslXdPjFduZCTKWdaAOm493K+CVpzzCMUq9QtbKkDHPsXgakI59Y63kJVSKPhv+uiVxdsz5EDZdfkLdZRYftIBcn7JRT+mPwuKPd+8SlT7Zv/60susei+F10EDiMKGmlu2guOdoMxmo2TzA3J83EUIWrglVNSj9WAubnm+cU7kM6/Co96ZDc8iCnWmqTLJDOtjYtmUytVqFGwS6QD7Ixq8zE0JU9UaBv8GTr5785P8kaGGU3yuGDfUSjxvHRw/66AwiJHE3TCY9yGU0xb6ll6p5p3nQwoGTXi9LGwa8RtIwFiqv3vc21dveT5qlfSxHT9mt9ToffPJO+aW8QroERAgejSo2VD49sNTY+dHRaS7hcRtBqTTxn1dsJRykrs9DIROcFBMmEbacxoLNlxwBMRFeG9AXc5CRr82iTtu3Ix8se6ETQw/ekg9u86aCMtzOOAU7dOkil50/kdwlA635e92pZsNHoCAB8hldyxaXPd3T40SHaHN22V2pRPySdwHl+OtGqtmHm6DrRYXeodBhnMDbQBb0zKS2t5hT2og+8rx0XhnA1o9LgBbIaArP1q9vU13PgRwgpMCTecy0q2bLOuw6NsXTv0VxcXPJSl4tzNpLZYt7lyxGY7M7sIIkAgrdB+4gOvzorzlscOKWLDVDa2V0nsYtuULBp1b/XcoQfZRf0Vu08A8Tp9irDDg6k2VyrJvTbYG2KQFub14V+9n5DlaUgfwIcNOaEPxTAkxgi6qLDEGadjqE+lT1LMXSbPA8ascpGc2nzr+41zpXBdekls/zPOvy8BJnacFurj3JFqrPEDN7mnEDgOR/Q/cBA50bU4eC3pYhWikwUUM0/ZcI1b3St5ZWM3M7el2yJZp1XQ3rYiQf1qjUMJXWbnDwjNkAit/2s26nDc4EOQnn4eUPktW4R3UpN0Chwr1MGt0/1D3/Nc3J8XuFLOvjNfUazFELCGS7O8i5rKRUT9ZLCIyvFbLMKmW8ZceE+f1/qSB++WyzD4uyySxSuQtW38qaOep82aCVeS8fPxXLk8P92MOpLX/LabwVxWfaiwzk52c+jHBK+fc7+NxAmy7bax54jC1TVwXEpxK/r39HhdwLxPsW5NzrOg2ZATv69eJ+/z3quC4rfcMaK5NyJhI6qTDYlB79NL7aMBcBZbVlYultFoF5l4kZ4sq5lIqDRTF5Ceq+gyLfnhHnIxc3INx2a4gCsY9WN2Yd9acSmxxttyYNB4mLEy3WWTNdK6UM6/E6wCwAW0WgHBvllpUKeJ9EANsGO33e5JbyrKp8VqkjLjBZnMtizAgbjeHlyq4CaP5itFHgWgMeyRQ91JzNXLARhOLsGArOCYdtq6XmKsrmzFuSuTHnXofqWPDlG/ylNMI5tskQyApzK3N793fapXeUyQ52NxKJACVt2QQ1/Tqy/o4Pf/k3nKGconol7D/3swqBMakjGFD+DQWnRqRYOCqjlufZmAwdP2Aj/Kc1u2ucp05LXdJhxDuJZ6NMWIBCU0K9IxnDqR47jwOQrnK5mnyK8bdWIz3G60JwIev0UZqtpRF09yuPdp8hWEGjDNj+ow88HszCBfH7WyU6P8wIVSrh/VinVn6nu7eR425FfIt67z4jsPJwThprfRCtFGAKn6vfo1oGxqKdCU9cfZJF8MWwCOUUnsMM8UWzfD6639wnOXYd25Hy9BNB005Ix26XpKmLZafba/tJneGVva/RYsfqJ4q/o8PMEEKjmrK2o3n7tgG70y1XKJ8vJ3Jx9LtmirxCxxltLKbfNvbBKJUO2Mm3UgokjyrW08yimt4s4U8FwyWvZlZ94mJRLRtvXrs8JzG+Cyg0Epw4Ifr9K9M/Pv0LoMgCITQOYeYar96m/3/jELmnhLR/T4eeNDoSa3ox9rDZN5EuOaQ60XUvlDB4YO/URb6PtumYMplzfoG2ZstnM8oyn6rDUF+4UrY8O8SVsoyCMRnshWcHpo06kBuY2teSItAaeLp0maEwd9r2c8rSuJFKrXXM3ycHIxEp55lNu2fB5fNRnXM61jGojqXxFh18NxqmcnpXPzQxf+0cFAVdRntK8BtVr6eQygYSZYqaXLUAhsLSh9Xo/G8YCn3IezJFwrN9aBgw+8ESbtM/WNf40nMIQ8wZn5L6A0PsOHXQPZajkk3MVniBc8zS/FdVLrVuZEU1+b5BeDbBKhxh0Ytjjgzr8NDnm8qqe/6otdD18EX7UNPdgbzzU0B686+k33dqO3KKz3DDLWuUsu48Tx6UmxM1H3m1gz4EQ9MlM5iAqzrWa1DMVjzfXnRa11XijYQ3mqevT0ghycTAM7E0H2WW0D/GzAxJ+5XFZl3Zfu1uin3u8ZINbzX9tumVtZvqeDr9EuuY9BfAeVyilUkL0seWkJUIry5Ch40YFYUoNtOd8QrQ2bbpt62NDVFsv97n5Du4sm5k34Sawa59Ws6KcJZ2zFwNy00eZlLQ7kWOtMUzntVcdYIP+95CxtSEdyZm9L24XygpgCjznp6Y/db+1ZFm8SPc7OjhD9PSCqFjp//6YCoQmm3LHEDz7z0d+eB1KmkM0rboMWikaMS+uC1KFwKdI5Bys7ONTwLOXERMZ7mIfDEIf5z1DmHbiICJTRCMgE0QF5h86nMY7P900zMTg1Zib0eGUWnlMLzOHeYyVa9OisxYwfFOHn/7zCksmTSQfh6mNupvcEo0oKn2bDvQOtLHwdOqWkdLt+oNGCi49OAQBs2gCRDbrLF4T9bt9KsMUhfNv3obx5+GxME9mycDN6PTcL/7QoRmrbDEzOmmyDp+fPmAblMZNrgBaiLejEo+B+Wx4wwST/Y4OP092CdxbAMmVvo7DaJv+M0hRKFf+e9oGjJpz2zmnU8SwBOkpCJhJmNlIm4EWaBfjHoJl9m3pBlanDi1TTf0QCMMWXUbIM/tPHY7UghJRMkzz/YXGfyI1g3cNh3rr+B+Yf0yHfwAjBO4Lyccm/wAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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 14 and higher.","icon":"data:image/png;base64,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","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","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Standard DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"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","scaleExtent":[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 14 and higher.","icon":"data:image/png;base64,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","overlay":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}","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/Esri","terms_text":"Terms & Feedback","default":true,"description":"Esri world imagery.","icon":"data:image/png;base64,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"},{"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}","scaleExtent":[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":"data:image/png;base64,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"},{"id":"maaamet.ee-orto","name":"Estonia Ortho (Maaamet)","type":"tms","template":"http://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png","scaleExtent":[14,18],"polygon":[[[21.6940073,57.5025466],[21.6940073,59.8274564],[28.2110546,59.8274564],[28.2110546,57.5025466],[21.6940073,57.5025466]]],"terms_text":"Maa-Ameti ortofoto"},{"id":"estrela_de_alagoas","name":"Estrela de Alagoas","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.71382371133,-9.43475990551],[-36.7147678489,-9.34442676518],[-36.80585566705,-9.34497726095],[-36.80525485223,-9.43541609465],[-36.71382371133,-9.43475990551]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://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","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://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":"http://t{switch:1,2,3,4}.freemap.sk/A/{zoom}/{x}/{y}.jpeg","scaleExtent":[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":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Cyclo","name":"Freemap.sk Cyclo","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/C/{zoom}/{x}/{y}.jpeg","scaleExtent":[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":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Hiking","name":"Freemap.sk Hiking","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/T/{zoom}/{x}/{y}.jpeg","scaleExtent":[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":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Ski","name":"Freemap.sk Ski","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/K/{zoom}/{x}/{y}.jpeg","scaleExtent":[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":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Geobase_Hydrography","name":"Geobase Hydrography","type":"wms","template":"http://ows.geobase.ca/wms/geobase_en?service=wms&request=GetMap&version=1.1.1&SRS={proj}&style=&format=image/png&transparent=true&layers=nhn:hydrography,nhn:network&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:900913","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.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-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","name":"Geobase Roads","type":"wms","template":"http://ows.geobase.ca/wms/geobase_en?service=wms&request=GetMap&version=1.1.1&SRS={proj}&style=&format=image/png&transparent=true&layers=nrn:addressrange,nrn:streetnames,nrn:streetnames:streetnames_primary,nrn:streetnames:streetnames_secondary,nrn:streetnames:streetnames_other,nhn:hydrography,nrn:roadnetwork&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:900913","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.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-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":"http://gis.lebensministerium.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.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"geoimage.at","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QwTFA8gQvGHigAAAwtJREFUOMvtk19oW1Ucx7/nnntukpvGtF2btHG1o52bYxULOp99sYggiM7pVKbbQNCH+SYOFMHCHhR88g9jjPmgm32YMpGNTbpp1W5D7NyfJnYLTdNm3ZI0SZPc5N5zzz3n+CIiCtM9+KQf+D39+H74Pfy+wH8Ocqvlh4enyblMO7JpKHl/X080sbhcnH3r3eNXkR1XtyU8cHiS2Hakf+iuxJ7enq7n4x12ijFDtz3fW11tzBZL1YMnpjKfvrN3m/O3ws+OTRnxmP1gsrf7g2RizUbGLCtkGdSkBnigtPCFaLXc1ZvF8vfZXOG1HdvGcn/M0z8Ln9nx8vBAas0ngwN9dzPGmGlSCkIMrTQxQABCSDjE2B2xyJ2E0A0d/Q+cPP/tMb7v0Kwx+tBz5PcL9350mXZFVuzR4b73Nm3o326HQpYdNonWMEAIgdZQWmvP8yECpZptKetNtzqTLkz8UpBfKmJ1tJo1SgBgfP8V2mhVn2JYet0Osc09Xabp+DFdbpgkV7SQ6jbRdCXaHAgU4AsFj0sQAFGbgguNhsPRqiyeM/d/PkezS4WxRilzpLM5ga5EEu5qGJvXDZFDuXvA4sO4b30MXCi4XCLRGYZhaFQaEtTQ6I5bKNV8HJ3ML1cLM+Pm1fnCaNFZmLhRORkkUltIpl2mI/duxMW8Rk0N4okRG3OLDtb2RlB3AthhgXI9QLbgIp13QQ0CrQSEU57JnX3/OBnbfWBfpVIZjEb7DClb8WRv50jMDqesSNzwpU+UFAiZFIGmaHsKFjNAKNOub8LhkC6XbiD4wvXLR19dOH/wzF9+8McL6Uev31jJNlrc8Xjg+4GSvlBKSKXaLpfFUk3kl5bddOZa7dTk1PTT2194DED3LfqxlZz+7qc35uZvXitXHdf1ROALKX+boO353nKpXr2UyU9/deLMzn9aPfLNDz+/NLC2/0WDhgZNxnqYSUzOA0f4vMg9J33xytzHz2595Ivb6vKet48kHx/b8mQ40vFwNMKS9UbzQmWleHrXK29+XZs/1cD//Cv8CriEgFStQ2K4AAAAAElFTkSuQmCC"},{"id":"lu.geoportail.opendata.ortho_10cm_proto_lidar","name":"geoportail.lu LIDAR prototype Nordstad 2017","type":"tms","template":"http://{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","scaleExtent":[0,21],"polygon":[[[6.050007108761704,49.82175399016297],[6.049789364226169,49.91165980309075],[6.18901175543688,49.91171720394339],[6.188971338193781,49.821811209128995],[6.050007108761704,49.82175399016297]]],"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":"Geoportal-PL-aerial_image","name":"Geoportal.gov.pl (Orthophotomap)","type":"tms","template":"http://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}","scaleExtent":[6,24],"polygon":[[[15.9751041,54.3709213],[16.311164,54.5561775],[17.1391878,54.7845723],[18.3448458,54.9022727],[19.6613689,54.4737213],[20.2815206,54.4213456],[21.4663914,54.3406369],[22.7759855,54.3769755],[22.8625989,54.4233613],[23.2956657,54.2678633],[23.5347186,54.0955258],[23.5208604,53.9775182],[23.7183389,53.4629603],[23.9296755,53.1856735],[23.9296755,52.6887269],[23.732197,52.6067497],[23.5658994,52.5878101],[23.2090523,52.3302642],[23.1951942,52.2370089],[23.5035377,52.1860596],[23.6906226,52.0030113],[23.5970802,51.739903],[23.6629063,51.3888562],[23.9366046,50.9827781],[24.1687284,50.8604752],[24.0197534,50.8035823],[24.1098313,50.6610467],[24.0578633,50.4188439],[23.6178674,50.3083403],[22.6824431,49.5163532],[22.7378756,49.2094935],[22.9041733,49.0780441],[22.8625989,48.9940062],[22.6096878,49.0371785],[22.0761495,49.2004392],[21.8474902,49.3721872],[21.3763135,49.4488281],[21.1026153,49.3721872],[20.9120659,49.3022043],[20.6452967,49.3902311],[20.1845136,49.3315641],[20.1186875,49.2004392],[19.9419962,49.1302123],[19.765305,49.2117568],[19.7479823,49.3992506],[19.6024718,49.4150307],[19.5089294,49.5815389],[19.4292451,49.5905232],[19.2317666,49.4150307],[18.9961783,49.387976],[18.9338167,49.4916048],[18.8368097,49.4938552],[18.8021643,49.6623381],[18.6427958,49.7094091],[18.521537,49.8994693],[18.0815412,50.0109209],[17.8875272,49.9886512],[17.7385522,50.0687739],[17.6068999,50.1709584],[17.7454813,50.2153184],[17.710836,50.3017019],[17.4163505,50.2640668],[16.9486384,50.4453265],[16.8932058,50.4033889],[17.0006064,50.3105529],[17.017929,50.2241854],[16.8135215,50.186489],[16.6402948,50.0976742],[16.4324227,50.2862087],[16.1968344,50.4276731],[16.4220291,50.5885165],[16.3388803,50.6632429],[16.2280152,50.6368824],[16.0547884,50.6127057],[15.5732181,50.7641544],[15.2683391,50.8976368],[15.2440873,50.980597],[15.0292862,51.0133036],[15.0015699,50.8582883],[14.8110205,50.8735944],[14.956531,51.0721176],[15.0188926,51.2914636],[14.9392083,51.4601459],[14.7209426,51.5571799],[14.7521234,51.6260562],[14.5996839,51.8427626],[14.70362,52.0733396],[14.5581095,52.2497371],[14.5165351,52.425436],[14.6031485,52.5878101],[14.1146491,52.8208272],[14.152759,52.9733951],[14.3502374,53.0734212],[14.4229927,53.2665624],[14.1977979,53.8734759],[14.2220497,53.9958517],[15.9751041,54.3709213]]],"terms_text":"Copyright © Główny Urząd Geodezji i Kartografii.","best":true,"icon":"http://i.imgur.com/aFlvMpM.png"},{"id":"girau_do_pnciano","name":"Girau do Ponciano","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.78012791818,-9.92939325541],[-36.78086820787,-9.83891760784],[-36.87233153527,-9.83917131263],[-36.87173072046,-9.90542386241],[-36.87036815828,-9.92988995709],[-36.86155978387,-9.92994279765],[-36.85565892404,-9.92980541218],[-36.85146394914,-9.92973143536],[-36.84574547952,-9.92977370783],[-36.83213058656,-9.92966802665],[-36.81455675309,-9.92960461792],[-36.78012791818,-9.92939325541]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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","scaleExtent":[0,22],"polygon":[[[6.06066031366,48.60554459242],[6.29717112787,48.59922593248],[6.30611158204,48.74076820528],[6.06896018357,48.74710338225],[6.06066031366,48.60554459242]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie","terms_text":"GrandNancy Orthophotographie 2012"},{"id":"hamburg-40cm","name":"Hamburg (40 cm)","type":"wms","template":"http://geodienste.hamburg.de/HH_WMS_DOP40?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.4825961,53.9356013],[8.4827386,53.9092447],[8.5274957,53.9094126],[8.5279233,53.9357691],[8.4825961,53.9356013]],[[9.7723167,53.543523],[9.7743354,53.5543296],[9.7631359,53.5552115],[9.7304736,53.5578689],[9.7346453,53.5653605],[9.7579266,53.6182757],[9.7712877,53.6313071],[9.770699,53.6160708],[9.7963361,53.6102995],[9.7899342,53.6038562],[9.8181678,53.5859147],[9.8377278,53.5919808],[9.8449827,53.5949795],[9.8541578,53.5980542],[9.8681371,53.6092959],[9.8693051,53.6132263],[9.885052,53.6219916],[9.8869663,53.6252015],[9.8935594,53.6302636],[9.8963672,53.6312186],[9.8968811,53.6349162],[9.9067823,53.6523063],[9.9311454,53.6526154],[9.9455232,53.6527604],[9.9502445,53.6508457],[9.9515493,53.6506547],[9.9779541,53.6488699],[9.9849181,53.6482971],[9.9873906,53.6507159],[9.9995963,53.6815314],[10.0228185,53.6815708],[10.0433756,53.6819823],[10.0514778,53.6775926],[10.0692494,53.679547],[10.0604009,53.6883344],[10.0709998,53.6958498],[10.0707046,53.7099642],[10.0819849,53.7204444],[10.1190792,53.7132448],[10.1693902,53.7389576],[10.1936896,53.7310028],[10.1779029,53.7099228],[10.1569421,53.7045133],[10.1582858,53.6894414],[10.1434248,53.6805732],[10.1417595,53.6774354],[10.144728,53.6761294],[10.1464311,53.6758841],[10.1495537,53.6754497],[10.1715323,53.6686937],[10.1988496,53.6467523],[10.1897268,53.6383796],[10.2220152,53.6334888],[10.1888726,53.6131597],[10.1923583,53.5947431],[10.2011737,53.5839226],[10.1516942,53.5761904],[10.1506692,53.5697309],[10.1479994,53.5639032],[10.1530759,53.5624246],[10.1594205,53.5609125],[10.1518903,53.5416987],[10.154649,53.5365725],[10.1687379,53.5374002],[10.1632659,53.5218549],[10.1661094,53.5201314],[10.169185,53.5196505],[10.1895059,53.5114835],[10.2104308,53.5199588],[10.218276,53.4992345],[10.2366988,53.4962928],[10.2500849,53.4789784],[10.2659161,53.4707878],[10.2904343,53.4551223],[10.3096151,53.4430928],[10.3122326,53.4522908],[10.3251401,53.4497898],[10.3079865,53.4333199],[10.2559794,53.4162256],[10.2508909,53.4102422],[10.2457816,53.402611],[10.2415493,53.3979725],[10.1655462,53.399327],[10.1450604,53.416136],[10.1094899,53.4264876],[10.1067973,53.4265817],[10.075805,53.4543638],[10.0515477,53.4639369],[10.0351698,53.446896],[10.0144851,53.4420285],[10.0229369,53.4322826],[9.9975402,53.4254609],[9.9824345,53.4147804],[9.9787266,53.4142015],[9.958105,53.4270802],[9.9295317,53.4200676],[9.92552,53.4192417],[9.9066683,53.4159559],[9.9230535,53.4363147],[9.9170421,53.4466391],[9.9043636,53.4570665],[9.8949316,53.4558313],[9.8688468,53.4446225],[9.8621101,53.4294212],[9.8487204,53.4411135],[9.806634,53.4664838],[9.8002119,53.4737243],[9.8028025,53.4938287],[9.7820338,53.4923568],[9.7688507,53.5053032],[9.7710683,53.5218512],[9.7810509,53.5183751],[9.773523,53.527956],[9.7723167,53.543523]]]},{"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","scaleExtent":[8,20],"polygon":[[[-1.315673,50.77809],[-1.491387,50.73027],[-1.57113,50.69041],[-1.680953,50.71748],[-1.693378,50.73484],[-1.695277,50.74065],[-1.686891,50.74999],[-1.710684,50.74812],[-1.719504,50.75261],[-1.746001,50.74452],[-1.748452,50.75675],[-1.742869,50.76397],[-1.751012,50.77577],[-1.78525,50.76177],[-1.799108,50.77236],[-1.822565,50.77225],[-1.826778,50.78077],[-1.822497,50.79933],[-1.807317,50.80074],[-1.81566,50.80752],[-1.808894,50.81358],[-1.805787,50.83249],[-1.798157,50.83535],[-1.806491,50.84414],[-1.809882,50.86189],[-1.813783,50.85591],[-1.830516,50.85261],[-1.852711,50.85651],[-1.85655,50.86684],[-1.849205,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.826931,50.89939],[-1.820062,50.90492],[-1.821513,50.91691],[-1.816889,50.92412],[-1.841137,50.92886],[-1.874458,50.91441],[-1.911294,50.9439],[-1.923386,50.95917],[-1.95751,50.97575],[-1.959101,50.99152],[-1.949071,50.98649],[-1.928787,51.00055],[-1.887094,51.0026],[-1.87393,51.0097],[-1.871695,50.99083],[-1.854331,51.00786],[-1.835675,51.01238],[-1.815019,50.9899],[-1.800312,50.99457],[-1.751838,50.98133],[-1.719271,50.98047],[-1.691416,50.95943],[-1.66829,50.95041],[-1.652596,50.95029],[-1.635362,50.96269],[-1.623972,50.95903],[-1.608898,50.97686],[-1.621721,50.98099],[-1.631149,50.99984],[-1.609836,51.01225],[-1.601734,51.01042],[-1.607874,51.01582],[-1.605696,51.02271],[-1.635423,51.03176],[-1.638583,51.04126],[-1.631067,51.07819],[-1.640253,51.09201],[-1.630602,51.10359],[-1.634078,51.11099],[-1.630674,51.11652],[-1.641093,51.12237],[-1.665249,51.12546],[-1.657236,51.15539],[-1.674737,51.177],[-1.67213,51.18708],[-1.696792,51.20233],[-1.69247,51.21617],[-1.652877,51.22301],[-1.635643,51.22019],[-1.623947,51.24136],[-1.614024,51.24467],[-1.607408,51.25513],[-1.577168,51.25863],[-1.544434,51.24826],[-1.538396,51.25085],[-1.534359,51.25919],[-1.543446,51.25957],[-1.540068,51.27602],[-1.545961,51.28095],[-1.535908,51.28978],[-1.525949,51.28975],[-1.530933,51.29948],[-1.530081,51.3111],[-1.536275,51.31596],[-1.529857,51.34057],[-1.515522,51.34219],[-1.494983,51.33228],[-1.435991,51.33861],[-1.447589,51.3464],[-1.446305,51.35699],[-1.430556,51.35941],[-1.416077,51.37517],[-1.348989,51.37045],[-1.314724,51.37627],[-1.275549,51.3707],[-1.251156,51.37511],[-1.241179,51.36938],[-1.222093,51.37271],[-1.176023,51.36102],[-1.143212,51.36028],[-1.118753,51.36156],[-1.120961,51.36859],[-1.116785,51.3767],[-1.083632,51.38712],[-1.047537,51.36122],[-0.990405,51.36619],[-0.972636,51.36297],[-0.92376,51.36937],[-0.876809,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.811219,51.34418],[-0.783225,51.34084],[-0.763252,51.32721],[-0.760048,51.32013],[-0.741834,51.31112],[-0.728423,51.28238],[-0.726306,51.25653],[-0.737128,51.23126],[-0.748978,51.2277],[-0.777122,51.23901],[-0.801926,51.23628],[-0.806106,51.24056],[-0.824914,51.23137],[-0.827009,51.22315],[-0.844932,51.20998],[-0.822682,51.18268],[-0.830416,51.15022],[-0.819518,51.15047],[-0.805037,51.15847],[-0.793819,51.15491],[-0.788794,51.14141],[-0.77846,51.13664],[-0.778131,51.13063],[-0.766544,51.11946],[-0.743652,51.11491],[-0.747146,51.10131],[-0.754112,51.10116],[-0.751217,51.09547],[-0.75506,51.08987],[-0.750757,51.0852],[-0.778501,51.07715],[-0.786448,51.06467],[-0.799544,51.06078],[-0.826446,51.05881],[-0.836458,51.0664],[-0.845193,51.06052],[-0.849904,51.0436],[-0.894853,51.01978],[-0.890651,51.00194],[-0.904614,50.99327],[-0.914614,50.97806],[-0.912784,50.9708],[-0.932457,50.94278],[-0.921188,50.9232],[-0.93793,50.91615],[-0.951325,50.89178],[-0.923681,50.86513],[-0.929757,50.85365],[-0.929033,50.84245],[-0.943419,50.82191],[-0.929902,50.78445],[-0.932748,50.77435],[-0.953469,50.73682],[-1.315673,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","scaleExtent":[8,20],"polygon":[[[-1.315673,50.77809],[-1.491387,50.73027],[-1.57113,50.69041],[-1.680953,50.71748],[-1.693378,50.73484],[-1.695277,50.74065],[-1.686891,50.74999],[-1.710684,50.74812],[-1.719504,50.75261],[-1.746001,50.74452],[-1.748452,50.75675],[-1.742869,50.76397],[-1.751012,50.77577],[-1.78525,50.76177],[-1.799108,50.77236],[-1.822565,50.77225],[-1.826778,50.78077],[-1.822497,50.79933],[-1.807317,50.80074],[-1.81566,50.80752],[-1.808894,50.81358],[-1.805787,50.83249],[-1.798157,50.83535],[-1.806491,50.84414],[-1.809882,50.86189],[-1.813783,50.85591],[-1.830516,50.85261],[-1.852711,50.85651],[-1.85655,50.86684],[-1.849205,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.826931,50.89939],[-1.820062,50.90492],[-1.821513,50.91691],[-1.816889,50.92412],[-1.841137,50.92886],[-1.874458,50.91441],[-1.911294,50.9439],[-1.923386,50.95917],[-1.95751,50.97575],[-1.959101,50.99152],[-1.949071,50.98649],[-1.928787,51.00055],[-1.887094,51.0026],[-1.87393,51.0097],[-1.871695,50.99083],[-1.854331,51.00786],[-1.835675,51.01238],[-1.815019,50.9899],[-1.800312,50.99457],[-1.751838,50.98133],[-1.719271,50.98047],[-1.691416,50.95943],[-1.66829,50.95041],[-1.652596,50.95029],[-1.635362,50.96269],[-1.623972,50.95903],[-1.608898,50.97686],[-1.621721,50.98099],[-1.631149,50.99984],[-1.609836,51.01225],[-1.601734,51.01042],[-1.607874,51.01582],[-1.605696,51.02271],[-1.635423,51.03176],[-1.638583,51.04126],[-1.631067,51.07819],[-1.640253,51.09201],[-1.630602,51.10359],[-1.634078,51.11099],[-1.630674,51.11652],[-1.641093,51.12237],[-1.665249,51.12546],[-1.657236,51.15539],[-1.674737,51.177],[-1.67213,51.18708],[-1.696792,51.20233],[-1.69247,51.21617],[-1.652877,51.22301],[-1.635643,51.22019],[-1.623947,51.24136],[-1.614024,51.24467],[-1.607408,51.25513],[-1.577168,51.25863],[-1.544434,51.24826],[-1.538396,51.25085],[-1.534359,51.25919],[-1.543446,51.25957],[-1.540068,51.27602],[-1.545961,51.28095],[-1.535908,51.28978],[-1.525949,51.28975],[-1.530933,51.29948],[-1.530081,51.3111],[-1.536275,51.31596],[-1.529857,51.34057],[-1.515522,51.34219],[-1.494983,51.33228],[-1.435991,51.33861],[-1.447589,51.3464],[-1.446305,51.35699],[-1.430556,51.35941],[-1.416077,51.37517],[-1.348989,51.37045],[-1.314724,51.37627],[-1.275549,51.3707],[-1.251156,51.37511],[-1.241179,51.36938],[-1.222093,51.37271],[-1.176023,51.36102],[-1.143212,51.36028],[-1.118753,51.36156],[-1.120961,51.36859],[-1.116785,51.3767],[-1.083632,51.38712],[-1.047537,51.36122],[-0.990405,51.36619],[-0.972636,51.36297],[-0.92376,51.36937],[-0.876809,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.811219,51.34418],[-0.783225,51.34084],[-0.763252,51.32721],[-0.760048,51.32013],[-0.741834,51.31112],[-0.728423,51.28238],[-0.726306,51.25653],[-0.737128,51.23126],[-0.748978,51.2277],[-0.777122,51.23901],[-0.801926,51.23628],[-0.806106,51.24056],[-0.824914,51.23137],[-0.827009,51.22315],[-0.844932,51.20998],[-0.822682,51.18268],[-0.830416,51.15022],[-0.819518,51.15047],[-0.805037,51.15847],[-0.793819,51.15491],[-0.788794,51.14141],[-0.77846,51.13664],[-0.778131,51.13063],[-0.766544,51.11946],[-0.743652,51.11491],[-0.747146,51.10131],[-0.754112,51.10116],[-0.751217,51.09547],[-0.75506,51.08987],[-0.750757,51.0852],[-0.778501,51.07715],[-0.786448,51.06467],[-0.799544,51.06078],[-0.826446,51.05881],[-0.836458,51.0664],[-0.845193,51.06052],[-0.849904,51.0436],[-0.894853,51.01978],[-0.890651,51.00194],[-0.904614,50.99327],[-0.914614,50.97806],[-0.912784,50.9708],[-0.932457,50.94278],[-0.921188,50.9232],[-0.93793,50.91615],[-0.951325,50.89178],[-0.923681,50.86513],[-0.929757,50.85365],[-0.929033,50.84245],[-0.943419,50.82191],[-0.929902,50.78445],[-0.932748,50.77435],[-0.953469,50.73682],[-1.315673,50.77809]]]},{"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","scaleExtent":[0,20],"polygon":[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],"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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,14],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,19],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"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.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]],"terms_text":"IBGE","overlay":true},{"id":"Haiti-Drone","name":"Imagerie Drone (Haiti)","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}","polygon":[[[-72.1547401,19.6878969],[-72.162234,19.689011],[-72.164995,19.6932445],[-72.1657838,19.6979977],[-72.161603,19.7035677],[-72.1487449,19.7028993],[-72.1477194,19.7026765],[-72.1485082,19.7001514],[-72.1436963,19.7011169],[-72.1410143,19.7000029],[-72.139476,19.6973664],[-72.1382533,19.6927617],[-72.1386872,19.6923161],[-72.1380561,19.6896423],[-72.1385294,19.6894938],[-72.1388055,19.6901251],[-72.1388844,19.6876741],[-72.1378195,19.6872656],[-72.13778,19.6850003],[-72.1369517,19.6855945],[-72.136794,19.6840719],[-72.135729,19.6835148],[-72.1355713,19.6740817],[-72.1366362,19.6708133],[-72.1487843,19.6710733],[-72.1534779,19.6763843],[-72.1530835,19.6769414],[-72.1533251,19.6769768],[-72.1532807,19.6796525],[-72.1523834,19.6797175],[-72.1522749,19.6803488],[-72.1519101,19.6803395],[-72.1518608,19.6805067],[-72.1528173,19.6806552],[-72.1522299,19.6833011],[-72.1507801,19.6831499],[-72.1504457,19.6847862],[-72.1508591,19.6843492],[-72.1530087,19.6849898],[-72.1546258,19.6854354],[-72.1543103,19.6870694],[-72.1547244,19.6868466],[-72.1548501,19.6877564],[-72.1545814,19.6877982],[-72.1547401,19.6878969]],[[-72.1310601,19.6718929],[-72.1259842,19.6772765],[-72.1255379,19.6776179],[-72.1216891,19.6776442],[-72.1149677,19.672602],[-72.1152745,19.6687152],[-72.1198205,19.6627535],[-72.1227768,19.6625696],[-72.1248965,19.662701],[-72.1285779,19.6645394],[-72.1308091,19.6661677],[-72.1316737,19.668794],[-72.1315621,19.671],[-72.1310601,19.6718929]],[[-71.845795,19.6709758],[-71.8429354,19.6759525],[-71.8410027,19.6759525],[-71.8380249,19.6755254],[-71.8378671,19.6745041],[-71.8390504,19.6743927],[-71.8390109,19.6741141],[-71.8398392,19.673947],[-71.8389123,19.6736127],[-71.8380249,19.67209],[-71.8380052,19.6726285],[-71.8376699,19.6727214],[-71.8376305,19.672545],[-71.8354414,19.6732135],[-71.835333,19.6729999],[-71.8331242,19.6734642],[-71.8326706,19.6716815],[-71.8321579,19.67209],[-71.8307183,19.6694902],[-71.8306009,19.6697594],[-71.8302174,19.6698907],[-71.8291833,19.6672095],[-71.8290749,19.6672095],[-71.8289122,19.6667916],[-71.8289516,19.6666199],[-71.8288333,19.6663506],[-71.8285572,19.6664759],[-71.8288678,19.6672466],[-71.8287593,19.6674138],[-71.8277979,19.6678177],[-71.8277112,19.6678586],[-71.8278263,19.6679637],[-71.8271831,19.6681212],[-71.8271761,19.6680917],[-71.8264405,19.6683921],[-71.8264074,19.6683231],[-71.8261954,19.6684253],[-71.8261806,19.6683556],[-71.8258946,19.6684206],[-71.8258897,19.6686574],[-71.8251551,19.6687549],[-71.8254509,19.6691588],[-71.8229332,19.6695739],[-71.822713,19.6696658],[-71.8227688,19.6697577],[-71.8201751,19.6709855],[-71.8198474,19.6704537],[-71.8197985,19.6706014],[-71.8194674,19.6707557],[-71.8182472,19.6713433],[-71.8181426,19.6711431],[-71.8175813,19.6714254],[-71.816959,19.6707672],[-71.8176388,19.6718965],[-71.8171403,19.6720376],[-71.8158225,19.6718045],[-71.8138354,19.6711874],[-71.8123259,19.6706982],[-71.8121759,19.6704258],[-71.8124304,19.6701467],[-71.8119184,19.6700141],[-71.8118765,19.6705828],[-71.811169,19.6703483],[-71.8095938,19.6698516],[-71.8077992,19.6692829],[-71.8056028,19.668612],[-71.8051443,19.6668942],[-71.8051196,19.6652322],[-71.8052315,19.661979],[-71.8065603,19.6523921],[-71.8073412,19.6482946],[-71.8099686,19.6468292],[-71.8147517,19.6454502],[-71.8147726,19.6455619],[-71.8150027,19.6455093],[-71.8149469,19.6453846],[-71.8159928,19.6450234],[-71.8158882,19.6448855],[-71.8165854,19.6446097],[-71.8190119,19.643802],[-71.8211524,19.643454],[-71.8221564,19.6433292],[-71.8269046,19.643211],[-71.8280481,19.6432241],[-71.8304466,19.6440778],[-71.8306419,19.6448592],[-71.8295263,19.6450365],[-71.8296064,19.6456111],[-71.8299411,19.6455651],[-71.8303699,19.6451744],[-71.830471,19.6453452],[-71.8308092,19.6451974],[-71.8310184,19.6451088],[-71.8312519,19.6458541],[-71.8311125,19.6458245],[-71.831367,19.6465862],[-71.8328939,19.646189],[-71.8344566,19.6457062],[-71.8344664,19.6463052],[-71.834215,19.6461938],[-71.8342002,19.6465513],[-71.8346702,19.6463],[-71.8349118,19.6463905],[-71.8347984,19.6462187],[-71.8354393,19.6458496],[-71.8355034,19.6458032],[-71.8364747,19.6461328],[-71.8376382,19.6472658],[-71.8379143,19.647888],[-71.8390483,19.6508039],[-71.8456942,19.6696203],[-71.845795,19.6709758]],[[-72.098878,18.54843],[-72.096993,18.5501994],[-72.0972888,18.5503209],[-72.0968451,18.5503489],[-72.0955632,18.551854],[-72.0956428,18.5526742],[-72.0959914,18.5533748],[-72.0962145,18.553203],[-72.0962842,18.5535665],[-72.0964446,18.5535533],[-72.0965352,18.5539764],[-72.0965056,18.554173],[-72.0966085,18.5541747],[-72.0965178,18.5542127],[-72.0968769,18.5546588],[-72.0979018,18.5552141],[-72.1006211,18.5555875],[-72.1014926,18.5556206],[-72.1024339,18.5555016],[-72.103417,18.5543515],[-72.1034798,18.5516215],[-72.1030789,18.5516149],[-72.1033752,18.5515224],[-72.1035042,18.5515224],[-72.1035239,18.5502417],[-72.1028701,18.5503062],[-72.1029015,18.55025],[-72.1028457,18.5501773],[-72.1035081,18.5500252],[-72.103491,18.5497396],[-72.1035181,18.5497361],[-72.1035398,18.5489039],[-72.1034317,18.5487056],[-72.102717,18.5481437],[-72.1025601,18.5481536],[-72.10229,18.5482751],[-72.1022891,18.5482569],[-72.1025201,18.5481396],[-72.1023388,18.5481321],[-72.0999082,18.5480901],[-72.09907,18.5483799],[-72.098878,18.54843]],[[-72.2542503,18.568262],[-72.2560252,18.5717765],[-72.2557886,18.5748049],[-72.2535009,18.5755526],[-72.2522782,18.5755526],[-72.2499906,18.5740945],[-72.2473874,18.5698323],[-72.2460069,18.566729],[-72.2458492,18.5629527],[-72.2479396,18.5625414],[-72.2501483,18.5628031],[-72.2519232,18.5650839],[-72.2542503,18.568262]],[[-72.303145,18.5332749],[-72.3031275,18.5331799],[-72.3048311,18.5311081],[-72.3097397,18.5311081],[-72.3164332,18.5324302],[-72.3234056,18.5366083],[-72.3261388,18.5387765],[-72.3261946,18.5426371],[-72.3170468,18.5540596],[-72.3130864,18.5540596],[-72.2987511,18.5453342],[-72.2988627,18.5407333],[-72.2962969,18.5404689],[-72.2954602,18.5395169],[-72.2961853,18.5338582],[-72.2971893,18.5332235],[-72.3007034,18.5332764],[-72.3022652,18.5342284],[-72.3028486,18.5335189],[-72.303104,18.5333361],[-72.303181,18.5334007],[-72.3035793,18.5335614],[-72.3030793,18.5346463],[-72.303715,18.5339873],[-72.3045286,18.5344052],[-72.3044015,18.5345097],[-72.3062747,18.5352571],[-72.3063107,18.5352741],[-72.3061219,18.5357628],[-72.3061219,18.5358196],[-72.30637,18.5358928],[-72.3062726,18.5354869],[-72.3066688,18.5350891],[-72.3061963,18.5349706],[-72.3058869,18.5349385],[-72.3055373,18.5346833],[-72.3054864,18.534613],[-72.3055585,18.5345065],[-72.3046749,18.5342293],[-72.3047617,18.5338817],[-72.3043252,18.5337511],[-72.3042595,18.5336346],[-72.303145,18.5332749]],[[-72.2981405,18.477502],[-72.2935652,18.4948587],[-72.2922242,18.4964297],[-72.2931708,18.4972526],[-72.2892266,18.5057058],[-72.2878067,18.5080996],[-72.2850458,18.5119893],[-72.2840203,18.5113161],[-72.2808649,18.515879],[-72.2773151,18.5175994],[-72.2723454,18.5175246],[-72.2662714,18.5144578],[-72.2665869,18.5066783],[-72.2692643,18.5046154],[-72.2661965,18.5029756],[-72.2688181,18.4965222],[-72.2691528,18.4959403],[-72.2702684,18.4961519],[-72.2702684,18.4955964],[-72.2690691,18.49557],[-72.2692922,18.4937714],[-72.2736988,18.4859951],[-72.2746749,18.4850429],[-72.2751769,18.483403],[-72.2765435,18.4813398],[-72.2773523,18.4814985],[-72.2783006,18.4809694],[-72.2778544,18.4807049],[-72.2771013,18.480123],[-72.2789978,18.4775836],[-72.279723,18.4772927],[-72.2806433,18.4776365],[-72.2813685,18.4771604],[-72.2808386,18.4769752],[-72.2812848,18.4758378],[-72.2823167,18.4751765],[-72.2851615,18.4750971],[-72.2849941,18.4763668],[-72.2854404,18.4769752],[-72.286277,18.4756262],[-72.2869325,18.4754675],[-72.2865978,18.4751897],[-72.2865978,18.4750046],[-72.2909765,18.4747268],[-72.2946579,18.4749384],[-72.2973911,18.476843],[-72.2981405,18.477502]],[[-72.3466657,18.5222375],[-72.346833,18.5244325],[-72.3475303,18.5277645],[-72.3455501,18.5291131],[-72.3403069,18.5292189],[-72.3383267,18.5280289],[-72.3369043,18.530118],[-72.3338086,18.5296684],[-72.3289279,18.5270769],[-72.328649,18.5253316],[-72.3292068,18.5232689],[-72.330406,18.5220524],[-72.3321631,18.5221847],[-72.3322467,18.5191963],[-72.3369183,18.5183633],[-72.3382012,18.5184691],[-72.3381454,18.5181782],[-72.3411993,18.5177947],[-72.3454943,18.5171997],[-72.3492595,18.517279],[-72.3504308,18.5188922],[-72.3503472,18.5206112],[-72.3496778,18.5220392],[-72.3466657,18.5222375]],[[-72.3303078,18.5486462],[-72.3429687,18.5508149],[-72.3433236,18.5530585],[-72.3413121,18.5614341],[-72.3390639,18.5613593],[-72.3384723,18.5638271],[-72.3375257,18.5654348],[-72.3348436,18.5650609],[-72.3311755,18.5638271],[-72.3312149,18.5616211],[-72.3232082,18.5606863],[-72.3212361,18.559602],[-72.3208023,18.5587046],[-72.3208811,18.557882],[-72.3259493,18.5580274],[-72.3266186,18.5581993],[-72.3259214,18.5577498],[-72.3250986,18.5573797],[-72.3233767,18.552263],[-72.3245994,18.5478507],[-72.3288986,18.5483742],[-72.329979,18.5489548],[-72.3303078,18.5486462]],[[-72.3231383,18.5269828],[-72.3223434,18.528067],[-72.3209629,18.5279745],[-72.3207816,18.5271282],[-72.3208513,18.5253697],[-72.3214649,18.5249598],[-72.3225666,18.5248937],[-72.3228454,18.52533],[-72.3232359,18.5264804],[-72.3231383,18.5269828]],[[-72.2160832,18.6457752],[-72.2159649,18.6553795],[-72.2030279,18.6558279],[-72.1947057,18.6553421],[-72.1922208,18.6545573],[-72.1920631,18.6521283],[-72.193483,18.6477559],[-72.201253,18.6385249],[-72.2069327,18.6388239],[-72.2120996,18.6424117],[-72.2118068,18.6430591],[-72.2121693,18.6426892],[-72.2127968,18.6427552],[-72.2134662,18.6431252],[-72.2135638,18.6437462],[-72.2154176,18.6443947],[-72.2158909,18.6450301],[-72.2160832,18.6457752]],[[-72.2867654,18.6482017],[-72.2900977,18.6527446],[-72.28981,18.6536532],[-72.2900738,18.6542664],[-72.290721,18.6537667],[-72.2910327,18.6544709],[-72.2912485,18.654221],[-72.29168,18.6558905],[-72.2912245,18.656606],[-72.2922673,18.65597],[-72.2926869,18.6567536],[-72.2930705,18.6567309],[-72.2941253,18.6581846],[-72.2960192,18.6608421],[-72.2959713,18.6619096],[-72.2932862,18.664567],[-72.2906731,18.6659979],[-72.2895943,18.6661342],[-72.2895943,18.6665657],[-72.2877004,18.6664749],[-72.2875805,18.6676559],[-72.2831214,18.6697227],[-72.2796453,18.6696546],[-72.2784311,18.6690787],[-72.2783972,18.6687736],[-72.277736,18.6691671],[-72.2774394,18.669143],[-72.2770071,18.6683159],[-72.2765575,18.6681125],[-72.2765385,18.6680583],[-72.2752319,18.6685239],[-72.2749292,18.6674649],[-72.2746416,18.6674309],[-72.2734668,18.6682145],[-72.2732271,18.6682712],[-72.2726757,18.6671583],[-72.2719147,18.6674288],[-72.2718808,18.6673405],[-72.2688149,18.6681868],[-72.2688269,18.6671761],[-72.2690786,18.6668241],[-72.2688149,18.66679],[-72.2681077,18.6670739],[-72.2676282,18.6673805],[-72.2675563,18.6666878],[-72.266861,18.666949],[-72.2655904,18.6673578],[-72.2654466,18.6670058],[-72.2647514,18.6674146],[-72.2629893,18.6681868],[-72.2628455,18.6681754],[-72.2626537,18.6676076],[-72.2623001,18.6677098],[-72.2624799,18.6679199],[-72.2624799,18.6682322],[-72.262306,18.6682606],[-72.2620963,18.6679654],[-72.2622761,18.6689193],[-72.2601484,18.6688966],[-72.2542749,18.6687944],[-72.2505388,18.6683476],[-72.2504371,18.669536],[-72.2477926,18.6698893],[-72.2415204,18.669793],[-72.2414187,18.6741933],[-72.2389167,18.6739759],[-72.2387249,18.6734649],[-72.2383653,18.6733059],[-72.2387009,18.6739532],[-72.2375502,18.6738964],[-72.2374183,18.6735103],[-72.237742,18.67334],[-72.2375142,18.6732605],[-72.236843,18.6734876],[-72.2364354,18.6724088],[-72.2355124,18.6726019],[-72.2354045,18.6724202],[-72.2353027,18.6729028],[-72.2345475,18.6726871],[-72.2343077,18.6724599],[-72.2342358,18.6734706],[-72.2334087,18.6734592],[-72.2332889,18.6733003],[-72.2327375,18.6732889],[-72.2327135,18.6735047],[-72.227703,18.6725281],[-72.2265283,18.6716537],[-72.226804,18.6715742],[-72.2274993,18.6715855],[-72.2274873,18.6714493],[-72.2272899,18.6714623],[-72.2272814,18.6712977],[-72.2272094,18.671358],[-72.2261785,18.6713693],[-72.2256032,18.670881],[-72.2255073,18.6694502],[-72.2261066,18.6696886],[-72.2261785,18.6695949],[-72.2259837,18.6695495],[-72.225777,18.6691379],[-72.2253335,18.6694643],[-72.2249739,18.66947],[-72.2245783,18.6678802],[-72.2235525,18.6677046],[-72.2235907,18.6675921],[-72.2224634,18.6676283],[-72.2223659,18.667022],[-72.2223277,18.6670943],[-72.2219209,18.667026],[-72.2208105,18.6669015],[-72.220809,18.6665325],[-72.2208705,18.6663593],[-72.2206023,18.6668107],[-72.2203895,18.6666361],[-72.2184341,18.6650535],[-72.21829,18.6640979],[-72.2183493,18.6608376],[-72.2187223,18.6606541],[-72.2186894,18.660603],[-72.2187253,18.6604525],[-72.2189771,18.6603247],[-72.2187823,18.6601998],[-72.2186984,18.6602367],[-72.2185815,18.6600352],[-72.2186085,18.6600039],[-72.2187823,18.6601345],[-72.218995,18.6600181],[-72.2189111,18.6599131],[-72.2189681,18.6597938],[-72.2183807,18.6595837],[-72.2184728,18.6539662],[-72.2201001,18.6511554],[-72.225796,18.6469472],[-72.2283048,18.6457265],[-72.2379335,18.645855],[-72.237764,18.6446985],[-72.2400355,18.6432529],[-72.2455958,18.6433493],[-72.2482742,18.6450358],[-72.2487488,18.6436705],[-72.2511067,18.6429775],[-72.2512385,18.6433409],[-72.2512625,18.6431592],[-72.2514843,18.6431365],[-72.2513284,18.6429718],[-72.2533602,18.6423471],[-72.253516,18.6426765],[-72.2539535,18.6425402],[-72.2541453,18.642932],[-72.2543851,18.6428696],[-72.2543791,18.6427503],[-72.2564168,18.6423244],[-72.2566925,18.6431365],[-72.2568783,18.6428582],[-72.2568184,18.6425288],[-72.258843,18.6420991],[-72.258885,18.6422467],[-72.2592626,18.6422297],[-72.2596461,18.6424057],[-72.2592206,18.6406907],[-72.2599545,18.6404815],[-72.2601156,18.6406341],[-72.2601156,18.6399393],[-72.2615268,18.6394669],[-72.2626056,18.6391034],[-72.2654465,18.6387286],[-72.2719433,18.6386832],[-72.272201,18.6388649],[-72.2730341,18.6394158],[-72.273166,18.6412558],[-72.2738732,18.6410286],[-72.2742208,18.6416079],[-72.2752187,18.6416987],[-72.2754524,18.6415738],[-72.2755513,18.6416874],[-72.2755394,18.6417527],[-72.2764713,18.6418634],[-72.276753,18.6418975],[-72.2762953,18.6426002],[-72.2774226,18.6429978],[-72.277982,18.6427247],[-72.2785796,18.6431303],[-72.2785669,18.6432307],[-72.2789017,18.6433471],[-72.279851,18.6439655],[-72.2858703,18.6469651],[-72.2867654,18.6482017]],[[-72.5557247,18.5305893],[-72.5555866,18.5367036],[-72.554995,18.537975],[-72.5488026,18.537919],[-72.5486646,18.5372832],[-72.548842,18.5306267],[-72.5493745,18.5301031],[-72.555133,18.5301218],[-72.5557247,18.5305893]],[[-72.6235278,18.5079877],[-72.6234441,18.5095217],[-72.6226074,18.5104341],[-72.6204878,18.511849],[-72.6183403,18.5107514],[-72.6162207,18.5083183],[-72.6162625,18.506467],[-72.618661,18.5044438],[-72.6204041,18.5044967],[-72.6228305,18.506996],[-72.6235278,18.5079877]]]},{"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","scaleExtent":[0,14],"polygon":[[[79.01779174804685,8.827572266651268],[79.01401519775389,9.64678471986339],[80.17642021179198,9.650423231331946],[80.17727851867674,8.831304063493132],[79.01779174804685,8.827572266651268]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,12],"polygon":[[[-152.70872943147867,62.30357443926811],[-152.70838610872474,62.58153176976553],[-152.00835101350992,63.54645538851267],[-148.99432055696695,63.53329945446586],[-148.99432055696695,62.30357443926811],[-152.70872943147867,62.30357443926811]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[114.35999506049737,2.028456548619032],[113.5344754987298,2.030000532161949],[113.53619211249934,3.070767124420059],[114.76511591010677,3.067510236472651],[114.76254098945248,2.088156161702156],[114.35999506049737,2.028456548619032]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[104.00154570197358,-0.000078769115171],[104.00137404059662,1.45099139170518],[104.91014937018647,1.451162998032411],[104.91014937018647,-0.000078769115171],[104.00154570197358,-0.000078769115171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing Islands in OSM (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[3.246529403113632,-54.47046993167111],[3.246529403113632,-54.375391687979096],[3.463852706336288,-54.375391687979096],[3.463852706336288,-54.47046993167111],[3.246529403113632,-54.47046993167111]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[10.559062957763668,45.95484945195885],[7.473964691162107,45.95532682303484],[7.555847167968747,46.27080015119853],[8.05469512939453,47.66469371011084],[11.752452850341793,47.664809318453564],[11.752452850341793,46.813336457338615],[11.38423919677734,45.955088138010865],[10.559062957763668,45.95484945195885]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[-34.17701089820909,-55.29692751183208],[-35.19599283180284,-55.282851769908206],[-35.16663873634385,-54.7209735214882],[-34.12516916236925,-54.73465315976587],[-34.14010370216417,-55.29692751183208],[-34.17701089820909,-55.29692751183208]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[-72.7594470977783,-15.68684010813036],[-72.7594470977783,-15.49570157136026],[-72.74434089660643,-15.426295586903299],[-72.41286277770995,-15.426295586903299],[-72.41286277770995,-15.652957427428944],[-72.42410659790038,-15.686674840407827],[-72.7594470977783,-15.68684010813036]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[1.839749701876779,6.257803795151386],[1.839749701876779,7.114271792431897],[2.549397834200998,7.114271792431897],[2.549397834200998,6.489052510574106],[2.497813590426584,6.258059752887941],[1.839749701876779,6.257803795151386]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[-92.05216379429558,1.321295617717369],[-92.05216379429558,1.72181118585353],[-91.74849481846549,1.72181118585353],[-91.74849481846549,1.321295617717369],[-92.05216379429558,1.321295617717369]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,11],"polygon":[[[-84.34798733886554,74.38945823827667],[-84.34798733886554,75.89030323920836],[-79.14870755370929,75.89030323920836],[-79.14870755370929,74.38945823827667],[-84.34798733886554,74.38945823827667]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coastline mostly mapped meanwhile (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,12],"polygon":[[[-13.047005598725303,64.2110895294821],[-15.164963667572959,64.22408122727819],[-15.168053572358117,64.81572800422087],[-13.043572371186242,64.80359943673454],[-13.047005598725303,64.2110895294821]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islets and inaccurate coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[-78.531997745432,-1.805085317123331],[-78.531997745432,-1.608105565001241],[-78.33561713019762,-1.608105565001241],[-78.33561713019762,-1.805085317123331],[-78.531997745432,-1.805085317123331]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[-56.13476090727487,-61.63471600102006],[-56.13476090727487,-61.199363166283845],[-55.83263688383738,-60.84015069906498],[-53.72343354521433,-60.83981613078141],[-53.72343354521433,-61.63471600102006],[-56.13476090727487,-61.63471600102006]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[-24.758781955967567,14.748140156641956],[-24.758781955967567,15.092493544965103],[-24.267057941685337,15.092493544965103],[-24.267057941685337,14.748140156641956],[-24.758781955967567,14.748140156641956]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[73.06896521028185,-53.270590689700434],[73.06896521028185,-52.875489636268725],[73.67338491853381,-52.87673289134188],[74.08863378938341,-52.94950473139763],[74.08863378938341,-53.270590689700434],[73.06896521028185,-53.270590689700434]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,12],"polygon":[[[-69.85679747431641,-55.55949231551995],[-72.26520659296875,-55.149427383391455],[-72.26520659296875,-54.51089432315929],[-72.08530546992188,-54.17909103768387],[-69.49115874140625,-54.17889010631196],[-69.49150206416016,-55.28378528847367],[-69.62230803339844,-55.55910398108892],[-69.85679747431641,-55.55949231551995]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[35.932588577270494,44.96236872935039],[35.932588577270494,45.559256426515695],[37.369909286499016,45.559256426515695],[37.369909286499016,44.96236872935039],[35.932588577270494,44.96236872935039]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,10],"polygon":[[[-79.05174500251786,81.91484289044183],[-79.05174500251786,83.43338556749623],[-73.60389956385866,83.80224987787145],[-26.424486898081835,83.80224987787145],[-21.492998879371186,83.50352415480617],[-16.888354121159868,83.15094632775453],[-16.888354121159868,81.91484289044183],[-79.05174500251786,81.91484289044183]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[-28.210747081406492,-56.72108048139938],[-28.210747081406492,-56.624975043089115],[-27.96956284678735,-56.624975043089115],[-27.96956284678735,-56.72108048139938],[-28.210747081406492,-56.72108048139938]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[-27.992928409215843,-56.73479060902333],[-28.227761172887714,-56.732624892496354],[-28.2241562839717,-56.600752537318456],[-27.969754123327167,-56.60283135691063],[-27.97318735086623,-56.73479060902333],[-27.992928409215843,-56.73479060902333]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,10],"polygon":[[[-85.76109385682587,81.39333391115835],[-89.83015512094161,82.14951616258433],[-89.83152841195212,82.24404688557661],[-84.99342418195555,82.73098798225534],[-79.95207288240479,83.13107965605444],[-74.55641250214465,83.46266728201661],[-69.35850602739671,83.70450775086888],[-28.207840897721187,83.70450775086888],[-23.06623935440381,83.46532469372944],[-17.96583654140148,83.15518123848051],[-17.96720983241198,82.72386035102944],[-22.781968115230015,81.44190408358111],[-85.76109385682587,81.39333391115835]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[37.20665931701659,-0.266846645776291],[37.20665931701659,-0.011930465612033],[37.5655174255371,-0.011930465612033],[37.5655174255371,-0.266846645776291],[37.20665931701659,-0.266846645776291]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[37.24768638610839,-3.229213650135676],[37.24768638610839,-2.968155849006605],[37.61581420898436,-2.968155849006605],[37.61581420898436,-3.229213650135676],[37.24768638610839,-3.229213650135676]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[150.38853376619625,-2.800534349432724],[150.38853376619625,-2.383396178206425],[150.83348005525875,-2.383396178206425],[150.83348005525875,-2.800534349432724],[150.38853376619625,-2.800534349432724]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[59.198977223476454,64.8920468958533],[59.198977223476454,66.91656046303187],[60.733286610683486,68.44289182710118],[67.7329509173241,68.44327026354412],[67.7329509173241,67.748828729217],[64.21646761043934,64.9195663902952],[59.198977223476454,64.8920468958533]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,10],"polygon":[[[-81.62923243782096,82.45969864814401],[-83.03136255954291,82.47985512217643],[-83.03136255954291,83.05876272004272],[-72.80309111332822,83.09567468670448],[-65.65785798568925,83.03232446260982],[-65.8116665788654,82.45969864814401],[-81.62923243782096,82.45969864814401]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,10],"polygon":[[[-78.89729497133754,82.17577067162792],[-82.64500613899595,82.19425721404356],[-82.64500613899595,83.08067098163464],[-66.58986093522367,83.08497116318647],[-63.78010752773773,82.98907949583335],[-63.78010752773773,82.72198178031782],[-65.0092029821365,82.17577067162792],[-78.89729497133754,82.17577067162792]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66770140276793],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66810821588294],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,10],"polygon":[[[-52.49221819430999,82.48971755550389],[-52.49221819430999,82.94294978186194],[-49.28695697579964,83.47311821807558],[-44.52850362441216,83.7321400994933],[-29.525299334683975,83.7321400994933],[-25.263977329098022,83.58271128961059],[-21.183929736898254,83.39775984253468],[-21.183929736898254,82.74312310369845],[-23.404541300879075,82.48971755550389],[-52.49221819430999,82.48971755550389]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[73.22790413350113,-53.20333324999222],[73.22790413350113,-53.01072925838941],[73.2594898268605,-52.94943913810479],[73.78992348164566,-52.94943913810479],[73.78992348164566,-53.06048282358537],[73.71782570332533,-53.20333324999222],[73.22790413350113,-53.20333324999222]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[-80.01653561766223,8.848981570244637],[-80.01653561766223,9.41480707574399],[-79.46859250242785,9.41480707574399],[-79.46859250242785,8.848981570244637],[-80.01653561766223,8.848981570244637]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[-79.62538719177245,8.770827350748924],[-79.68684196472167,8.821974500616129],[-79.6866703033447,8.93705081902936],[-79.65362548828124,9.0929436313527],[-79.268159866333,9.0929436313527],[-79.32832717895505,8.770827350748924],[-79.62538719177245,8.770827350748924]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,10],"polygon":[[[-53.20921946177197,-84.12524693598144],[-60.615377881406225,-83.78609327915953],[-60.615377881406225,-82.29968785439104],[-48.72405102147429,-82.29987186164387],[-44.52178052933989,-82.43683433550413],[-44.51354078327688,-84.12524693598144],[-53.20921946177197,-84.12524693598144]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[19.112325688609005,42.1531576323006],[19.08425905347717,43.08073531915633],[20.63298799634826,43.09602978090892],[20.637880345591427,42.167791043253985],[19.112325688609005,42.1531576323006]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,15],"polygon":[[[-51.238571767352376,68.79971882076842],[-51.243335370562825,68.85302612951142],[-51.151668195269856,68.85302612951142],[-51.14038145973519,68.80116208175376],[-51.238571767352376,68.79971882076842]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,12],"polygon":[[[67.96839858817646,22.36264542957619],[67.86231185721942,22.38391650007107],[67.86231185721942,24.886930816927297],[71.48986007499286,24.886930816927297],[71.48986007499286,22.36264542957619],[67.96839858817646,22.36264542957619]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[23.808114560320394,41.584878805945024],[22.992379697039144,41.6019534981177],[23.011863263323328,42.29983747360261],[23.99402383156063,42.283393175568236],[23.965613873674886,41.584878805945024],[23.808114560320394,41.584878805945024]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[29.766296776846374,0.206886934953159],[29.766296776846374,0.509176367154027],[30.034603509024116,0.509176367154027],[30.034603509024116,0.206886934953159],[29.766296776846374,0.206886934953159]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[29.8051357269287,0.235862065771959],[29.8051357269287,0.467085433008179],[30.02503395080565,0.467085433008179],[30.02503395080565,0.235862065771959],[29.8051357269287,0.235862065771959]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[-180,-67.4263452007858],[-180,-67.32544337276457],[-179.8247337341308,-67.3253771978419],[-179.8247337341308,-67.4263452007858],[-180,-67.4263452007858]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[-42.12874872458635,-53.72050213468143],[-42.14625818503558,-53.45782244664258],[-41.67573435080706,-53.445862233424414],[-41.6558216310805,-53.70871763480476],[-42.12874872458635,-53.72050213468143]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[120.84382442048364,-3.595452324350203],[120.84382442048364,-3.159848173206955],[120.98184016755395,-2.514681686347053],[122.62618449738794,-2.514681686347053],[122.62618449738794,-3.002148034113534],[122.5007000308352,-3.595452324350203],[120.84382442048364,-3.595452324350203]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,10],"polygon":[[[156.96951345925345,-84.50097988272655],[154.50857596843485,-84.46255082580927],[154.50857596843485,-82.60681485793681],[175.46774337070775,-82.58504749645738],[177.00582930246938,-83.52806548607914],[177.00582930246938,-84.19262083779002],[171.93838547371908,-84.34632646581997],[166.83798266071676,-84.44370142483508],[161.67028858819987,-84.50045345467909],[156.96951345925345,-84.50097988272655]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,15],"polygon":[[[-68.93976917529807,76.51132557714853],[-68.93976917529807,76.54990046497333],[-68.76634826923117,76.55175699880375],[-68.50992908740743,76.55175699880375],[-68.50743999744161,76.51611959755911],[-68.67897262836203,76.51193618208278],[-68.93976917529807,76.51132557714853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,17],"polygon":[[[-68.74291885235837,76.52635852412212],[-68.74446380475094,76.52840070669755],[-68.74806869366695,76.54938731810256],[-68.7461482320123,76.56016657973251],[-68.72275936940244,76.56022393334496],[-68.72017371991207,76.5577475347327],[-68.71853220799495,76.5292079974043],[-68.71977675297786,76.52636602351234],[-68.74291885235837,76.52635852412212]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,16],"polygon":[[[-68.81923965911197,76.52510098413808],[-68.82651380996036,76.54176603738404],[-68.77344898680974,76.5439032956252],[-68.7021022270136,76.54544610909097],[-68.59176687697696,76.54560088014632],[-68.59183124999333,76.52793072237704],[-68.65970186690618,76.52510098413808],[-68.81923965911197,76.52510098413808]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,16],"polygon":[[[-68.7777130980429,76.50687742381471],[-68.77661875676482,76.57064446843503],[-68.68115357350676,76.57065443536027],[-68.67630413960784,76.55384487076157],[-68.67619685124725,76.5307435998188],[-68.6852305312094,76.50688243050337],[-68.7777130980429,76.50687742381471]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,12],"polygon":[[[78.45885691499899,80.72643412860921],[78.45885691499899,80.9098976404357],[80.48892435884663,80.9098976404357],[80.48892435884663,80.72643412860921],[78.45885691499899,80.72643412860921]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[153.0613810625655,-11.789228234021259],[153.0613810625655,-11.288690822294749],[153.10927458673538,-11.072292520575749],[154.41201277643268,-11.072292520575749],[154.41201277643268,-11.789228234021259],[153.0613810625655,-11.789228234021259]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[-72.8669610523419,-41.51741123877955],[-72.8669610523419,-41.045274923011036],[-72.23181395761533,-41.045274923011036],[-71.87510161630674,-41.10829439141359],[-72.00007109872861,-41.51741123877955],[-72.8669610523419,-41.51741123877955]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[126.36143429881301,51.375528375017275],[126.34804471141064,52.33932231282816],[128.60762341624462,52.340895519845674],[128.6117432892915,51.375528375017275],[126.36143429881301,51.375528375017275]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image showing newest features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,13],"polygon":[[[75.98364343730569,34.97850982318471],[73.96164407817483,35.36957188964085],[74.44281091777444,37.09391400468158],[76.50600900737405,36.7026732100855],[75.98364343730569,34.97850982318471]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,14],"polygon":[[[-71.18070648306262,-14.4978507264954],[-71.17976234548938,-13.710292880050797],[-70.5563740550841,-13.71262765059222],[-70.5563740550841,-14.4978507264954],[-71.18070648306262,-14.4978507264954]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"IPR-orotofoto-last-tms","name":"IPR ortofoto LAST (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,18],"polygon":[[[14.81231552124,49.93089301941],[14.18754582291,49.87687266984],[14.12025456314,50.19881542327],[14.74502426147,50.25247461226],[14.81231552124,49.93089301941]]]},{"id":"IPR-orotofoto-vege-tms","name":"IPR ortofoto Low-Vegetation (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,20],"polygon":[[[14.30454236984,49.99538124382],[14.3160436821,49.94205148763],[14.3499983888,49.94508261663],[14.35383872175,49.92726356386],[14.42385321818,49.93351545169],[14.4200902288,49.95097343212],[14.48865449494,49.95709281879],[14.48479036398,49.9750111737],[14.55385989188,49.98117257481],[14.55011770159,49.99851689993],[14.58455395868,50.0015874108],[14.58829614897,49.98424419323],[14.69168128485,49.99346468175],[14.67633637226,50.06452744171],[14.71278864961,50.06777324036],[14.70115373952,50.12158114828],[14.66470146217,50.11833899243],[14.6610031918,50.13543086714],[14.62755290441,50.13245658485],[14.61965341283,50.16894659259],[14.58542741996,50.16590546732],[14.58162921725,50.18344165464],[14.40776267983,50.167995553],[14.41156088254,50.15045369625],[14.37764851321,50.14743927281],[14.37379555571,50.16523508727],[14.33892816423,50.16213672855],[14.34278112173,50.14433976066],[14.27367931007,50.13819641038],[14.27749028245,50.12058459573],[14.20879964298,50.11447476994],[14.21288816219,50.09557069695],[14.24656290855,50.09856724424],[14.25417384067,50.06335893014],[14.21987061144,50.0603042129],[14.22369648177,50.04259477081],[14.257999711,50.04565061557],[14.26952647673,49.99225864496],[14.30454236984,49.99538124382]]]},{"id":"bartholomew_qi1940","name":"Ireland Bartholomew Quarter-Inch 1940","type":"tms","template":"http://geo.nls.uk/maps/ireland/bartholomew/{zoom}/{x}/{-y}.png","scaleExtent":[5,13],"polygon":[[[-8.8312773,55.3963337],[-7.3221271,55.398605],[-7.2891331,55.4333162],[-7.2368042,55.4530757],[-7.18881,55.4497995],[-7.1528144,55.3968384],[-6.90561,55.394903],[-6.9047153,55.3842114],[-5.8485282,55.3922956],[-5.8378629,55.248676],[-5.3614762,55.2507024],[-5.3899172,53.8466464],[-5.8734141,53.8487436],[-5.8983,52.8256258],[-6.0191742,52.8256258],[-6.0262844,51.7712367],[-8.1131422,51.7712367],[-8.1273627,51.3268839],[-10.6052842,51.3091083],[-10.6271879,52.0328254],[-10.6469845,52.0322454],[-10.6469845,52.0440365],[-10.6271879,52.0448095],[-10.6290733,52.0745627],[-10.6699234,52.0743695],[-10.6702376,52.0876941],[-10.6312729,52.0898179],[-10.6393128,52.4147202],[-10.3137689,52.4185533],[-10.3166401,53.3341342],[-10.3699669,53.3330727],[-10.385965,54.3534472],[-8.8163777,54.3586265],[-8.8173427,54.6595721],[-8.8413398,54.6616284],[-8.8422286,54.6929749],[-8.8315632,54.7145436],[-8.8151208,54.7145436],[-8.8312773,55.3963337]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAABACAMAAACX6y++AAABzlBMVEVHcEx7f549P3Gww9d4e5ygq8NlaY/F3OylzugCe8HE0+FYXIUWGFXd5O0/Q3MHCEociMicoLZ8f58iJF0IesEPEE0bIFqAg6LU1d+pq8CYx+USgcQdIVyHvuBmrtmLjamtr8NCndCMrs0dHlgREk6KjqqYnLR3ept7fp2jpbxVWIOPwN1laY43OWxlZ44aG1Z+gaCytMUiJl5XWYQ/QnNNUX1SVoGOkaxcYYlkZ40yk8x4eptDnNCQk6xSpNRucZSLwOFFSXdcqNWFveB9ud0iJVxRpNJFntErMWg0O29/gaE3l86DhaN6t91mrdhjaI9tb5BwdJi82+0pjspCRHego7paYIirrsIuLWBmaZAGBkZ0eZpRVYBaXoXg4ehCRneq0uqbyeYrMWZla5AmisiDvN+hzOdDW4gUhsYCfMIAAkYAAEQAAEYAAEADfMEDe8ECe8EAAUcAAEIAADsCfMEAAD4Ce8AAe8EAecACf8YAAUgAeMAAADYCBUUBfcQAEVEChMsAdb4Adb8CcbMDgcgAc70BHl0DU5MEf8MFBkkCXZ0ACUkCS4oCJWQCeb4AMG4CZKQBNnUBRIQCdrkBPXsCAj0Hdb4BF1gCaqsCaqyC7/fbAAAAanRSTlMADNoWAQMCBWClCAbzEb357h4u6/v77YwqOSv09HeWeSW4EOH2ai0YUWujZEPNkP05VeO9qq1rdlKm3IrFPkCBUraiMiPQp9HZzprPRYJBhKyhVOnOTF1Y45r9esixH8lgH9dq3YZtfJilWVggggAAA+BJREFUeF6dl4Vz20gUxmXHca9xmJukcGVmvhQPmZkZFsVGCGO5h//tLXqVubiS/OTsjmf82++97z1pIqt97HhudqrbShOGXJ7+uaszcqG6fP27ro5Im86PPv9OB+R8kZLSwuCeqfSaRZvadnX0+u6eTkhKSwujs7fTZmszkMmWqtN3p1JqimBssTS4uy+VJmWX+DDdNz/oSeGtLfKVB8xPv/JimjoFKU+oLn/49ksJ66TE1jCP4vxfr57Yn8whieqL2iEbqpvJvKWS1AnbxWo4uOf7JJocIMJdKldSrJZ++mVHbJ1CTl984WuxtPZbfFdEUMKFVYgKdsZpKk4oUSqyljnvjNNUP9QehZTKc0isJv85ESAX9xmpvsdqUqMp8tXJxtcpeiI+CtJex5I6T1vKcU66lUQzlFqEM8TnHLM4SVdUiVLZJ0I/tEmirlAzPLq9foI6CVGWyDPUCdROoOlrzOdbqPyNJ6WIXNQAExLflRONIldRQVhQmkSz78r4w8Uy04i2Uzb0mfdKz8mvMITNew/KDZvKdghMHtNes3v4jXrgOAC6Kxvhkq9HlkjN9tnmh46N1JDDSMdx64//WVvSk6Dnvo1DhU9OBW4FMIzDCDefLM6xlIVJvnBpe838rotnPORITmwuXlnlsq1nCt22K32nPwuwAySkZEFQf/hoqRxS3ss2d1nh0GvrXkXLmR26zT8Wyz7Vs69Jk2j/AIbO1pD1Igj/Xn3QMEMcJXNDEwNQccD8sUVuENx/VG4QNRKGzHUdOy/zBC0pZDRFuJss5bLoiiG7T16oQSUHWPDNQNouGDTvPV1qRCYhd/jzGc9RCJBCkkKSEyQCwMH4/sbaXMvbvi+zHlZpCl5sKPIdtMpGePPxv3PlkJO5c9/WAyRrkpemgUpelasycoPmk6dzv1vW5MXeACoqUpSEtWy0RQC67soq07y0jhGIOKq1jKu6YGAGA8/8almZK+cBdmRoaa0Z7WyEc0H/DWHQN8fHsasNVEma3DSnz4H4i+yPeT11H/efCVBk2ExmW7MHyMH1kdND0YfV5VM1XAGmd7wuZLxFaj6Qd/DSWWtL5PZN9NZUN4yc8UkslcD76NPM/x89N97DQRQFegOqTOiN7D1ibRf7j2YDCLSa5pGSRO7Ba4dz1vaRP3KrF0E1CMYkwcHK62+14WS5k3fGoKsZM4IuPLA37j/UwrmXx+Rzwfjs1nuP77PiI/PuAYzNXQNQMNB/1UoU+eH3Z2pQ14n/zB7KWEmjcPTCuicGA3rjLwxbKSLXdTnLZfHY12fTvtTlJydAUP/haqaTF7pd1yae9Tb3H7gLAvuPLxXhAAAAAElFTkSuQmCC"},{"id":"GSGS3906","name":"Ireland British War Office 1:25k GSGS 3906","type":"tms","template":"http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-10.71,51.32],[-10.71,55.46],[-5.37,55.46],[-5.37,51.32],[-10.71,51.32]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin","terms_text":"Glucksman Map Library, Trinity College Dublin","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAB3RJTUUH3gQOFR0YB1KT3QAAAAlwSFlzAAAewQAAHsEBw2lUUwAAAARnQU1BAACxjwv8YQUAAAS/SURBVHjandN7TFNXHAfwzrn/lm3ZHy7LYrJkybK5zMw9fCEoPjbeChoHTtBVRF7l1ZZSaG8flCtvsFVpoZZHC5Y6jDM+UScDaxF5lIfSAaMIlVKBS8EZN4d+d9voZpbMFX/JN7nnnvM7n5xzcxmM5wrPlX1yFmP2adgmXKHc78bsU+j9ZRT3HzzE+D0n7tjuYdo5h38X47/q+UWD1nE0tw/gktEC66gdN/tG0Dc4hnEHhdG7DujOdqGHxi4ae2AZti8ccJXZYoOxawRPnjzGwcpmzM8//ntOe86MickZTEw7ka+99nJAZ/8YWjqs7ufc6ibM/fbQ/fzHo0eoOduJ8UkKljt2nLhk9hj4/Wlm6VA9A2NUa/ew6wNQE1OzVGvPEGUZvkvZHVNUo2mA6ugfpvoGrNT8/Dz1tMfd/yJgKZ13h6zjzFbzvbwO8wDZaR4kzeZbZG/fIHnTbCOvdzrI9h472dnVT97oociO23NkW+9M3pDVsc/V69rjRYA7Su11/dvbfkRJvDeOcMORuj8CpelLkJO6BVs4vQhj3QD5fTQS2PXYndQAblw2yrUt9c/6/xeoqzulK+VEoCTtawgSM5HCr0Nsmg48ngJhYiukonNIybeg8MQEFIZBFBWIoa4z1XoMaOrbtbHci2BtW4RachnOlO/GZW0SjuZEY2eWGYVEFfYJ+kDo/4ThdDPExadQcbxb5zmgb6/xYZlAxPtDmByFS2U+EHM5yBOyEZZ8HkzeZaQmyxFZROGkgUQIMQSNvkPrMXBM31YdFqNDJK8ZHE4FYgSt2Jl0GpKUGAhFjTiQ2QJDgRBGdSTIvEJ8IXDSQJvngEbfWrWacGJDzn1sJ34FkSqFQbgWTcUrcLWIATlnBzYSE8hOOIBQzk9YK56jgRs1CzlBVXD6bcijCYSwTYjhXUFD7nrUlHyFc6pPUCL4BpskUwhn6iGPSMYG3igN3KxeCKDZyulGddReBKV3YbNkGidkIWhQLMeFiuUoE3ths8iOfXFnoQ5nwTt9xHVFVZ5f0XGjxks0A++sIWyNqYM0TYp6qS9+UHxOn+BjqMQfwF8wgg2x5+ErccCboKA5bloAUGc8tk40i2CmGuGhgQhjX0MZwUY5uRJVuX6QcpPhm2TErlBfBLAa4S2epYHrlZ5fke4K6SVyIjRejz1REfhO2Ab2wavgZJ8EU9gEUek1MDMvIIa5DUFpzVhHzECtbRR4DJRrDP5f8h04ILwAmTQLAkEWCgsLIJVIIcwS4uhRBSQSCfi8FGzP6sbKjLsoV+tWewwolUfe+pR1y7GD1YDd4cGIi4uFgM/HulWr4LdpI5ITE5EQH49dOwMRmtmND/ebLMoy+WueA2VyBmO9opSTcx6HimWQHypGBicF+6MjwdzzLSQEH6UlBSjKFyNS1AnGMm6Csuwww2NApVK6hkv2JMptmTkGiPNqEcc+jFiuGsy0SrD4lciQ1kJW3ICAqJIWeu1ilUq1EEDlHr/6vr/XxozBuQD6jw6UUXRm6DgRQCeQfIA1iaZ+BuP191xrXwpw1RtL16zwSfi5PVg2hZAcyp0gqQOr9548TU+/82zdywGvLH429eZnO8rPBNMbB4ps+MhPpvyna9ELgb8ASvKZeuq+E9sAAAAASUVORK5CYII="},{"id":"GSGS4136","name":"Ireland British War Office One-Inch 1941-43 GSGS 4136","type":"tms","template":"http://geo.nls.uk/maps/ireland/gsgs4136/{zoom}/{x}/{-y}.png","scaleExtent":[5,15],"polygon":[[[-10.0847426,51.4147902],[-10.0906535,51.5064103],[-10.4564222,51.5003961],[-10.5005905,52.3043019],[-10.0837522,52.312741],[-10.0840973,52.3404698],[-10.055802,52.3408915],[-10.0768509,52.7628238],[-9.7780248,52.7684611],[-9.7818205,52.8577261],[-9.6337877,52.8596012],[-9.6449626,53.1294502],[-10.0919663,53.1227152],[-10.1051422,53.3912913],[-10.4052593,53.3866349],[-10.4530828,54.193502],[-10.2998523,54.1974988],[-10.3149801,54.4669592],[-8.9276095,54.4853897],[-8.9339534,54.7546562],[-8.7773069,54.755501],[-8.7826749,55.0252208],[-8.9402974,55.0238221],[-8.9451773,55.2934155],[-7.528039,55.2970274],[-7.525599,55.3874955],[-7.0541955,55.3841691],[-7.0556595,55.2939712],[-6.3241545,55.2859128],[-6.3217146,55.3253556],[-6.1035807,55.3223016],[-6.1045566,55.2828557],[-5.7985836,55.2772968],[-5.8117595,55.0087135],[-5.656577,55.0056351],[-5.6721928,54.7355021],[-5.3618278,54.729585],[-5.3964755,54.1917889],[-5.855679,54.2017807],[-5.9220464,52.8524504],[-6.070885,52.8551025],[-6.1030927,52.1373337],[-6.8331336,52.1463183],[-6.8355736,52.0578908],[-7.5641506,52.0617913],[-7.5661026,51.7921593],[-8.147305,51.792763],[-8.146329,51.7033331],[-8.2912636,51.7027283],[-8.2897996,51.5227274],[-9.1174397,51.516958],[-9.1179277,51.4625685],[-9.3692452,51.4616564],[-9.3672933,51.4254613],[-10.0847426,51.4147902]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"data:image/png;base64,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"},{"id":"gsi.go.jp","name":"Japan GSI ortho Imagery","type":"tms","template":"http://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg","scaleExtent":[12,19],"polygon":[[[141.85546875,44.64911632343077],[140.2294921875,43.96909818325174],[138.955078125,41.80407814427237],[139.482421875,40.17887331434696],[138.8671875,38.30718056188316],[136.31835937499997,37.19533058280065],[132.1435546875,35.137879119634185],[128.935546875,33.35806161277885],[129.5068359375,32.47269502206151],[129.77050781249997,31.690781806136822],[130.2099609375,30.90222470517144],[131.220703125,30.78903675126116],[131.66015625,32.32427558887655],[132.71484375,32.879587173066305],[133.76953125,33.17434155100208],[136.7578125,33.87041555094183],[139.306640625,35.06597313798418],[140.888671875,35.17380831799959],[141.15234374999997,36.56260003738548],[142.11914062499997,39.9434364619742],[141.767578125,42.68243539838623],[141.85546875,44.64911632343077]]]},{"id":"Aargau-AGIS-2011","name":"Kanton Aargau 25cm (AGIS 2011)","type":"tms","template":"http://tiles.poole.ch/AGIS/OF2011/{zoom}/{x}/{y}.png","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[14,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2011"},{"id":"Aargau-AGIS-2014","name":"Kanton Aargau 25cm (AGIS 2014)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2014-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2014"},{"id":"Aargau-AGIS-2016","name":"Kanton Aargau 25cm (AGIS 2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2016","best":true},{"id":"Basel-Landschaft-2015","name":"Kanton Basel-Landschaft 10cm (2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[18,21],"polygon":[[[7.370281219482422,47.413684985326796],[7.357578277587891,47.41507892620101],[7.357921600341797,47.41827323486739],[7.353544235229492,47.4196089792119],[7.344875335693359,47.42402250214274],[7.339725494384765,47.42971307765559],[7.332687377929687,47.430235650685475],[7.32685089111328,47.4319194618196],[7.325280543317693,47.43489176778178],[7.33050406703179,47.44175856152086],[7.338990092194756,47.44109169292469],[7.344964876980962,47.43607806019703],[7.352656881264292,47.43435807026775],[7.38119797480828,47.432081698142134],[7.375988960266113,47.414309359238985],[7.378145456314087,47.41399717320828],[7.382040023803711,47.41330745332341],[7.388391494750976,47.41397539271845],[7.413708184603623,47.410929293287566],[7.420743520414262,47.411098781635985],[7.427483310496426,47.41448047082256],[7.438105529405026,47.412739349590474],[7.448396898794484,47.41507114537187],[7.455576414208223,47.42792319548619],[7.45061852232364,47.43534476535272],[7.437842682352891,47.446323188615104],[7.425422575234655,47.443283894442736],[7.420904049355535,47.44594415975335],[7.422417620777747,47.45071647996838],[7.428795928789581,47.45387944195848],[7.430028776685507,47.459491697398036],[7.445765194338128,47.46197276972992],[7.44717015944249,47.456958090215814],[7.456512189239691,47.44925575541638],[7.492356675875099,47.458972279610066],[7.530679075390223,47.46118857622267],[7.527445320030451,47.473906165741866],[7.536326693749955,47.48383279861684],[7.536231113003725,47.49105266753894],[7.532603895549507,47.490968962664795],[7.531789123586811,47.49739885661967],[7.520038351186771,47.49678264400428],[7.512226152318425,47.49891674929323],[7.509348758631863,47.508884893812876],[7.499082452238831,47.51627805213703],[7.497870355425969,47.52124757864722],[7.502278119030558,47.514906577969604],[7.517459288006065,47.51728104695845],[7.522200236749534,47.514091442409054],[7.530955756497733,47.52904526885427],[7.519353655277215,47.53471778813415],[7.510751927105658,47.528989768842564],[7.50229842095598,47.52840455858729],[7.4980383403841,47.536152181750076],[7.505454651706732,47.54438188661593],[7.516758242758337,47.545408295649786],[7.527317399933993,47.552778846515565],[7.554658254426867,47.564368052237306],[7.5645783501094,47.55703599040843],[7.561243624111692,47.55172275211291],[7.558752685660356,47.55235329499035],[7.555882119169953,47.54433555917895],[7.564785321950861,47.54568625396918],[7.587263056821628,47.54190064304111],[7.582688476068778,47.53246814131337],[7.589482524394103,47.5279230654027],[7.590248428005343,47.51978966346127],[7.594781326929009,47.51929395578897],[7.613780785019665,47.53925099543145],[7.622303281783164,47.53977428916004],[7.622854488041502,47.550040256825795],[7.617740918118178,47.554366555487356],[7.617617220103555,47.558648485827725],[7.632727781497729,47.5614887674157],[7.639973682410965,47.55816478484801],[7.648995462809379,47.548295861439875],[7.661308760240334,47.544832242956765],[7.665860164458853,47.53745814872834],[7.674674254363578,47.5337535789565],[7.694938989531916,47.532496041115465],[7.71346844906592,47.53978344629896],[7.715956243413761,47.53582195507857],[7.723622825374551,47.536754165368905],[7.727157067196862,47.53293048764033],[7.733221863174538,47.53275465944404],[7.737974130690588,47.52732498381306],[7.749022330706917,47.5249849998809],[7.757861753102653,47.52605097450287],[7.787633628417415,47.52011695778467],[7.790143521321244,47.51864117486466],[7.788870069574476,47.50682929074843],[7.792799480290271,47.500684271209245],[7.786625359342518,47.49312139201968],[7.798890147748131,47.49565149600841],[7.798162871694108,47.49939947973339],[7.799400121334925,47.497477088945935],[7.807418124234862,47.4971384859743],[7.814709929059118,47.504801278976316],[7.831976267472122,47.51473657456054],[7.833207588232065,47.53382387257594],[7.846527268275818,47.53266095290337],[7.852330295179702,47.53523506225097],[7.862569292788096,47.52692027402488],[7.86395674074442,47.519309183202445],[7.876658649367283,47.52269034821798],[7.87567113137545,47.51319304945735],[7.893993798731052,47.50605656803392],[7.904769180395594,47.49217505264052],[7.904821911502771,47.48490926161113],[7.93328835504665,47.48140776210853],[7.947015241408695,47.48488995686335],[7.940027875634228,47.462021295570224],[7.948854362289874,47.46377967418039],[7.957614193951437,47.45880646812721],[7.957849013566705,47.451279351685564],[7.946784554043733,47.44319336966537],[7.950032053627354,47.431716361052416],[7.96183169437885,47.421834282667845],[7.956570351591289,47.41968057428149],[7.955037646053525,47.415605646331336],[7.948388855309641,47.4162657867356],[7.934927870271696,47.41176694218953],[7.936722434714782,47.408057452805856],[7.932661510641391,47.40527495151619],[7.909737672400531,47.398520997340924],[7.890221593189976,47.407141074214024],[7.883331964118422,47.40609724771633],[7.883443085719068,47.4012049891245],[7.877702761222016,47.401257097623],[7.869136696167237,47.3955142728722],[7.879434713089799,47.38799354849815],[7.878812180597903,47.38351047538804],[7.862650230995195,47.38198499163919],[7.840119046365023,47.374763282921705],[7.830547227518145,47.36512144155488],[7.80216648325237,47.36109584064414],[7.796366151294341,47.3534705803715],[7.793560892325092,47.33905227137494],[7.78528803737905,47.3378822997136],[7.768963133383802,47.33891408469915],[7.766419194330703,47.342734660857005],[7.751518928544542,47.3443274446774],[7.734153146629586,47.35776074638933],[7.727913718160677,47.36885889855421],[7.701953574259492,47.37244716296033],[7.644203220263186,47.36720838530677],[7.641761060331779,47.38046937860509],[7.635580022356337,47.38059279713257],[7.633316986492583,47.38291397270416],[7.633305398225418,47.38533959871929],[7.637251158279386,47.38606854199808],[7.63272275093214,47.41003108104519],[7.664054730400831,47.41001995588381],[7.679802017668389,47.41751395224505],[7.686578998003315,47.43366406703297],[7.682972441800632,47.43872228466388],[7.684853783500164,47.447843589969715],[7.692273418589347,47.45421309996921],[7.698831030331891,47.45585888435835],[7.699930658071183,47.46190517358485],[7.709877972706822,47.469384739707586],[7.699760966314013,47.48063247960835],[7.668326578902932,47.48634665620256],[7.666120855554305,47.49686816039971],[7.65217109717027,47.49581439933043],[7.648646287658441,47.49183004211102],[7.655389581170213,47.49020559719241],[7.650513795302598,47.48826095607083],[7.655925875394832,47.48739459757455],[7.644422678687097,47.485637798180356],[7.640965961473804,47.482734093980326],[7.607299799570857,47.48939839412024],[7.608850381582776,47.48352506892989],[7.605631268762133,47.47935909729055],[7.608148977008936,47.475213682276376],[7.604494899927722,47.47044546774548],[7.618872436050056,47.4674530520825],[7.626072253389216,47.462913883669614],[7.62217338539308,47.46195224188912],[7.616464591762502,47.445234574416695],[7.615798850305441,47.432747890966844],[7.592069133423196,47.43271179535717],[7.581206884670679,47.42878068945942],[7.578423275099778,47.434906655087865],[7.568904367023134,47.43689695884281],[7.56829539909203,47.42233486107083],[7.58074128785892,47.414703988151935],[7.525235194936931,47.41163289737562],[7.531172340312734,47.40352507464003],[7.518616677418122,47.38822295597742],[7.511295677347134,47.38974369796625],[7.502255661148456,47.384806980223004],[7.492327480628366,47.385231761698726],[7.478410241257615,47.39055778320416],[7.47746817801916,47.401277162725364],[7.464484018734026,47.40251498235377],[7.460919593518167,47.40068414452088],[7.450020783333588,47.40392739156406],[7.44951323519806,47.39975827367453],[7.443401098004909,47.40231427489849],[7.441311347159463,47.40017886074712],[7.443566657511773,47.38890284041263],[7.437324174770898,47.3808884773088],[7.411692544769116,47.38057235919037],[7.416276198506335,47.384788794341716],[7.414494030814171,47.39429988358522],[7.398935569419335,47.39683906243558],[7.395920463999715,47.40338304393273],[7.388693876865087,47.403019088497395],[7.384054886906365,47.4123601395877],[7.379679679870605,47.4128137535428],[7.375844120979309,47.41401169352981],[7.370281219482422,47.413684985326796]]],"terms_url":"http://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p1.pdf","terms_text":"Geodaten des Kantons Basel-Landschaft 2015","best":true},{"id":"KTBASELSTADT2015","name":"Kanton Basel-Stadt 2015","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[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":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.6713752,47.5952248],[7.6799583,47.6007811],[7.6845073,47.6018228],[7.6943779,47.601707],[7.6939487,47.5966718],[7.6870823,47.5935462],[7.6788425,47.5871208],[7.685709,47.585384],[7.6890564,47.5761205],[7.6941204,47.573399],[7.6924038,47.5669132],[7.6847005,47.5617009],[7.6642513,47.5616429],[7.6487159,47.5568934],[7.6303482,47.558689],[7.6235675,47.5566617],[7.6278591,47.5514483],[7.6273763,47.5365801],[7.6183319,47.5366163],[7.6133537,47.5326179],[7.5996208,47.5191137],[7.5850296,47.5191717],[7.5840854,47.5263589],[7.5771331,47.5316327],[7.581253,47.5398612],[7.5718975,47.5414835],[7.553873,47.5414835],[7.5537872,47.5512166],[7.5565338,47.5582836],[7.5537014,47.5603108],[7.5537872,47.5747308],[7.5643444,47.5812157],[7.5793647,47.579884],[7.583313,47.5901889],[7.5856304,47.5923306],[7.5920677,47.5923885],[7.598505,47.5907098],[7.609148,47.5864261],[7.6092338,47.5810999],[7.6191043,47.580463],[7.6368713,47.593141],[7.6378154,47.595572],[7.6416778,47.5988711],[7.6452827,47.6002602],[7.664938,47.5961798],[7.6713752,47.5952248]]],"terms_text":"Kanton Basel-Stadt OF 2017","best":true},{"id":"Solothurn-sogis2014-tms","name":"Kanton Solothurn 25cm (SOGIS 2014-2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[15,19],"polygon":[[[7.3404127,47.2175697],[7.4154818,47.2402115],[7.4173645,47.2537956],[7.4658424,47.2646513],[7.4946766,47.2882287],[7.5328638,47.294534],[7.5483333,47.3163566],[7.5709479,47.3263111],[7.5604584,47.342492],[7.5388991,47.3476266],[7.5396485,47.3601134],[7.5217459,47.3651488],[7.5237238,47.3720704],[7.4634937,47.3702566],[7.4361035,47.3781317],[7.4434011,47.4023143],[7.4774682,47.4012772],[7.4792364,47.3897076],[7.5022557,47.384807],[7.5213659,47.3912021],[7.5311724,47.4035251],[7.5252352,47.4116329],[7.5807413,47.414704],[7.5682954,47.4223349],[7.5689044,47.436897],[7.5812069,47.4287807],[7.6157989,47.4327479],[7.6260723,47.4629139],[7.6044949,47.4704455],[7.6072998,47.4893984],[7.640966,47.4827341],[7.6559259,47.4873946],[7.6521711,47.4958144],[7.6661209,47.4968682],[7.6683266,47.4863467],[7.699761,47.4806325],[7.709878,47.4693848],[7.6848538,47.4478436],[7.6798021,47.417514],[7.6327228,47.4100311],[7.633317,47.382914],[7.6417611,47.3804694],[7.6442033,47.3672084],[7.7279138,47.3688589],[7.751519,47.3443275],[7.7935609,47.3390523],[7.8021665,47.3610959],[7.8788122,47.3835105],[7.8691367,47.3955143],[7.883332,47.4060973],[7.9097377,47.398521],[7.9550377,47.4156057],[7.9618317,47.4218343],[7.9467846,47.4431934],[7.9682836,47.4628082],[7.9872707,47.4287435],[7.9854653,47.4227641],[7.9827035,47.4283325],[7.9631993,47.4223547],[8.0072617,47.4065858],[8.0100022,47.395418],[8.0265612,47.3956224],[8.0313669,47.3836856],[8.0038366,47.3453146],[8.0051906,47.3367516],[7.9479701,47.3171432],[7.9478307,47.3325169],[7.9192088,47.3339507],[7.9078055,47.341719],[7.889098,47.3114878],[7.8611018,47.3061239],[7.8418057,47.2744707],[7.8166423,47.2616706],[7.8028241,47.2684079],[7.7861469,47.256098],[7.7746009,47.267869],[7.7568187,47.258095],[7.7326672,47.2591133],[7.684769,47.2939919],[7.6482742,47.2819898],[7.5801066,47.2763483],[7.5936981,47.2662199],[7.5959384,47.245569],[7.6261802,47.2263143],[7.6405558,47.2297944],[7.6484666,47.2189525],[7.6472258,47.2017823],[7.6715278,47.1949714],[7.6711002,47.1845216],[7.6779881,47.1819259],[7.6728612,47.1683945],[7.6600808,47.1684026],[7.6451021,47.1489207],[7.6155322,47.1565739],[7.5861404,47.1475453],[7.5810534,47.16013],[7.5634674,47.1683541],[7.5257686,47.162205],[7.5203336,47.1588879],[7.5297508,47.1487369],[7.5097234,47.1255457],[7.4613252,47.1082327],[7.4750945,47.0867101],[7.454461,47.074927],[7.4354156,47.0801664],[7.4340002,47.1005003],[7.3820271,47.0957398],[7.3704914,47.1209312],[7.4401788,47.1237276],[7.4217922,47.1358605],[7.447783,47.1550805],[7.4728074,47.1525609],[7.4970383,47.1700873],[7.4804964,47.171738],[7.4708545,47.181324],[7.4757226,47.1906485],[7.4497638,47.1895691],[7.4476258,47.1810839],[7.4332849,47.1847269],[7.4118135,47.1624212],[7.3842442,47.1601249],[7.3821749,47.1651186],[7.391911,47.1662739],[7.3835137,47.1803011],[7.3654609,47.1944525],[7.3544799,47.1915316],[7.3404127,47.2175697]],[[7.420816,47.4803666],[7.4349836,47.4981011],[7.4707584,47.480734],[7.487277,47.4820136],[7.5116652,47.5026958],[7.5317892,47.4973989],[7.5366964,47.4850517],[7.5274454,47.4739062],[7.5306791,47.4611886],[7.4565122,47.4492558],[7.445214,47.4623781],[7.4557367,47.4733767],[7.420816,47.4803666]],[[7.3759458,47.4140995],[7.3821514,47.4330266],[7.4209041,47.4459442],[7.4378427,47.4463232],[7.4555765,47.4279232],[7.4437574,47.413444],[7.3759458,47.4140995]],[[7.6744234,47.1539707],[7.6853662,47.1662986],[7.7007985,47.1617746],[7.6901531,47.1525567],[7.6744234,47.1539707]]],"terms_text":"Orthofoto WMS Solothurn","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"KTTHURGAU2017","name":"Kanton Thurgau OF 2017","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[8.63768410076,47.7004145356],[8.78327839646,47.69879895418],[8.78303977274,47.68533252804],[8.87027412213,47.68426691888],[8.8699714813,47.67089514045],[8.89900814897,47.67047199109],[8.89866777324,47.65698230742],[8.92770444091,47.65661195321],[8.92828046137,47.67015462681],[8.95726476355,47.66973147144],[8.95773605301,47.68327074156],[9.19060541482,47.6799391377],[9.1902650391,47.66645190099],[9.21922315852,47.6660287156],[9.21898751379,47.65255552096],[9.24784090222,47.65209694793],[9.24747434375,47.63863780005],[9.30570477557,47.63764983607],[9.30525966885,47.62420461255],[9.33416542278,47.62371049645],[9.33348467133,47.59673879302],[9.39150564117,47.59576769355],[9.3911390827,47.58234701941],[9.42007101938,47.58176420165],[9.41860478548,47.54139270755],[9.44753672216,47.5408447841],[9.44717016368,47.52730395336],[9.47604973486,47.52680892203],[9.47518570418,47.49985802607],[9.5041438236,47.49934504674],[9.50309651368,47.47241544181],[9.41596032792,47.47391975877],[9.41554140395,47.46045016443],[9.35759898235,47.4614060707],[9.35817500281,47.47498160364],[9.32895505591,47.47533554716],[9.32864086293,47.46188401733],[9.18361462107,47.46420288184],[9.18411209329,47.47768921094],[9.15491832913,47.47809622481],[9.15465650165,47.4646277009],[9.0673632194,47.46583133624],[9.06717994017,47.45234196418],[9.0960856941,47.45193475084],[9.09582386661,47.43853036098],[9.06663010246,47.43883142176],[9.06642064047,47.42537055101],[9.00829493964,47.42620309948],[9.00714289872,47.385729558],[8.97810623105,47.38615501083],[8.97739929685,47.3591319418],[8.91940450976,47.35989459356],[8.92032090594,47.38697045248],[8.89136278652,47.38725408141],[8.89285520316,47.44116901155],[8.86397563198,47.44148776574],[8.86604406908,47.52251256102],[8.80783982,47.52316676216],[8.80893949543,47.56372896753],[8.77985046226,47.56402931121],[8.78024320348,47.57750766919],[8.7220913199,47.57814352175],[8.72337427456,47.63212747913],[8.66519620823,47.63272738003],[8.66579841143,47.65980396746],[8.63673556102,47.65999795099],[8.63768410076,47.7004145356]]],"terms_text":"Kanton Thurgau OF 2017","best":true},{"id":"KTZUERICH2015","name":"Kanton Zürich 2015  10cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[8.807601928710938,47.66608099332474],[8.808631896972656,47.65475043477393],[8.830604553222656,47.648506014952225],[8.805885314941406,47.597597727711346],[8.749580383300781,47.61565270219988],[8.751983642578125,47.59505101193038],[8.807945251464844,47.585789182379905],[8.811721801757812,47.57467282332527],[8.840904235839844,47.57467282332527],[8.854637145996094,47.56216409801383],[8.8330078125,47.55382328811835],[8.845024108886719,47.53458802782819],[8.899612426757812,47.52786561031842],[8.895835876464844,47.491224888201955],[8.902702331542969,47.48588897929538],[8.887252807617188,47.475911695481756],[8.911285400390625,47.43969913094723],[8.934288024902344,47.43807362350206],[8.935317993164062,47.43017758727173],[8.917121887207031,47.42808726171425],[8.909912109375,47.404855836246135],[8.944587707519531,47.38905261221537],[8.945274353027344,47.379521907289295],[8.963127136230469,47.357664518690434],[8.973083496093748,47.35580389715929],[8.989906311035156,47.31857768821123],[8.973426818847656,47.30367985581531],[8.9593505859375,47.300653220457775],[8.941154479980469,47.2873805430142],[8.950080871582031,47.28458587064588],[8.940467834472656,47.259194168186234],[8.876266479492188,47.24847474828181],[8.876609802246092,47.243114224640834],[8.850173950195312,47.23961793870555],[8.849830627441406,47.247076403108416],[8.825111389160156,47.24824169331652],[8.800048828125,47.24031721435106],[8.804855346679688,47.23425651880584],[8.815155029296875,47.217702626593784],[8.793525695800781,47.21886856286133],[8.71490478515625,47.20021050593422],[8.685722351074219,47.18154588528182],[8.697395324707031,47.163108130899104],[8.660659790039062,47.15633823511178],[8.6572265625,47.16684287656919],[8.618087768554688,47.172444502751944],[8.622550964355469,47.17991241867412],[8.607101440429688,47.201376826785406],[8.595085144042969,47.19834433924206],[8.575859069824219,47.21513747655813],[8.541183471679688,47.2186353776589],[8.471488952636719,47.2053421258966],[8.441619873046875,47.22120035848172],[8.417243957519531,47.22120035848172],[8.383941650390625,47.292270864380086],[8.422050476074219,47.302282968719936],[8.442306518554688,47.32439601339355],[8.413810729980469,47.32299967378833],[8.408660888671875,47.33067908487908],[8.378448486328125,47.39718721653071],[8.360939025878906,47.39695481668995],[8.359222412109375,47.4053205652024],[8.379135131835938,47.40764414848437],[8.377418518066406,47.41624051540972],[8.384284973144531,47.42274494145051],[8.372611999511719,47.42808726171425],[8.372955322265625,47.437376962080776],[8.379478454589844,47.45037978769006],[8.36402893066406,47.46198673754625],[8.352012634277344,47.5079250985124],[8.373985290527344,47.517200697839414],[8.392181396484375,47.5366741201253],[8.417587280273436,47.56610235225701],[8.430290222167967,47.5693453981427],[8.491744995117188,47.581620824334166],[8.487625122070312,47.58648387645128],[8.463935852050781,47.58301031389572],[8.453292846679688,47.60315376826432],[8.479385375976562,47.617504142079596],[8.505821228027344,47.61958693358351],[8.513717651367188,47.635783590864854],[8.542213439941406,47.632776019724375],[8.545646667480469,47.627685889602006],[8.564186096191406,47.6256034207548],[8.566932678222656,47.61935551640258],[8.576202392578125,47.613569753973955],[8.564872741699219,47.60037582174319],[8.535346984863281,47.586715439092906],[8.550109863281248,47.5714301073211],[8.555259704589844,47.55498181333744],[8.581008911132812,47.59551406038282],[8.598861694335936,47.61449551898437],[8.59130859375,47.64642437575518],[8.609848022460938,47.65521295468833],[8.620834350585938,47.646886969413],[8.618431091308594,47.65660048985082],[8.602981567382812,47.666312203609145],[8.610877990722656,47.67856488312544],[8.62323760986328,47.67856488312544],[8.621864318847656,47.69312564683551],[8.64898681640625,47.697516190510555],[8.667526245117188,47.68665469810477],[8.671646118164062,47.67602211074509],[8.692245483398438,47.65197522925437],[8.734817504882812,47.64526787368664],[8.777389526367188,47.65313158281113],[8.785629272460938,47.667930646923494],[8.807601928710938,47.66608099332474]]],"terms_text":"Kanton Zürich OF 2015","best":true},{"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","scaleExtent":[6,24],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"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-topo4","name":"Kartverket N50 topo","type":"tms","template":"http://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}","scaleExtent":[3,15],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"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-vegnett","name":"Kartverket Road Network","type":"wms","template":"http://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","scaleExtent":[3,24],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"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":"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","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"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","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"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","scaleExtent":[5,14],"polygon":[[[-60.8550011,6.1765004],[-60.4762612,7.9188291],[-62.161689,8.2778675],[-62.5322549,6.5375488],[-60.8550011,6.1765004]]],"description":"Recent Landsat imagery"},{"id":"lu.geoportail.opendata.ortholatest","name":"Latest available ortho geoportail.lu","type":"tms","template":"http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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","scaleExtent":[5,13],"polygon":[[[-121.9355512,47.7820648],[-121.5720582,48.6410125],[-121.2015461,49.4846247],[-121.8375516,49.6023246],[-122.4767046,49.7161735],[-123.118912,49.8268824],[-123.760228,49.9335836],[-124.0887706,49.0870469],[-124.4128889,48.2252567],[-123.792772,48.1197334],[-123.1727942,48.0109592],[-122.553553,47.8982299],[-121.9355512,47.7820648]]],"description":"Recent lower-resolution landsat imagery for southwest British Columbia"},{"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","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"http://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data","terms_text":"Sourced from LINZ CC-BY 3.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","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps/","terms_text":"Sourced from the LINZ Data Service and licensed by LINZ for re-use under the Creative Commons Attribution 3.0 New Zealand licence."},{"id":"ORT10LT","name":"Lithuania - NŽT ORT10LT","type":"tms","template":"http://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2010-01-01T00:00:00.000Z","scaleExtent":[4,18],"polygon":[[[26.2138385,55.850748],[26.3858298,55.7045315],[26.6303618,55.6806692],[26.6205349,55.5689227],[26.5242191,55.5099228],[26.5541476,55.388833],[26.4399286,55.3479351],[26.7919694,55.3212027],[26.8291304,55.2763488],[26.7434625,55.2539863],[26.6764846,55.158828],[26.4611191,55.1285624],[26.3577434,55.1505399],[26.2296342,55.1073177],[26.2713814,55.0775905],[26.2085126,54.997414],[26.0619117,54.9416094],[25.8578176,54.9276001],[25.7429827,54.8150641],[25.7626083,54.5769013],[25.5319352,54.3418175],[25.6771618,54.3238109],[25.7857293,54.2336242],[25.7858844,54.1550594],[25.5550843,54.1461918],[25.5109462,54.1750267],[25.5896725,54.2285838],[25.5136246,54.3078472],[25.2689287,54.2744706],[25.0705963,54.1336282],[24.9573726,54.1720575],[24.8133801,54.144862],[24.7790172,54.0999054],[24.8712786,54.034904],[24.819568,53.9977218],[24.6845912,53.9621091],[24.697865,54.0171421],[24.6259068,54.0105048],[24.4342619,53.9014424],[24.3520594,53.8967893],[24.2016059,53.9700069],[23.9683341,53.9266977],[23.9130177,53.9696842],[23.7781192,53.8989169],[23.7097655,53.9394502],[23.5370435,53.9430702],[23.4822428,53.9893848],[23.5273356,54.0473482],[23.4858579,54.1532339],[23.3867851,54.224838],[23.0421216,54.3159745],[23.0102115,54.3827959],[22.8546899,54.4104029],[22.7919963,54.3633227],[22.7023421,54.4528985],[22.6838586,54.585972],[22.7489713,54.6319792],[22.7429727,54.7268221],[22.8866837,54.8135001],[22.8204005,54.9119829],[22.6424041,54.9713362],[22.5892361,55.070243],[22.080597,55.0244812],[22.0324081,55.084098],[21.9130671,55.0816838],[21.6491949,55.1808113],[21.5015124,55.1868198],[21.3843708,55.2936996],[21.2709829,55.2450059],[21.0983616,55.2563884],[20.9421741,55.282453],[21.0863466,55.5618266],[21.0399547,55.8363584],[21.0640261,56.0699542],[21.2047804,56.0811668],[21.2307958,56.1623302],[21.5021038,56.2954952],[21.7235874,56.3138211],[21.8356623,56.37162],[21.9695397,56.3766515],[22.0153001,56.4242811],[22.4372717,56.406405],[22.6800028,56.3515884],[22.9191739,56.3790184],[22.9466759,56.4146477],[23.0932498,56.3046383],[23.1703443,56.3667721],[23.3064522,56.3830535],[23.5571715,56.3338187],[23.7647953,56.3733238],[23.7666897,56.3238079],[24.0189971,56.3297615],[24.1214631,56.2488984],[24.2857421,56.3006367],[24.4541496,56.2581579],[24.5794651,56.2882389],[24.6284061,56.3753322],[24.9023767,56.4805317],[25.1277405,56.2059091],[25.5771398,56.182414],[25.6731232,56.1493667],[26.2138385,55.850748]]],"terms_url":"http://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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,16],"overzoom":false,"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Shows major features to help orient you.","overlay":true},{"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","scaleExtent":[0,19],"polygon":[[[-1.4863838,46.8769078],[-1.5443674,46.8487272],[-1.7346797,46.8724645],[-1.8927568,46.9423436],[-1.9547478,46.980844],[-2.070671,47.0852054],[-2.2678023,47.1265555],[-2.2262684,47.1712448],[-2.1921733,47.1691377],[-2.1934131,47.2554621],[-2.2969381,47.2276852],[-2.4165807,47.2533583],[-2.5486216,47.2857476],[-2.6391284,47.4167844],[-2.5057256,47.5081195],[-2.3106273,47.5302088],[-2.2483636,47.5238409],[-2.2322311,47.5149928],[-2.1210893,47.5467415],[-2.117832,47.6012606],[-2.1001019,47.6112276],[-2.099813,47.6200473],[-2.1114061,47.6287298],[-2.1005485,47.6514139],[-2.0812094,47.6657768],[-1.9801641,47.7075082],[-1.8307658,47.7241914],[-1.6745485,47.7254424],[-1.6373539,47.7746256],[-1.4960144,47.8175187],[-1.499114,47.8416565],[-1.3813311,47.8441529],[-1.3459962,47.810858],[-1.230073,47.7858729],[-1.216435,47.7583753],[-1.2263536,47.7362834],[-1.2108558,47.7316971],[-1.1866793,47.7346157],[-1.1519644,47.6933233],[-1.1315073,47.6365449],[-1.0912132,47.6332031],[-0.9926475,47.6026991],[-0.9845887,47.585977],[-1.0317018,47.5500064],[-1.1358467,47.5562822],[-1.1327472,47.5161046],[-1.0317018,47.5177793],[-0.9486339,47.5010301],[-0.9368556,47.4771532],[-0.9337561,47.4385923],[-0.9009008,47.3987442],[-0.926937,47.3748209],[-0.9715706,47.358446],[-1.2833853,47.3273618],[-1.2337925,47.2609316],[-1.2003173,47.2693451],[-1.1649825,47.2495712],[-1.1414259,47.1763017],[-1.1563037,47.1581792],[-1.2065164,47.1240248],[-1.2083762,47.1096818],[-1.1556838,47.1050406],[-1.140806,47.0805621],[-1.0943127,47.0716964],[-1.0998919,47.0319939],[-1.1445254,47.0163582],[-1.2158151,47.0290362],[-1.2672676,47.0632516],[-1.285245,47.0218524],[-1.3497157,47.0239654],[-1.3391772,46.9690007],[-1.3490957,46.9444597],[-1.4501411,46.9118621],[-1.4750393,46.9176026],[-1.4877512,46.9306253],[-1.4923538,46.9843293],[-1.4864362,46.9994285],[-1.4921346,47.0272238],[-1.5276404,47.0054072],[-1.5296129,46.9725161],[-1.5050657,46.944393],[-1.5022165,46.9297273],[-1.5114217,46.9137101],[-1.486217,46.8972388],[-1.4863838,46.8769078]]],"terms_url":"http://data.loire-atlantique.fr/licence/","terms_text":"Département de Loire-Atlantique"},{"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}","polygon":[[[-51.10903142008701,-23.392750890870328],[-51.110147219037096,-23.39111628244602],[-51.111981850003126,-23.389599820448623],[-51.11358044657587,-23.38976722295012],[-51.120999436701226,-23.38592675938185],[-51.12224934611127,-23.385109415587607],[-51.12483499560139,-23.383504255873166],[-51.12538216624037,-23.38186953335707],[-51.12482426676533,-23.37770385409619],[-51.12445948633935,-23.375054689723584],[-51.124373655650885,-23.372297138974446],[-51.12244246516032,-23.37032742475139],[-51.12302182230749,-23.366427304263887],[-51.128557901713755,-23.36548180323493],[-51.12832186732048,-23.358843408308623],[-51.12477062258506,-23.35475580404945],[-51.12703440699343,-23.35091432623551],[-51.12411616358548,-23.34679692655685],[-51.12025378260435,-23.347811512977742],[-51.1176466754421,-23.33969460448754],[-51.11264703783877,-23.341290443649072],[-51.109396200513004,-23.33488726938344],[-51.10756156954697,-23.334089313725826],[-51.10485790286019,-23.333980949007543],[-51.10252974543546,-23.334187827029368],[-51.09986899409291,-23.331015661953632],[-51.09801290545476,-23.329360589233605],[-51.09998701128955,-23.32830645478855],[-51.10322711977927,-23.325321337105603],[-51.10472915682748,-23.323193291476684],[-51.104664783811145,-23.321291814470847],[-51.10514758143378,-23.318444474199904],[-51.1063599399084,-23.3157547161216],[-51.10660670313775,-23.31467091543279],[-51.11050127062705,-23.311665785493048],[-51.111584883068964,-23.30842411016493],[-51.099504213666904,-23.309468549142686],[-51.09740136179941,-23.308631027972474],[-51.09511611971892,-23.307448636164267],[-51.09201548609798,-23.3049360186679],[-51.09036324534495,-23.3037141796735],[-51.09204767260616,-23.29874787986134],[-51.09269140276969,-23.297496421894902],[-51.09407542262125,-23.292953629109174],[-51.10073802981369,-23.293318240761657],[-51.10101697955121,-23.28870632248831],[-51.10068438563339,-23.28837126237015],[-51.10084531817427,-23.28777997775132],[-51.09937546763423,-23.28663682004102],[-51.09631774935752,-23.277914991984613],[-51.10285161051725,-23.273016720553397],[-51.10835550341534,-23.27033590016574],[-51.11309764895328,-23.268404099092194],[-51.13160489115448,-23.265338785827712],[-51.13188384089201,-23.262007272160396],[-51.1317336371872,-23.255058136908826],[-51.13290308031759,-23.254683563301587],[-51.132956724497895,-23.250750476893938],[-51.13473771128364,-23.2512729236245],[-51.13533852610292,-23.25133206840842],[-51.13516686472599,-23.24359373640034],[-51.13534925493897,-23.24117849627157],[-51.137516479822814,-23.24219388826517],[-51.13884685549409,-23.243495156026544],[-51.14108918223035,-23.24521044413634],[-51.1471724322756,-23.243179698340864],[-51.14761231455401,-23.23828015040167],[-51.149082165094036,-23.235884531292832],[-51.14976881060179,-23.236811236789336],[-51.15138886484666,-23.23853646924079],[-51.15289090189487,-23.238842079520833],[-51.15383503946804,-23.238950521710013],[-51.15820167574391,-23.238142132361276],[-51.16045473131624,-23.238161849232945],[-51.160347442955654,-23.24658068718069],[-51.15912435564498,-23.2478326235554],[-51.16131303820094,-23.247773477219496],[-51.166591625541805,-23.245939927797],[-51.17193458589902,-23.245821633420345],[-51.17205260309565,-23.249557713480034],[-51.174241285651625,-23.248404370116877],[-51.17514250788055,-23.2493211310392],[-51.176859121649926,-23.248157927934038],[-51.179466228812196,-23.251686936561047],[-51.18135450395853,-23.253806268366073],[-51.18273852381009,-23.253628837227893],[-51.18378994974384,-23.253264116924615],[-51.18495939287424,-23.253303546194683],[-51.18626831087339,-23.252150235227905],[-51.18665454897149,-23.247477745146526],[-51.191182117788244,-23.249143693933142],[-51.19141815218154,-23.252859966234126],[-51.19369266542598,-23.252781107419985],[-51.1938428691308,-23.26073575534214],[-51.20096681627374,-23.26054847664639],[-51.20126722368338,-23.24259807127726],[-51.209936123218775,-23.242775517090898],[-51.21090171846407,-23.26988252079656],[-51.21968863519614,-23.27221839365197],[-51.225965004290465,-23.2745345140599],[-51.22934458764894,-23.27860487489667],[-51.234515886629225,-23.28160089636689],[-51.23497722657975,-23.283246708422755],[-51.235073786104266,-23.285444377831148],[-51.23371122392482,-23.285897704227196],[-51.232155542696304,-23.28801649191402],[-51.22870085748543,-23.292293383844925],[-51.227402668322334,-23.294599300809004],[-51.22679112466699,-23.295476327114592],[-51.225600223864475,-23.29657013833941],[-51.22392652543933,-23.297210654251764],[-51.220482569064515,-23.30072850975029],[-51.21863720926242,-23.301300029310937],[-51.21668456109974,-23.30211788923888],[-51.21423838647836,-23.30441378240661],[-51.210966091480465,-23.306965823153238],[-51.22328279527583,-23.318296686707587],[-51.224387865389886,-23.31459209321986],[-51.22521398576639,-23.312887551432937],[-51.22511742624187,-23.312582111000477],[-51.22521398576639,-23.312513140483127],[-51.2255251220121,-23.312532846348883],[-51.22595427545445,-23.312385052284572],[-51.22616885217561,-23.31183328632629],[-51.22935531648505,-23.314887676277397],[-51.22802494081377,-23.31661189768144],[-51.227885465945,-23.31901591762422],[-51.22767088922384,-23.320227763653186],[-51.22723100694544,-23.321508564518947],[-51.2273919394863,-23.322227778055023],[-51.22725246461755,-23.322848466059934],[-51.230331640566384,-23.325577488448165],[-51.23046038659909,-23.326710459617892],[-51.229537706698046,-23.32789268010374],[-51.229162197436,-23.330503379743732],[-51.229290943468705,-23.33178408156439],[-51.22681258233914,-23.334473515196468],[-51.2260186484708,-23.336571826694826],[-51.22473118814376,-23.33839427691611],[-51.22210262330938,-23.340226553005806],[-51.22257469209598,-23.34196029634743],[-51.22380850824271,-23.343388647432523],[-51.22384069475089,-23.345309509145306],[-51.22440932306201,-23.347003784611864],[-51.2245380690947,-23.348294177581966],[-51.22404454263601,-23.34968305981433],[-51.22350810083308,-23.35010661675208],[-51.22381923707877,-23.35076657486812],[-51.22304676088255,-23.35174173085325],[-51.22259614976809,-23.35296312824164],[-51.22586844476598,-23.35480505304304],[-51.22650144609346,-23.36705763453823],[-51.22354028734128,-23.369145582171885],[-51.22366903337377,-23.37968330666716],[-51.220375280703756,-23.381633186264455],[-51.216469984378406,-23.38170212087667],[-51.21416328462579,-23.379949201028825],[-51.2092816642191,-23.37395167630701],[-51.20738266023672,-23.368141007697016],[-51.20628831895872,-23.36723491438801],[-51.20472190889416,-23.366269721227162],[-51.198230963078665,-23.366683376299132],[-51.19297383340994,-23.366506095711998],[-51.18986247095292,-23.3654424072124],[-51.18806002649507,-23.36464463523902],[-51.18718026193825,-23.3645264463904],[-51.18579624208668,-23.363738518041337],[-51.183038931219606,-23.36359078095478],[-51.18071077379488,-23.3637582163071],[-51.179069261877906,-23.361581540240305],[-51.177642326682125,-23.35836078207346],[-51.16683838877106,-23.356262814974126],[-51.166141014427254,-23.358538073547532],[-51.16475699457568,-23.360389770338585],[-51.16076586756186,-23.359217688669915],[-51.15983245882475,-23.36660458495632],[-51.162042599052846,-23.36861374957437],[-51.16276143106877,-23.374158492021696],[-51.158448438973174,-23.37580315788644],[-51.155047397942575,-23.376305417047273],[-51.15396378550066,-23.37903334042617],[-51.15298746141932,-23.381052164536694],[-51.15118501696147,-23.382076336717283],[-51.149167995782435,-23.382509637949354],[-51.14721534761976,-23.382155118864866],[-51.14517686876862,-23.382588419839323],[-51.14410398516276,-23.38376029492248],[-51.14512322458833,-23.388083341091015],[-51.141797285410156,-23.389402876058366],[-51.14030597719799,-23.38880219385971],[-51.14068148646006,-23.391608636504017],[-51.14127157244328,-23.393538646762796],[-51.14093897852546,-23.394434713394368],[-51.140456180902824,-23.39536031431835],[-51.13939402613302,-23.395104297688697],[-51.13738773379004,-23.393154616350518],[-51.13608954462695,-23.389796764546077],[-51.13428710016909,-23.389757375749994],[-51.132162790629465,-23.390072485790583],[-51.13172290835106,-23.39285920758337],[-51.12259266886514,-23.38864463742227],[-51.12228153261944,-23.391657871809155],[-51.11882684740854,-23.393174310244916],[-51.115683298443365,-23.393351555162592],[-51.10903142008701,-23.392750890870328]],[[-51.13829432042955,-23.41600741009485],[-51.133310776080314,-23.418665600378624],[-51.132087688769644,-23.416440600302334],[-51.13002238782791,-23.418291487939495],[-51.12868664773901,-23.419010176689888],[-51.12824140104259,-23.42102839134528],[-51.12696466955051,-23.421860280620358],[-51.12532852205271,-23.422692164660027],[-51.1244541219139,-23.420969322085504],[-51.1215144208339,-23.424109801147612],[-51.12063465627703,-23.423268081315832],[-51.11970661195797,-23.423120410617486],[-51.11977098497433,-23.42156985833077],[-51.1188000253111,-23.421545246243184],[-51.11643431696008,-23.420836416154565],[-51.11942766222045,-23.419167696990424],[-51.11787198099193,-23.416775337218567],[-51.116546969738685,-23.41730697646229],[-51.115699391690086,-23.415702207051474],[-51.115120034542905,-23.413088261827834],[-51.119078975048524,-23.411114231305813],[-51.119599323597356,-23.41169512115064],[-51.12052200349841,-23.41489489238112],[-51.12147686990764,-23.417139608782644],[-51.12308619531643,-23.418626220171642],[-51.12754939111684,-23.41653905242448],[-51.12803218873949,-23.417395582795194],[-51.13119719537679,-23.415574218468866],[-51.13080022844262,-23.414766903017576],[-51.13278506311348,-23.41264029239725],[-51.13521514448077,-23.411055157619415],[-51.13585887464424,-23.410956701416854],[-51.13682446988958,-23.411188073376714],[-51.137205343569626,-23.411576974270133],[-51.13730190309418,-23.41324086645236],[-51.137430649126884,-23.414707830961888],[-51.13829432042955,-23.41600741009485]],[[-51.18929065852,-23.61469318354],[-51.18868716149,-23.61385268133],[-51.18817754178,-23.61338573333],[-51.18731118826,-23.61301708899],[-51.18628926663,-23.61314488581],[-51.18401743559,-23.61395590119],[-51.18348904042,-23.61396573165],[-51.18183143525,-23.61283522407],[-51.18140496401,-23.61344471632],[-51.18062980561,-23.61313505529],[-51.18001021533,-23.61409352754],[-51.17865838198,-23.61328742827],[-51.18064589886,-23.61060367181],[-51.17972321896,-23.61018095058],[-51.18061639456,-23.60849005203],[-51.1821157494,-23.60850479833],[-51.18260927586,-23.60775273479],[-51.18319936184,-23.60804274673],[-51.18415154605,-23.60627808786],[-51.18511177687,-23.60666149766],[-51.18649043231,-23.60469528171],[-51.18902243762,-23.60610112912],[-51.18821241049,-23.60741848294],[-51.18918873458,-23.60801816947],[-51.188899056,-23.60953211999],[-51.18962325244,-23.60992535103],[-51.1911896625,-23.6111935131],[-51.1901489654,-23.61244691705],[-51.19054056792,-23.6127565797],[-51.19029380469,-23.61377895281],[-51.18929065852,-23.61469318354]],[[-51.08005769639,-23.52984412096],[-51.07962317853,-23.52205317842],[-51.08468182473,-23.52194496764],[-51.08581908135,-23.52404030606],[-51.0858941832,-23.52703569673],[-51.08579494147,-23.52777346722],[-51.08530141501,-23.52806365581],[-51.08513511805,-23.52856533627],[-51.08512438922,-23.52981952906],[-51.08470864682,-23.53023759067],[-51.08343459754,-23.53023759067],[-51.08329512267,-23.52978018202],[-51.08005769639,-23.52984412096]]],"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","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"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","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"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","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"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","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"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","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"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","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"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}","scaleExtent":[0,19],"polygon":[[[140.9948644,-28.952966],[148.9611382,-28.8997729],[148.9870097,-28.4862285],[151.013609,-28.4786485],[151.1084711,-28.7032909],[151.8759917,-28.683118],[151.9334839,-28.4078753],[152.25544,-28.2332683],[153.0660798,-28.2104723],[153.1408196,-28.1090981],[153.4735137,-28.1164808],[153.3576523,-27.693606],[159.4938303,-27.699252],[159.4856997,-37.8474137],[149.5256879,-37.8281502],[149.9159578,-37.4869999],[148.0485886,-36.8131741],[147.9680996,-36.1567945],[146.7147701,-36.2866613],[145.3004625,-36.1567945],[144.5300673,-36.1475101],[142.8397973,-35.0254303],[142.356863,-34.7802471],[141.9774146,-34.4016159],[140.9950258,-34.1371824],[140.9948644,-28.952966]]],"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}","scaleExtent":[0,21],"polygon":[[[140.9868688,-28.9887829],[148.9951472,-28.9727491],[148.9966717,-28.4915066],[151.0029027,-28.4930697],[151.0029027,-28.7261663],[151.4915093,-28.7323921],[151.4918687,-28.7155337],[151.9228213,-28.719635],[151.9251607,-28.4897139],[151.9955886,-28.4898718],[151.9989947,-28.1192742],[152.4967606,-28.122091],[152.4968241,-28.1146398],[153.0044563,-28.1154389],[153.0044563,-28.120397],[153.5038629,-28.119345],[153.5039264,-28.1227063],[153.5919395,-28.1223619],[153.5926582,-28.1776872],[153.6111186,-28.1757867],[153.6113881,-28.1825173],[153.7426846,-28.2162084],[153.7787253,-28.710911],[152.6237954,-32.5877239],[152.3123961,-32.6328837],[151.4141942,-33.5790388],[150.8929925,-35.2648721],[150.4620695,-35.7777256],[150.0156501,-37.5103569],[149.9918121,-37.5126787],[149.519778,-37.5130704],[149.5199577,-37.5216919],[149.4462958,-37.5353701],[149.063344,-37.5357975],[148.9836635,-37.5217631],[148.9816872,-37.5191982],[148.9863847,-37.2584972],[148.4875376,-37.265846],[148.4824774,-37.0092669],[147.994386,-37.014339],[147.988288,-36.5332184],[147.9529707,-36.5260725],[147.9486513,-36.0685992],[147.5034997,-36.0716798],[147.5047701,-36.2651047],[146.4919996,-36.266129],[146.4922536,-36.2565],[145.9929826,-36.2534267],[145.9965866,-36.0188147],[145.9831568,-36.0187058],[145.9624506,-36.0219026],[145.946236,-36.0120936],[145.9454275,-36.0060259],[145.5041534,-36.0013564],[145.5037941,-36.0109125],[145.0072008,-36.0036213],[145.0035404,-36.1520424],[144.4860806,-36.1423149],[144.4874127,-36.0137522],[143.9874676,-36.0024134],[143.9932853,-35.5723753],[143.4971691,-35.5837101],[143.4917967,-35.4065648],[143.4613438,-35.3674934],[143.4585591,-35.3555888],[143.4897755,-35.3396522],[143.4895509,-35.332214],[143.4316994,-35.2570613],[143.2505542,-35.2606556],[143.2438356,-35.0132729],[142.9933305,-35.0177207],[142.9919767,-34.7961882],[142.4971375,-34.8032323],[142.4973172,-34.8007613],[142.4211401,-34.8017571],[142.4209155,-34.7838306],[142.2330892,-34.7859191],[142.2307707,-34.7807542],[142.2269959,-34.5061271],[141.9975302,-34.5083733],[141.9945959,-34.2526687],[141.4982345,-34.2556921],[141.498171,-34.2522794],[140.9945397,-34.2528411],[140.9868688,-28.9887829]]],"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","scaleExtent":[0,21],"polygon":[[[140.9868688,-28.9887829],[148.9951472,-28.9727491],[148.9966717,-28.4915066],[151.0029027,-28.4930697],[151.0029027,-28.7261663],[151.4915093,-28.7323921],[151.4918687,-28.7155337],[151.9228213,-28.719635],[151.9251607,-28.4897139],[151.9955886,-28.4898718],[151.9989947,-28.1192742],[152.4967606,-28.122091],[152.4968241,-28.1146398],[153.0044563,-28.1154389],[153.0044563,-28.120397],[153.5038629,-28.119345],[153.5039264,-28.1227063],[153.5919395,-28.1223619],[153.5926582,-28.1776872],[153.6111186,-28.1757867],[153.6113881,-28.1825173],[153.7426846,-28.2162084],[153.7787253,-28.710911],[152.6237954,-32.5877239],[152.3123961,-32.6328837],[151.4141942,-33.5790388],[150.8929925,-35.2648721],[150.4620695,-35.7777256],[150.0156501,-37.5103569],[149.9918121,-37.5126787],[149.519778,-37.5130704],[149.5199577,-37.5216919],[149.4462958,-37.5353701],[149.063344,-37.5357975],[148.9836635,-37.5217631],[148.9816872,-37.5191982],[148.9863847,-37.2584972],[148.4875376,-37.265846],[148.4824774,-37.0092669],[147.994386,-37.014339],[147.988288,-36.5332184],[147.9529707,-36.5260725],[147.9486513,-36.0685992],[147.5034997,-36.0716798],[147.5047701,-36.2651047],[146.4919996,-36.266129],[146.4922536,-36.2565],[145.9929826,-36.2534267],[145.9965866,-36.0188147],[145.9831568,-36.0187058],[145.9624506,-36.0219026],[145.946236,-36.0120936],[145.9454275,-36.0060259],[145.5041534,-36.0013564],[145.5037941,-36.0109125],[145.0072008,-36.0036213],[145.0035404,-36.1520424],[144.4860806,-36.1423149],[144.4874127,-36.0137522],[143.9874676,-36.0024134],[143.9932853,-35.5723753],[143.4971691,-35.5837101],[143.4917967,-35.4065648],[143.4613438,-35.3674934],[143.4585591,-35.3555888],[143.4897755,-35.3396522],[143.4895509,-35.332214],[143.4316994,-35.2570613],[143.2505542,-35.2606556],[143.2438356,-35.0132729],[142.9933305,-35.0177207],[142.9919767,-34.7961882],[142.4971375,-34.8032323],[142.4973172,-34.8007613],[142.4211401,-34.8017571],[142.4209155,-34.7838306],[142.2330892,-34.7859191],[142.2307707,-34.7807542],[142.2269959,-34.5061271],[141.9975302,-34.5083733],[141.9945959,-34.2526687],[141.4982345,-34.2556921],[141.498171,-34.2522794],[140.9945397,-34.2528411],[140.9868688,-28.9887829]]],"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}","scaleExtent":[0,16],"polygon":[[[140.9988422,-28.9992444],[148.9502438,-28.9993736],[148.9498845,-28.9665265],[148.9998308,-28.9665265],[149.0000917,-28.8165829],[149.1000729,-28.8165829],[149.0997046,-28.7488533],[148.9998504,-28.7497444],[148.9998169,-28.5000304],[151.0000514,-28.5005192],[151.0005904,-28.7325849],[151.0239466,-28.7327424],[151.0241262,-28.7418794],[151.0329297,-28.7418794],[151.033828,-28.7505431],[151.999984,-28.7495314],[151.999984,-28.7164478],[152.0334014,-28.7166053],[152.0332217,-28.683196],[152.0000739,-28.6833537],[151.9998769,-28.6416273],[151.9829886,-28.6413908],[151.9831683,-28.624912],[151.9331321,-28.6247543],[151.9334122,-28.500071],[151.9998875,-28.5002289],[151.9998556,-28.3749591],[152.2499739,-28.3750718],[152.2499356,-28.2500066],[152.9997192,-28.2498563],[152.9998989,-28.2832447],[153.1165002,-28.2834029],[153.11659,-28.2498563],[153.1666262,-28.2500146],[153.166716,-28.2331582],[153.2499898,-28.2332373],[153.2500265,-28.1249689],[153.6249628,-28.1250833],[153.6248398,-28.4999134],[153.7497955,-28.4999924],[153.7495877,-28.7497976],[153.6248117,-28.7501127],[153.6249745,-28.9999333],[153.4997672,-29.0000612],[153.4998417,-29.4995077],[153.3747962,-29.500055],[153.3754111,-29.8750302],[153.4999113,-29.8751403],[153.4999113,-30.0000922],[153.2498947,-29.9997621],[153.250025,-30.1917704],[153.2748185,-30.1916151],[153.2748185,-30.2168467],[153.2166077,-30.2166139],[153.2166077,-30.250065],[153.250025,-30.250065],[153.2497502,-30.3751935],[153.1243608,-30.3749743],[153.1246457,-30.6250359],[153.0331676,-30.6250482],[153.0333884,-30.8750837],[153.1249214,-30.8750291],[153.1249344,-31.1250505],[153.0082433,-31.1249736],[153.0082914,-31.2499759],[153.0000019,-31.250003],[152.9999392,-31.6249919],[152.8749386,-31.6250491],[152.8749572,-31.749954],[152.7832899,-31.7500034],[152.7831966,-31.8748579],[152.749914,-31.8750105],[152.7500397,-32.0000207],[152.6249044,-31.9999446],[152.6249078,-32.5000047],[152.4999757,-32.4999569],[152.5000336,-32.5666443],[152.4166699,-32.5663415],[152.4167598,-32.6249954],[152.3498477,-32.624991],[152.3498477,-32.6332294],[152.2830786,-32.6332218],[152.2832583,-32.6249755],[152.2494816,-32.6249755],[152.2498101,-32.874906],[151.8745693,-32.8750443],[151.8748535,-33.0000091],[151.7497706,-33.0001533],[151.7504669,-33.2500398],[151.6252418,-33.2497393],[151.6250828,-33.3751621],[151.499585,-33.3751442],[151.5003127,-33.6249385],[151.3741466,-33.6243658],[151.3727902,-34.001962],[151.2477819,-34.0011194],[151.2477819,-34.2493114],[150.9957327,-34.2501515],[151.0008143,-34.62483],[150.8717407,-34.6265026],[150.872757,-35.1242738],[150.7670589,-35.1234425],[150.7690916,-35.2463774],[150.6257894,-35.2496974],[150.6280314,-35.3751485],[150.4999742,-35.3751485],[150.4959088,-35.6275034],[150.3719169,-35.6250251],[150.3749658,-35.7537957],[150.2672351,-35.7513213],[150.2652024,-35.8741232],[150.2479249,-35.870829],[150.2458922,-36.374885],[150.1229166,-36.374885],[150.1259656,-36.6224345],[150.0253491,-36.6240658],[150.0283981,-36.7471337],[149.9928266,-36.7495768],[150.0040062,-37.1224477],[150.0588879,-37.1273097],[150.0568553,-37.37809],[149.9979083,-37.3732441],[149.9999409,-37.4830073],[149.987745,-37.4846202],[149.9857123,-37.5080043],[148.0684571,-36.80624],[147.9930603,-36.1379955],[147.8148345,-36.0055567],[147.3893924,-36.0113701],[147.3822059,-36.1310306],[146.9972549,-36.1275479],[146.9886311,-36.2528271],[146.4956356,-36.2447132],[146.5042595,-36.126387],[145.0011817,-36.0079505],[145.0154103,-36.2542074],[144.5072465,-36.2476506],[144.4991158,-36.0211037],[143.9965422,-35.9810531],[143.3382568,-35.2331794],[142.4097581,-34.7669434],[142.0361436,-34.3758837],[140.9965216,-34.1385805],[140.9988422,-28.9992444]]],"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.690486,45.546522],[4.831309,45.546522],[4.831309,45.571307],[4.883437,45.571307],[4.883437,45.59745],[5.166222,45.59745],[5.166222,45.745327],[5.107934,45.745327],[5.107934,45.881452],[4.906982,45.881452],[4.906982,45.92107],[4.84377,45.92107],[4.84377,45.940115],[4.715432,45.940115],[4.715432,45.870179],[4.674581,45.870179],[4.674581,45.717805],[4.695675,45.717805],[4.690486,45.546522]]],"terms_url":"http://smartdata.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.664889,45.546882],[4.882528,45.543476],[4.884346,45.597449],[5.166229,45.592416],[5.17217,45.745324],[5.107932,45.746531],[5.113048,45.88145],[4.906978,45.885083],[4.908215,45.921064],[4.84377,45.922124],[4.844965,45.958104],[4.677293,45.96069],[4.664889,45.546882]]],"terms_url":"http://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon/","terms_text":"Métropole de Lyon DINSI","best":true},{"id":"major_isidoro","name":"Major Isidoro AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.94048110193,-9.57587518044],[-36.94106045907,-9.48535688436],[-37.03214827722,-9.48605530547],[-37.03164402192,-9.57639356782],[-36.94048110193,-9.57587518044]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Mapbox","name":"Mapbox Satellite","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmap/cj8gojt0i1eau2rnn7q4mdgu7/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q","scaleExtent":[0,22],"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,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"},{"id":"mar_vermelho_al","name":"Mar Vermelho AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.34201321548,-9.49288996873],[-36.34219560569,-9.47533412032],[-36.34275350517,-9.4029001574],[-36.344727611,-9.4029001574],[-36.34537134116,-9.40279431056],[-36.34702358192,-9.40293191144],[-36.35080013221,-9.40291074208],[-36.35899696296,-9.40306951227],[-36.36108908599,-9.40299541952],[-36.36289153045,-9.40306951227],[-36.36589560455,-9.40304834292],[-36.36712942069,-9.4030060042],[-36.37571248954,-9.40306951227],[-36.38048682159,-9.40308009695],[-36.38663444465,-9.40319652837],[-36.3885227198,-9.40312243565],[-36.39285716956,-9.40324945173],[-36.396558618,-9.40321769772],[-36.40309247916,-9.40327062108],[-36.41973290389,-9.40337646777],[-36.43368039077,-9.4033976371],[-36.43355164474,-9.41685048724],[-36.43344435638,-9.4238571931],[-36.43337998336,-9.43753150237],[-36.43329415267,-9.45011519778],[-36.4330044741,-9.49358837449],[-36.40839252418,-9.49350371932],[-36.40442285484,-9.49353546501],[-36.40007767623,-9.49351430122],[-36.397867536,-9.49341906413],[-36.3916769976,-9.49328149941],[-36.38756785339,-9.49331324512],[-36.38535771316,-9.49340848223],[-36.37673172897,-9.49331324512],[-36.37427482551,-9.49318626226],[-36.36706504768,-9.49298520596],[-36.36501583999,-9.49299578788],[-36.36043462699,-9.49298520596],[-36.35955486243,-9.49295346022],[-36.35895404762,-9.49303811553],[-36.35703358596,-9.49294287831],[-36.35664734786,-9.49299578788],[-36.35260257667,-9.49299578788],[-36.34766731208,-9.49297462405],[-36.34201321548,-9.49288996873]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"geodata.md.gov-MD_SixInchImagery","name":"MD Latest 6 Inch Aerial Imagery","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_SixInchImagery/http://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer","endDate":"2016-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"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":"http://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","scaleExtent":[0,20],"polygon":[[[-76.46298868788,38.98080463627],[-76.46325795583,38.94779459044],[-76.49498669632,38.93690418359],[-76.51616910865,38.93697399921],[-76.54762858119,38.95910208849],[-76.54744906922,38.98666527704],[-76.51558569475,39.0030585399],[-76.48390183225,39.00291903879],[-76.46298868788,38.98080463627]],[[-76.09548280964,38.8413320581],[-76.04279604678,38.84089512141],[-76.04288580276,38.82980476995],[-76.0322945966,38.8296998884],[-76.03276581552,38.79667199901],[-76.02545070279,38.79663702224],[-76.0254058248,38.7746157424],[-76.03307996147,38.77472070505],[-76.03366337536,38.7307278267],[-76.05462139773,38.73093788097],[-76.0548009097,38.72004925436],[-76.10753255055,38.72043441094],[-76.10713709241,38.75338442343],[-76.11753984459,38.75346037077],[-76.11701334711,38.79730508527],[-76.09601366219,38.79715186708],[-76.09548280964,38.8413320581]],[[-77.23397015511,39.16838491616],[-77.25516378693,39.14647458509],[-77.25496183597,39.11342872174],[-77.18093418537,39.05337051467],[-77.14907221334,39.04769565692],[-77.12797815456,39.04779422613],[-77.10683080317,39.05325234984],[-77.1068770836,39.09169503464],[-77.11774597234,39.10827342699],[-77.16011079699,39.12484737677],[-77.15975177305,39.15213714767],[-77.17047901562,39.16302432313],[-77.21284384027,39.17271658577],[-77.23397015511,39.16838491616]]],"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":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_ColorBasemap/http://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer","polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"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":"minador_do_negrao","name":"Minador do Negrão","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.81960228856,-9.35174057847],[-36.82016893109,-9.26141767312],[-36.82465236584,-9.26132936954],[-36.83063690623,-9.26146673066],[-36.83673079868,-9.26149616517],[-36.84227793081,-9.26147654216],[-36.8456181394,-9.26160409172],[-36.85563876517,-9.26160409172],[-36.8621402426,-9.26159428022],[-36.86589797726,-9.26146673066],[-36.86724002536,-9.26149616517],[-36.86951653657,-9.26148635367],[-36.87126616964,-9.26157465721],[-36.87475549468,-9.26152559969],[-36.87815534986,-9.26163352623],[-36.88320542713,-9.26170220674],[-36.88565093699,-9.26167277223],[-36.88857361951,-9.26147654216],[-36.89217229662,-9.26150597668],[-36.89383245981,-9.26163352623],[-36.89740131364,-9.26175126423],[-36.91121943846,-9.26182975621],[-36.91110014529,-9.26650980886],[-36.91112002749,-9.28541580138],[-36.91120949736,-9.29066455986],[-36.91117967407,-9.29367642875],[-36.91099079323,-9.2992880502],[-36.91091126445,-9.30729328446],[-36.91090132335,-9.3122964628],[-36.91083173567,-9.31596541472],[-36.91084167677,-9.32013463149],[-36.91098085213,-9.32395064743],[-36.91099079323,-9.3258733543],[-36.91079197129,-9.32964025951],[-36.91079197129,-9.33523168439],[-36.9107422658,-9.33943990818],[-36.91092120555,-9.34310857462],[-36.91084167677,-9.3447074733],[-36.91066273702,-9.35228988056],[-36.89276876244,-9.35225064472],[-36.877350121,-9.35212312823],[-36.86462551685,-9.35203484755],[-36.85760710237,-9.35193675789],[-36.84344103915,-9.35190733098],[-36.83115384327,-9.3517994323],[-36.81960228856,-9.35174057847]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"NC-US","name":"NC Latest Orthoimagery","type":"wms","template":"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_All/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","polygon":[[[-81.6792,36.5974],[-80.2535886,36.5479298],[-75.8409,36.5671],[-75.4323,35.6441],[-75.5047482,35.1880648],[-75.7052487,35.1768406],[-76.1474484,34.9407747],[-76.5347165,34.5548667],[-76.6967648,34.6678918],[-77.2790402,34.5322432],[-77.688281,34.2648225],[-77.9435,33.8269],[-78.2128781,33.8940169],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.8468503,34.9632866],[-80.9512204,35.0555205],[-81.0638303,35.0172898],[-81.0748166,35.1341745],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.2718381,35.2822869],[-84.0905637,35.2733181],[-83.9147824,35.53301],[-83.5549802,35.591102],[-83.2556027,35.7339181],[-82.9864377,35.8141398],[-82.9232663,35.9676717],[-82.6788205,36.0853997],[-82.6019162,36.0898388],[-82.5359982,35.9698946],[-82.3547238,36.1475245],[-82.0443601,36.1430887],[-81.9042844,36.3380291],[-81.742236,36.3734205],[-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":"geodata.state.nj.us-Infrared2015","name":"NJ 2015 Aerial Imagery (Infrared)","type":"wms","template":"http://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","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"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":"http://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","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"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":"http://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[120.4570579,26.3970586],[120.44256,26.3708009],[120.44713,26.3531513],[120.4673009,26.3405831],[120.4978723,26.3340866],[120.5141036,26.3401594],[120.5341168,26.3641649],[120.5297045,26.3842128],[120.4956661,26.4015754],[120.4570579,26.3970586]],[[119.9007221,25.9858609],[119.8960071,25.9648902],[119.9131301,25.9470399],[119.9503542,25.9278478],[119.9905563,25.9260623],[120.0198392,25.9363284],[120.0277804,25.9557423],[120.0275322,25.9845224],[119.9989937,26.0010288],[119.9404278,26.0028131],[119.9007221,25.9858609]],[[122.089,24.5485],[121.709,23.4541],[121.717,22.698],[121.818,21.95],[121.803,21.8735],[121.759,21.8087],[121.694,21.7653],[120.861,21.5631],[120.815,21.5576],[120.739,21.5728],[120.661,21.6296],[120.202,22.1809],[119.27,23.0542],[119.153,23.2049],[119.128,23.2485],[119.103,23.4],[119.118,23.4765],[119.137,23.512],[119.361,23.8885],[119.406,23.9407],[120.968,25.2284],[121.408,25.4687],[121.989,25.8147],[122.065,25.8299],[122.141,25.8147],[122.216,25.7663],[122.26,25.7015],[122.297,25.48],[122.196,24.9696],[122.089,24.5485]],[[116.6855033,20.8547596],[116.6309071,20.8149565],[116.5941695,20.7600846],[116.5797214,20.6967501],[116.5893056,20.6325865],[116.621766,20.5753367],[116.6731874,20.5319171],[116.7373678,20.5075783],[116.8065659,20.5052653],[116.8724354,20.5252581],[116.9270316,20.5651373],[116.9637692,20.6200797],[116.9782173,20.6834462],[116.9686331,20.7475883],[116.9361727,20.8047732],[116.8847512,20.8481147],[116.8205709,20.872399],[116.7513728,20.8747063],[116.6855033,20.8547596]],[[118.2261504,24.4563345],[118.2936439,24.4538527],[118.2851467,24.4751026],[118.3097372,24.4916821],[118.3767709,24.4729348],[118.4100947,24.5332285],[118.4479031,24.5284069],[118.4746394,24.4599272],[118.512992,24.4315479],[118.5065839,24.4202318],[118.4811625,24.4332439],[118.4610567,24.4089192],[118.426145,24.3970385],[118.3970055,24.4284184],[118.3765564,24.4258395],[118.3397565,24.3814628],[118.3031926,24.3705764],[118.2574234,24.4139213],[118.1381276,24.3724838],[118.1617342,24.4022433],[118.2094226,24.4139604],[118.1895784,24.4352201],[118.2176338,24.430205],[118.2261504,24.4563345]],[[120.2234496,26.30045],[120.2550843,26.3100412],[120.269888,26.3368716],[120.2591889,26.3652192],[120.2292544,26.3784823],[120.1976197,26.3688968],[120.182816,26.3420738],[120.1935151,26.3137205],[120.2234496,26.30045]],[[119.4374461,25.0047541],[119.4342024,24.9886249],[119.4541901,24.9722553],[119.4827444,24.9718376],[119.4898402,24.9937882],[119.4715877,25.0069239],[119.4374461,25.0047541]],[[119.8869914,26.180381],[119.893227,26.1203128],[119.9285109,26.1080224],[119.9779388,26.1223611],[120.0366775,26.151728],[120.1098054,26.2134921],[120.119269,26.2713663],[120.0629175,26.3172592],[119.9923706,26.3164881],[119.9467732,26.2898799],[119.9020362,26.2439761],[119.8869914,26.180381]]],"terms_url":"http://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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAxJJREFUOI3tlF9oW2UYxn9f4nKW2ixfjJGYMnuctRUZ5mhEpjdJEEaHtmsZaKHq0qt6ZdtZL3Zhk3ilIKS9Ui806UStE7Edjln8kwzEwaB6IshsmJIqK1ttZ7Qlzel2eryQhqZrsDC8EHyuvu993+/53j+8D/yPfxtip4GqH1X1owLkdHI3RSwbkbFu1yAPdx4t3hpSS6YLAM05i/vCqcmzZwpj9T6pIZYOZNArNADhsQj3RVNjtyS1DcKtiHlPIb96PTn67nJiq8++cRgJicTpQ7Yz0oHc7cQZeakzPbTyqr9iKXUr0lfbqOx7LHJgbXrux5/X9M0+G0C8SySeeWTPQPSLxu4jn1vd4tE7m4euDNclrCEvt6E+25/e6H+VuKen57vEe1b8I29b8cKyo6j6Uece6I/VK387jC70crgjMFBDPDEx8aA5aOPkG+f7FhcX9YhGZLIUBSD7VAtSsZOKNpGKNgFU710tbiJ7G0lFm9DucCL2R7uCXjTpQFZbMV6wMu+EbWnpQOIJVKcvFTuDIR+az4nmc1Zt6h4HuV9XGHjIx1D2EvrCKtLnUgE+Pig+kQ6kDeDFc9YQwJdP2rLuBlfzRjklw7yh7JJh0vfZL6Tb70IqdqRSnT/5JfQTBcZfDom4HaBiUjn5k/Xh0VYRe85ztZ11QX53K4ZQyPxwFcO0yP+2Ste9bi6XrxPbfxuvnV9g6uIfPK/dTskwURbOFfPTM2PSIeTT99Bzw4KMhERi5ICIl667OOHuYNzdQV5p/ccBxi89kUmm5vveDou06kLddvNSibasbvZGXvj9fYJGgbldAaYaI+SVVoq7ApxtCNXEH7ZyhL8+Nho00YJeoT3+6Xp0W2KtBU07NpzNlHulem2ecHmGzpUcmlGg+dp83aynitbkK99ayfwSel2tiLUTo3M4lSn3ys12ub5MsFL4O4GGWZq/fyszfvrPsfwSNZtnpw70i+jMfjPdf//MfXf7UYtrASqWQkUoeNzLtHumS0buzePJD4zjV1a5vPX9jmRT9aNGNCKbZXMn0vnfwl+e9BTflqrxKAAAAABJRU5ErkJggg=="},{"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","scaleExtent":[0,20],"polygon":[[[-38.489742279052734,-12.811131765117107],[-38.54484558105469,-13.013924052026558],[-38.47755432128906,-13.034662471471638],[-38.33473205566406,-12.946846814654444],[-38.30005645751953,-12.906692193510644],[-38.33953857421875,-12.904349641337422],[-38.35481643676758,-12.830213284310222],[-38.38090896606445,-12.821844374997415],[-38.40717315673828,-12.867535227819912],[-38.46536636352539,-12.815985972925704],[-38.489742279052734,-12.811131765117107]]],"description":"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.","overlay":true},{"id":"orthos.dhses.ny.gov_latest","name":"NYS Orthos Online","type":"wms","template":"http://www.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","scaleExtent":[0,19],"polygon":[[[-74.91231104790405,45.036060871422514],[-73.47787904626531,45.02996489601911],[-73.33846123282218,45.03098119095642],[-73.31977627491248,45.005581106608915],[-73.32265088382167,44.98525292658083],[-73.34852236400432,44.92829565917409],[-73.36720732191401,44.83969633391092],[-73.34277314618596,44.81727029165119],[-73.34564775509514,44.7764733152644],[-73.37295653973237,44.73462648007473],[-73.37008193082319,44.6794648966887],[-73.39739071546042,44.64470656126996],[-73.39307880209665,44.60276438225357],[-73.39739071546042,44.54542854468756],[-73.34995966845892,44.512639828752185],[-73.34564775509514,44.49521331585934],[-73.37870575755073,44.47060231167881],[-73.30827783927576,44.43571894999882],[-73.30396592591198,44.4182694555537],[-73.3327120150038,44.3391682816244],[-73.30827783927576,44.27128222420617],[-73.30827783927576,44.25172471526754],[-73.38014306200533,44.14868323115224],[-73.40457723773338,44.0413289327325],[-73.33989853727677,43.79595697288363],[-73.28096905463853,43.642215731803084],[-73.20910383190896,43.549573305004984],[-73.21341574527274,43.51205945175996],[-73.24647374772834,42.6755714070924],[-73.45919480700785,42.142839357113225],[-73.47069324264457,42.03937970922349],[-73.48794089609967,41.737642097452465],[-73.4994393317364,41.643191171126794],[-73.47787976491753,41.62707774888845],[-73.4318860223706,41.57978847312145],[-73.42613680455224,41.56365920821005],[-73.42685473812732,41.45925887814987],[-73.43979047821864,41.403222667065656],[-73.44985160940078,41.383275042836544],[-73.43835317376404,41.37033277045519],[-73.42757339035461,41.35900616964153],[-73.41751225917248,41.34390096839462],[-73.41894956362707,41.27642429018757],[-73.43044799926379,41.24455103927662],[-73.46566195840128,41.19752312226992],[-73.52962200663059,41.145049831455864],[-73.55477483458594,41.133684100459654],[-73.61586027390607,41.13530789690045],[-73.6266400573155,41.1087808553827],[-73.62735870954279,41.054068843422385],[-73.63957579740682,40.99117509837295],[-73.61873488281525,40.98195286582785],[-73.59933127267827,40.96567519162947],[-73.59933127267827,40.93473654650821],[-73.63454523181575,40.91681807360894],[-73.68053897436268,40.89183270232195],[-73.69850528004507,40.8798798402391],[-73.68628819218104,40.87064205907731],[-73.66257266868028,40.87933647703018],[-73.63813849295222,40.90541287946855],[-73.59789396822369,40.91193037416514],[-73.57561574917752,40.91790417996723],[-73.52674739772141,40.92387744595259],[-73.50159456976607,40.9428797007417],[-73.49009613412935,40.953735678064604],[-73.41751225917248,40.960791106211715],[-73.38373560448959,40.9613338002184],[-73.33702320971537,40.95590665935183],[-73.30827712062354,40.93636525766628],[-73.27090720480417,40.92659238839886],[-73.20910311325675,40.91953330604491],[-73.18682489421059,40.92713536350369],[-73.16813993630089,40.93147900372728],[-73.165983979619,40.95970570481162],[-73.1688585885282,40.970016297449746],[-73.12933271602694,40.98195286582785],[-73.10777314920807,40.98195286582785],[-73.06680997225222,40.97489970011966],[-72.85840082633648,40.97435711767307],[-72.71826364201384,40.98195286582785],[-72.65574089823912,41.00527719453338],[-72.64424246260239,41.004734862008505],[-72.62627615692,40.99225998211336],[-72.54147519409912,41.03889309392365],[-72.47679649364251,41.063280983759014],[-72.45811153573283,41.08928476815911],[-72.41858566323157,41.093076127227],[-72.36612405063899,41.138555369199075],[-72.36037483282063,41.14180268071838],[-72.32228626477396,41.15479031895286],[-72.29066556677296,41.16398833949227],[-72.21448843067962,41.182380507948444],[-72.20083403836101,41.19157465575383],[-72.04847976617432,41.25913903369694],[-72.02548289490088,41.29370497046782],[-71.9392446276254,41.30774215335454],[-71.9234342786249,41.30666247732331],[-71.90259336403332,41.299104244517785],[-71.90187471180603,41.2893852294372],[-71.99458084912716,41.24509139345555],[-72.10453463990339,41.19806386514946],[-72.1828677326786,41.16723439148816],[-72.18933560272427,41.16236525319468],[-72.25185834649899,41.12231639996208],[-72.30431995909157,41.10444889166786],[-72.3158183947283,41.09524251989042],[-72.27916713113622,41.08440984216064],[-72.27269926109055,41.080617983013646],[-72.26838734772679,41.04973327212589],[-72.2173630395888,41.04810735923019],[-72.19652212499723,41.04214533487485],[-72.18646099381509,41.05298497738375],[-72.17136929704188,41.05840412900452],[-72.14980973022301,41.058946019612705],[-72.15627760026867,41.09632568943114],[-72.1526843391322,41.10769789124652],[-72.1490910779957,41.146673346530676],[-72.13399938122251,41.145049831455864],[-72.07075798522048,41.10553190938901],[-72.07435124635697,41.05677843039375],[-72.086568334221,41.0318460205672],[-72.10956520549446,41.006904165328564],[-72.08728698644829,41.01286938123731],[-72.06213415849294,41.02534036020521],[-72.04560515726514,41.03238812991624],[-72.01901502485521,41.03293023480147],[-72.00895389367307,41.04214533487485],[-72.00176737140012,41.05135914484385],[-71.96367880335345,41.07736764390088],[-71.9219969741703,41.088743127574865],[-71.889657623942,41.08765983301127],[-71.8558809692591,41.080617983013646],[-71.84581983807696,41.07465890519177],[-71.8558809692591,41.05298497738375],[-71.89037627616929,41.03726691318444],[-71.91624775635194,41.03021966573728],[-71.99098758799067,41.00365018356915],[-72.07938181194804,40.97272934355811],[-72.31941165586478,40.88205324847025],[-72.44230118673232,40.84020260474275],[-72.6277134613746,40.78689990926171],[-72.76569468901535,40.75043362643005],[-72.88499095874643,40.71285788340029],[-72.95973079038517,40.68670572169275],[-73.0373452309331,40.65999813364621],[-73.08118301679814,40.64854874971067],[-73.22994402784832,40.616370919338586],[-73.32193151294216,40.61309772897009],[-73.35211490648857,40.61855295716485],[-73.55477483458594,40.56943986927557],[-73.75959071936519,40.57708205228237],[-73.88248025023275,40.548146328651804],[-73.93350455837073,40.53449306094386],[-73.94500299400745,40.533946872353866],[-73.94572164623476,40.56288873200082],[-74.08226556942093,40.562342774949634],[-74.08010961273904,40.5492384698493],[-74.12251009414948,40.52083701052971],[-74.15772405328697,40.51373476465814],[-74.18718879460609,40.50116740969577],[-74.22887062378922,40.48695799891573],[-74.26120997401753,40.48531825788795],[-74.27630167079074,40.49570260781157],[-74.27917627969993,40.54377758575639],[-74.26983380074509,40.56671030667376],[-74.25833536510835,40.57216932054787],[-74.22527736265275,40.57216932054787],[-74.22599601488004,40.58308601230896],[-74.25114884283539,40.59563800556682],[-74.25258614728999,40.622371351867315],[-74.24324366833514,40.64091473558487],[-74.23390118938029,40.64909400302126],[-74.2022804913793,40.65400108233582],[-74.12538470305866,40.65672708157882],[-74.11532357187652,40.691065128306576],[-74.09951322287603,40.68997530338939],[-74.07795365605716,40.71067892875261],[-74.06286195928395,40.71830495805569],[-74.0520821758745,40.743900238938934],[-74.02549204346457,40.79288499840126],[-73.98093560537225,40.869011728592994],[-73.96225064746255,40.92550642480473],[-73.94931490737123,40.964589870550604],[-73.94644029846205,40.99876890966543],[-73.98165425759954,41.01612290773734],[-74.04561430582885,41.04322937947981],[-74.18072092456043,41.09524251989042],[-74.30792236879175,41.14937911566324],[-74.44087303084143,41.215365278476916],[-74.5278299503442,41.25913903369694],[-74.61334956539238,41.30234359441648],[-74.65790600348473,41.310981074177676],[-74.70246244157704,41.33580745460507],[-74.76714114203365,41.38974521327815],[-74.79660588335277,41.41022983858581],[-74.85337940930913,41.42262529077297],[-74.90727832635629,41.431785626305874],[-74.99782850699555,41.471106493417004],[-75.04166629286057,41.527084094166106],[-75.08478542649831,41.593225913275326],[-75.08406677427102,41.61848173934118],[-75.07328699086159,41.664668930702504],[-75.0876600354075,41.70277526731324],[-75.0876600354075,41.71350537258048],[-75.12143669009038,41.76176868230114],[-75.1192807334085,41.792316684103675],[-75.13077916904523,41.816958847412266],[-75.18755269500159,41.838379111347166],[-75.25295004768549,41.84962188079648],[-75.28744535459568,41.85497488617851],[-75.29822513800511,41.88226824503906],[-75.30613031250536,41.93040456765947],[-75.34062561941555,41.940027476740525],[-75.36649709959819,41.95659686103546],[-75.37224631741655,41.97743609810382],[-75.58065546333229,41.97957307031645],[-75.58137411555958,41.923988488332995],[-75.78906460924802,41.92666193313772],[-75.78690865256613,41.98277839417683],[-79.7768658185114,41.98117575241552],[-79.7818971027547,42.20994439336295],[-79.77183597157256,42.28016852623668],[-79.72153031566185,42.29824389979878],[-79.57348795683896,42.367307788746416],[-79.42975751137983,42.46599037989962],[-79.37370263765078,42.499909767684656],[-79.2572809768289,42.54545998533663],[-79.1897276674631,42.56240042582576],[-79.16529349173506,42.56981042255861],[-79.12073705364273,42.62482855594211],[-79.09630287791468,42.64597644140587],[-79.06899409327744,42.696702043447694],[-79.03162417745807,42.7104331026147],[-78.98850504382034,42.723105230911976],[-78.88358181863518,42.776932904700104],[-78.88645642754436,42.814900763418876],[-78.93963669236422,42.88655426672713],[-78.93963669236422,42.93603089533893],[-79.04887183091316,42.96969438273069],[-79.04743452645856,43.05167198470151],[-79.09342826900549,43.05272226918912],[-79.0919909645509,43.09261975149211],[-79.08624174673254,43.265557535860246],[-79.06468217991367,43.27602287004617],[-78.84908651172498,43.33041359857192],[-78.72979024199391,43.35236529048099],[-78.63924006135466,43.370129894376525],[-78.54868988071541,43.379532578835416],[-78.47826196244044,43.38788929664161],[-77.95508314096922,43.38475566245842],[-77.73158157962807,43.34713889446963],[-77.7114593172638,43.340344586318594],[-77.66259096580768,43.311591022674435],[-77.61515991880619,43.28387016659478],[-77.55335582725876,43.25299623609951],[-77.52820299930342,43.25508987878669],[-77.45633777657385,43.27863839921907],[-77.42256112189095,43.28491646608342],[-77.16384632006454,43.29433235167476],[-77.05029926815182,43.29380928516081],[-76.94178278183018,43.29328621414787],[-76.91447399719296,43.3079305018789],[-76.85051394896364,43.31629708261557],[-76.80236424973484,43.328322024532355],[-76.7599637683244,43.35184220081927],[-76.64785402086628,43.42808936716575],[-76.545086752363,43.4802581022461],[-76.51993392440767,43.49485728312425],[-76.44303813608703,43.52717148354531],[-76.42219722149545,43.538112693359565],[-76.28206003717281,43.538633653838865],[-76.23822225130777,43.55686443488524],[-76.24037820798966,43.74146501378322],[-76.30649421290086,43.82914593255031],[-76.31152477849193,43.86749827350751],[-76.34602008540212,43.861798810265746],[-76.40063765467659,43.8612806502232],[-76.47178422517885,43.8840754318208],[-76.46675365958778,43.90893252243542],[-76.41860396035898,43.93119152129071],[-76.37189156558476,43.93222662089228],[-76.36973560890287,43.90271922256843],[-76.33308434531081,43.92963883810956],[-76.27846677603632,43.92963883810956],[-76.27846677603632,43.90427260833489],[-76.2669683403996,43.8959874158668],[-76.2360662946259,43.91203892916922],[-76.19294716098815,43.93326170247849],[-76.19007255207897,43.95085533306909],[-76.21522538003431,43.96016750024623],[-76.2504393391718,43.94982055774786],[-76.31224343071922,43.94775095305809],[-76.30577556067355,43.97620170069497],[-76.33092838862892,44.004638823445866],[-76.39560708908552,44.024795072402476],[-76.3984816979947,44.06250502187776],[-76.37548482672123,44.064570626786484],[-76.37620347894854,44.090900771655065],[-76.47106557295156,44.0929653855436],[-76.46603500736049,44.109479701923],[-76.44231948385973,44.129600288113295],[-76.3984816979947,44.13217935491029],[-76.3977630457674,44.2043474993423],[-76.37620347894854,44.21671031511876],[-76.23965955576237,44.2192855751065],[-76.23965955576237,44.2280406165722],[-76.2173813367162,44.228555578463435],[-76.21522538003431,44.34790496257489],[-76.1189259815767,44.37102654591561],[-76.04634210661985,44.39157140443917],[-75.93423235916174,44.43417898509957],[-75.83721430847683,44.50341416416661],[-75.76822369465644,44.558231111426025],[-75.69923308083607,44.60378721108942],[-75.63167977147027,44.64828507610631],[-75.56772044189319,44.70500920154141],[-75.50447904589117,44.7458566542504],[-75.4527360855259,44.78157451471142],[-75.31762946679432,44.872300455880584],[-75.15377675897092,44.937453318614374],[-75.0905353629689,44.973052557209364],[-74.97411370214701,45.027933775754924],[-74.91985438100785,45.03682085482298],[-74.91231104790405,45.036060871422514]]],"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":"data:image/png:base64,iVBORw0KGgoAAAANSUhEUgAAAG0AAABCCAYAAABdAli1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTA1Nzc1NjVGNjM2MTFFMzk5NkFGRERGMEYyODU3RTciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTA1Nzc1NjZGNjM2MTFFMzk5NkFGRERGMEYyODU3RTciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBMDU3NzU2M0Y2MzYxMUUzOTk2QUZEREYwRjI4NTdFNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBMDU3NzU2NEY2MzYxMUUzOTk2QUZEREYwRjI4NTdFNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhMlZyIAAA02SURBVHja7F1djNxW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"},{"id":"olho_dagua_do_casado","name":"Olho d'Agua do Casado AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.78219871045,-9.54444051839],[-37.78259635433,-9.45388353571],[-37.8114653,-9.45411888151],[-37.81735042942,-9.45451112414],[-37.82057134484,-9.45415810579],[-37.8739351535,-9.45427577861],[-37.87357727401,-9.54475422977],[-37.78219871045,-9.54444051839]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"MAPNIK","name":"OpenStreetMap (Standard)","type":"tms","template":"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors, CC-BY-SA","default":true,"description":"The default OpenStreetMap layer.","icon":"data:image/png;base64,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"},{"id":"OpenStreetMap-turistautak","name":"OpenStreetMap (turistautak)","type":"tms","template":"http://{switch:h,i,j}.tile.openstreetmap.hu/turistautak/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors"},{"id":"osm-gps","name":"OpenStreetMap GPS traces","type":"tms","template":"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGb0lEQVR4Xq3MS2xcVx3H8e855z7m3vH1jMdjO43zshIrtpM0SZ3WFEcRVFFKoRWPBYtAHwgWCFUsQN100QeCsqAhCESrirRASdWWIkoUqgKFJm3UZ5o2oW2akrR5uXbi2ON4PPfOfZ17iERW2bCAz1/f3V8/cfDC02UEj4OxKHjdFMUfmUzOlAeXZFZuuVIKN8zi1dPh7Hcn5091G2EOB5b//NplA28/9tAT4bq111jD64ZKHR2VQWPEbULI0aHqZz7NZeLNmSeVMOJu4AfGgNEGLsR/95YuetcRzprcFJvaaVxrpm2mmqfp8FxKSYk8ck+0pt1nykFp0A/k9Tnt/lq3T2dHEOmi2DxSu+EdAAFwcPqp640xe42h26Qa2hqnXsFVHs04pNFuYgvbtOWCmD3aMj2VNaLi1+jwyxgpCKOQRCdMN6ZMd5Bmw1cPfG+5O/7LeX0ECyBppx9Zrn0c6BbNHJNr4qhFYWtsJCWpSFUm3ntxips2bxe+p1BKIJQECpRbkCQ2wu0XzbnIeemvhzYCVNR6JMDm5bdNF9qcwhiKbpvMg2KujZDmUgX1jgqT719gy+iX6QxsPM9F2YqclHbRRpUEXmCRZTGFlZGKxSMbR6+uA0gu863OzLc7cVUZN6jgKI8kicl0ykzjAiW5lGrVAWUwokApSa3UTY/XR2B3UlDgVy1sB8od7tgt2++4AcACOHL+uRW2bW8QQiCxcUoS6XssyBbnF6Y5+8kci8vjlJwqjnQwWpDlgtRYZDpHmxJzWUyk26gOYXxK0g+8G4bXX/snC0DZcmVh9EoQ5DpDSIVJYmIiGvkCurAQpkLU9kkTEEJeCjxbURSCZgTkfVjOApoM6Qtc3109Nj7uWO9M70EbPQT4YMhNjrWQEdHmTPs8SgfUisUgDLoAgcGyEjJtEaeaVlKQ5gVSGYwBhETaEmVJcemQaZ44aRpvyLIEnedGoNHNkNTTeI5DT2kRljeJziVhnKNlE1GaJFfnuRi3SXMDxmA7IUqCI20qdifkxfED+/dlanzb1cYL3BFhsTXPU4Ep0FGKUVALegCb1oLN7FlNpd5HIUNQLYxIsO0EKcByWljuAmXbp7fcIwgVb7xyaNeep3YfUnt272PLjaP1em/lZqmEk4cJQoMKfBxVIcwjlAp47okX6ap3XaoP221CIREyx7La2E6O7/h0eTXK+Bw+8uHrP7znvocXLe6flwCHXj06kab5hJAS6dhQFOgiJ2qXsKLVuHqAgdVD7HrwXibPTKJzFyMMAgECHGXTJTqxE4t3T5xMD7y29+mFRjgpLSUlYJ793T9ORWF0Lk1StCzQNqTTAle30flbzJ/bx6n3Xsa2Fb9/5Eccfu19wnlNFBniWJA3JecbDfa/8y5nJg7bW7ZeuyYKZwyF0QIAkC988Ogzfof6SppapHGZqgNTExPsfngfgaXpqyWk9QF6lwWk7YJlK1fQaTysqk8sE6LwIq4OEMql1DH3/O03PnBHUCk3JMCeA7/q6u1a0ltiNZ1eL719cPrcWR752d+Yn2lx/HSDY40qY2Pb2PapjYxv3YBX1syZ88weP3bp90Omw3PMOxNUe9FTn9gn5uemQqfk5BbAisHBlVo7g7PFx9TdgDMnZvjtzheI51qkWY5xYWxTLxXfJ5IVevIZ6gMDxCYnPjWDXZ0nSiOkEmYqO5l8cGT6FSD6+NhRJMCF1sWV88VkX6f3n/FHd+xl9uwsrTDEOIbPfWEj120eorw0JEzLhGWfop3ixxKrP0CTIQSAEVmhw5/f94uXAANg3b/r+1YrnV1T86ucPDzBrp3PcvHcHGmaUekL+OKtm9m0ailOUEe4FrXyWaKFblM4HmUvElNzF4jTxFiOhRRSJO34JHCOy6RU0i60uepfx07nO+593FycapAkCbX+Kl+/cxvXfXYIU3GjN/Yf2vPPg2/9JVxoNYNqQ+hcilznlKWDcpSwlCWiZrtx/O3Tf+AKClj88I9v/9aD99/aHBkaLlYNDTXuvPubH/3kN3e9vP3bn78HGAP6gSXA6K3fufnOXz+/888vHH3i9O4XH3j1roe+8dDo1pGvAeuAClfa/+aTQH35Yztuenz7l4aPLB9c81O/3H3L5VHFlUACZaAH6AQc/pv1o9cEiwbWbRlev+mrazeOblg3usnj/6nWV2fVyFp71fCa0sDgkOKyq5av4H/xb0Ky8po5hQEuAAAAAElFTkSuQmCC","overlay":true},{"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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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":"OS-historic-25k-OSM_Limited","name":"OS 1:25k historic (OSM)","type":"tms","template":"https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg","scaleExtent":[6,17],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]]},{"id":"OS-New_Popular_Edition-historic","name":"OS New Popular Edition historic","type":"tms","template":"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png","polygon":[[[-5.8,49.8],[-5.8,55.8],[1.9,55.8],[1.9,49.8],[-5.8,49.8]]]},{"id":"OS-OpenData_Locator","name":"OS OpenData Locator","type":"tms","template":"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png","polygon":[[[-9,49.8],[-9,61.1],[1.9,61.1],[1.9,49.8],[-9,49.8]]],"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","scaleExtent":[1,18],"polygon":[[[-5.8292886,50.0229734],[-5.8292886,50.254819],[-5.373356,50.254819],[-5.373356,50.3530588],[-5.1756021,50.3530588],[-5.1756021,50.5925406],[-4.9970743,50.5925406],[-4.9970743,50.6935617],[-4.7965738,50.6935617],[-4.7965738,50.7822112],[-4.6949503,50.7822112],[-4.6949503,50.9607371],[-4.6043131,50.9607371],[-4.6043131,51.0692066],[-4.3792215,51.0692066],[-4.3792215,51.2521782],[-3.9039346,51.2521782],[-3.9039346,51.2916998],[-3.7171671,51.2916998],[-3.7171671,51.2453014],[-3.1486246,51.2453014],[-3.1486246,51.362067],[-3.7446329,51.362067],[-3.7446329,51.4340386],[-3.8297769,51.4340386],[-3.8297769,51.5298246],[-4.0852091,51.5298246],[-4.0852091,51.4939284],[-4.3792215,51.4939284],[-4.3792215,51.5427168],[-5.1444195,51.5427168],[-5.1444195,51.6296003],[-5.7387103,51.6296003],[-5.7387103,51.774037],[-5.5095393,51.774037],[-5.5095393,51.9802596],[-5.198799,51.9802596],[-5.198799,52.0973358],[-4.8880588,52.0973358],[-4.8880588,52.1831557],[-4.4957492,52.1831557],[-4.4957492,52.2925739],[-4.3015365,52.2925739],[-4.3015365,52.3685318],[-4.1811246,52.3685318],[-4.1811246,52.7933685],[-4.4413696,52.7933685],[-4.4413696,52.7369614],[-4.8569847,52.7369614],[-4.8569847,52.9317255],[-4.7288044,52.9317255],[-4.7288044,53.5038599],[-4.1578191,53.5038599],[-4.1578191,53.4113498],[-3.3110518,53.4113498],[-3.3110518,53.5038599],[-3.2333667,53.5038599],[-3.2333667,54.0159169],[-3.3926211,54.0159169],[-3.3926211,54.1980953],[-3.559644,54.1980953],[-3.559644,54.433732],[-3.7188984,54.433732],[-3.7188984,54.721897],[-4.3015365,54.721897],[-4.3015365,54.6140739],[-5.0473132,54.6140739],[-5.0473132,54.7532915],[-5.2298731,54.7532915],[-5.2298731,55.2190799],[-5.6532567,55.2190799],[-5.6532567,55.250088],[-5.8979647,55.250088],[-5.8979647,55.4822462],[-6.5933212,55.4822462],[-6.5933212,56.3013441],[-7.1727691,56.3013441],[-7.1727691,56.5601822],[-6.8171722,56.5601822],[-6.8171722,56.6991713],[-6.5315276,56.6991713],[-6.5315276,56.9066964],[-6.811679,56.9066964],[-6.811679,57.3716613],[-6.8721038,57.3716613],[-6.8721038,57.5518893],[-7.0973235,57.5518893],[-7.0973235,57.2411085],[-7.1742278,57.2411085],[-7.1742278,56.9066964],[-7.3719817,56.9066964],[-7.3719817,56.8075885],[-7.5202972,56.8075885],[-7.5202972,56.7142479],[-7.8306806,56.7142479],[-7.8306806,56.8994605],[-7.6494061,56.8994605],[-7.6494061,57.4739617],[-7.8306806,57.4739617],[-7.8306806,57.7915584],[-7.4736249,57.7915584],[-7.4736249,58.086063],[-7.1879804,58.086063],[-7.1879804,58.367197],[-6.8034589,58.367197],[-6.8034589,58.4155786],[-6.638664,58.4155786],[-6.638664,58.4673277],[-6.5178143,58.4673277],[-6.5178143,58.5625632],[-6.0536224,58.5625632],[-6.0536224,58.1568843],[-6.1470062,58.1568843],[-6.1470062,58.1105865],[-6.2799798,58.1105865],[-6.2799798,57.7122664],[-6.1591302,57.7122664],[-6.1591302,57.6667563],[-5.9339104,57.6667563],[-5.9339104,57.8892524],[-5.80643,57.8892524],[-5.80643,57.9621767],[-5.6141692,57.9621767],[-5.6141692,58.0911236],[-5.490819,58.0911236],[-5.490819,58.3733281],[-5.3199118,58.3733281],[-5.3199118,58.75015],[-3.5719977,58.75015],[-3.5719977,59.2091788],[-3.1944501,59.2091788],[-3.1944501,59.4759216],[-2.243583,59.4759216],[-2.243583,59.1388749],[-2.4611012,59.1388749],[-2.4611012,58.8185938],[-2.7407675,58.8185938],[-2.7407675,58.5804743],[-2.9116746,58.5804743],[-2.9116746,58.1157523],[-3.4865441,58.1157523],[-3.4865441,57.740386],[-1.7153245,57.740386],[-1.7153245,57.2225558],[-1.9794538,57.2225558],[-1.9794538,56.8760742],[-2.1658979,56.8760742],[-2.1658979,56.6333186],[-2.3601106,56.6333186],[-2.3601106,56.0477521],[-1.9794538,56.0477521],[-1.9794538,55.8650949],[-1.4745008,55.8650949],[-1.4745008,55.2499926],[-1.3221997,55.2499926],[-1.3221997,54.8221737],[-1.0550014,54.8221737],[-1.0550014,54.6746628],[-0.6618765,54.6746628],[-0.6618765,54.5527463],[-0.3247617,54.5527463],[-0.3247617,54.2865195],[0.0092841,54.2865195],[0.0092841,53.7938518],[0.2081962,53.7938518],[0.2081962,53.5217726],[0.4163548,53.5217726],[0.4163548,53.0298851],[1.4273388,53.0298851],[1.4273388,52.92021],[1.8333912,52.92021],[1.8333912,52.042488],[1.5235504,52.042488],[1.5235504,51.8261335],[1.2697049,51.8261335],[1.2697049,51.6967453],[1.116651,51.6967453],[1.116651,51.440346],[1.5235504,51.440346],[1.5235504,51.3331831],[1.4507565,51.3331831],[1.4507565,51.0207553],[1.0699883,51.0207553],[1.0699883,50.9008416],[0.7788126,50.9008416],[0.7788126,50.729843],[-0.7255952,50.729843],[-0.7255952,50.7038437],[-1.0074383,50.7038437],[-1.0074383,50.5736307],[-2.3625252,50.5736307],[-2.3625252,50.4846421],[-2.4987805,50.4846421],[-2.4987805,50.5736307],[-3.4096378,50.5736307],[-3.4096378,50.2057837],[-3.6922446,50.2057837],[-3.6922446,50.1347737],[-5.005468,50.1347737],[-5.005468,49.9474456],[-5.2839506,49.9474456],[-5.2839506,50.0229734],[-5.8292886,50.0229734]],[[-6.4580707,49.8673563],[-6.4580707,49.9499935],[-6.3978807,49.9499935],[-6.3978807,50.0053797],[-6.1799606,50.0053797],[-6.1799606,49.9168614],[-6.2540201,49.9168614],[-6.2540201,49.8673563],[-6.4580707,49.8673563]],[[-5.8343165,49.932156],[-5.8343165,49.9754641],[-5.7683254,49.9754641],[-5.7683254,49.932156],[-5.8343165,49.932156]],[[-1.9483797,60.6885737],[-1.9483797,60.3058841],[-1.7543149,60.3058841],[-1.7543149,60.1284428],[-1.5754914,60.1284428],[-1.5754914,59.797917],[-1.0316959,59.797917],[-1.0316959,60.0354518],[-0.6626918,60.0354518],[-0.6626918,60.9103862],[-1.1034395,60.9103862],[-1.1034395,60.8040022],[-1.3506319,60.8040022],[-1.3506319,60.6885737],[-1.9483797,60.6885737]],[[-2.203381,60.1968568],[-2.203381,60.0929443],[-1.9864011,60.0929443],[-1.9864011,60.1968568],[-2.203381,60.1968568]],[[-1.7543149,59.5698289],[-1.7543149,59.4639383],[-1.5373349,59.4639383],[-1.5373349,59.5698289],[-1.7543149,59.5698289]],[[-4.5585981,59.1370518],[-4.5585981,58.9569099],[-4.2867004,58.9569099],[-4.2867004,59.1370518],[-4.5585981,59.1370518]],[[-6.2787732,59.2025744],[-6.2787732,59.0227769],[-5.6650612,59.0227769],[-5.6650612,59.2025744],[-6.2787732,59.2025744]],[[-8.7163482,57.9440556],[-8.7163482,57.7305936],[-8.3592926,57.7305936],[-8.3592926,57.9440556],[-8.7163482,57.9440556]],[[-7.6077005,50.4021026],[-7.6077005,50.2688657],[-7.3907205,50.2688657],[-7.3907205,50.4021026],[-7.6077005,50.4021026]],[[-7.7304303,58.3579902],[-7.7304303,58.248313],[-7.5134503,58.248313],[-7.5134503,58.3579902],[-7.7304303,58.3579902]]]},{"id":"OS-Scottish_Popular-historic","name":"OS Scottish Popular historic","type":"tms","template":"https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg","scaleExtent":[6,15],"polygon":[[[-7.8,54.5],[-7.8,61.1],[-1.1,61.1],[-1.1,54.5],[-7.8,54.5]]]},{"id":"al_palestina","name":"Palestina AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.28906746617,-9.71915617946],[-37.28903527966,-9.71114035022],[-37.28911038151,-9.70220427214],[-37.28915329685,-9.69174505681],[-37.28918548336,-9.68885787521],[-37.28927131405,-9.68069325658],[-37.28926058521,-9.67731947667],[-37.28935714474,-9.66999011394],[-37.28935714474,-9.66599221238],[-37.28931422939,-9.66132793384],[-37.28941078892,-9.6552568713],[-37.2894644331,-9.64555775166],[-37.28949661961,-9.6348852245],[-37.28953953495,-9.62925794841],[-37.29639526119,-9.62884541884],[-37.31187697163,-9.62897235107],[-37.32761617413,-9.62914159397],[-37.33181114903,-9.62919448235],[-37.3433768343,-9.629173327],[-37.35876198521,-9.62922621538],[-37.37175460568,-9.6293002591],[-37.37838502636,-9.62913101629],[-37.3805093359,-9.62921563771],[-37.38060589543,-9.63142636478],[-37.38054152241,-9.63784691108],[-37.38043423405,-9.63894695947],[-37.38053079357,-9.64147494171],[-37.3805093359,-9.64876261706],[-37.38049860706,-9.65430495262],[-37.38043423405,-9.65599725065],[-37.380241115,-9.66028084202],[-37.38021965733,-9.66550569201],[-37.38018747082,-9.6705400861],[-37.38015528431,-9.67895877835],[-37.38013382664,-9.68781086916],[-37.38009091129,-9.70115730775],[-37.38002653828,-9.7105269939],[-37.38010164013,-9.71743247513],[-37.38004799595,-9.71958974786],[-37.3793184351,-9.7195368737],[-37.37392183056,-9.71955802336],[-37.36582155934,-9.71945227502],[-37.35849376431,-9.71946284985],[-37.353343923,-9.71937825115],[-37.34413858166,-9.71936767631],[-37.33422513714,-9.71923020337],[-37.3293327879,-9.71927250275],[-37.32180114498,-9.71924077822],[-37.31982703915,-9.71927250275],[-37.31094356289,-9.71919847884],[-37.2958910059,-9.71920905369],[-37.28906746617,-9.71915617946]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"palmeira_dos_indios","name":"Palmeira dos Indios AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.58663984051,-9.46124293173],[-36.58665056935,-9.45851253477],[-36.58618922939,-9.41968140694],[-36.58603902569,-9.41451629413],[-36.58596392384,-9.4059322986],[-36.58584590664,-9.3950935092],[-36.58579226246,-9.39163222273],[-36.58565278759,-9.38983276351],[-36.58549185505,-9.3824866389],[-36.58528800717,-9.37964976527],[-36.58510561695,-9.37743741114],[-36.5850305151,-9.3705885508],[-36.58890362492,-9.37057796513],[-36.59064169636,-9.37065206481],[-36.59389253369,-9.37059913647],[-36.60037275067,-9.37072616447],[-36.61045785656,-9.37049327977],[-36.62288184872,-9.37020746651],[-36.63377161732,-9.3700169242],[-36.63835283032,-9.36985813887],[-36.64742942562,-9.36997458145],[-36.6514098238,-9.36994282439],[-36.6553365778,-9.36972052485],[-36.65647383442,-9.36974169624],[-36.6611086916,-9.37023922355],[-36.66276093235,-9.37026039491],[-36.66704173794,-9.36973111055],[-36.67051788082,-9.36965701067],[-36.67325373402,-9.36965701067],[-36.67602177372,-9.36986872456],[-36.6759252142,-9.3725998221],[-36.67596812954,-9.37679169746],[-36.67638655415,-9.38137517998],[-36.67653675785,-9.38463544939],[-36.67663331738,-9.39264838381],[-36.67675133457,-9.39829014058],[-36.67689080944,-9.40874778795],[-36.67707319966,-9.41886642501],[-36.67716975918,-9.43178948329],[-36.67724486103,-9.43394857114],[-36.67718048802,-9.43752585362],[-36.67727704754,-9.44311396022],[-36.67729850521,-9.449326389],[-36.67740579357,-9.45528471196],[-36.67739506474,-9.4593803377],[-36.67735214939,-9.46017405798],[-36.67567845097,-9.46020580675],[-36.66624780407,-9.46030105305],[-36.66223521938,-9.46030105305],[-36.65736432781,-9.46041746516],[-36.65040131321,-9.46047037975],[-36.63543458691,-9.46065028927],[-36.61979194393,-9.46083019869],[-36.61433096638,-9.46083019869],[-36.61028619518,-9.46096777643],[-36.60646672955,-9.46096777643],[-36.60186405888,-9.46098894223],[-36.59425731411,-9.461115937],[-36.58663984051,-9.46124293173]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Pangasinan_Bulacan_HiRes","name":"Pangasinán/Bulacan (Philippines HiRes)","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png","scaleExtent":[12,19],"polygon":[[[120.336593,15.985768],[120.445995,15.984],[120.446134,15.974459],[120.476464,15.974592],[120.594247,15.946832],[120.598064,16.090795],[120.596537,16.197999],[120.368537,16.218527],[120.347576,16.042308],[120.336593,15.985768]],[[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://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.39002812509,-9.78589413544],[-37.39018686777,-9.77619515195],[-37.38992540924,-9.76575048432],[-37.38990673363,-9.75256304825],[-37.39014951655,-9.7410224633],[-37.39002812509,-9.73201243097],[-37.39012150314,-9.72254197161],[-37.39014951655,-9.71288716505],[-37.39018686777,-9.7034069601],[-37.39019620557,-9.69548203924],[-37.40377337333,-9.6955004481],[-37.41727583865,-9.69560169682],[-37.43223500148,-9.69569374108],[-37.44318824617,-9.69573055877],[-37.44723151552,-9.69582260299],[-37.45682144076,-9.69585021626],[-37.47062271582,-9.69591464719],[-37.47373220472,-9.69590544277],[-37.47586122415,-9.69604350903],[-37.48127715077,-9.69605271344],[-37.48131450199,-9.69889686551],[-37.48122112394,-9.70086658775],[-37.48121178614,-9.70238529092],[-37.48135185321,-9.70545028909],[-37.48137986662,-9.71045731285],[-37.4813425154,-9.71617295985],[-37.48120244833,-9.71875003124],[-37.48124913736,-9.72035148703],[-37.48136119101,-9.7213362865],[-37.4813425154,-9.72409739103],[-37.48129582638,-9.72506377223],[-37.48103436785,-9.72731865083],[-37.48101569224,-9.73088040767],[-37.48126781296,-9.73461699032],[-37.48130516418,-9.73638402962],[-37.48131450199,-9.73893333547],[-37.48131450199,-9.74387543612],[-37.48129582638,-9.7498850055],[-37.48122112394,-9.75315203071],[-37.48101569224,-9.75855405565],[-37.48083827396,-9.76419525907],[-37.48084761176,-9.76526275174],[-37.48094098981,-9.76675355473],[-37.480931652,-9.76881490096],[-37.48083827396,-9.77210014513],[-37.48086628737,-9.77486082942],[-37.48076357152,-9.77993122654],[-37.48081026054,-9.78629902044],[-37.46381545633,-9.78622540502],[-37.45353453357,-9.78619779924],[-37.43978928533,-9.78610577993],[-37.42997525279,-9.78606897221],[-37.42079619096,-9.78600455867],[-37.40852631583,-9.785958549],[-37.39545338951,-9.78593094319],[-37.39002812509,-9.78589413544]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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","polygon":[[[7.5479525,43.731183],[8.106966,43.86700730000001],[8.7359333,44.389436700000005],[10.183382,43.85116399999999],[9.5501637,43.13604889999999],[10.2772473,42.27514580000001],[11.6974829,42.08117770000001],[12.900592000000001,40.84896839999998],[14.9746632,40.208691200000004],[16.0477306,38.895298899999986],[13.1085959,38.74113290000001],[11.7771711,37.9360538],[14.406238300000002,36.74298800000001],[15.134669000000002,36.59363599999999],[15.428667100000002,37.0270026],[15.2199268,37.43375560000001],[15.483598700000002,37.929356000000006],[16.0164356,37.8035964],[17.216692,38.87424630000002],[17.216692,39.40468200000001],[16.5547657,39.7877476],[17.0546436,40.451437900000016],[18.3290577,39.70538770000001],[18.687732,40.05870289999999],[18.0496375,40.67064450000001],[16.005449300000002,41.5212225],[16.3844776,41.85963759999999],[15.5183696,42.15369720000001],[14.5799732,42.246104100000004],[13.5609913,43.65127720000002],[12.5788936,44.08670100000001],[12.2879505,44.6220446],[12.563982,44.9709164],[12.3415089,45.1745803],[12.4169596,45.4055695],[13.092517900000002,45.6282626],[13.6954906,45.70805899999999],[13.78445,45.5825],[13.919100000000002,45.63220000000001],[13.8235,45.717600000000004],[13.59784,45.807199999999995],[13.64307,45.98326],[13.52963,45.965879999999984],[13.47474,46.00546],[13.66472,46.17392000000001],[13.47587,46.22724999999999],[13.42218,46.20758],[13.37671,46.296679999999995],[13.59777,46.441370000000006],[13.68684,46.43880999999999],[13.7148,46.522200000000005],[12.9151,46.60953],[12.38708,46.715289999999996],[12.27591,46.88651],[12.17486,46.908950000000004],[12.11675,47.01240999999999],[12.21781,47.039959999999994],[12.19254,47.09331000000001],[11.74789,46.984840000000005],[11.33355,46.99862000000002],[11.10618,46.92966000000001],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258000000001],[10.66405,46.87613999999999],[10.47197,46.85698000000001],[10.38659,46.678470000000004],[10.49375,46.620490000000004],[10.46136,46.53164],[10.25309,46.574319999999986],[10.23674,46.634840000000004],[10.10307,46.610030000000016],[10.03715,46.44479],[10.165,46.410509999999995],[10.10506,46.33719999999999],[10.17862,46.25625999999999],[10.07055,46.216680000000004],[9.95249,46.38045000000001],[9.73086,46.35071],[9.71273,46.292660000000005],[9.57015,46.29580000000001],[9.46117,46.374810000000004],[9.459360000000002,46.50873],[9.40487,46.46620999999998],[9.36128,46.5081],[9.28136,46.496849999999995],[9.24503,46.236160000000005],[8.9560061,45.96502739999999],[9.09065,45.89905999999999],[9.0298,45.821270000000005],[8.90992,45.833299999999994],[8.9408,45.86681999999999],[8.88904,45.95465000000001],[8.78551,45.99063000000001],[8.85617,46.07480000000001],[8.62242,46.121120000000005],[8.45032,46.26869000000001],[8.42464,46.46366999999999],[8.08814,46.266920000000006],[8.15493,46.183399999999985],[8.11383,46.11577],[8.02906,46.10330999999999],[7.98881,45.99867],[7.9049000000000005,45.99945],[7.859490000000001,45.91485000000001],[7.563430000000001,45.97421],[7.10685,45.85652999999999],[7.04151,45.92434999999999],[6.95315,45.85163000000001],[6.80785,45.832649999999994],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.50900000000001],[7.18019,45.40070999999998],[7.10572,45.32924],[7.13115,45.25386],[6.851440000000001,45.132259999999995],[6.7697,45.16044],[6.62803,45.111749999999994],[6.66981,45.02324000000001],[6.74791,45.01939],[6.75518,44.899150000000006],[7.022170000000001,44.82519],[7.07484,44.680730000000004],[6.9513300000000005,44.66264],[6.85507,44.53072],[6.94504,44.431119999999986],[6.88784,44.42043],[6.891710000000001,44.36637000000001],[7.007640000000001,44.23735999999999],[7.363640000000001,44.11881999999999],[7.68694,44.17487],[7.725079999999999,44.07578000000001],[7.493549999999999,43.86551],[7.5479525,43.731183]],[[8.171339,39.148484300000014],[8.6245251,38.75118870000001],[9.0983105,39.037636700000014],[9.0310192,39.13144220000001],[9.265852000000002,39.1857496],[9.6407604,39.0227016],[9.8989391,40.6799061],[9.5006847,41.392570299999996],[8.303175,40.91070760000001],[8.4130383,41.16138739999999],[8.2125378,41.1386378],[8.0752087,40.598623299999986],[8.3615398,40.34999509999999],[8.2791424,39.985851200000006],[8.3828259,39.65359839999999],[8.171339,39.148484300000014]],[[12.514886900000002,35.53423470000001],[12.640543,35.5306027],[12.6386149,35.486413600000006],[12.512958700000002,35.4900477],[12.514886900000002,35.53423470000001]],[[11.9121838,36.8568754],[12.081785200000002,36.8552271],[12.0795789,36.7097361],[11.9099774,36.71138750000001],[11.9121838,36.8568754]],[[12.8401852,35.881314200000006],[12.8918552,35.8814533],[12.891984,35.850033999999994],[12.840314,35.8498949],[12.8401852,35.881314200000006]]]},{"id":"Actueel_ortho25_WMTS","name":"PDOK Luchtfoto Beeldmateriaal 25cm","type":"tms","template":"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=2016_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,18],"polygon":[[[3.1437689,51.3598403],[3.1575018,51.2411346],[3.3387762,51.1154412],[3.9128119,51.0585083],[4.6571356,51.2806657],[4.8933416,51.2634825],[5.1789862,51.1257851],[5.3849798,51.1309561],[5.5442816,51.056782],[5.4206854,50.8595581],[5.4673773,50.7032633],[5.6568914,50.6192567],[6.1485296,50.6214349],[6.3023382,50.8578243],[6.2995916,50.9543819],[6.2638861,51.0183545],[6.3723761,51.0925902],[6.4012152,51.2011393],[6.3737494,51.2510206],[6.4451605,51.3158713],[6.4204413,51.5496009],[6.343537,51.6792182],[6.796723,51.7642909],[7.046662,51.9102418],[7.0713812,52.0455856],[7.2718817,52.1704147],[7.3075872,52.3855111],[7.2059637,52.5319494],[7.282868,52.614576],[7.2993475,52.7785318],[7.4421698,52.9782705],[7.43393,53.2831352],[7.0439154,53.5515877],[6.7829901,53.6363531],[6.2391668,53.5401639],[5.6871039,53.5124077],[5.173493,53.4388477],[4.8164373,53.2338445],[4.6516424,53.0658312],[4.5417791,52.4859784],[4.3220526,52.1956753],[4.08104,52.0136897],[4.0219885,52.0162253],[3.9368445,51.9637937],[3.9519507,51.8807927],[3.844834,51.8494157],[3.6237341,51.7075226],[3.6553198,51.6606936],[3.6333471,51.6274583],[3.5468298,51.622343],[3.3957678,51.5609145],[3.3820349,51.5173524],[3.4987646,51.4326715],[3.3298498,51.3855587],[3.1437689,51.3598403]]],"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":"Landsdekkende dataset 25cm resolutie kleuren luchtfotos van de meest recente jaargang.","icon":"data:image/png;base64,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"},{"id":"Philadelphia2015Imagery","name":"Philadelphia 2015 Imagery","type":"wms","template":"http://maps.pasda.psu.edu/arcgis/services/pasda/PhiladelphiaImagery2015/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","polygon":[[[-75.2884151414,39.82486515846],[-75.24549979717,39.82381045509],[-75.20464438945,39.83699308346],[-75.16619224101,39.8738909832],[-75.11572379619,39.87415446828],[-75.11057395488,39.95289110072],[-75.09649772197,39.95289110072],[-75.04293937236,39.98525480677],[-75.04156608135,40.00340334729],[-75.01616019756,40.00340334729],[-74.95161551982,40.04284005685],[-74.95127219707,40.1195447926],[-74.98586196452,40.14021663243],[-75.02834815532,40.14152891793],[-75.11898536235,40.06458621765],[-75.20309943706,40.10713867106],[-75.23434180766,40.09794749237],[-75.27416724712,40.05354975847],[-75.22095222026,40.00964901184],[-75.29510993511,39.97545522066],[-75.25734443218,39.95203575437],[-75.26009101421,39.91675985472],[-75.32085914165,39.8885787312],[-75.32257575542,39.8514251597],[-75.2884151414,39.82486515846]]],"terms_url":"http://www.pasda.psu.edu/"},{"id":"al_piranhas","name":"Piranhas AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.71917577496,-9.65235879937],[-37.71917577496,-9.63873541198],[-37.71914358845,-9.63210333094],[-37.71924014797,-9.62114477442],[-37.71929379215,-9.61022817566],[-37.7193367075,-9.59988246925],[-37.71940108051,-9.58891229023],[-37.71945472469,-9.57801581129],[-37.71944399586,-9.57173166346],[-37.71951909771,-9.56684391256],[-37.71956201306,-9.56225232497],[-37.71998043766,-9.5621782666],[-37.72257681599,-9.56194551161],[-37.72817726841,-9.56203014981],[-37.73254390469,-9.56199841049],[-37.74107332935,-9.56206188913],[-37.74845476856,-9.56201957003],[-37.75925870648,-9.56215710706],[-37.76971932163,-9.56227348451],[-37.78036232701,-9.56244276071],[-37.78537269344,-9.56235812262],[-37.78907414189,-9.56232638333],[-37.79561873188,-9.56245334047],[-37.79771085491,-9.56236870238],[-37.81005974522,-9.56243218095],[-37.81060691586,-9.56241102143],[-37.810531814,-9.5653098637],[-37.81048889866,-9.57629138499],[-37.81045671215,-9.58742065699],[-37.8103816103,-9.59756574935],[-37.81030650845,-9.61798195891],[-37.81017776241,-9.65196745198],[-37.81017776241,-9.65229533767],[-37.81024213543,-9.6525914922],[-37.80663724651,-9.65245399191],[-37.80205603352,-9.65252803054],[-37.79597278347,-9.65236937632],[-37.79178853741,-9.65251745359],[-37.78815146198,-9.65246456886],[-37.78722878208,-9.65242226107],[-37.78035159817,-9.65241168412],[-37.77864571324,-9.65223187594],[-37.77625318279,-9.65229533767],[-37.77475114575,-9.65218956812],[-37.77233715763,-9.65223187594],[-37.76960130444,-9.65245399191],[-37.76623244991,-9.65250687665],[-37.76345368138,-9.65246456886],[-37.7603959631,-9.6524962997],[-37.75101896038,-9.65236937632],[-37.75011773815,-9.65248572275],[-37.74154539814,-9.65247514581],[-37.74030085316,-9.65239053022],[-37.73785467854,-9.65246456886],[-37.73443217983,-9.65237995327],[-37.73106332531,-9.65243283802],[-37.72651429882,-9.65236937632],[-37.7219545435,-9.65225302985],[-37.71991606465,-9.65228476071],[-37.71917577496,-9.65235879937]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"PNOA-Spain-TMS","name":"PNOA Spain","type":"tms","template":"http://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}","polygon":[[[-17.8846298,28.4460601],[-17.8939535,28.5225529],[-18.0212548,28.7481927],[-18.0224091,28.8038375],[-17.9424017,28.8726124],[-17.8911792,28.8737099],[-17.8903302,28.8515102],[-17.7675902,28.8537764],[-17.7669837,28.8312183],[-17.7412714,28.8319975],[-17.7394926,28.7642235],[-17.7139824,28.7649677],[-17.7129312,28.7303731],[-17.7574427,28.6931782],[-17.7570788,28.6741254],[-17.7457913,28.6743524],[-17.7457266,28.6165627],[-17.7519687,28.5833675],[-17.7622536,28.5591958],[-17.7833086,28.541667],[-17.7831575,28.4936643],[-17.808611,28.4925024],[-17.8060072,28.4468974],[-17.8846298,28.4460601]],[[-18.1661033,27.7851643],[-18.163494,27.6949247],[-18.0889827,27.6963366],[-18.0873398,27.6738724],[-18.0364092,27.6753701],[-18.0350079,27.6302571],[-17.9589987,27.6323976],[-17.8603269,27.7926025],[-17.8630328,27.8368793],[-17.8884015,27.8364947],[-17.8891263,27.8590536],[-17.9906491,27.8567467],[-18.0386803,27.7655831],[-18.1146412,27.7637873],[-18.1154627,27.7863613],[-18.1661033,27.7851643]],[[-17.36038,28.0639801],[-17.3629657,28.1757247],[-17.3375583,28.1763688],[-17.3384577,28.2213012],[-17.1857883,28.2238767],[-17.0820788,28.1351849],[-17.0808422,28.0679977],[-17.1315446,28.0668073],[-17.1563337,28.0214628],[-17.2321063,28.0203711],[-17.2319938,27.9980388],[-17.2576823,27.9978403],[-17.257851,28.0199741],[-17.3086658,28.0192298],[-17.36038,28.0639801]],[[-16.9278171,28.3275779],[-16.9286591,28.3721879],[-16.8776666,28.3729288],[-16.8780707,28.3954191],[-16.5214259,28.4226146],[-16.4457117,28.491135],[-16.4462506,28.535972],[-16.4205859,28.5362679],[-16.4209227,28.5588419],[-16.3443329,28.5597589],[-16.3446023,28.5822095],[-16.1912541,28.5837179],[-16.1916246,28.6068435],[-16.1279344,28.6078193],[-16.1277997,28.5921762],[-16.0995079,28.5925015],[-16.0993395,28.5163822],[-16.1648148,28.5161158],[-16.1647474,28.4938583],[-16.2385755,28.4484704],[-16.2653516,28.4476116],[-16.2658569,28.4030038],[-16.3167484,28.4017594],[-16.3163105,28.380189],[-16.3420763,28.3795075],[-16.3408301,28.2892963],[-16.415837,28.1976134],[-16.415096,28.1311312],[-16.5153297,28.0164796],[-16.6168433,28.01532],[-16.6168096,27.9930469],[-16.7184243,27.9919168],[-16.7190979,28.0371426],[-16.7446952,28.0367859],[-16.7453351,28.0818146],[-16.7706967,28.0816065],[-16.8223966,28.1259036],[-16.8231712,28.1708652],[-16.8487012,28.1707464],[-16.8502842,28.260791],[-16.8756457,28.2605537],[-16.8760836,28.2832162],[-16.9015125,28.2827713],[-16.9023882,28.3279337],[-16.9278171,28.3275779]],[[-15.8537427,27.9008901],[-15.8542032,27.9901812],[-15.828953,27.9906555],[-15.8291065,28.035578],[-15.7782992,28.0363232],[-15.7532793,28.0814298],[-15.7278756,28.0815652],[-15.7282593,28.1718567],[-15.4989741,28.1728039],[-15.4987438,28.1504075],[-15.4497785,28.1507459],[-15.4501622,28.1961425],[-15.3972827,28.1961425],[-15.3964385,28.0383554],[-15.3710348,28.0380167],[-15.3706511,28.0153212],[-15.3457847,28.0153212],[-15.3454777,27.9254406],[-15.3708046,27.9252372],[-15.3705743,27.8352137],[-15.395978,27.8347387],[-15.4209979,27.7879673],[-15.4718052,27.7893932],[-15.471882,27.7666454],[-15.522766,27.7667813],[-15.5477092,27.7216112],[-15.6236132,27.7213395],[-15.6241504,27.741991],[-15.7007451,27.7433495],[-15.801669,27.8110501],[-15.8537427,27.9008901]],[[-14.5215621,28.0467778],[-14.5224358,28.1184131],[-14.4157526,28.1156076],[-14.2168794,28.2278805],[-14.2153651,28.33903],[-14.1641672,28.4528287],[-14.1115132,28.4747955],[-14.0335806,28.7226671],[-13.9565217,28.7449351],[-13.9561722,28.7665857],[-13.8290221,28.7664325],[-13.8289639,28.7879765],[-13.8000741,28.7879255],[-13.8012972,28.7189894],[-13.827566,28.719347],[-13.8278572,28.6517968],[-13.8025786,28.651899],[-13.8033941,28.5384172],[-13.8288474,28.5384684],[-13.8315061,28.3970177],[-13.9158189,28.2241438],[-13.9856445,28.2235696],[-14.0369588,28.1795787],[-14.1387139,28.1799894],[-14.1386556,28.1579103],[-14.2153651,28.1578076],[-14.2147244,28.1118888],[-14.2913173,28.0452356],[-14.3319673,28.0368713],[-14.4457846,28.0469834],[-14.4466583,28.0657961],[-14.4962835,28.0682631],[-14.495934,28.0458525],[-14.5215621,28.0467778]],[[-13.800662,28.8456579],[-13.8009273,28.8231121],[-13.775688,28.8230539],[-13.69729,28.8898184],[-13.69729,28.9127744],[-13.6072498,28.9117991],[-13.4388551,29.0002417],[-13.4374559,29.1351289],[-13.4117005,29.1349931],[-13.4105556,29.2229789],[-13.4592801,29.255586],[-13.4597392,29.2942023],[-13.5091254,29.2945638],[-13.5100581,29.3163453],[-13.5635382,29.3172941],[-13.5640564,29.2713764],[-13.5389228,29.2711956],[-13.5389747,29.2500375],[-13.5661293,29.2501279],[-13.5665956,29.2030039],[-13.5156549,29.2022349],[-13.5156549,29.1820579],[-13.5398038,29.1827819],[-13.5408921,29.137528],[-13.65782,29.1368528],[-13.713222,29.0935079],[-13.7663353,29.0934533],[-13.8502463,29.0165937],[-13.8518224,28.983425],[-13.8524443,28.914861],[-13.9013122,28.89245],[-13.9024005,28.8469779],[-13.800662,28.8456579]],[[1.6479916,38.9990693],[1.7321668,38.9993635],[1.7314703,39.0441733],[1.6489512,39.0431944],[1.6481552,39.1276358],[1.3948608,39.1265691],[1.3954412,39.0864199],[1.2281145,39.0852615],[1.2291095,39.0028958],[1.1448657,39.0018003],[1.1452803,38.8319988],[1.3113632,38.8331615],[1.3121924,38.7906483],[1.3946949,38.7916178],[1.3951924,38.7529597],[1.3112803,38.7519251],[1.3125919,38.6238804],[1.6489036,38.6251112],[1.6480745,38.7111504],[1.58456,38.7101152],[1.5811604,38.7005387],[1.5491544,38.7002798],[1.5197188,38.7092094],[1.50355,38.7253185],[1.4813282,38.9155064],[1.5518906,38.9254411],[1.5667328,38.9566554],[1.6487378,38.9583318],[1.6479916,38.9990693]],[[2.5450749,39.4166673],[2.43933,39.4161122],[2.438714,39.4846853],[2.439022,39.4993424],[2.3122308,39.4993424],[2.3119228,39.5417911],[2.2290722,39.5409994],[2.2283536,39.6260571],[2.3460076,39.6270851],[2.9270445,39.9601558],[3.1456647,39.9600498],[3.1460753,40.0019797],[3.2313899,40.0019797],[3.2312872,39.8329231],[3.1482313,39.8331596],[3.1484366,39.7935717],[3.4814817,39.7931773],[3.4803472,39.5959027],[3.3150618,39.4784606],[3.3146179,39.3785504],[3.0830178,39.2499355],[2.9798608,39.2501482],[2.9790395,39.3334971],[2.7287424,39.3334177],[2.7288451,39.4581361],[2.6456865,39.4577397],[2.6453785,39.4996593],[2.5452802,39.4994216],[2.5450749,39.4166673]],[[3.8120402,40.0434431],[3.729082,40.0437979],[3.7286185,39.9584155],[3.8126633,39.9576011],[3.8122771,39.9164393],[3.9608975,39.9159813],[4.1938142,39.791308],[4.3150279,39.7905799],[4.3159934,39.8329294],[4.3987393,39.8320396],[4.3973664,39.9185834],[4.3158003,39.9193274],[4.3161865,40.0433985],[4.2318959,40.0443594],[4.2324752,40.0847793],[4.1491501,40.086109],[4.1490623,40.1255157],[4.0627981,40.1272166],[4.0624217,40.0849941],[3.8128687,40.085294],[3.8120402,40.0434431]],[[-8.8910646,41.8228891],[-9.1092038,42.5751065],[-9.0365469,42.730656],[-9.0883419,42.7269569],[-9.1466113,42.7750272],[-9.2185488,42.9016271],[-9.2760988,42.8605106],[-9.3099094,42.9311297],[-9.2789763,42.9821991],[-9.3099094,43.0600377],[-9.2523594,43.1041725],[-9.2314975,43.1703151],[-9.1473307,43.210176],[-9.06748,43.1991644],[-9.0336694,43.2426748],[-8.99842,43.2447709],[-8.9998588,43.2955793],[-8.9372732,43.3055265],[-8.92936,43.326986],[-8.8638969,43.3290792],[-8.8761263,43.3740655],[-8.8221732,43.3735426],[-8.785485,43.3191358],[-8.7063538,43.305003],[-8.6099575,43.3296025],[-8.5509688,43.3233227],[-8.5243519,43.3364048],[-8.5250713,43.3646525],[-8.45745,43.3918416],[-8.3610538,43.4111803],[-8.3603344,43.4634161],[-8.3344369,43.5797394],[-8.2776063,43.5708796],[-8.0646713,43.7239184],[-7.9992081,43.7233986],[-7.9171994,43.7826357],[-7.8560525,43.7914643],[-7.83591,43.7374337],[-7.6628443,43.809819],[-7.3188932,43.6782695],[-7.1997467,43.5830817],[-6.2488228,43.6075032],[-6.1229322,43.5790105],[-5.8520425,43.6798953],[-5.6036334,43.5708672],[-5.2855347,43.5619084],[-5.1787525,43.4991591],[-4.9089869,43.4836655],[-4.6156167,43.4192021],[-4.1839917,43.4249168],[-3.8029478,43.5195394],[-3.7400025,43.4869277],[-3.5612827,43.5423572],[-3.1083013,43.3816347],[-2.9385737,43.4624573],[-2.7452417,43.4755094],[-2.3046245,43.3170625],[-1.9854018,43.3563045],[-1.8552841,43.3972545],[-1.769802,43.3964383],[-1.7700492,43.3760501],[-1.7100474,43.3756908],[-1.7113451,43.3312527],[-1.7225915,43.3131806],[-1.6890375,43.3129108],[-1.6881106,43.3341294],[-1.6446695,43.3337248],[-1.6449785,43.3133155],[-1.6029903,43.3129528],[-1.6034352,43.2926624],[-1.5635905,43.2921227],[-1.5630468,43.3133844],[-1.4779905,43.3128355],[-1.3667723,43.2761368],[-1.3568809,43.2381533],[-1.3703692,43.1712972],[-1.4423067,43.0833554],[-1.4198262,43.0603647],[-1.3730668,43.051166],[-1.3640746,43.1115893],[-1.3020285,43.135217],[-1.2354864,43.1332484],[-1.2795481,43.0774443],[-1.1923239,43.0649635],[-1.0061856,43.0077821],[-0.942341,42.9748951],[-0.7562028,42.9821318],[-0.7148387,42.9610774],[-0.6968543,42.9031405],[-0.5511809,42.8220693],[-0.5044215,42.8484456],[-0.4288871,42.8200906],[-0.3164848,42.8655842],[-0.1456332,42.810856],[-0.0314324,42.7124874],[0.1861785,42.7540985],[0.3021777,42.7177729],[0.3642238,42.7428729],[0.4487504,42.7144695],[0.6276949,42.7223973],[0.6411832,42.8576747],[0.7149192,42.882718],[0.9675996,42.8181119],[1.108777,42.7989808],[1.1753192,42.7342872],[1.3632559,42.7415521],[1.4113736,42.7093914],[1.4806054,42.7103407],[1.4813006,42.5010664],[1.6443591,42.5020345],[1.6432777,42.5424539],[1.730407,42.5434214],[1.7316429,42.5011803],[2.0638621,42.5016359],[2.0645572,42.4590247],[2.3969309,42.4599364],[2.3976786,42.4178363],[2.4804823,42.4179732],[2.4809767,42.3759441],[2.6447922,42.3762636],[2.6444832,42.4592447],[2.8113266,42.4596094],[2.8112648,42.5010358],[3.063878,42.5008535],[3.063878,42.4591535],[3.2307832,42.4593359],[3.2304935,42.3764363],[3.3141469,42.3760369],[3.3141243,42.3339864],[3.397855,42.3340435],[3.3973912,42.290094],[3.3138923,42.2908368],[3.3139695,42.2070151],[3.1475896,42.2073012],[3.1475896,42.1260612],[3.2305478,42.1260039],[3.2466753,41.9529359],[3.1945206,41.8558943],[3.060537,41.7647419],[2.7835777,41.6371796],[2.26293,41.4271601],[2.1649151,41.2989297],[1.86008,41.2232228],[1.3763003,41.116273],[1.1793714,41.0464585],[1.0858526,41.048493],[0.758537,40.8195599],[0.9114042,40.733761],[0.8781331,40.6751363],[0.6650182,40.5358666],[0.5580112,40.5502166],[0.433919,40.3757589],[0.2675635,40.1919192],[0.1641534,40.0647234],[0.0751307,40.0144671],[0.010387,39.8952188],[-0.0939224,39.8116904],[-0.1847435,39.6311716],[-0.2908513,39.5036254],[-0.2863552,39.333431],[-0.1856427,39.1774612],[-0.2135185,39.1558487],[-0.1110076,38.9722246],[0.0094878,38.8826835],[0.1218901,38.872183],[0.2342925,38.798636],[0.2558737,38.7264162],[0.0958128,38.6133825],[-0.0022021,38.6070586],[-0.0570544,38.5269073],[-0.2719677,38.4762395],[-0.379874,38.3931234],[-0.3834708,38.3381297],[-0.4509122,38.3310763],[-0.5048654,38.2830943],[-0.4823849,38.1948095],[-0.429331,38.1658287],[-0.4545091,38.148859],[-0.5839966,38.1721913],[-0.6136708,38.1198599],[-0.6370505,37.9612228],[-0.6811123,37.9456238],[-0.7323677,37.8810656],[-0.7215771,37.7830562],[-0.688306,37.7340026],[-0.6641461,37.6231485],[-0.7193941,37.5878413],[-0.9196258,37.5375806],[-1.1107098,37.5164093],[-1.3383246,37.5286671],[-1.4408917,37.3903714],[-1.6766966,37.2765189],[-1.8540816,36.9122889],[-2.0683486,36.6929117],[-2.2158766,36.6619233],[-2.3721861,36.7801753],[-2.6812926,36.6591056],[-2.9201476,36.6675585],[-3.09402,36.712625],[-3.4610839,36.6548788],[-3.7280395,36.6929117],[-4.3743529,36.6633322],[-4.6571151,36.4404171],[-4.9188018,36.4531321],[-5.1699508,36.3513541],[-5.2841094,36.1970201],[-5.2680911,36.1241812],[-5.3524784,36.1224654],[-5.3516094,36.0401413],[-5.4365759,36.0388921],[-5.4353207,36.0034384],[-5.6888562,36.0036518],[-5.6899635,36.0405317],[-5.85506,36.0385595],[-5.8566821,36.1242077],[-5.9384817,36.1221487],[-5.9400265,36.1655625],[-5.9983445,36.1645024],[-6.0357297,36.1780957],[-6.0775178,36.2224132],[-6.1506113,36.2864561],[-6.231541,36.3770075],[-6.3358504,36.5310643],[-6.3214629,36.5816265],[-6.404191,36.6234958],[-6.4743301,36.7489673],[-6.4158808,36.7993866],[-6.490516,36.9173818],[-6.6298949,37.0194012],[-6.8744824,37.1083766],[-7.0426363,37.1850699],[-7.2647434,37.1843535],[-7.3753473,37.1535419],[-7.408316,37.1682196],[-7.4202886,37.2118318],[-7.4249231,37.2350505],[-7.4380543,37.2451969],[-7.4459717,37.3326142],[-7.4480958,37.3909382],[-7.4696271,37.4075829],[-7.4647029,37.4530494],[-7.5019723,37.516411],[-7.5191587,37.5229203],[-7.5219588,37.5723727],[-7.4501271,37.6695835],[-7.4249019,37.7599222],[-7.316662,37.839974],[-7.268329,37.988952],[-7.1536786,38.0155235],[-7.1177098,38.0553626],[-7.0142997,38.0243785],[-6.9963153,38.1075633],[-6.9614706,38.201254],[-7.080617,38.1570753],[-7.3402665,38.4402363],[-7.2638329,38.7380741],[-7.0435243,38.8729667],[-7.0615086,38.907962],[-6.9693387,39.0198308],[-7.0008114,39.0887867],[-7.1536786,39.0957658],[-7.1525545,39.1602899],[-7.2447245,39.1968854],[-7.2559647,39.2813308],[-7.3368944,39.3535074],[-7.3279022,39.4559917],[-7.5144901,39.5886496],[-7.5527069,39.6795427],[-7.0502684,39.6752171],[-6.9951913,39.8195433],[-6.9221297,39.8790868],[-6.886161,40.0229854],[-7.0412762,40.1347927],[-7.0176717,40.266146],[-6.8086034,40.3450071],[-6.8681766,40.4451649],[-6.8535643,40.6066433],[-6.837828,40.8757589],[-6.9536024,41.0370445],[-6.8018592,41.0395879],[-6.7681385,41.138706],[-6.6411239,41.2655616],[-6.5624422,41.2630269],[-6.217367,41.5791017],[-6.3162811,41.644652],[-6.5152332,41.6412921],[-6.5871707,41.6883151],[-6.5478299,41.8559743],[-6.6298836,41.9112057],[-7.1334461,41.9404756],[-7.1682909,41.8718791],[-7.4256922,41.7847727],[-7.9539833,41.8459271],[-8.130455,41.7805819],[-8.2518495,41.9078597],[-8.1293309,42.0348842],[-8.2484774,42.1008034],[-8.3676239,42.0557521],[-8.6070409,42.0340493],[-8.8910646,41.8228891]]],"terms_text":"PNOA","best":true},{"id":"poco_das_trincheiras","name":"Poço das Trincheiras AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.23941602841,-9.35156513689],[-37.23946967259,-9.34386884913],[-37.23941602841,-9.3379191951],[-37.23954477444,-9.33022260582],[-37.23972716465,-9.32791465461],[-37.23973789349,-9.32280111197],[-37.23964133396,-9.32085307601],[-37.23970570698,-9.31864034808],[-37.2398022665,-9.31706284448],[-37.23982372418,-9.31561238186],[-37.24053182736,-9.30933403261],[-37.24051036968,-9.30003805717],[-37.24008121624,-9.29687228705],[-37.23998465672,-9.29546409248],[-37.2399202837,-9.29318767574],[-37.23988809719,-9.28977831694],[-37.23995247021,-9.28817950681],[-37.24008121624,-9.28641127785],[-37.24036016598,-9.28212302085],[-37.24038162365,-9.27896767726],[-37.24051036968,-9.27556876869],[-37.2400383009,-9.26978737192],[-37.24017777577,-9.26721430207],[-37.24017777577,-9.26612365361],[-37.23995247021,-9.26454591343],[-37.23983445301,-9.26150689057],[-37.24333205357,-9.26135864488],[-37.24936165943,-9.26146453466],[-37.26444640293,-9.26161278031],[-37.28016414776,-9.26171867001],[-37.2829429163,-9.26170808105],[-37.29580679074,-9.26178220382],[-37.30684676304,-9.26178220382],[-37.31418528691,-9.26188809348],[-37.32436695233,-9.26191986037],[-37.33078279629,-9.26175043692],[-37.33056821957,-9.27275220267],[-37.33048238888,-9.28006887422],[-37.33053603306,-9.28117006773],[-37.33068623677,-9.28427245005],[-37.3306969656,-9.28535245384],[-37.33064332142,-9.28616774861],[-37.33070769444,-9.28717362916],[-37.33064332142,-9.28769245062],[-37.33062186375,-9.29026537022],[-37.3304287447,-9.29308179553],[-37.33037510052,-9.29655464967],[-37.33034291401,-9.3059142435],[-37.33039655819,-9.31203384249],[-37.33037510052,-9.321943554],[-37.33040728703,-9.33420325643],[-37.33035364285,-9.34184682509],[-37.33029999867,-9.3478281711],[-37.33035364285,-9.35202034528],[-37.31508650913,-9.35193565539],[-37.300109054,-9.35190389668],[-37.29531326428,-9.351829793],[-37.28899397984,-9.35171334434],[-37.28497066632,-9.35181920676],[-37.27851190701,-9.35173451683],[-37.27430620327,-9.35180862052],[-37.27115192547,-9.35170275809],[-37.2635129942,-9.3516815856],[-37.26045527592,-9.35163924062],[-37.25401797428,-9.35176627555],[-37.24705495968,-9.35162865438],[-37.23941602841,-9.35156513689]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"route500","name":"Route 500","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"http://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"},{"id":"santana_do_ipanema","name":"Santana do Ipanema AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.20224124741,-9.41355941666],[-37.20188336806,-9.37768274195],[-37.20208218992,-9.37455390013],[-37.20192313243,-9.36732508877],[-37.20169448729,-9.36044924119],[-37.20172431057,-9.35500535669],[-37.20195295571,-9.35101312056],[-37.20191319134,-9.34772709331],[-37.20175413385,-9.3383494838],[-37.20170442839,-9.33505352761],[-37.20171436948,-9.33301315816],[-37.20141613669,-9.32833399659],[-37.20120737373,-9.3246946053],[-37.20116760936,-9.32350762581],[-37.21425008782,-9.32345857698],[-37.21537343133,-9.32339971838],[-37.22078138595,-9.32328200115],[-37.23727365933,-9.32313485456],[-37.25180753737,-9.32292884922],[-37.26559583344,-9.32276208291],[-37.28029871006,-9.32258550672],[-37.29190990675,-9.32244816963],[-37.29204908205,-9.33522028804],[-37.29304319135,-9.41219621023],[-37.28356932967,-9.41235312635],[-37.27789296554,-9.41250023515],[-37.27160025364,-9.4124904279],[-37.26505901441,-9.41261792215],[-37.26164921949,-9.4127356091],[-37.25498868715,-9.41275522359],[-37.2499087886,-9.41296117565],[-37.24616099652,-9.41297098289],[-37.24108109797,-9.41302982631],[-37.23460944639,-9.41320635652],[-37.22839626323,-9.41324558544],[-37.22164626105,-9.41335346495],[-37.21686459529,-9.41346134443],[-37.21291798135,-9.41343192276],[-37.20224124741,-9.41355941666]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Sao_miguel_dos_campos","name":"São Miguel dos Campos AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.14150176596,-9.83171289603],[-36.05047117688,-9.8324573223],[-36.04958641959,-9.74245778891],[-36.1405871854,-9.74166417216],[-36.14150176596,-9.83171289603]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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.549014,50.697922],[13.842514,50.711263],[13.93239,50.745042],[14.046138,50.79389],[14.252571,50.859532],[14.400023,50.889661],[14.426705,50.935703],[14.35649,50.971973],[14.325595,50.993191],[14.27504,50.990539],[14.315765,51.042662],[14.415471,51.012633],[14.519389,51.003797],[14.5882,50.981699],[14.544667,50.91977],[14.579775,50.906489],[14.647181,50.922426],[14.644373,50.909146],[14.605052,50.856873],[14.720205,50.817851],[14.810081,50.813415],[14.856423,50.890547],[14.912595,50.947206],[14.996853,51.086789],[15.053026,51.247932],[15.055834,51.292741],[14.99264,51.344524],[14.988427,51.398],[14.977193,51.45754],[14.909786,51.496025],[14.739865,51.537097],[14.739865,51.591221],[14.700545,51.60605],[14.67948,51.5982],[14.683693,51.578133],[14.673863,51.558056],[14.617691,51.557183],[14.583987,51.590349],[14.519389,51.569405],[14.435131,51.559802],[14.326999,51.52574],[14.13461,51.555437],[14.067203,51.499522],[14.027882,51.478536],[14.04333,51.45229],[13.995583,51.392743],[13.957667,51.405885],[13.888856,51.388362],[13.724552,51.374338],[13.554631,51.392743],[13.404371,51.45929],[13.352411,51.439161],[13.315899,51.443538],[13.286409,51.418147],[13.226024,51.400629],[13.213385,51.46104],[13.219002,51.526614],[13.174064,51.5982],[13.002739,51.677512],[12.905842,51.653123],[12.903033,51.66619],[12.853883,51.693183],[12.764007,51.659221],[12.688175,51.670545],[12.643237,51.629593],[12.577235,51.630464],[12.425569,51.610411],[12.230371,51.570278],[12.177007,51.530109],[12.139091,51.460165],[12.167177,51.417272],[12.174199,51.334874],[12.13207,51.318201],[12.186838,51.213637],[12.158751,51.188119],[12.220541,51.092963],[12.490168,51.054139],[12.521062,50.993191],[12.605321,50.972857],[12.626385,50.918885],[12.502806,50.910917],[12.237393,50.818738],[12.213519,50.729933],[12.286543,50.664999],[12.217732,50.646303],[12.133474,50.627599],[12.053428,50.563416],[12.019725,50.647193],[11.859634,50.548248],[11.876486,50.508076],[11.927041,50.505397],[11.936871,50.486637],[11.870869,50.441941],[11.934062,50.399888],[11.96917,50.339875],[12.120835,50.297732],[12.172794,50.306702],[12.185433,50.260938],[12.212115,50.253755],[12.257053,50.216029],[12.28233,50.156684],[12.355354,50.158483],[12.355354,50.22142],[12.414335,50.281582],[12.511232,50.347045],[12.537914,50.387354],[12.678345,50.402573],[12.712048,50.386459],[12.7289,50.396307],[12.756986,50.42584],[12.786476,50.433891],[12.817371,50.417787],[12.846861,50.436574],[12.947971,50.387354],[13.009761,50.414208],[13.046273,50.449989],[13.056103,50.48753],[13.214789,50.492891],[13.275174,50.566092],[13.341177,50.568768],[13.391732,50.613344],[13.477394,50.585711],[13.54761,50.634725],[13.568674,50.67212],[13.549014,50.697922]]],"terms_url":"https://geoportal.sachsen.de/md/cd01c334-7e32-482f-bd43-af286707178a","terms_text":"Staatsbetrieb Geobasisinformation und Vermessung Sachsen","best":true,"icon":"data:image/png;base64,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"},{"id":"Geodatastyrelsen_Denmark","name":"SDFE aerial imagery","type":"tms","template":"http://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg","scaleExtent":[0,21],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://download.kortforsyningen.dk/content/vilkaar-og-betingelser","terms_text":"Geodatastyrelsen og Danske Kommuner","best":true,"icon":"data:image/png;base64,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"},{"id":"sc2012","name":"SIG Santa Catarina OrtoRGB 2012","type":"wms","template":"http://sigsc.sc.gov.br:80/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","polygon":[[[-48.62488448156965,-26.916236931410996],[-48.624164193144196,-26.83408805760915],[-48.5616254665196,-26.83412188528322],[-48.5616507397977,-26.749193916956184],[-48.626754704148055,-26.74918263262303],[-48.627146439958395,-26.73276274152515],[-48.6412615657696,-26.732999746505616],[-48.641741758053236,-26.709116191945647],[-48.624138919866105,-26.709127480253297],[-48.624176829783245,-26.500792500209887],[-48.570989216050585,-26.500769882438657],[-48.57154522816848,-26.474145680246586],[-48.55418248612319,-26.47380633457661],[-48.55449840209926,-26.45735818142214],[-48.56154964668535,-26.457471312923715],[-48.56161282988055,-26.41746108634898],[-48.49909937653404,-26.417472403421797],[-48.49908673989502,-26.250810301340856],[-48.43663646974372,-26.250787634582515],[-48.43661119646563,-26.207520071408148],[-48.460102708446854,-26.20750873380981],[-48.46194765774716,-26.124204304592393],[-48.56161282988057,-26.12419295889107],[-48.56162546651964,-25.95753087401021],[-48.624113646588064,-25.95753087401021],[-48.624113646588064,-25.945066276881477],[-48.688383592761575,-25.94606622032166],[-48.68839622940061,-25.9575195121708],[-49.25089094312879,-25.9575195121708],[-49.25090357976782,-25.999198717680073],[-49.31339175983624,-25.999198717680073],[-49.31337912319721,-26.0825014166478],[-49.37590521318276,-26.082501416647776],[-49.37590521318275,-26.124192958891047],[-49.50093211987576,-26.124181613188597],[-49.50091948323672,-26.16585828693744],[-49.68661489397596,-26.165846945284223],[-49.68661489397595,-26.12417026748506],[-49.74906516412725,-26.082456017648312],[-49.74907780076631,-26.04084043378188],[-49.81160389075186,-26.040851787565785],[-49.811591254112805,-25.999176002051062],[-49.93656761424967,-25.99915328641767],[-49.9366055241668,-25.98244474858429],[-50.000913380257444,-25.982876406234503],[-50.00093865353552,-25.99915328641767],[-50.313379553877645,-25.999164644234927],[-50.313417463794764,-26.040829079996882],[-50.37411124111907,-26.04084043378188],[-50.374098604480025,-25.999198717680073],[-50.49913814781211,-25.999176002051062],[-50.49911287453402,-25.984137291872997],[-50.62593418397117,-25.984523506389962],[-50.62594682061022,-26.04084043378188],[-50.6883970907615,-26.041612488584164],[-50.68844763731769,-26.124158921780424],[-50.75093581738611,-26.124136230367803],[-50.750948454025156,-26.207520071408148],[-51.12595335426997,-26.207474721008193],[-51.12595335426997,-26.249132949280156],[-51.18847944425552,-26.249178283438034],[-51.31344316775333,-26.33244989854678],[-51.31346844103143,-26.624140013763412],[-51.436599851867975,-26.62415131048226],[-51.43658721522893,-26.56476034464233],[-51.62408966535135,-26.564104792996805],[-51.62411493862942,-26.540796365619084],[-51.99906929231806,-26.540796365619084],[-52.06158274566456,-26.49910746406482],[-52.06158274566456,-26.457471312923687],[-52.12408356237202,-26.457493939210668],[-52.12405828909395,-26.41578614733],[-52.374074192562865,-26.41579746456714],[-52.37408682920191,-26.391327004376254],[-52.56156400604623,-26.389402650121472],[-52.561576642685274,-26.374153838977676],[-52.624077459392744,-26.37416516029677],[-52.62409009603178,-26.332472549349774],[-53.124083993052494,-26.332472549349752],[-53.12409662969154,-26.317068980284002],[-53.16180436059632,-26.31650263355217],[-53.161362078229814,-26.290821564697215],[-53.18655953648188,-26.29083289416888],[-53.24907298982837,-26.24911028219455],[-53.24906035318934,-26.23919300812073],[-53.31158644317491,-26.23824090528976],[-53.374099896521415,-26.22882146785218],[-53.43844566252919,-26.227767259506184],[-53.43843302589015,-26.249144282821256],[-53.5616023466438,-26.249155616361257],[-53.56158971000477,-26.239827739008902],[-53.655012382450856,-26.238138893809616],[-53.656225499799,-26.292634266082075],[-53.67011316610744,-26.316842441923516],[-53.68846156599812,-26.33241592233391],[-53.70322116040052,-26.374097232365553],[-53.70928674714123,-26.384489741468975],[-53.70980484934199,-26.395684982214643],[-53.70619077057565,-26.407218680242053],[-53.70721433833813,-26.459270088862837],[-53.714379312675604,-26.461679725793857],[-53.714758411846894,-26.48118122161117],[-53.73046575417756,-26.49913008216322],[-53.73146404866198,-26.54080767056338],[-53.750962382705566,-26.540796365619055],[-53.75094974606652,-26.624173903916578],[-53.76019976584611,-26.624140013763338],[-53.761248606886696,-26.667499888848678],[-53.75097501934461,-26.66751118127877],[-53.75096238270559,-26.742976079662007],[-53.727369777612,-26.743404906944193],[-53.72132946414936,-26.749047220537665],[-53.72140528398363,-26.750931690893374],[-53.745705540863625,-26.759428345833868],[-53.746122549952055,-26.777040237532006],[-53.71948451484907,-26.77754790691426],[-53.720836635226696,-26.834155712947112],[-53.700466373089114,-26.834144437060257],[-53.70276624139493,-26.931075520284146],[-53.71167507192037,-26.930906526843206],[-53.712243720677314,-26.955565624612287],[-53.751000292622685,-26.954788421555175],[-53.75092447278844,-26.999147992456276],[-53.764673136067394,-26.999147992456276],[-53.80369507743266,-27.037513523530937],[-53.80454173224855,-27.0725803974359],[-53.80809262781969,-27.07249038098803],[-53.8086233666595,-27.09612846681215],[-53.82689594671591,-27.095768476254833],[-53.82761623514137,-27.124136682787803],[-53.846444827315686,-27.124125435915396],[-53.84764530802479,-27.170138168249487],[-53.8350592155378,-27.18931578625989],[-53.83536249487484,-27.200544291231996],[-53.688474202637146,-27.202837060128804],[-53.688486839276194,-27.227885858850012],[-53.43653753003366,-27.23245898831079],[-53.43655016667271,-27.167507452480596],[-53.37598275573884,-27.167507452480574],[-53.376008029016916,-27.233515163499888],[-53.24904771655028,-27.235638719456546],[-53.24904771655028,-27.209220599589166],[-53.06344076228435,-27.209175646364237],[-53.06345339892339,-27.233402804913485],[-52.8134754053716,-27.23685216181505],[-52.81346276873256,-27.276528928524463],[-52.750961952025094,-27.277315131338465],[-52.750961952025094,-27.292487755808434],[-52.438495778404864,-27.292521445488386],[-52.438483141765836,-27.326890821722227],[-52.37603287161454,-27.327530725463642],[-52.3759949616974,-27.33419897625023],[-52.25098069164342,-27.33417652490038],[-52.25099332828246,-27.346692446966557],[-52.18654646916235,-27.34727611465991],[-52.18657174244043,-27.334187750575865],[-52.12597905822849,-27.33419897625023],[-52.12599169486754,-27.364133804119422],[-52.02978896183197,-27.364885718492065],[-52.03035761058891,-27.424416622283772],[-51.97533768419499,-27.42478676693274],[-51.97603269934236,-27.50087558818674],[-51.93845133482801,-27.500853170691318],[-51.93845133482801,-27.54251940627202],[-51.688460704637194,-27.542474588252876],[-51.68847334127622,-27.55742038383185],[-51.599031210128736,-27.557902111020763],[-51.599233396353426,-27.59480956901105],[-51.563509617778415,-27.594977556358298],[-51.563484344500324,-27.625860453692134],[-51.500882434680506,-27.62586045369211],[-51.50094561787572,-27.667535190923896],[-51.43936727581839,-27.667501615740118],[-51.439544188765,-27.709317103607006],[-51.37596925773886,-27.70949610256912],[-51.376007167655985,-27.750892905814947],[-51.31349371430947,-27.750904088992016],[-51.313455804392355,-27.792531093204254],[-51.18846680761643,-27.792508735404642],[-51.1884794442555,-27.875860156488773],[-51.12597862754804,-27.875860156488773],[-51.12596599090898,-27.91751742532308],[-51.06347781084055,-27.91749509328296],[-51.06346517420149,-27.959192137382583],[-51.000951720854985,-28.00086192326361],[-50.93850145070369,-28.00086192326361],[-50.93848881406464,-28.16754693055966],[-50.813461907371625,-28.167524650369067],[-50.813449270732576,-28.292532475134653],[-50.750961090664134,-28.29251022102188],[-50.68844763731762,-28.334184014870516],[-50.68848554723476,-28.417538143267095],[-50.625997367166335,-28.4175159153423],[-50.56352182373695,-28.44094155830843],[-50.43848228040489,-28.44050820876798],[-50.438469643765856,-28.459173964550686],[-50.37596882705837,-28.459207293310225],[-50.37598146369743,-28.475537121198975],[-50.188441103657894,-28.474537408344325],[-50.188491650214054,-28.51143164845026],[-50.12398160789872,-28.51104300453612],[-50.124019517815846,-28.5008600237691],[-49.87597493003768,-28.500848918564397],[-49.876012839954804,-28.514196530962266],[-49.813474113330216,-28.513685754912284],[-49.813474113330194,-28.58255155550104],[-49.830028110476746,-28.582507169109398],[-49.829510008275975,-28.625974659050915],[-49.87589911020343,-28.66572089511971],[-50.0010018367307,-28.749145575544063],[-50.00100183673066,-29.04083327722487],[-50.03318735637359,-29.04081118145324],[-50.0321890618892,-29.147114336184],[-50.12601610678465,-29.14774341401082],[-50.12597819686752,-29.165786374753505],[-50.13612541801917,-29.16580844371222],[-50.18850428685308,-29.19622599157441],[-50.18850428685309,-29.31905095330294],[-50.14220364139895,-29.31873143173735],[-50.14207727500852,-29.334221566678927],[-50.126003470145626,-29.334177501353437],[-50.125990833506584,-29.362375414604447],[-49.99905579431803,-29.361527388076844],[-49.99904315767897,-29.24030824385708],[-49.9384757467451,-29.239856157941617],[-49.93851365666223,-29.25087104871457],[-49.87601283995477,-29.25087104871457],[-49.876000203315726,-29.300979886173586],[-49.82262303999743,-29.30051704853271],[-49.82226921410422,-29.3341885176866],[-49.81347411333018,-29.334221566678927],[-49.81353729652554,-29.34109552421944],[-49.6865390741418,-29.339905833968423],[-49.6865138008637,-29.29254930022262],[-49.62398771087813,-29.292516237731153],[-49.6239750742391,-29.2508489980658],[-49.56148689417066,-29.2508269474122],[-49.561448984253516,-29.167485670694504],[-49.49901135074126,-29.167463602096316],[-49.49902398738031,-29.0841871105079],[-49.43649789739473,-29.084176067267432],[-49.43651053403379,-29.04251254202398],[-49.374047627243456,-29.04247939890416],[-49.37402235396536,-28.959201357408347],[-49.31153417389693,-28.959168187563616],[-49.311521537257896,-28.9174874156231],[-49.248982810633294,-28.917498476687246],[-49.24897017399424,-28.875823083095714],[-49.18654517712104,-28.875845214103762],[-49.18653254048198,-28.83414203544581],[-49.12401908713548,-28.834175245265325],[-49.12400645049644,-28.79249965988945],[-49.06149299714994,-28.79246643678005],[-49.06145508723281,-28.750840644227264],[-48.99903009035959,-28.75085172301705],[-48.999030090359604,-28.709187170256886],[-48.936579820208316,-28.709176087050047],[-48.936579820208316,-28.667517104639387],[-48.87405373022276,-28.667506017020735],[-48.874041093583735,-28.625852646864526],[-48.74911528000304,-28.625852646864555],[-48.749115280003025,-28.54254072237745],[-48.68656391673939,-28.54252962156217],[-48.68657655337841,-28.33417289217185],[-48.62407573667094,-28.334161769471883],[-48.62406310003189,-28.08417545272023],[-48.561600193241524,-28.08417545272023],[-48.56158755660246,-27.959192137382715],[-48.49904882997788,-27.959158652239882],[-48.49903619333884,-27.915809010935423],[-48.56157491996342,-27.915797844739515],[-48.561600193241524,-27.875837815851458],[-48.4990235566998,-27.875860156488873],[-48.49902355669978,-27.834220385416636],[-48.4365732865485,-27.83417568697334],[-48.43661119646565,-27.62582686571355],[-48.374059833202004,-27.625849257700484],[-48.374047196562984,-27.50086437943969],[-48.3115716531336,-27.50086437943969],[-48.311533743216444,-27.24913190347051],[-48.43657328654852,-27.24913190347051],[-48.4365353766314,-27.209164408055255],[-48.374021923284864,-27.20919812297907],[-48.37404719656297,-27.16579857825554],[-48.43656064990947,-27.16579857825554],[-48.43656064990947,-27.12414792965919],[-48.49906146661692,-27.124125435915495],[-48.49907031973662,-27.086668577138795],[-48.500216139509774,-27.08666004891293],[-48.5003124938822,-27.082470514310543],[-48.561600193241524,-27.082481765368538],[-48.56158755660248,-27.04252214011793],[-48.49906146661693,-27.04252214011793],[-48.49906146661693,-26.999125473627824],[-48.56156228332439,-26.999125473627824],[-48.56157491996343,-26.915786222397905],[-48.62488448156965,-26.916236931410996]]],"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":"Slovakia-Historic-Maps","name":"Slovakia Historic Maps","type":"tms","template":"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png","scaleExtent":[0,12],"polygon":[[[16.8196949,47.4927236],[16.8196949,49.5030322],[22.8388318,49.5030322],[22.8388318,47.4927236],[16.8196949,47.4927236]]]},{"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","startDate":"2017-03-01T00:00:00.000Z","scaleExtent":[11,20],"polygon":[[[18.79273330201,47.37078533804],[18.791936169,47.37048036201],[18.79139114593,47.37063268281],[18.7901097,47.3717614],[18.7891647,47.3734529],[18.78721506824,47.37566027041],[18.7860339,47.37764910001],[18.7849824,47.3790513],[18.783695,47.3803226],[18.782665,47.3819499],[18.781399,47.3836789],[18.7793426,47.3871257],[18.776657,47.3893959],[18.764716,47.396699],[18.7616966,47.3996569],[18.7563102,47.4032821],[18.7583737,47.4065272],[18.75879657883,47.40776342073],[18.76199554897,47.41217224817],[18.7630394973,47.41315137445],[18.7659298,47.4147108],[18.7704058,47.4176575],[18.77247285488,47.41808545272],[18.7724806,47.4202978],[18.8086021,47.4404108],[18.8174212,47.435389],[18.8209188,47.4357228],[18.8280427,47.4375516],[18.8302099,47.4352584],[18.8358533,47.4375371],[18.8404882,47.4334586],[18.847655,47.4357228],[18.8510024,47.4328054],[18.8689996,47.4396086],[18.87361350924,47.43597176329],[18.87499181607,47.43342149293],[18.87386045593,47.43248349864],[18.8760377,47.4279677],[18.8605023,47.4230028],[18.8662101,47.4179794],[18.8724328,47.4108645],[18.8662959,47.4077278],[18.8696433,47.4047072],[18.86776892261,47.40207457802],[18.86509430105,47.40052438512],[18.87081279074,47.3983820654],[18.86772375423,47.39699336542],[18.86992005424,47.39655168559],[18.87648610191,47.39477958954],[18.87748924808,47.39494663392],[18.87866942005,47.39462343887],[18.88358322696,47.3899604942],[18.88290731029,47.3896699544],[18.88538567142,47.38530440107],[18.87747851924,47.38339390377],[18.88181296901,47.37604910406],[18.87914148883,47.37392756692],[18.88638345317,47.36922645965],[18.88205973224,47.36772957402],[18.87973157482,47.36640704749],[18.8746997507,47.36252284243],[18.87282220439,47.36136733615],[18.87027947025,47.36062605465],[18.86687842922,47.3585329683],[18.86234013156,47.35637438604],[18.85566679554,47.35199153827],[18.84873596744,47.34728120653],[18.83192388134,47.3384118486],[18.82497159557,47.34257772442],[18.81619540767,47.34925116493],[18.8107880743,47.35356882392],[18.80823461132,47.35599644336],[18.80645362453,47.35854023611],[18.80707589702,47.359019909],[18.80634633617,47.36021180457],[18.80465118007,47.36175250772],[18.80381433086,47.36335130305],[18.80054616504,47.36544732015],[18.79988097721,47.36617355102],[18.79416204336,47.36974865444],[18.79273330201,47.37078533804]],[[18.91871480064,47.4093812629],[18.91826418952,47.40997664498],[18.9206674488,47.41155945729],[18.92509845809,47.41372304121],[18.93473295288,47.41916790937],[18.94063381271,47.42241278301],[18.94981769638,47.41937843296],[18.95154503898,47.41749820965],[18.95689872818,47.41922598493],[18.95770339088,47.41877589767],[18.95755318717,47.41435467478],[18.9621129425,47.40506817222],[18.96266011314,47.40117592194],[18.96316436843,47.39903360927],[18.95446328239,47.3967314338],[18.95275739746,47.39526437993],[18.95201710777,47.39362297422],[18.95119098739,47.39356487042],[18.94692091064,47.39798783856],[18.94410995559,47.3984526281],[18.94161013679,47.39868502134],[18.93735078887,47.39633199249],[18.93617061691,47.39682584676],[18.93122462348,47.39999947627],[18.93120316581,47.40023186269],[18.92923978881,47.40204734624],[18.92561344223,47.40604845111],[18.92465857582,47.40635342305],[18.92293123321,47.40925782918],[18.91871480064,47.4093812629]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true},{"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","scaleExtent":[1,22],"polygon":[[[17.8396817,-32.7983384],[17.8893509,-32.6972835],[18.00364,-32.6982187],[18.0991679,-32.7485251],[18.2898747,-32.5526645],[18.2930182,-32.0487089],[18.105455,-31.6454966],[17.8529257,-31.3443951],[17.5480046,-30.902171],[17.4044506,-30.6374731],[17.2493704,-30.3991663],[16.9936977,-29.6543552],[16.7987996,-29.19437],[16.5494139,-28.8415949],[16.4498691,-28.691876],[16.4491046,-28.5515766],[16.6002551,-28.4825663],[16.7514057,-28.4486958],[16.7462192,-28.2458973],[16.8855148,-28.04729],[16.9929502,-28.0244005],[17.0529659,-28.0257086],[17.1007562,-28.0338839],[17.2011527,-28.0930546],[17.2026346,-28.2328424],[17.2474611,-28.2338215],[17.2507953,-28.198892],[17.3511919,-28.1975861],[17.3515624,-28.2442655],[17.4015754,-28.2452446],[17.4149122,-28.3489751],[17.4008345,-28.547997],[17.4526999,-28.5489733],[17.4512071,-28.6495106],[17.4983599,-28.6872054],[17.6028204,-28.6830048],[17.6499732,-28.6967928],[17.6525928,-28.7381457],[17.801386,-28.7381457],[17.9994276,-28.7560602],[18.0002748,-28.7956172],[18.1574507,-28.8718055],[18.5063811,-28.8718055],[18.6153564,-28.8295875],[18.9087513,-28.8277516],[19.1046973,-28.9488548],[19.1969071,-28.9378513],[19.243012,-28.8516164],[19.2314858,-28.802963],[19.2587296,-28.7009928],[19.4431493,-28.6973163],[19.5500289,-28.4958332],[19.6967264,-28.4939914],[19.698822,-28.4479358],[19.8507587,-28.4433291],[19.8497109,-28.4027818],[19.9953605,-28.399095],[19.9893671,-24.7497859],[20.2916682,-24.9192346],[20.4724562,-25.1501701],[20.6532441,-25.4529449],[20.733265,-25.6801957],[20.8281046,-25.8963498],[20.8429232,-26.215851],[20.6502804,-26.4840868],[20.6532441,-26.8204869],[21.0889134,-26.846933],[21.6727695,-26.8389998],[21.7765003,-26.6696268],[21.9721069,-26.6431395],[22.2803355,-26.3274702],[22.5707817,-26.1333967],[22.7752795,-25.6775246],[23.0005235,-25.2761948],[23.4658301,-25.2735148],[23.883717,-25.597366],[24.2364017,-25.613402],[24.603905,-25.7896563],[25.110704,-25.7389432],[25.5078447,-25.6855376],[25.6441766,-25.4823781],[25.8419267,-24.7805437],[25.846641,-24.7538456],[26.3928487,-24.6332894],[26.4739066,-24.5653312],[26.5089966,-24.4842437],[26.5861946,-24.4075775],[26.7300635,-24.3014458],[26.8567384,-24.2499463],[26.8574402,-24.1026901],[26.9215471,-23.8990957],[26.931831,-23.8461891],[26.9714827,-23.6994344],[27.0006074,-23.6367644],[27.0578041,-23.6052574],[27.1360547,-23.5203437],[27.3339623,-23.3973792],[27.5144057,-23.3593929],[27.5958145,-23.2085465],[27.8098634,-23.0994957],[27.8828506,-23.0620496],[27.9382928,-22.9496487],[28.0407556,-22.8255118],[28.2056786,-22.6552861],[28.3397223,-22.5639374],[28.4906093,-22.560697],[28.6108769,-22.5400248],[28.828175,-22.4550173],[28.9285324,-22.4232328],[28.9594116,-22.3090081],[29.0162574,-22.208335],[29.2324117,-22.1693453],[29.3531213,-22.1842926],[29.6548952,-22.1186426],[29.7777102,-22.1361956],[29.9292989,-22.1849425],[30.1166795,-22.2830348],[30.2563377,-22.2914767],[30.3033582,-22.3395204],[30.5061784,-22.3057617],[30.8374279,-22.284983],[31.0058599,-22.3077095],[31.1834152,-22.3232913],[31.2930586,-22.3674647],[31.5680579,-23.1903385],[31.5568311,-23.4430809],[31.6931122,-23.6175209],[31.7119696,-23.741136],[31.7774743,-23.8800628],[31.8886337,-23.9481098],[31.9144386,-24.1746736],[31.9948307,-24.3040878],[32.0166656,-24.4405988],[32.0077331,-24.6536578],[32.019643,-24.9140701],[32.035523,-25.0849767],[32.019643,-25.3821442],[31.9928457,-25.4493771],[31.9997931,-25.5165725],[32.0057481,-25.6078978],[32.0057481,-25.6624806],[31.9362735,-25.8403721],[31.9809357,-25.9546537],[31.8687838,-26.0037251],[31.4162062,-25.7277683],[31.3229117,-25.7438611],[31.2504595,-25.8296526],[31.1393001,-25.9162746],[31.1164727,-25.9912361],[30.9656135,-26.2665756],[30.8921689,-26.3279703],[30.8534616,-26.4035568],[30.8226943,-26.4488849],[30.8022583,-26.5240694],[30.8038369,-26.8082089],[30.9020939,-26.7807451],[30.9100338,-26.8489495],[30.9824859,-26.9082627],[30.976531,-27.0029222],[31.0034434,-27.0441587],[31.1543322,-27.1980416],[31.5015607,-27.311117],[31.9700183,-27.311117],[31.9700183,-27.120472],[31.9769658,-27.050664],[32.0002464,-26.7983892],[32.1069826,-26.7984645],[32.3114546,-26.8479493],[32.899986,-26.8516059],[32.886091,-26.9816971],[32.709427,-27.4785436],[32.6240724,-27.7775144],[32.5813951,-28.07479],[32.5387178,-28.2288046],[32.4275584,-28.5021568],[32.3640388,-28.5945699],[32.0702603,-28.8469827],[31.9878832,-28.9069497],[31.7764818,-28.969487],[31.4638459,-29.2859343],[31.359634,-29.3854348],[31.1680825,-29.6307408],[31.064863,-29.7893535],[31.0534493,-29.8470469],[31.0669933,-29.8640319],[31.0455459,-29.9502017],[30.9518556,-30.0033946],[30.8651833,-30.1024093],[30.7244725,-30.392502],[30.3556256,-30.9308873],[30.0972364,-31.2458274],[29.8673136,-31.4304296],[29.7409393,-31.5014699],[29.481312,-31.6978686],[28.8943171,-32.2898903],[28.5497137,-32.5894641],[28.1436499,-32.8320732],[28.0748735,-32.941689],[27.8450942,-33.082869],[27.3757956,-33.3860685],[26.8805407,-33.6458951],[26.5916871,-33.7480756],[26.4527308,-33.7935795],[26.206754,-33.7548943],[26.0077897,-33.7223961],[25.8055494,-33.7524272],[25.7511073,-33.8006512],[25.6529079,-33.8543597],[25.6529079,-33.9469768],[25.7195789,-34.0040115],[25.7202807,-34.0511235],[25.5508915,-34.063151],[25.3504571,-34.0502627],[25.2810609,-34.0020322],[25.0476316,-33.9994588],[24.954724,-34.0043594],[24.9496586,-34.1010363],[24.8770358,-34.1506456],[24.8762914,-34.2005281],[24.8532574,-34.2189562],[24.7645287,-34.2017946],[24.5001356,-34.2003254],[24.3486733,-34.1163824],[24.1988819,-34.1019039],[23.9963377,-34.0514443],[23.8017509,-34.0524332],[23.7493589,-34.0111855],[23.4973536,-34.009014],[23.4155191,-34.0434586],[23.4154284,-34.1140433],[22.9000853,-34.0993009],[22.8412418,-34.0547911],[22.6470321,-34.0502627],[22.6459843,-34.0072768],[22.570016,-34.0064081],[22.5050499,-34.0645866],[22.2519968,-34.0645866],[22.2221334,-34.1014701],[22.1621197,-34.1057019],[22.1712431,-34.1521766],[22.1576913,-34.2180897],[22.0015632,-34.2172232],[21.9496952,-34.3220009],[21.8611528,-34.4007145],[21.5614708,-34.4020114],[21.5468011,-34.3661242],[21.501744,-34.3669892],[21.5006961,-34.4020114],[21.4194886,-34.4465247],[21.1978706,-34.4478208],[21.0988193,-34.3991325],[21.0033746,-34.3753872],[20.893192,-34.3997115],[20.8976647,-34.4854003],[20.7446802,-34.4828092],[20.5042011,-34.486264],[20.2527197,-34.701477],[20.0803502,-34.8361855],[19.9923317,-34.8379056],[19.899074,-34.8275845],[19.8938348,-34.7936018],[19.5972963,-34.7961833],[19.3929677,-34.642015],[19.2877095,-34.6404784],[19.2861377,-34.5986563],[19.3474363,-34.5244458],[19.3285256,-34.4534372],[19.098001,-34.449981],[19.0725583,-34.3802371],[19.0023531,-34.3525593],[18.9520568,-34.3949373],[18.7975006,-34.3936403],[18.7984174,-34.1016376],[18.501748,-34.1015292],[18.4999545,-34.3616945],[18.4477325,-34.3620007],[18.4479944,-34.3522691],[18.3974362,-34.3514041],[18.3971742,-34.3022959],[18.3565705,-34.3005647],[18.3479258,-34.2020436],[18.2972095,-34.1950274],[18.2951139,-33.9937138],[18.3374474,-33.9914079],[18.3476638,-33.8492427],[18.3479258,-33.781555],[18.4124718,-33.7448849],[18.3615477,-33.6501624],[18.2992013,-33.585591],[18.2166839,-33.448872],[18.1389858,-33.3974083],[17.9473472,-33.1602647],[17.8855247,-33.0575732],[17.8485884,-32.9668505],[17.8396817,-32.8507302],[17.8396817,-32.7983384]]],"best":true},{"id":"South-Tyrol-Orthofoto2011","name":"South Tyrol Orthofoto 2011","type":"tms","template":"http://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","scaleExtent":[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":"http://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":"http://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","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":"http://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-Orthofoto-2014-2015","name":"South Tyrol Orthofoto 2014/2015","type":"tms","template":"http://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","scaleExtent":[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":"http://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":"http://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","scaleExtent":[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":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano","description":"Topographical basemap of South Tyrol"},{"id":"Bern-bern2016-tms","name":"Stadt Bern 10cm (2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.2943145,46.9237564],[7.2982665,46.9274715],[7.3061586,46.9309487],[7.3043338,46.9362344],[7.3068603,46.9403709],[7.3246431,46.9432765],[7.3284525,46.946409],[7.3414051,46.9460797],[7.3438454,46.9473713],[7.3434554,46.9487937],[7.3513567,46.9485481],[7.3505628,46.950213],[7.3530901,46.9519266],[7.3582028,46.9511773],[7.3685031,46.9566244],[7.3715097,46.9607339],[7.37503,46.959835],[7.3785111,46.9614686],[7.3806232,46.9654741],[7.3832097,46.9663014],[7.3937998,46.9669268],[7.4000528,46.9691779],[7.4082922,46.9686857],[7.4281713,46.9738041],[7.4327053,46.972689],[7.4353602,46.9684345],[7.4378522,46.9684302],[7.4412474,46.9767865],[7.4456893,46.9747939],[7.4483835,46.9756393],[7.4477006,46.9790125],[7.4440468,46.9780682],[7.4412738,46.9798224],[7.4506732,46.9901527],[7.4522112,46.9896803],[7.454649,46.9778182],[7.4680382,46.9758258],[7.4707923,46.969998],[7.4701907,46.9674116],[7.4781618,46.9711823],[7.4845237,46.9701571],[7.4861275,46.9679018],[7.4857945,46.9646828],[7.4784708,46.9629043],[7.4802865,46.9606768],[7.4789304,46.9587841],[7.4797786,46.9566019],[7.4770135,46.9544586],[7.4840504,46.9499938],[7.4833925,46.9451977],[7.4955563,46.9396169],[7.4935119,46.9376594],[7.4908036,46.9387617],[7.4894997,46.9368667],[7.4766667,46.9369496],[7.4781093,46.9362489],[7.4746986,46.9339187],[7.4753537,46.9329898],[7.4691047,46.9292427],[7.4707683,46.9255044],[7.4585674,46.934836],[7.4476373,46.9304297],[7.435418,46.9349668],[7.4338022,46.9331237],[7.4376403,46.9307415],[7.4146941,46.9368183],[7.413844,46.9315682],[7.4070798,46.9303824],[7.408065,46.9256296],[7.4021268,46.9241992],[7.4014835,46.9211927],[7.3875736,46.9304506],[7.3823129,46.927282],[7.3800187,46.9298929],[7.3808694,46.9324085],[7.3748669,46.9314306],[7.3748901,46.9327104],[7.368066,46.9323929],[7.3683058,46.930426],[7.3604074,46.9285884],[7.3605592,46.9272018],[7.338783,46.9245357],[7.3393683,46.9196675],[7.3274574,46.9190326],[7.3269178,46.9235974],[7.324374,46.9251891],[7.3082264,46.9222857],[7.2943145,46.9237564]]],"terms_text":"Orthophoto 2016, Vermessungsamt Stadt Bern ","best":true},{"id":"Uster-2008","name":"Stadt Uster Orthophoto 2008 10cm","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.6,47.31],[8.6,47.39],[8.77,47.39],[8.77,47.31],[8.6,47.31]]],"terms_text":"Stadt Uster Vermessung Orthophoto 2008"},{"id":"Zuerich-zh_luftbild2011-tms","name":"Stadt Zürich Luftbild 2011","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4441,47.3141],[8.4441,47.4411],[8.6284,47.4411],[8.6284,47.3141],[8.4441,47.3141]]],"terms_text":"Stadt Zürich Luftbild 2011"},{"id":"Zuerich-city_map","name":"Stadtplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"stamen-terrain-background","name":"Stamen Terrain","type":"tms","template":"http://{switch:a,b,c,d}.tile.stamen.com/terrain-background/{zoom}/{x}/{y}.jpg","scaleExtent":[4,18],"terms_url":"http://maps.stamen.com/#terrain","terms_text":"Map tiles by Stamen Design, under CC BY 3.0"},{"id":"Stevns_Denmark","name":"Stevns","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/stevns/2009/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[12.0913942,55.3491574],[12.0943104,55.3842256],[12.1573875,55.3833103],[12.1587287,55.4013326],[12.1903468,55.400558],[12.1931411,55.4364665],[12.2564251,55.4347995],[12.2547073,55.4168882],[12.3822489,55.4134349],[12.3795942,55.3954143],[12.4109213,55.3946958],[12.409403,55.3766417],[12.4407807,55.375779],[12.4394142,55.3578314],[12.4707413,55.3569971],[12.4629475,55.2672214],[12.4315633,55.2681491],[12.430045,55.2502103],[12.3672011,55.2519673],[12.3656858,55.2340267],[12.2714604,55.2366031],[12.2744467,55.272476],[12.2115654,55.2741475],[12.2130078,55.2920322],[12.1815665,55.2928638],[12.183141,55.3107091],[12.2144897,55.3100981],[12.2159927,55.3279764],[12.1214458,55.3303379],[12.1229489,55.3483291],[12.0913942,55.3491574]]],"terms_text":"Stevns Kommune"},{"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","scaleExtent":[8,21],"polygon":[[[-0.752478,51.0821941],[-0.7595183,51.0856254],[-0.8014342,51.1457917],[-0.8398864,51.1440686],[-0.8357665,51.1802397],[-0.8529549,51.2011266],[-0.8522683,51.2096231],[-0.8495217,51.217903],[-0.8266907,51.2403696],[-0.8120995,51.2469248],[-0.7736474,51.2459577],[-0.7544213,51.2381127],[-0.754078,51.233921],[-0.7446366,51.2333836],[-0.7430693,51.2847178],[-0.751503,51.3069524],[-0.7664376,51.3121032],[-0.7820588,51.3270157],[-0.7815438,51.3388135],[-0.7374268,51.3720456],[-0.7192307,51.3769748],[-0.6795769,51.3847961],[-0.6807786,51.3901523],[-0.6531411,51.3917591],[-0.6301385,51.3905808],[-0.6291085,51.3970074],[-0.6234437,51.3977572],[-0.613144,51.4295552],[-0.6002471,51.4459121],[-0.5867081,51.4445365],[-0.5762368,51.453202],[-0.5626755,51.4523462],[-0.547741,51.4469972],[-0.5372697,51.4448575],[-0.537098,51.4526671],[-0.5439644,51.4545926],[-0.5405312,51.4698865],[-0.5309182,51.4760881],[-0.5091172,51.4744843],[-0.5086022,51.4695657],[-0.4900628,51.4682825],[-0.4526406,51.4606894],[-0.4486924,51.4429316],[-0.4414826,51.4418616],[-0.4418259,51.4369394],[-0.4112702,51.4380095],[-0.4014855,51.4279498],[-0.3807145,51.4262372],[-0.3805428,51.4161749],[-0.3491288,51.4138195],[-0.3274994,51.4037544],[-0.3039818,51.3990424],[-0.3019219,51.3754747],[-0.309475,51.369688],[-0.3111916,51.3529669],[-0.2955704,51.3541462],[-0.2923089,51.3673303],[-0.2850991,51.3680805],[-0.2787476,51.3771891],[-0.2655297,51.3837247],[-0.2411538,51.3847961],[-0.2123147,51.3628288],[-0.2107697,51.3498578],[-0.190857,51.3502867],[-0.1542931,51.3338802],[-0.1496583,51.3057719],[-0.1074296,51.2966491],[-0.0887185,51.3099571],[-0.0878602,51.3220811],[-0.0652009,51.3215448],[-0.0641709,51.3264793],[-0.0519829,51.3263721],[-0.0528412,51.334631],[-0.0330779,51.3430876],[0.0019187,51.3376339],[0.0118751,51.3281956],[0.013935,51.2994398],[0.0202865,51.2994398],[0.0240631,51.3072743],[0.0331611,51.3086694],[0.0455207,51.30545],[0.0523872,51.2877392],[0.0616569,51.2577764],[0.0640602,51.2415518],[0.0462074,51.2126342],[0.0407142,51.2109136],[0.0448341,51.1989753],[0.0494689,51.1997283],[0.0558204,51.1944573],[0.0611419,51.1790713],[0.0623435,51.1542061],[0.0577087,51.1417146],[0.0204582,51.1365447],[-0.0446015,51.1336364],[-0.1566964,51.1352522],[-0.1572114,51.1290043],[-0.2287942,51.1183379],[-0.2473336,51.1183379],[-0.2500802,51.1211394],[-0.299347,51.1137042],[-0.3221779,51.1119799],[-0.3223496,51.1058367],[-0.3596001,51.1019563],[-0.3589135,51.1113333],[-0.3863793,51.1117644],[-0.3869014,51.1062516],[-0.4281001,51.0947174],[-0.4856784,51.0951554],[-0.487135,51.0872266],[-0.5297404,51.0865404],[-0.5302259,51.0789914],[-0.61046,51.076551],[-0.6099745,51.080669],[-0.6577994,51.0792202],[-0.6582849,51.0743394],[-0.6836539,51.0707547],[-0.6997979,51.070831],[-0.7296581,51.0744919],[-0.752478,51.0821941]]]},{"id":"Szeged_2011","name":"Szeged orthophoto 2011","type":"tms","template":"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png","scaleExtent":[10,22],"polygon":[[[20.1459914,46.2281144],[20.1332261,46.2290431],[20.1258373,46.2298686],[20.122329,46.2309893],[20.1208484,46.2317537],[20.1189709,46.2335126],[20.1131237,46.2413638],[20.1120293,46.2433005],[20.1115733,46.2449996],[20.1111871,46.247092],[20.1112944,46.2487725],[20.1115948,46.2509686],[20.1122171,46.2528047],[20.1129949,46.2542681],[20.1135421,46.2553549],[20.1147705,46.2567977],[20.1352251,46.2768529],[20.1366386,46.2775055],[20.1378939,46.2780301],[20.1393932,46.2783508],[20.1408818,46.2784583],[20.1611494,46.278159],[20.1621093,46.2781579],[20.1635894,46.277702],[20.1661777,46.2761484],[20.1687795,46.2738569],[20.1696108,46.2714413],[20.1695895,46.2704465],[20.1700871,46.2704418],[20.1739897,46.2643295],[20.1766182,46.2582878],[20.1947983,46.25492],[20.1858719,46.2448077],[20.1846595,46.2453122],[20.1780371,46.2383112],[20.1781766,46.2377101],[20.1795258,46.2370961],[20.1725666,46.2300241],[20.1698349,46.2350404],[20.1687701,46.2362946],[20.1670262,46.2378475],[20.1659431,46.2387342],[20.1654408,46.2389988],[20.1654837,46.2389988],[20.1635177,46.2401383],[20.1602051,46.2412003],[20.1592684,46.241531],[20.1592684,46.2415751],[20.1583504,46.2418505],[20.1549473,46.2422869],[20.1510796,46.2351538],[20.1493804,46.232459],[20.1459914,46.2281144]]],"terms_url":"http://www.geo.u-szeged.hu/","terms_text":"SZTE TFGT - University of Szeged","best":true},{"id":"teotonio_vilela","name":"Teotonio Vilela AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.31163860301,-9.95467712399],[-36.31157895645,-9.94381824983],[-36.31144972224,-9.93197001342],[-36.31127078257,-9.92436145686],[-36.31123101819,-9.91847621012],[-36.31119125382,-9.91637081332],[-36.31140995787,-9.91323717443],[-36.31110178398,-9.90922215583],[-36.3110819018,-9.90317994983],[-36.31099243196,-9.8937883586],[-36.31089302103,-9.88420062824],[-36.31078366901,-9.87412292696],[-36.31068425808,-9.86457379995],[-36.33179913972,-9.86431915278],[-36.34001048258,-9.8643681234],[-36.34780429953,-9.86425059389],[-36.35916696889,-9.86420162324],[-36.37046999169,-9.86404491714],[-36.38447699181,-9.86385882853],[-36.40163531841,-9.86364335739],[-36.40221190181,-9.92250090776],[-36.40249025242,-9.9317741712],[-36.40258966335,-9.94183051783],[-36.40248031132,-9.94803846834],[-36.402659251,-9.95369797972],[-36.38550092439,-9.95384485155],[-36.38282677036,-9.95392318316],[-36.37095710525,-9.95399172331],[-36.36231829539,-9.95422671799],[-36.34746630237,-9.95421692655],[-36.33287277777,-9.9544617125],[-36.32909516241,-9.95455962683],[-36.32089376064,-9.95458900112],[-36.31163860301,-9.95467712399]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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","scaleExtent":[0,20],"polygon":[[[-99.9985439,34.5601834],[-95.55654502453,33.99257450647],[-93.89679027134,33.61039304449],[-93.98468089634,32.04103124103],[-93.41613841587,31.02505269211],[-93.74531484297,29.57268254375],[-96.50492070332,28.23158511753],[-97.36942054453,26.95467452634],[-97.04866958924,25.80530249434],[-99.0734177889,26.32559221139],[-100.76599193149,29.02531904433],[-102.3315436893,29.8433892263],[-103.13354564242,28.88112103669],[-104.2887874222,29.28831477845],[-104.7269783935,29.94815782859],[-104.72696778796,30.23535241761],[-106.53450082091,31.78456647831],[-106.75767043939,31.78457253947],[-106.75766067978,32.04385536686],[-106.61848436611,32.04385159755],[-103.11949492759,32.04375683439],[-103.09544343487,36.50045758762],[-103.05798056071,36.54268645422],[-100.00042146824,36.54222227302],[-99.9985439,34.5601834]]],"terms_url":"https://tnris.org/maps-and-data/online-mapping-services/"},{"id":"tf-landscape","name":"Thunderforest Landscape","type":"tms","template":"https://{switch:a,b,c}.tile.thunderforest.com/landscape/{zoom}/{x}/{y}.png","scaleExtent":[0,22],"terms_url":"http://www.thunderforest.com/terms/","terms_text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},{"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","scaleExtent":[0,22],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-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":"data:image/png;base64,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","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","scaleExtent":[15,22],"polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"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.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"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.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"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.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"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.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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":"http://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","startDate":"2013-09-01T00:00:00.000Z","polygon":[[[18.9173064,47.4085354],[18.9169121,47.4084901],[18.9160618,47.4088477],[18.9156514,47.4090528],[18.9145812,47.4093813],[18.913849,47.4097008],[18.9137605,47.4097607],[18.9131436,47.4103815],[18.9122048,47.4109805],[18.9104104,47.4117465],[18.9093161,47.4125778],[18.9084095,47.4131731],[18.9067599,47.4144328],[18.90481,47.4156797],[18.9036191,47.4159737],[18.9031738,47.4161643],[18.9006203,47.417422],[18.9004192,47.4175527],[18.8996789,47.4179738],[18.8988796,47.4181843],[18.898142,47.4183495],[18.897517,47.4185509],[18.896656,47.4190083],[18.8958004,47.4195436],[18.8942072,47.4205001],[18.8905513,47.4220862],[18.8874319,47.4233166],[18.8855383,47.4242421],[18.8843554,47.4247611],[18.8818851,47.4255287],[18.8808498,47.4259805],[18.8801014,47.4262872],[18.879557,47.4264922],[18.8774098,47.4273787],[18.8760151,47.4278868],[18.8750763,47.4283585],[18.8728072,47.4293384],[18.8716377,47.4296795],[18.8713963,47.4300061],[18.8725872,47.4323032],[18.8727321,47.4327822],[18.8727374,47.4332431],[18.872437,47.4348216],[18.8720562,47.4352642],[18.8689126,47.4371221],[18.8656135,47.4374994],[18.864664,47.4377353],[18.8640364,47.4380909],[18.8637762,47.4379113],[18.8634034,47.4378423],[18.8630037,47.437982],[18.8519503,47.4471521],[18.8521703,47.4484689],[18.8592969,47.4538685],[18.8583876,47.4551181],[18.857768,47.4556839],[18.8571779,47.4559977],[18.8571967,47.456355],[18.860151,47.4583903],[18.8619415,47.4594978],[18.8609867,47.4607128],[18.8597904,47.4620076],[18.8592862,47.4623594],[18.8585941,47.4627221],[18.8571297,47.4633313],[18.8563411,47.4636033],[18.8562821,47.4640277],[18.857194,47.4652825],[18.8566254,47.4655073],[18.8565288,47.4658047],[18.8569285,47.4665563],[18.8583635,47.4695253],[18.8582641,47.4698029],[18.8582669,47.4699079],[18.8583834,47.4701931],[18.8584438,47.4702729],[18.8585189,47.4703264],[18.8586221,47.4703609],[18.8587348,47.4703763],[18.8589011,47.4703609],[18.8614614,47.469732],[18.8627677,47.469286],[18.8661674,47.4678491],[18.8679403,47.4665581],[18.8699654,47.4652435],[18.8708009,47.4645698],[18.8726784,47.4633259],[18.8753606,47.4611281],[18.8768734,47.4592711],[18.8894261,47.4598659],[18.8902415,47.4598804],[18.9037116,47.4553357],[18.9042733,47.455203],[18.9049332,47.4550579],[18.9054213,47.4551014],[18.9056735,47.4550543],[18.9062877,47.4547659],[18.9064835,47.4545301],[18.9065968,47.4544712],[18.9067819,47.454395],[18.9081149,47.4539888],[18.9083731,47.4539507],[18.9089048,47.4538437],[18.9095419,47.4536959],[18.9132587,47.4531717],[18.9135296,47.4532043],[18.9137201,47.4531717],[18.9138649,47.4530738],[18.9143117,47.4529381],[18.9159773,47.4529961],[18.9180668,47.4531666],[18.9184637,47.4529997],[18.9190324,47.4516141],[18.9217253,47.4508015],[18.9224602,47.450689],[18.9241768,47.4502537],[18.9275564,47.4498946],[18.9297237,47.4495064],[18.9322127,47.4492199],[18.9334694,47.4493242],[18.9392093,47.4493532],[18.9422885,47.4490339],[18.945491,47.4488961],[18.9482617,47.4487002],[18.9500347,47.4482413],[18.954699,47.4472183],[18.9574899,47.4469162],[18.958025,47.4471475],[18.9584434,47.4470822],[18.9587666,47.4466623],[18.9614488,47.4393046],[18.9636804,47.4357995],[18.9659764,47.432882],[18.9689912,47.4296958],[18.9701003,47.4270366],[18.9700922,47.4267935],[18.9669541,47.424605],[18.9573531,47.4184193],[18.9567603,47.4184012],[18.9560576,47.418129],[18.9538513,47.4173936],[18.9514447,47.4166549],[18.9513133,47.4166426],[18.9326981,47.4170333],[18.9325733,47.4169625],[18.9320101,47.4167393],[18.9314857,47.4163972],[18.9311357,47.4161158],[18.9212291,47.4109106],[18.9195742,47.4098705],[18.9192684,47.4096109],[18.9173064,47.4085354]]],"terms_url":"http://www.torokbalint.hu/","terms_text":"Törökbálint"},{"id":"Torokbalint-orthophoto-2015","name":"Törökbálint orthophoto 2015","type":"wms","template":"http://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","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[18.9173064,47.4085354],[18.9169121,47.4084901],[18.9160618,47.4088477],[18.9156514,47.4090528],[18.9145812,47.4093813],[18.913849,47.4097008],[18.9137605,47.4097607],[18.9131436,47.4103815],[18.9122048,47.4109805],[18.9104104,47.4117465],[18.9093161,47.4125778],[18.9084095,47.4131731],[18.9067599,47.4144328],[18.90481,47.4156797],[18.9036191,47.4159737],[18.9031738,47.4161643],[18.9006203,47.417422],[18.9004192,47.4175527],[18.8996789,47.4179738],[18.8988796,47.4181843],[18.898142,47.4183495],[18.897517,47.4185509],[18.896656,47.4190083],[18.8958004,47.4195436],[18.8942072,47.4205001],[18.8905513,47.4220862],[18.8874319,47.4233166],[18.8855383,47.4242421],[18.8843554,47.4247611],[18.8818851,47.4255287],[18.8808498,47.4259805],[18.8801014,47.4262872],[18.879557,47.4264922],[18.8774098,47.4273787],[18.8760151,47.4278868],[18.8750763,47.4283585],[18.8728072,47.4293384],[18.8716377,47.4296795],[18.8713963,47.4300061],[18.8725872,47.4323032],[18.8727321,47.4327822],[18.8727374,47.4332431],[18.872437,47.4348216],[18.8720562,47.4352642],[18.8689126,47.4371221],[18.8656135,47.4374994],[18.864664,47.4377353],[18.8640364,47.4380909],[18.8637762,47.4379113],[18.8634034,47.4378423],[18.8630037,47.437982],[18.8519503,47.4471521],[18.8521703,47.4484689],[18.8592969,47.4538685],[18.8583876,47.4551181],[18.857768,47.4556839],[18.8571779,47.4559977],[18.8571967,47.456355],[18.860151,47.4583903],[18.8619415,47.4594978],[18.8609867,47.4607128],[18.8597904,47.4620076],[18.8592862,47.4623594],[18.8585941,47.4627221],[18.8571297,47.4633313],[18.8563411,47.4636033],[18.8562821,47.4640277],[18.857194,47.4652825],[18.8566254,47.4655073],[18.8565288,47.4658047],[18.8569285,47.4665563],[18.8583635,47.4695253],[18.8582641,47.4698029],[18.8582669,47.4699079],[18.8583834,47.4701931],[18.8584438,47.4702729],[18.8585189,47.4703264],[18.8586221,47.4703609],[18.8587348,47.4703763],[18.8589011,47.4703609],[18.8614614,47.469732],[18.8627677,47.469286],[18.8661674,47.4678491],[18.8679403,47.4665581],[18.8699654,47.4652435],[18.8708009,47.4645698],[18.8726784,47.4633259],[18.8753606,47.4611281],[18.8768734,47.4592711],[18.8894261,47.4598659],[18.8902415,47.4598804],[18.9037116,47.4553357],[18.9042733,47.455203],[18.9049332,47.4550579],[18.9054213,47.4551014],[18.9056735,47.4550543],[18.9062877,47.4547659],[18.9064835,47.4545301],[18.9065968,47.4544712],[18.9067819,47.454395],[18.9081149,47.4539888],[18.9083731,47.4539507],[18.9089048,47.4538437],[18.9095419,47.4536959],[18.9132587,47.4531717],[18.9135296,47.4532043],[18.9137201,47.4531717],[18.9138649,47.4530738],[18.9143117,47.4529381],[18.9159773,47.4529961],[18.9180668,47.4531666],[18.9184637,47.4529997],[18.9190324,47.4516141],[18.9217253,47.4508015],[18.9224602,47.450689],[18.9241768,47.4502537],[18.9275564,47.4498946],[18.9297237,47.4495064],[18.9322127,47.4492199],[18.9334694,47.4493242],[18.9392093,47.4493532],[18.9422885,47.4490339],[18.945491,47.4488961],[18.9482617,47.4487002],[18.9500347,47.4482413],[18.954699,47.4472183],[18.9574899,47.4469162],[18.958025,47.4471475],[18.9584434,47.4470822],[18.9587666,47.4466623],[18.9614488,47.4393046],[18.9636804,47.4357995],[18.9659764,47.432882],[18.9689912,47.4296958],[18.9701003,47.4270366],[18.9700922,47.4267935],[18.9669541,47.424605],[18.9573531,47.4184193],[18.9567603,47.4184012],[18.9560576,47.418129],[18.9538513,47.4173936],[18.9514447,47.4166549],[18.9513133,47.4166426],[18.9326981,47.4170333],[18.9325733,47.4169625],[18.9320101,47.4167393],[18.9314857,47.4163972],[18.9311357,47.4161158],[18.9212291,47.4109106],[18.9195742,47.4098705],[18.9192684,47.4096109],[18.9173064,47.4085354]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true},{"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","scaleExtent":[0,22],"polygon":[[[1.1919978,43.6328791],[1.2015377,43.6329729],[1.2011107,43.6554932],[1.2227985,43.6557029],[1.2226231,43.6653353],[1.2275341,43.6653849],[1.2275417,43.6656387],[1.2337568,43.6656883],[1.2337644,43.6650153],[1.2351218,43.6650319],[1.2350913,43.6670729],[1.2443566,43.6671556],[1.2441584,43.6743925],[1.2493973,43.6744256],[1.2493973,43.6746628],[1.2555666,43.6747234],[1.2555742,43.6744532],[1.2569545,43.6744697],[1.2568782,43.678529],[1.2874873,43.6788257],[1.2870803,43.7013229],[1.3088219,43.7014632],[1.3086493,43.7127673],[1.3303262,43.7129544],[1.3300242,43.7305221],[1.3367106,43.7305845],[1.3367322,43.7312235],[1.3734338,43.7310456],[1.3735848,43.7245772],[1.4604504,43.7252947],[1.4607783,43.7028034],[1.4824875,43.7029516],[1.4829828,43.6692071],[1.5046832,43.6693616],[1.5048383,43.6581174],[1.5265475,43.6582656],[1.5266945,43.6470298],[1.548368,43.6471633],[1.5485357,43.6359385],[1.5702172,43.636082],[1.5705123,43.6135777],[1.5488166,43.6134276],[1.549097,43.5909479],[1.5707695,43.5910694],[1.5709373,43.5798341],[1.5793714,43.5798894],[1.5794782,43.5737682],[1.5809119,43.5737792],[1.5810859,43.5573794],[1.5712334,43.5573131],[1.5716504,43.5235497],[1.3984804,43.5222618],[1.3986509,43.5110113],[1.3120959,43.5102543],[1.3118968,43.5215192],[1.2902569,43.5213126],[1.2898637,43.5438168],[1.311517,43.5440133],[1.3113271,43.5552596],[1.3036924,43.5551924],[1.3036117,43.5595099],[1.2955449,43.5594317],[1.2955449,43.5595489],[1.2895595,43.5594473],[1.2892899,43.5775366],[1.2675698,43.5773647],[1.2673973,43.5886141],[1.25355,43.5885047],[1.2533774,43.5956282],[1.2518029,43.5956282],[1.2518029,43.5949409],[1.2350437,43.5947847],[1.2350437,43.5945972],[1.2239572,43.5945972],[1.2239357,43.5994708],[1.2139708,43.599299],[1.2138845,43.6046408],[1.2020647,43.6044846],[1.2019464,43.61048],[1.1924294,43.6103695],[1.1919978,43.6328791]]],"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","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"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","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"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","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"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","scaleExtent":[0,20],"polygon":[[[0.5457462,47.465264],[0.54585,47.4608163],[0.5392188,47.4606983],[0.5393484,47.456243],[0.5327959,47.4561003],[0.5329011,47.451565],[0.52619,47.4514013],[0.5265854,47.4424884],[0.5000941,47.4420739],[0.5002357,47.4375835],[0.4936014,47.4374324],[0.4937,47.4329285],[0.4606141,47.4324593],[0.4607248,47.4279827],[0.4541016,47.4278125],[0.454932,47.4053921],[0.4615431,47.4054476],[0.4619097,47.3964924],[0.4684346,47.3966005],[0.4691319,47.3786415],[0.4757125,47.3787609],[0.4762116,47.3652018],[0.4828297,47.3653499],[0.4829611,47.3608321],[0.4763543,47.360743],[0.476654,47.3517263],[0.4700497,47.3516186],[0.4701971,47.3471313],[0.4637503,47.3470104],[0.4571425,47.3424146],[0.4572922,47.3379061],[0.4506741,47.3378081],[0.4508379,47.3333051],[0.4442212,47.3332032],[0.4443809,47.328711],[0.4311392,47.3284977],[0.4316262,47.3150004],[0.4382432,47.3151136],[0.4383815,47.3106174],[0.4714487,47.3111374],[0.4713096,47.3156565],[0.477888,47.3157542],[0.4780733,47.3112802],[0.4846826,47.3113639],[0.4848576,47.3068686],[0.4914359,47.3069803],[0.491745,47.2979733],[0.4851578,47.2978722],[0.4854269,47.2888744],[0.4788485,47.2887697],[0.4791574,47.2797818],[0.4857769,47.2799005],[0.4859107,47.2753885],[0.492539,47.2755029],[0.4926669,47.2710127],[0.4992986,47.2711066],[0.4994296,47.2666116],[0.5192658,47.2669245],[0.5194225,47.2624231],[0.5260186,47.2625205],[0.5258735,47.2670183],[0.5456972,47.2673383],[0.5455537,47.2718283],[0.5587737,47.2720366],[0.5586259,47.2765185],[0.5652252,47.2766278],[0.5650848,47.2811206],[0.5716753,47.2812285],[0.5715223,47.2857217],[0.5781436,47.2858299],[0.5779914,47.2903294],[0.5846023,47.2904263],[0.5843076,47.2994231],[0.597499,47.2996094],[0.5976637,47.2951375],[0.6571596,47.2960036],[0.6572988,47.2915091],[0.6705019,47.2917186],[0.6703475,47.2962082],[0.6836175,47.2963688],[0.6834322,47.3008929],[0.690062,47.3009558],[0.6899241,47.3054703],[0.7362019,47.3061157],[0.7360848,47.3106063],[0.7559022,47.3108935],[0.7557718,47.315392],[0.7623755,47.3154716],[0.7622314,47.3199941],[0.7754911,47.3201546],[0.77497,47.3388218],[0.7745786,47.351628],[0.7680363,47.3515901],[0.767589,47.3605298],[0.7742443,47.3606238],[0.7733465,47.3921266],[0.7667434,47.3920195],[0.7664411,47.4010837],[0.7730647,47.4011115],[0.7728868,47.4101297],[0.7661849,47.4100226],[0.7660267,47.4145044],[0.7527613,47.4143038],[0.7529788,47.4098086],[0.7462373,47.4097016],[0.7459424,47.4232208],[0.7392324,47.4231451],[0.738869,47.4366116],[0.7323267,47.4365171],[0.7321869,47.4410556],[0.7255048,47.44098],[0.7254209,47.4453479],[0.7318793,47.4454803],[0.7318514,47.4501126],[0.7384496,47.450226],[0.7383098,47.454631],[0.7449359,47.4547444],[0.7443209,47.4771985],[0.7310685,47.4769717],[0.7309008,47.4815445],[0.7176205,47.4812611],[0.7177883,47.4768394],[0.69777,47.4764993],[0.6980496,47.4719827],[0.6914514,47.4718882],[0.6917309,47.4630241],[0.6851048,47.4629295],[0.684937,47.4673524],[0.678255,47.4673335],[0.6779754,47.4762158],[0.6714051,47.4761592],[0.6710417,47.4881952],[0.6577334,47.4879685],[0.6578173,47.48504],[0.6511911,47.4848322],[0.6514707,47.4758568],[0.6448166,47.4757245],[0.6449284,47.4712646],[0.6117976,47.4707543],[0.6118815,47.4663129],[0.6052833,47.4661239],[0.6054231,47.4616631],[0.5988808,47.4615497],[0.5990206,47.4570886],[0.572488,47.4566916],[0.5721805,47.4656513],[0.5457462,47.465264]]],"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","scaleExtent":[0,22],"polygon":[[[0.7751199,47.3298327],[0.7742685,47.356166],[0.7705338,47.3561106],[0.7702424,47.3651192],[0.7739772,47.3651747],[0.7728024,47.4014836],[0.7903977,47.4014691],[0.7898827,47.4102988],[0.7911702,47.410473],[0.7910844,47.4194174],[0.7939168,47.4194174],[0.7931872,47.4373306],[0.7983371,47.4374177],[0.7980796,47.4554408],[0.8004399,47.4554118],[0.8013841,47.4642615],[0.8007403,47.4689904],[0.7939597,47.4733127],[0.7840463,47.4732257],[0.7838746,47.4787079],[0.776064,47.4785919],[0.7758494,47.4820434],[0.7706567,47.4821884],[0.7704421,47.4859006],[0.7609578,47.4909176],[0.7571813,47.4909176],[0.737526,47.5033563],[0.725896,47.5058785],[0.7111331,47.5057626],[0.7041808,47.5040811],[0.6910916,47.5003846],[0.6904479,47.4971808],[0.6775733,47.4968329],[0.6775733,47.4935273],[0.6642695,47.4930054],[0.6634971,47.4895256],[0.6508799,47.4895836],[0.6513306,47.4803177],[0.6473394,47.4803032],[0.6474682,47.4785194],[0.6447431,47.4784614],[0.644786,47.4757493],[0.6423827,47.4757783],[0.642254,47.4730226],[0.6383487,47.4729356],[0.6379195,47.4713111],[0.6051322,47.470789],[0.6051322,47.4663213],[0.5985232,47.4660312],[0.5987807,47.4615632],[0.5920001,47.4615632],[0.5922576,47.4597643],[0.5808421,47.4597062],[0.5800696,47.4614471],[0.5723449,47.4613891],[0.5722161,47.4651173],[0.5587407,47.4648852],[0.5465957,47.4605187],[0.5326911,47.4535546],[0.5267688,47.4531483],[0.5267688,47.4515233],[0.5223056,47.4512331],[0.5225631,47.4480407],[0.5197736,47.447765],[0.520074,47.4424682],[0.4975005,47.4415975],[0.4971572,47.4404945],[0.4935523,47.4401462],[0.4935523,47.435734],[0.4794331,47.4357485],[0.4617091,47.428186],[0.4564305,47.4208838],[0.4548856,47.4122882],[0.4550572,47.4021807],[0.4614945,47.4019338],[0.4616662,47.3964145],[0.4687901,47.3960224],[0.4701634,47.3517307],[0.4567738,47.3514981],[0.4572888,47.3425422],[0.430853,47.3419606],[0.431958,47.3060196],[0.4715367,47.3067035],[0.4725667,47.2800414],[0.4852696,47.2800414],[0.4857846,47.2708404],[0.4993459,47.2710734],[0.4991742,47.2624533],[0.5527326,47.2630358],[0.5522176,47.2720052],[0.5656072,47.2722381],[0.5652638,47.2815553],[0.5911847,47.2815553],[0.5906697,47.2909873],[0.669119,47.2916859],[0.6831952,47.2956444],[0.6831952,47.3007668],[0.6965848,47.3012324],[0.6964131,47.3023965],[0.7100602,47.3024547],[0.7229348,47.3058887],[0.722849,47.3104281],[0.7416459,47.3108355],[0.754263,47.3139197],[0.7625028,47.318153],[0.7620736,47.3201313],[0.7661935,47.3200877],[0.7695623,47.3220659],[0.7723304,47.3250768],[0.7733603,47.3266985],[0.7751199,47.3298327]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s)plus 2013"},{"id":"US_Forest_Service_roads","name":"U.S. Forest Service roads","type":"tms","template":"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1571546,68.721974],[-164.8553982,67.0255078],[-168.002195,66.0017503],[-169.0087448,66.001546],[-169.0075381,64.9987675],[-172.5143281,63.8767267],[-173.8197023,59.74014],[-162.5018149,58.0005815],[-160.0159024,58.0012389],[-160.0149725,57.000035],[-160.5054788,56.9999017],[-165.8092575,54.824847],[-178.000097,52.2446469],[-177.9992996,51.2554252],[-171.4689067,51.8215329],[-162.40251,53.956664],[-159.0075717,55.002502],[-158.0190709,55.0027849],[-151.9963213,55.9991902],[-151.500341,57.9987853],[-151.5012894,58.9919816],[-138.5159989,58.9953194],[-138.5150471,57.9986434],[-133.9948193,54.0031685],[-130.0044418,54.0043387],[-130.0070826,57.0000507],[-131.975877,56.9995156],[-135.1229873,59.756601],[-138.0071813,59.991805],[-139.1715881,60.4127229],[-140.9874011,61.0118551],[-140.9683975,69.9535069],[-156.176891,71.5633329],[-160.413634,70.7397728],[-163.0218273,69.9707435],[-164.9717003,68.994689],[-167.1571546,68.721974]]]},{"id":"Zuerich-zh_uebersichtsplan-tms","name":"Übersichtsplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,21],"polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"uniao_dos_palmares","name":"União dos Palmares AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.97724708197,-9.20751562713],[-35.97719915169,-9.19398393291],[-35.97694352353,-9.19052995603],[-35.97678375594,-9.18606654789],[-35.97702340733,-9.18207624495],[-35.97703938409,-9.17967888719],[-35.97681570946,-9.17734460222],[-35.9766399651,-9.17516802537],[-35.97700743057,-9.17518379771],[-35.97695950029,-9.17070442381],[-35.97673582566,-9.17065710618],[-35.97660801158,-9.16644581169],[-35.97617663907,-9.16221869434],[-35.97609675527,-9.1602628469],[-35.97660801158,-9.1602628469],[-35.9767198489,-9.14608263113],[-35.97654410454,-9.1412243182],[-35.97665594186,-9.13319533758],[-35.97652812778,-9.12183772804],[-35.9764801975,-9.11748388185],[-35.98617809061,-9.11754698145],[-35.9894693031,-9.1173261328],[-36.00560583036,-9.1173261328],[-36.01859493596,-9.11735768262],[-36.04601105553,-9.11721570843],[-36.06734002967,-9.11697908465],[-36.0675637043,-9.16133540973],[-36.06770749514,-9.16404834833],[-36.06745186698,-9.164079894],[-36.0675637043,-9.16657199353],[-36.06777140218,-9.16654044807],[-36.06797910005,-9.20701095785],[-36.04979754756,-9.2071055834],[-36.04671403295,-9.206979416],[-36.02941120224,-9.20708981247],[-36.0135462799,-9.207184438],[-35.99317591134,-9.20732637623],[-35.97724708197,-9.20751562713]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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":"2017-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"UrbISOrtho2017","name":"UrbIS-Ortho 2017","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Urbis:Ortho2017/https://geoservices-urbis.irisnet.be/geoserver/ows","endDate":"2018-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"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.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"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.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"USGS-Large_Scale","name":"USGS Large Scale Imagery","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg","scaleExtent":[12,20],"polygon":[[[-123.2549305,48.7529029],[-123.2549305,48.5592263],[-123.192224,48.5592263],[-123.192224,48.4348366],[-122.9419646,48.4348366],[-122.9419646,48.3720812],[-122.8806229,48.3720812],[-122.8806229,48.3094763],[-122.8167566,48.3094763],[-122.8167566,48.1904587],[-123.0041133,48.1904587],[-123.0041133,48.1275918],[-123.058416,48.1275918],[-123.058416,48.190514],[-123.254113,48.190514],[-123.254113,48.1274982],[-123.3706593,48.1274982],[-123.3706593,48.1908403],[-124.0582632,48.1908403],[-124.0582632,48.253442],[-124.1815163,48.253442],[-124.1815163,48.3164666],[-124.4319117,48.3164666],[-124.4319117,48.3782613],[-124.5564618,48.3782613],[-124.5564618,48.4408305],[-124.7555107,48.4408305],[-124.7555107,48.1914986],[-124.8185282,48.1914986],[-124.8185282,48.1228381],[-124.7552951,48.1228381],[-124.7552951,47.5535253],[-124.3812108,47.5535253],[-124.3812108,47.1218696],[-124.1928897,47.1218696],[-124.1928897,43.7569431],[-124.4443382,43.7569431],[-124.4443382,43.1425556],[-124.6398855,43.1425556],[-124.6398855,42.6194503],[-124.4438525,42.6194503],[-124.4438525,39.8080662],[-123.8815685,39.8080662],[-123.8815685,39.1102825],[-123.75805,39.1102825],[-123.75805,38.4968799],[-123.2702803,38.4968799],[-123.2702803,37.9331905],[-122.8148084,37.9331905],[-122.8148084,37.8019606],[-122.5664316,37.8019606],[-122.5664316,36.9319611],[-121.8784026,36.9319611],[-121.8784026,36.6897596],[-122.0034748,36.6897596],[-122.0034748,36.4341056],[-121.9414159,36.4341056],[-121.9414159,35.9297636],[-121.5040977,35.9297636],[-121.5040977,35.8100273],[-121.3790276,35.8100273],[-121.3790276,35.4239164],[-120.9426515,35.4239164],[-120.9426515,35.1849683],[-120.8171978,35.1849683],[-120.8171978,35.1219894],[-120.6918447,35.1219894],[-120.6918447,34.4966794],[-120.5045898,34.4966794],[-120.5045898,34.4339651],[-120.0078775,34.4339651],[-120.0078775,34.3682626],[-119.5283517,34.3682626],[-119.5283517,34.0576434],[-119.0060985,34.0576434],[-119.0060985,33.9975267],[-118.5046259,33.9975267],[-118.5046259,33.8694631],[-118.4413209,33.8694631],[-118.4413209,33.6865253],[-118.066912,33.6865253],[-118.066912,33.3063832],[-117.5030045,33.3063832],[-117.5030045,33.0500337],[-117.3188195,33.0500337],[-117.3188195,32.6205888],[-117.1917023,32.6205888],[-117.1917023,32.4974566],[-116.746496,32.4974566],[-116.746496,32.5609161],[-115.9970138,32.5609161],[-115.9970138,32.6264942],[-114.8808125,32.6264942],[-114.8808125,32.4340796],[-114.6294474,32.4340796],[-114.6294474,32.3731636],[-114.4447437,32.3731636],[-114.4447437,32.3075418],[-114.2557628,32.3075418],[-114.2557628,32.2444561],[-114.0680274,32.2444561],[-114.0680274,32.1829113],[-113.8166499,32.1829113],[-113.8166499,32.1207622],[-113.6307421,32.1207622],[-113.6307421,32.0565099],[-113.4417495,32.0565099],[-113.4417495,31.9984372],[-113.2546027,31.9984372],[-113.2546027,31.9325434],[-113.068072,31.9325434],[-113.068072,31.8718062],[-112.8161105,31.8718062],[-112.8161105,31.8104171],[-112.6308756,31.8104171],[-112.6308756,31.7464723],[-112.4418918,31.7464723],[-112.4418918,31.6856001],[-112.257192,31.6856001],[-112.257192,31.6210352],[-112.0033787,31.6210352],[-112.0033787,31.559584],[-111.815619,31.559584],[-111.815619,31.4970238],[-111.6278586,31.4970238],[-111.6278586,31.4339867],[-111.4418978,31.4339867],[-111.4418978,31.3733859],[-111.2559708,31.3733859],[-111.2559708,31.3113225],[-108.1845822,31.3113225],[-108.1845822,31.7459502],[-106.5065055,31.7459502],[-106.5065055,31.6842308],[-106.3797265,31.6842308],[-106.3797265,31.621752],[-106.317434,31.621752],[-106.317434,31.4968167],[-106.2551769,31.4968167],[-106.2551769,31.4344889],[-106.1924698,31.4344889],[-106.1924698,31.3721296],[-106.0039212,31.3721296],[-106.0039212,31.309328],[-105.9416582,31.309328],[-105.9416582,31.2457547],[-105.8798174,31.2457547],[-105.8798174,31.1836194],[-105.8162349,31.1836194],[-105.8162349,31.1207155],[-105.6921198,31.1207155],[-105.6921198,31.0584835],[-105.6302881,31.0584835],[-105.6302881,30.9328271],[-105.5044418,30.9328271],[-105.5044418,30.8715864],[-105.4412973,30.8715864],[-105.4412973,30.808463],[-105.3781497,30.808463],[-105.3781497,30.7471828],[-105.1904658,30.7471828],[-105.1904658,30.6843231],[-105.1286244,30.6843231],[-105.1286244,30.6199737],[-105.0036504,30.6199737],[-105.0036504,30.5589058],[-104.9417962,30.5589058],[-104.9417962,30.4963236],[-104.8782018,30.4963236],[-104.8782018,30.3098261],[-104.8155257,30.3098261],[-104.8155257,30.2478305],[-104.7536079,30.2478305],[-104.7536079,29.9353916],[-104.690949,29.9353916],[-104.690949,29.8090156],[-104.6291301,29.8090156],[-104.6291301,29.6843577],[-104.5659869,29.6843577],[-104.5659869,29.6223459],[-104.5037188,29.6223459],[-104.5037188,29.5595436],[-104.4410072,29.5595436],[-104.4410072,29.4974832],[-104.2537551,29.4974832],[-104.2537551,29.3716718],[-104.1291984,29.3716718],[-104.1291984,29.3091621],[-104.0688737,29.3091621],[-104.0688737,29.2467276],[-103.8187309,29.2467276],[-103.8187309,29.1843076],[-103.755736,29.1843076],[-103.755736,29.1223174],[-103.5667542,29.1223174],[-103.5667542,29.0598119],[-103.5049819,29.0598119],[-103.5049819,28.9967506],[-103.3165753,28.9967506],[-103.3165753,28.9346923],[-103.0597572,28.9346923],[-103.0597572,29.0592965],[-102.9979694,29.0592965],[-102.9979694,29.1212855],[-102.9331397,29.1212855],[-102.9331397,29.1848575],[-102.8095989,29.1848575],[-102.8095989,29.2526154],[-102.8701345,29.2526154],[-102.8701345,29.308096],[-102.8096681,29.308096],[-102.8096681,29.3715484],[-102.7475655,29.3715484],[-102.7475655,29.5581899],[-102.684554,29.5581899],[-102.684554,29.6847655],[-102.4967764,29.6847655],[-102.4967764,29.7457694],[-102.3086647,29.7457694],[-102.3086647,29.8086627],[-102.1909323,29.8086627],[-102.1909323,29.7460097],[-101.5049914,29.7460097],[-101.5049914,29.6846777],[-101.3805796,29.6846777],[-101.3805796,29.5594459],[-101.3175057,29.5594459],[-101.3175057,29.4958934],[-101.1910075,29.4958934],[-101.1910075,29.4326115],[-101.067501,29.4326115],[-101.067501,29.308808],[-100.9418897,29.308808],[-100.9418897,29.2456231],[-100.8167271,29.2456231],[-100.8167271,29.1190449],[-100.7522672,29.1190449],[-100.7522672,29.0578214],[-100.6925358,29.0578214],[-100.6925358,28.8720431],[-100.6290158,28.8720431],[-100.6290158,28.8095363],[-100.5679901,28.8095363],[-100.5679901,28.622554],[-100.5040411,28.622554],[-100.5040411,28.5583804],[-100.4421832,28.5583804],[-100.4421832,28.4968266],[-100.379434,28.4968266],[-100.379434,28.3092865],[-100.3171942,28.3092865],[-100.3171942,28.1835681],[-100.254483,28.1835681],[-100.254483,28.1213885],[-100.1282282,28.1213885],[-100.1282282,28.059215],[-100.0659537,28.059215],[-100.0659537,27.9966087],[-100.0023855,27.9966087],[-100.0023855,27.9332152],[-99.9426497,27.9332152],[-99.9426497,27.7454658],[-99.816851,27.7454658],[-99.816851,27.6834301],[-99.7541346,27.6834301],[-99.7541346,27.6221543],[-99.6291629,27.6221543],[-99.6291629,27.5588977],[-99.5672838,27.5588977],[-99.5672838,27.4353752],[-99.5041798,27.4353752],[-99.5041798,27.3774021],[-99.5671796,27.3774021],[-99.5671796,27.2463726],[-99.504975,27.2463726],[-99.504975,26.9965649],[-99.4427427,26.9965649],[-99.4427427,26.872803],[-99.3800633,26.872803],[-99.3800633,26.8068179],[-99.3190684,26.8068179],[-99.3190684,26.7473614],[-99.2537541,26.7473614],[-99.2537541,26.6210068],[-99.1910617,26.6210068],[-99.1910617,26.4956737],[-99.1300639,26.4956737],[-99.1300639,26.3713808],[-99.0029473,26.3713808],[-99.0029473,26.3093836],[-98.816572,26.3093836],[-98.816572,26.2457762],[-98.6920082,26.2457762],[-98.6920082,26.1837096],[-98.4440896,26.1837096],[-98.4440896,26.1217217],[-98.3823181,26.1217217],[-98.3823181,26.0596488],[-98.2532707,26.0596488],[-98.2532707,25.9986871],[-98.0109084,25.9986871],[-98.0109084,25.9932255],[-97.6932319,25.9932255],[-97.6932319,25.9334103],[-97.6313904,25.9334103],[-97.6313904,25.8695893],[-97.5046779,25.8695893],[-97.5046779,25.8073488],[-97.3083401,25.8073488],[-97.3083401,25.8731159],[-97.2456326,25.8731159],[-97.2456326,25.9353731],[-97.1138939,25.9353731],[-97.1138939,27.6809179],[-97.0571035,27.6809179],[-97.0571035,27.8108242],[-95.5810766,27.8108242],[-95.5810766,28.7468827],[-94.271041,28.7468827],[-94.271041,29.5594076],[-92.5029947,29.5594076],[-92.5029947,29.4974754],[-91.8776216,29.4974754],[-91.8776216,29.3727013],[-91.378418,29.3727013],[-91.378418,29.2468326],[-91.3153953,29.2468326],[-91.3153953,29.1844301],[-91.1294702,29.1844301],[-91.1294702,29.1232559],[-91.0052632,29.1232559],[-91.0052632,28.9968437],[-89.4500159,28.9968437],[-89.4500159,28.8677422],[-88.8104309,28.8677422],[-88.8104309,30.1841864],[-85.8791527,30.1841864],[-85.8791527,29.5455038],[-84.8368083,29.5455038],[-84.8368083,29.6225158],[-84.7482786,29.6225158],[-84.7482786,29.683624],[-84.685894,29.683624],[-84.685894,29.7468386],[-83.6296975,29.7468386],[-83.6296975,29.4324361],[-83.3174937,29.4324361],[-83.3174937,29.0579442],[-82.879659,29.0579442],[-82.879659,27.7453529],[-82.8182822,27.7453529],[-82.8182822,26.9290868],[-82.3796782,26.9290868],[-82.3796782,26.3694183],[-81.8777106,26.3694183],[-81.8777106,25.805971],[-81.5036862,25.805971],[-81.5036862,25.7474753],[-81.4405462,25.7474753],[-81.4405462,25.6851489],[-81.3155883,25.6851489],[-81.3155883,25.5600985],[-81.2538534,25.5600985],[-81.2538534,25.4342361],[-81.1902012,25.4342361],[-81.1902012,25.1234341],[-81.1288133,25.1234341],[-81.1288133,25.0619389],[-81.0649231,25.0619389],[-81.0649231,24.8157807],[-81.6289469,24.8157807],[-81.6289469,24.7538367],[-81.6907173,24.7538367],[-81.6907173,24.6899374],[-81.8173189,24.6899374],[-81.8173189,24.6279161],[-82.1910041,24.6279161],[-82.1910041,24.496294],[-81.6216596,24.496294],[-81.6216596,24.559484],[-81.372006,24.559484],[-81.372006,24.6220687],[-81.0593278,24.6220687],[-81.0593278,24.684826],[-80.9347147,24.684826],[-80.9347147,24.7474828],[-80.7471081,24.7474828],[-80.7471081,24.8100618],[-80.3629898,24.8100618],[-80.3629898,25.1175858],[-80.122344,25.1175858],[-80.122344,25.7472357],[-80.0588458,25.7472357],[-80.0588458,26.3708251],[-79.995837,26.3708251],[-79.995837,26.9398003],[-80.0587265,26.9398003],[-80.0587265,27.1277466],[-80.1226251,27.1277466],[-80.1226251,27.2534279],[-80.1846956,27.2534279],[-80.1846956,27.3781229],[-80.246175,27.3781229],[-80.246175,27.5658729],[-80.3094768,27.5658729],[-80.3094768,27.7530311],[-80.3721485,27.7530311],[-80.3721485,27.8774451],[-80.4351457,27.8774451],[-80.4351457,28.0033366],[-80.4966078,28.0033366],[-80.4966078,28.1277326],[-80.5587159,28.1277326],[-80.5587159,28.3723509],[-80.4966335,28.3723509],[-80.4966335,29.5160326],[-81.1213644,29.5160326],[-81.1213644,31.6846966],[-80.6018723,31.6846966],[-80.6018723,32.2475309],[-79.4921024,32.2475309],[-79.4921024,32.9970261],[-79.1116488,32.9970261],[-79.1116488,33.3729457],[-78.6153621,33.3729457],[-78.6153621,33.8097638],[-77.9316963,33.8097638],[-77.9316963,33.8718243],[-77.8692252,33.8718243],[-77.8692252,34.0552454],[-77.6826392,34.0552454],[-77.6826392,34.2974598],[-77.2453509,34.2974598],[-77.2453509,34.5598585],[-76.4973277,34.5598585],[-76.4973277,34.622796],[-76.4337602,34.622796],[-76.4337602,34.6849285],[-76.373212,34.6849285],[-76.373212,34.7467674],[-76.3059364,34.7467674],[-76.3059364,34.808551],[-76.2468017,34.808551],[-76.2468017,34.8728418],[-76.1825922,34.8728418],[-76.1825922,34.9335332],[-76.120814,34.9335332],[-76.120814,34.9952359],[-75.9979015,34.9952359],[-75.9979015,35.0578182],[-75.870338,35.0578182],[-75.870338,35.1219097],[-75.7462194,35.1219097],[-75.7462194,35.1818911],[-75.4929694,35.1818911],[-75.4929694,35.3082988],[-75.4325662,35.3082988],[-75.4325662,35.7542495],[-75.4969907,35.7542495],[-75.4969907,37.8105602],[-75.3082972,37.8105602],[-75.3082972,37.8720088],[-75.245601,37.8720088],[-75.245601,37.9954849],[-75.1828751,37.9954849],[-75.1828751,38.0585079],[-75.1184793,38.0585079],[-75.1184793,38.2469091],[-75.0592098,38.2469091],[-75.0592098,38.3704316],[-74.9948111,38.3704316],[-74.9948111,38.8718417],[-74.4878252,38.8718417],[-74.4878252,39.3089428],[-74.1766317,39.3089428],[-74.1766317,39.6224653],[-74.0567045,39.6224653],[-74.0567045,39.933178],[-73.9959035,39.933178],[-73.9959035,40.1854852],[-73.9341593,40.1854852],[-73.9341593,40.4959486],[-73.8723024,40.4959486],[-73.8723024,40.5527135],[-71.8074506,40.5527135],[-71.8074506,41.3088005],[-70.882512,41.3088005],[-70.882512,41.184978],[-70.7461947,41.184978],[-70.7461947,41.3091865],[-70.4337553,41.3091865],[-70.4337553,41.4963885],[-69.9334281,41.4963885],[-69.9334281,41.6230802],[-69.869857,41.6230802],[-69.869857,41.8776895],[-69.935791,41.8776895],[-69.935791,42.0032342],[-69.9975823,42.0032342],[-69.9975823,42.0650191],[-70.0606103,42.0650191],[-70.0606103,42.1294348],[-70.5572884,42.1294348],[-70.5572884,43.2487079],[-70.4974097,43.2487079],[-70.4974097,43.3092194],[-70.3704249,43.3092194],[-70.3704249,43.371963],[-70.3085701,43.371963],[-70.3085701,43.4969879],[-70.183921,43.4969879],[-70.183921,43.6223531],[-70.057583,43.6223531],[-70.057583,43.6850173],[-69.7455247,43.6850173],[-69.7455247,43.7476571],[-69.2472845,43.7476571],[-69.2472845,43.8107035],[-69.0560701,43.8107035],[-69.0560701,43.8717247],[-68.9950522,43.8717247],[-68.9950522,43.9982022],[-68.4963672,43.9982022],[-68.4963672,44.0597368],[-68.3081038,44.0597368],[-68.3081038,44.122137],[-68.1851802,44.122137],[-68.1851802,44.3081382],[-67.9956019,44.3081382],[-67.9956019,44.3727489],[-67.8103041,44.3727489],[-67.8103041,44.435178],[-67.4965289,44.435178],[-67.4965289,44.4968776],[-67.37102,44.4968776],[-67.37102,44.5600642],[-67.1848753,44.5600642],[-67.1848753,44.6213345],[-67.1221208,44.6213345],[-67.1221208,44.6867918],[-67.059365,44.6867918],[-67.059365,44.7473657],[-66.9311098,44.7473657],[-66.9311098,44.9406566],[-66.994683,44.9406566],[-66.994683,45.0024514],[-67.0595847,45.0024514],[-67.0595847,45.1273377],[-67.1201974,45.1273377],[-67.1201974,45.1910115],[-67.2469811,45.1910115],[-67.2469811,45.253442],[-67.3177546,45.253442],[-67.3177546,45.1898369],[-67.370749,45.1898369],[-67.370749,45.2534001],[-67.4326888,45.2534001],[-67.4326888,45.3083409],[-67.3708571,45.3083409],[-67.3708571,45.4396986],[-67.4305573,45.4396986],[-67.4305573,45.4950095],[-67.37099,45.4950095],[-67.37099,45.6264543],[-67.6214982,45.6264543],[-67.6214982,45.6896133],[-67.683828,45.6896133],[-67.683828,45.753259],[-67.7462097,45.753259],[-67.7462097,47.1268165],[-67.8700141,47.1268165],[-67.8700141,47.1900278],[-67.9323803,47.1900278],[-67.9323803,47.2539678],[-67.9959387,47.2539678],[-67.9959387,47.3149737],[-68.1206676,47.3149737],[-68.1206676,47.3780823],[-68.4423175,47.3780823],[-68.4423175,47.3166082],[-68.6314305,47.3166082],[-68.6314305,47.2544676],[-68.9978037,47.2544676],[-68.9978037,47.439895],[-69.0607223,47.439895],[-69.0607223,47.5047558],[-69.2538122,47.5047558],[-69.2538122,47.4398084],[-69.3179284,47.4398084],[-69.3179284,47.378601],[-69.4438546,47.378601],[-69.4438546,47.3156274],[-69.5038204,47.3156274],[-69.5038204,47.2525839],[-69.5667838,47.2525839],[-69.5667838,47.1910884],[-69.6303478,47.1910884],[-69.6303478,47.128701],[-69.6933103,47.128701],[-69.6933103,47.0654307],[-69.7557063,47.0654307],[-69.7557063,47.0042751],[-69.8180391,47.0042751],[-69.8180391,46.9415344],[-69.8804023,46.9415344],[-69.8804023,46.8792519],[-69.9421674,46.8792519],[-69.9421674,46.8177399],[-70.0063088,46.8177399],[-70.0063088,46.6920295],[-70.0704265,46.6920295],[-70.0704265,46.4425926],[-70.1945902,46.4425926],[-70.1945902,46.3785887],[-70.2562047,46.3785887],[-70.2562047,46.3152628],[-70.3203651,46.3152628],[-70.3203651,46.0651209],[-70.3814988,46.0651209],[-70.3814988,45.93552],[-70.3201618,45.93552],[-70.3201618,45.879479],[-70.4493131,45.879479],[-70.4493131,45.7538713],[-70.5070021,45.7538713],[-70.5070021,45.6916912],[-70.6316642,45.6916912],[-70.6316642,45.6291619],[-70.7575538,45.6291619],[-70.7575538,45.4414685],[-70.8809878,45.4414685],[-70.8809878,45.3780612],[-71.13328,45.3780612],[-71.13328,45.3151452],[-71.3830282,45.3151452],[-71.3830282,45.253416],[-71.5076448,45.253416],[-71.5076448,45.0655726],[-73.9418929,45.0655726],[-73.9418929,45.0031242],[-74.7469725,45.0031242],[-74.7469725,45.0649003],[-74.8800964,45.0649003],[-74.8800964,45.0029023],[-75.0662455,45.0029023],[-75.0662455,44.9415167],[-75.2539363,44.9415167],[-75.2539363,44.8776043],[-75.3789648,44.8776043],[-75.3789648,44.8153462],[-75.4431283,44.8153462],[-75.4431283,44.7536053],[-75.5666566,44.7536053],[-75.5666566,44.6909879],[-75.6290205,44.6909879],[-75.6290205,44.6284958],[-75.7540484,44.6284958],[-75.7540484,44.566385],[-75.817312,44.566385],[-75.817312,44.5028932],[-75.8799549,44.5028932],[-75.8799549,44.3784946],[-76.1300319,44.3784946],[-76.1300319,44.3159227],[-76.1926961,44.3159227],[-76.1926961,44.2534378],[-76.3182619,44.2534378],[-76.3182619,44.1916726],[-76.3792975,44.1916726],[-76.3792975,44.0653733],[-76.4427584,44.0653733],[-76.4427584,43.9963825],[-76.317027,43.9963825],[-76.317027,43.9414581],[-76.5076611,43.9414581],[-76.5076611,43.8723335],[-76.3829974,43.8723335],[-76.3829974,43.8091872],[-76.2534102,43.8091872],[-76.2534102,43.5665222],[-76.5064833,43.5665222],[-76.5064833,43.5033881],[-76.6331208,43.5033881],[-76.6331208,43.4432252],[-76.6951085,43.4432252],[-76.6951085,43.3786858],[-76.8177798,43.3786858],[-76.8177798,43.318066],[-77.682,43.318066],[-77.682,43.3789376],[-78.0565883,43.3789376],[-78.0565883,43.4396918],[-78.4389748,43.4396918],[-78.4389748,43.3794382],[-78.8803396,43.3794382],[-78.8803396,43.3149724],[-79.1298858,43.3149724],[-79.1298858,43.2429286],[-79.0669615,43.2429286],[-79.0669615,43.1299931],[-79.1298858,43.1299931],[-79.1298858,43.0577305],[-79.071264,43.0577305],[-79.071264,42.9294906],[-78.943264,42.9294906],[-78.943264,42.7542165],[-79.069439,42.7542165],[-79.069439,42.6941622],[-79.133439,42.6941622],[-79.133439,42.6296973],[-79.1947499,42.6296973],[-79.1947499,42.5663538],[-79.3786827,42.5663538],[-79.3786827,42.5033425],[-79.4442961,42.5033425],[-79.4442961,42.4410614],[-79.5679936,42.4410614],[-79.5679936,42.3775264],[-79.6906154,42.3775264],[-79.6906154,42.3171086],[-79.8164642,42.3171086],[-79.8164642,42.2534481],[-80.0052373,42.2534481],[-80.0052373,42.1909188],[-80.1916829,42.1909188],[-80.1916829,42.1272555],[-80.3167992,42.1272555],[-80.3167992,42.0669857],[-80.5063234,42.0669857],[-80.5063234,42.0034331],[-80.6930471,42.0034331],[-80.6930471,41.9415141],[-80.9440403,41.9415141],[-80.9440403,41.8781193],[-81.1942729,41.8781193],[-81.1942729,41.8166455],[-81.3190089,41.8166455],[-81.3190089,41.7545453],[-81.4418435,41.7545453],[-81.4418435,41.690965],[-81.5053523,41.690965],[-81.5053523,41.6301643],[-82.7470081,41.6301643],[-82.7470081,41.7536942],[-82.8839135,41.7536942],[-82.8839135,41.5656075],[-82.9957195,41.5656075],[-82.9957195,41.6270375],[-83.1257796,41.6270375],[-83.1257796,41.6878411],[-83.2474733,41.6878411],[-83.2474733,41.7536942],[-83.3737305,41.7536942],[-83.3737305,41.809276],[-83.3106019,41.809276],[-83.3106019,41.8716064],[-83.2474733,41.8716064],[-83.2474733,41.9361393],[-83.1843447,41.9361393],[-83.1843447,41.9960851],[-83.1207681,41.9960851],[-83.1207681,42.2464812],[-83.0589194,42.2464812],[-83.0589194,42.3089555],[-82.8685328,42.3089555],[-82.8685328,42.3717652],[-82.8072219,42.3717652],[-82.8072219,42.558553],[-82.7553745,42.558553],[-82.7553745,42.4954945],[-82.5599041,42.4954945],[-82.5599041,42.558553],[-82.4967755,42.558553],[-82.4967755,42.6833607],[-82.4328863,42.6833607],[-82.4328863,42.9342196],[-82.3700552,42.9342196],[-82.3700552,43.0648071],[-82.4328863,43.0648071],[-82.4328863,43.1917566],[-82.4947464,43.1917566],[-82.4947464,43.5034627],[-82.557133,43.5034627],[-82.557133,43.8160901],[-82.6197884,43.8160901],[-82.6197884,43.9422098],[-82.6839499,43.9422098],[-82.6839499,44.0022641],[-82.7465346,44.0022641],[-82.7465346,44.0670545],[-82.8708696,44.0670545],[-82.8708696,44.1291935],[-83.008517,44.1291935],[-83.008517,44.0664786],[-83.1336086,44.0664786],[-83.1336086,44.0053949],[-83.2414522,44.0053949],[-83.2414522,44.9962034],[-83.1806112,44.9962034],[-83.1806112,45.067302],[-83.2455172,45.067302],[-83.2455172,45.1287382],[-83.3065878,45.1287382],[-83.3065878,45.2551509],[-83.3706087,45.2551509],[-83.3706087,45.3165923],[-83.4325644,45.3165923],[-83.4325644,45.3792105],[-83.6178415,45.3792105],[-83.6178415,45.4419665],[-83.8084291,45.4419665],[-83.8084291,45.5036189],[-84.0550718,45.5036189],[-84.0550718,45.5647907],[-84.1235181,45.5647907],[-84.1235181,45.6287845],[-84.1807534,45.6287845],[-84.1807534,45.6914688],[-84.3111554,45.6914688],[-84.3111554,45.9337076],[-83.8209974,45.9337076],[-83.8209974,45.8725113],[-83.4968086,45.8725113],[-83.4968086,45.9337076],[-83.4338066,45.9337076],[-83.4338066,46.0016863],[-83.4962697,46.0016863],[-83.4962697,46.0668178],[-83.5599956,46.0668178],[-83.5599956,46.1261576],[-83.9954558,46.1261576],[-83.9954558,46.1931747],[-84.0591816,46.1931747],[-84.0591816,46.3814972],[-84.1152614,46.3814972],[-84.1152614,46.4953584],[-84.0591816,46.4953584],[-84.0591816,46.5682653],[-84.2579545,46.5682653],[-84.2579545,46.5051232],[-84.3071879,46.5051232],[-84.3071879,46.5682653],[-84.4415364,46.5682653],[-84.4415364,46.504525],[-84.9965729,46.504525],[-84.9965729,46.6842882],[-84.9298158,46.6842882],[-84.9298158,46.818077],[-85.3165894,46.818077],[-85.3165894,46.7535825],[-87.5562645,46.7535825],[-87.5562645,47.4407371],[-87.6825361,47.4407371],[-87.6825361,47.5035554],[-88.2560738,47.5035554],[-88.2560738,47.4433716],[-88.4417419,47.4433716],[-88.4417419,47.3789949],[-88.50683,47.3789949],[-88.50683,47.3153881],[-88.6312821,47.3153881],[-88.6312821,47.2539782],[-88.7569636,47.2539782],[-88.7569636,47.1934682],[-88.8838253,47.1934682],[-88.8838253,47.1284735],[-88.9434208,47.1284735],[-88.9434208,47.0662127],[-89.0708726,47.0662127],[-89.0708726,47.0026826],[-89.2565553,47.0026826],[-89.2565553,46.9410806],[-90.3677669,46.9410806],[-90.3677669,47.6844827],[-90.3069978,47.6844827],[-90.3069978,47.7460174],[-89.994859,47.7460174],[-89.994859,47.8082719],[-89.8048615,47.8082719],[-89.8048615,47.8700562],[-89.6797699,47.8700562],[-89.6797699,47.9339637],[-89.4933757,47.9339637],[-89.4933757,47.9957956],[-89.4284697,47.9957956],[-89.4284697,48.0656377],[-89.9932739,48.0656377],[-89.9932739,48.1282966],[-90.7455933,48.1282966],[-90.7455933,48.1893056],[-90.8087291,48.1893056],[-90.8087291,48.2522065],[-91.067763,48.2522065],[-91.067763,48.1916658],[-91.1946247,48.1916658],[-91.1946247,48.1279027],[-91.6814196,48.1279027],[-91.6814196,48.2525994],[-91.9321927,48.2525994],[-91.9321927,48.3142454],[-91.9929683,48.3142454],[-91.9929683,48.3780845],[-92.3189383,48.3780845],[-92.3189383,48.2529081],[-92.3732233,48.2529081],[-92.3732233,48.3153385],[-92.4322288,48.3153385],[-92.4322288,48.4411448],[-92.4977248,48.4411448],[-92.4977248,48.501781],[-92.5679413,48.501781],[-92.5679413,48.439579],[-92.6210462,48.439579],[-92.6210462,48.5650783],[-92.8086835,48.5650783],[-92.8086835,48.6286865],[-92.8086835,48.6267365],[-92.933185,48.6267365],[-92.933185,48.6922145],[-93.0051716,48.6922145],[-93.0051716,48.6282965],[-93.1225924,48.6282965],[-93.1225924,48.6922145],[-93.3190806,48.6922145],[-93.3190806,48.6267365],[-93.5049477,48.6267365],[-93.5049477,48.5635164],[-93.7474601,48.5635164],[-93.7474601,48.6267365],[-93.8135461,48.6267365],[-93.8135461,48.6898775],[-94.2453121,48.6898775],[-94.2453121,48.7554327],[-94.6183171,48.7554327],[-94.6183171,48.941036],[-94.6809018,48.941036],[-94.6809018,49.0029737],[-94.7441532,49.0029737],[-94.7441532,49.2536079],[-94.8084069,49.2536079],[-94.8084069,49.3784134],[-95.1192391,49.3784134],[-95.1192391,49.4425264],[-95.1934341,49.4425264],[-95.1934341,49.0035292],[-96.87069,49.0035292],[-96.87069,49.0656063],[-99.0049312,49.0656063],[-99.0049312,49.0050714],[-109.3699257,49.0050714],[-109.3699257,49.0668231],[-109.5058746,49.0668231],[-109.5058746,49.0050714],[-114.1830014,49.0050714],[-114.1830014,49.0687317],[-114.7578709,49.0687317],[-114.7578709,49.0050714],[-115.433731,49.0050714],[-115.433731,49.0671412],[-116.5062706,49.0671412],[-116.5062706,49.0050714],[-117.3089504,49.0050714],[-117.3089504,49.0659803],[-119.882945,49.0659803],[-119.882945,49.0050714],[-120.1208555,49.0050714],[-120.1208555,49.0678367],[-121.4451636,49.0678367],[-121.4451636,49.0050714],[-121.9311808,49.0050714],[-121.9311808,49.0656099],[-122.817484,49.0656099],[-122.817484,49.0029143],[-122.8795155,49.0029143],[-122.8795155,48.9347018],[-122.8174629,48.9347018],[-122.8174629,48.8101998],[-122.7538859,48.8101998],[-122.7538859,48.7533758],[-122.8712937,48.7533758],[-122.8712937,48.8153948],[-123.0055391,48.8153948],[-123.0055391,48.7529529],[-123.1296926,48.7529529],[-123.1296926,48.6902201],[-123.1838197,48.6902201],[-123.1838197,48.7529029],[-123.2549305,48.7529029]],[[-122.9341743,37.7521547],[-122.9347457,37.6842013],[-123.0679013,37.6849023],[-123.0673747,37.7475251],[-123.1292603,37.7478506],[-123.1286894,37.815685],[-123.0590687,37.8153192],[-123.0595947,37.7528143],[-122.9341743,37.7521547]],[[-71.6299464,41.2540893],[-71.4966465,41.2541393],[-71.4965596,41.122965],[-71.6298594,41.1229149],[-71.6299464,41.2540893]],[[-70.3184265,41.3775196],[-70.3183384,41.2448243],[-70.1906612,41.2448722],[-70.1906239,41.1886019],[-69.9336025,41.1886984],[-69.933729,41.3791941],[-69.9950664,41.3791712],[-69.995109,41.443159],[-70.0707828,41.4431307],[-70.0706972,41.3144915],[-70.2461667,41.3144258],[-70.2462087,41.3775467],[-70.3184265,41.3775196]],[[-68.9403374,43.9404062],[-68.6856948,43.9404977],[-68.6856475,43.8721797],[-68.7465405,43.8721577],[-68.7464976,43.8102529],[-68.8090782,43.8102304],[-68.8090343,43.746728],[-68.8773094,43.7467034],[-68.8773544,43.8117826],[-68.9402483,43.8117599],[-68.9403374,43.9404062]],[[-123.1291466,49.0645144],[-122.9954224,49.0645144],[-122.9954224,48.9343243],[-123.1291466,48.9343243],[-123.1291466,49.0645144]],[[-82.9407144,24.7535913],[-82.8719398,24.7535913],[-82.8719398,24.6905653],[-82.7446233,24.6905653],[-82.7446233,24.6214593],[-82.8088038,24.6214593],[-82.8088038,24.5594908],[-82.9407144,24.5594908],[-82.9407144,24.7535913]]],"icon":"data:image/png;base64,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"},{"id":"USGS-Scanned_Topographic","name":"USGS Topographic Maps","type":"tms","template":"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png","scaleExtent":[0,16],"polygon":[[[-55.9959409871,52.00107125754],[-112.02896100663,52.00107125754],[-112.03994733476,56.01308253302],[-120.0049439862,56.00592357111],[-120.01711631014,60.01202439709],[-132.00196823895,60.00239237126],[-132.01208445818,63.00193292546],[-133.96882922149,63.00050478005],[-133.97240257168,63.9922484722],[-141.04429430438,63.98726254018],[-141.06879354491,69.92045693283],[-156.24893170976,71.51583202984],[-160.44570905351,70.83527373985],[-167.08145124101,68.42906280103],[-164.08218366288,67.03913532024],[-169.01504499101,65.68268604273],[-166.57608014726,64.50777504773],[-161.82998639726,64.0500622981],[-165.08193952226,63.26030016403],[-168.02627545976,59.7862264253],[-162.53311139726,59.73089435789],[-162.35733014726,58.55904663221],[-157.83096295976,58.31752983705],[-158.00674420976,57.52404350658],[-168.22402936601,53.51022153947],[-166.55410749101,53.14277307072],[-158.77578717851,54.88541314654],[-158.68240338944,55.7496444805],[-156.55105573319,56.00847621073],[-156.15554792069,56.7746616888],[-154.70535260819,56.14336689443],[-152.07412702226,57.37034511851],[-151.62918073319,58.22653323066],[-152.00820905351,58.98055685754],[-145.98770124101,60.24740887373],[-140.38467389726,59.48634241018],[-136.53945905351,57.80610084736],[-133.79287702226,54.83482554482],[-133.33145124101,53.14277307072],[-131.46377545976,51.69838238021],[-128.52493268632,51.74602265442],[-129.79385358476,50.90159054062],[-124.56436139726,47.49785657441],[-124.03701764726,45.48627362525],[-124.69619733476,42.90428451679],[-124.49844342851,40.3414647251],[-122.80654889726,37.53929308709],[-119.99404889726,33.37084692374],[-117.24746686601,32.54119524801],[-111.13906842851,31.19770451575],[-106.70059186601,31.23528720858],[-103.20693952226,28.64618215851],[-101.84463483476,29.81580068657],[-99.20791608476,26.28743998885],[-96.79092389726,25.75431753335],[-96.92275983476,27.96911213371],[-93.47305280351,29.68226300815],[-88.94668561601,28.87732407469],[-88.61709577226,30.17736083469],[-86.20010358476,30.3671253082],[-84.96963483476,29.43379356715],[-84.09072858476,30.06332630046],[-82.97012311601,28.95425748047],[-82.97012311601,27.26823750278],[-81.25625592851,25.07956298739],[-82.09121686601,24.5610471236],[-80.06973249101,24.76073298597],[-79.85000592851,27.11188091684],[-81.27822858476,30.70777424386],[-78.99307233476,33.20554049136],[-75.03799420976,35.59830000028],[-75.85098249101,37.2425160052],[-73.74160749101,40.4585957587],[-69.89639264726,41.60224497127],[-70.68740827226,43.17628724449],[-66.93008405351,44.69516042167],[-66.53457624101,43.08006996122],[-64.20547467851,43.35229243812],[-59.50332624101,45.73220792131],[-59.51431256913,46.24761804024],[-60.00320417069,46.25901313529],[-59.99221784257,47.24505773341],[-59.00894147538,47.23759898478],[-58.99795514726,47.50266941922],[-56.51504499101,47.50266941922],[-56.52603131913,46.74770404019],[-53.99917585038,46.74770404019],[-53.97720319413,46.48358117386],[-52.49404889726,46.46354265729],[-52.50503522538,48.75360583388],[-52.99667340898,48.75451123442],[-53.01315290116,49.99551104004],[-55.00167829179,50.00610367548],[-55.03738385819,53.74720613495],[-56.00418073319,53.73421061801],[-55.9959409871,52.00107125754]],[[-59.50126630448,43.7495431608],[-60.50239545487,43.7495431608],[-60.50239545487,43.99999882251],[-59.99839765214,43.99999882251],[-59.99839765214,44.2494016836],[-59.50126630448,44.2494016836],[-59.50126630448,43.7495431608]],[[-155.95024091386,20.49523373356],[-157.3267518687,20.49153389084],[-157.32902509355,21.23181053727],[-155.95251413871,21.23549220541],[-155.95024091386,20.49523373356]],[[-157.64488202714,21.24845058596],[-158.28534362719,21.24673774522],[-158.28689557694,21.7499618541],[-157.6464339769,21.75166877943],[-157.64488202714,21.24845058596]],[[-156.12602216386,20.32469602374],[-154.7461696274,20.3284088686],[-154.74174482011,18.87578125335],[-156.12159735656,18.87203473488],[-156.12602216386,20.32469602374]],[[-159.29077130937,22.24504086823],[-159.2892966564,21.76857042389],[-160.28916841131,21.76590592196],[-160.29064306428,22.24238530626],[-159.29077130937,22.24504086823]]],"terms_url":"https://caltopo.com/","terms_text":"© Caltopo","icon":"data:image/png;base64,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"},{"id":"sjcgis.org-General_Basemap_WM","name":"Vector Streetmap for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[-123.274024,48.692975],[-123.007726,48.767256],[-123.007619,48.831577],[-122.783495,48.758416],[-122.693402,48.658522],[-122.767451,48.603606],[-122.744842,48.387083],[-123.248221,48.283531],[-123.114524,48.422614],[-123.219035,48.548575],[-123.274024,48.692975]]],"best":true,"description":"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{"id":"Vejmidte_Denmark","name":"Vejmidte","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/danmark/vejmidte/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Vejmidte","terms_text":"Danish municipalities"},{"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","scaleExtent":[0,19],"polygon":[[[5.4356493,44.9991755],[5.4319266,44.9229046],[5.4362415,44.9228447],[5.4347186,44.8900063],[5.4330265,44.8899463],[5.4306544,44.8502562],[5.4338694,44.8501362],[5.4328541,44.8263781],[5.435477,44.8262581],[5.4349693,44.8138952],[5.4410611,44.8137151],[5.4371691,44.7409842],[5.4545983,44.7404433],[5.4528215,44.7042536],[5.5210998,44.7024496],[5.5232996,44.7385803],[5.5890397,44.7368374],[5.5929812,44.8126305],[5.5879047,44.8129906],[5.5897661,44.8494722],[5.588228,44.8493765],[5.5897237,44.8735055],[5.5386318,44.8750318],[5.5394694,44.886859],[5.5283416,44.8873253],[5.5300168,44.9201234],[5.5331876,44.9201234],[5.5376148,44.996241],[5.4356493,44.9991755]]],"terms_text":"Parc Naturel du Vercors"},{"id":"vicosa_al","name":"Viçosa AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?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.19799506289,-9.42067411388],[-36.19777392167,-9.41788790418],[-36.19779919496,-9.41528243495],[-36.19801401785,-9.41074463302],[-36.19789396976,-9.4085692096],[-36.19792556136,-9.40636883904],[-36.1979697896,-9.40560836777],[-36.19793187968,-9.40405001978],[-36.19798874457,-9.40311500762],[-36.19827306898,-9.40027878861],[-36.19829202394,-9.39495536094],[-36.19788765144,-9.39168895497],[-36.19844366363,-9.38932016801],[-36.19836784379,-9.3862033184],[-36.197938198,-9.38166513525],[-36.19801401785,-9.37972018144],[-36.1983425705,-9.37867289409],[-36.19831729722,-9.37697727931],[-36.19816565754,-9.37585517674],[-36.19851948347,-9.37139166614],[-36.1982162041,-9.36238966295],[-36.1986205766,-9.35318792839],[-36.19849421019,-9.35096850339],[-36.19857003004,-9.34852462578],[-36.19879748957,-9.34667923744],[-36.19859530332,-9.34348719127],[-36.19877221629,-9.34084375588],[-36.19894912926,-9.33301308429],[-36.19877221629,-9.33039450836],[-36.28957911612,-9.33114267492],[-36.28937692987,-9.33318765532],[-36.28950329627,-9.33538225508],[-36.28925056346,-9.34124276628],[-36.28945274971,-9.34291361737],[-36.28927583674,-9.34520790729],[-36.28897255737,-9.37311224406],[-36.28914947033,-9.37480787773],[-36.2889220108,-9.37707702159],[-36.28889673752,-9.38540540039],[-36.28871982455,-9.38632799292],[-36.28871982455,-9.39343436657],[-36.28887146424,-9.39557871736],[-36.28877037111,-9.40128860991],[-36.28861873143,-9.40652467311],[-36.28871982455,-9.40714800869],[-36.28877037111,-9.4213348225],[-36.19799506289,-9.42067411388]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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","scaleExtent":[12,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"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-gp","name":"Vienna: Mehrzweckkarte (general purpose)","type":"tms","template":"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"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","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"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.9680512,47.5463081],[9.9680895,47.5462689],[9.9712464,47.544249],[9.9648355,47.538031],[9.9683952,47.5280172],[9.965262,47.5208928],[9.9956949,47.5027787],[9.9873585,47.4984652],[10.0007641,47.4821056],[10.023014,47.4841071],[10.0374328,47.4891775],[10.0447745,47.4876222],[10.0541256,47.4758854],[10.0534684,47.4668571],[10.064681,47.4636357],[10.0699906,47.4559503],[10.0805676,47.4553604],[10.0885672,47.4602924],[10.091638,47.4589276],[10.0938486,47.4404644],[10.1055856,47.4287167],[10.0937374,47.4168811],[10.07418,47.4147226],[10.0691405,47.410176],[10.0862396,47.3995221],[10.0828437,47.3938062],[10.0998387,47.3547604],[10.1193354,47.375613],[10.1416871,47.36718],[10.1658749,47.3688749],[10.1695804,47.3712997],[10.1693975,47.3858299],[10.1813043,47.3872516],[10.181849,47.3924258],[10.1950843,47.3893456],[10.1998763,47.3833352],[10.2125912,47.3803897],[10.227051,47.388895],[10.2361856,47.3819213],[10.2316784,47.3789694],[10.2371623,47.3735651],[10.2169885,47.3543552],[10.2171047,47.3498849],[10.2042369,47.3367531],[10.2074173,47.3323161],[10.1995092,47.3264601],[10.2111311,47.3189838],[10.2159718,47.311064],[10.2123593,47.3112242],[10.1991314,47.2975423],[10.1896365,47.2939449],[10.1796106,47.2960256],[10.172077,47.2790762],[10.1740416,47.2702482],[10.1783421,47.2701114],[10.174493,47.263697],[10.218842,47.255327],[10.223433,47.249833],[10.210873,47.247805],[10.1977606,47.236662],[10.207913,47.232802],[10.214282,47.216842],[10.21269,47.204315],[10.1996265,47.195388],[10.1995066,47.1852535],[10.2115119,47.1712368],[10.2091987,47.1653713],[10.20851,47.159483],[10.213206,47.1576984],[10.222203,47.15323],[10.2216565,47.1492513],[10.214808,47.143515],[10.203327,47.142152],[10.208868,47.131643],[10.186295,47.12886],[10.186525,47.119455],[10.172877,47.120333],[10.162993,47.113607],[10.157657,47.114262],[10.154415,47.105778],[10.132428,47.081218],[10.1345877,47.0639183],[10.1508456,47.0618412],[10.156932,47.048827],[10.1441816,47.0335527],[10.1232555,47.0220943],[10.1328399,47.0120428],[10.1544702,47.0054497],[10.159614,46.9988153],[10.1544222,46.9929855],[10.1600074,46.9839969],[10.1446293,46.9830135],[10.1349173,46.9658398],[10.1350134,46.9548285],[10.1268364,46.9434986],[10.0977188,46.9267603],[10.0995372,46.9171215],[10.1092134,46.908337],[10.1090833,46.8943061],[10.1249668,46.8801373],[10.1414741,46.8746789],[10.1396666,46.8621658],[10.1450621,46.8510986],[10.1394105,46.8473781],[10.1230851,46.8484838],[10.1191237,46.8441698],[10.1051833,46.8408981],[10.0919546,46.851426],[10.0926536,46.8581775],[10.087123,46.861277],[10.0548814,46.8617049],[10.0508964,46.8644202],[10.0519245,46.8740502],[10.0389144,46.8861128],[10.0322055,46.8880172],[10.0178184,46.9016148],[10.0049435,46.8988926],[9.9824336,46.9061986],[9.9779314,46.9160343],[9.9665663,46.9122226],[9.9590704,46.9160246],[9.946121,46.9123495],[9.9375809,46.9132426],[9.9215303,46.918824],[9.9123097,46.9260554],[9.9063207,46.9253006],[9.8944853,46.9316447],[9.8761296,46.9346278],[9.8807063,46.9401115],[9.8765706,46.9407057],[9.8748781,46.9503903],[9.8787197,46.9570665],[9.8707312,46.9632091],[9.8848165,46.9854648],[9.8923039,46.9903589],[9.8887771,47.0007231],[9.870696,47.0096514],[9.8711507,47.0130577],[9.8803497,47.0172237],[9.8777935,47.0205525],[9.8597449,47.0232098],[9.8527287,47.0164129],[9.8361195,47.012531],[9.8235302,47.0198587],[9.8075641,47.0235627],[9.7849142,47.0384853],[9.7480774,47.0369227],[9.7418488,47.042675],[9.718211,47.0433745],[9.7070102,47.0480458],[9.7075964,47.0538077],[9.69756,47.0523884],[9.6839177,47.0576471],[9.6818398,47.0620979],[9.6774319,47.061409],[9.6582148,47.0581823],[9.6450573,47.059775],[9.6415752,47.0559826],[9.6365412,47.051703],[9.6263272,47.0513274],[9.6070544,47.0607725],[9.6133977,47.0694958],[9.6115341,47.0794024],[9.6186894,47.0781689],[9.6233873,47.0825788],[9.6334608,47.0834395],[9.6356428,47.0955277],[9.6285845,47.1075584],[9.6208286,47.1103155],[9.6350298,47.1281316],[9.6246665,47.1326485],[9.6225823,47.1413535],[9.6258673,47.1458981],[9.6205943,47.1516392],[9.6089021,47.1477494],[9.5967871,47.1629415],[9.5794635,47.1711566],[9.5645583,47.1702904],[9.5730168,47.1755955],[9.5725939,47.1907921],[9.5803175,47.1957775],[9.5847667,47.2053225],[9.5687023,47.2196758],[9.5585129,47.2241649],[9.5517611,47.2237671],[9.5667871,47.2428808],[9.5307265,47.2705781],[9.5461876,47.2800507],[9.556344,47.2982863],[9.588051,47.3173029],[9.5996599,47.3454983],[9.6107327,47.355706],[9.6244598,47.3661451],[9.6587582,47.369461],[9.6725468,47.3802057],[9.673111,47.3919406],[9.6516178,47.404626],[9.6455139,47.4311951],[9.6451212,47.4378008],[9.6579866,47.4477909],[9.6589756,47.4522045],[9.6223413,47.457472],[9.609044,47.4705422],[9.6029186,47.4619769],[9.5951426,47.4633095],[9.5821741,47.4827585],[9.562202,47.4959175],[9.550566,47.5371757],[9.5827036,47.5359236],[9.6046496,47.5295205],[9.7347836,47.5339558],[9.7351711,47.5466141],[9.7416436,47.5549858],[9.7471037,47.5556923],[9.7433711,47.5586655],[9.7520662,47.5674668],[9.7480649,47.5705239],[9.7563218,47.5726206],[9.7563266,47.5796315],[9.7619689,47.5809636],[9.7655314,47.5891166],[9.7693306,47.5873852],[9.7769663,47.5954393],[9.7915143,47.5935211],[9.7999911,47.5961057],[9.81414,47.5880685],[9.8238141,47.5871045],[9.8272819,47.579972],[9.8207906,47.5707624],[9.8256191,47.5592156],[9.8171007,47.5533268],[9.8157872,47.5476661],[9.8502301,47.5416393],[9.8583884,47.5338767],[9.8745052,47.5285372],[9.8780368,47.5387569],[9.8751486,47.543427],[9.8812471,47.5481426],[9.8891039,47.5439867],[9.8993513,47.54475],[9.9066603,47.5421716],[9.913579,47.532546],[9.9218947,47.5296364],[9.9335226,47.5326499],[9.9410791,47.5382227],[9.9636997,47.5347198],[9.9588294,47.5431278],[9.9631795,47.54229],[9.9680512,47.5463081]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"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.9680512,47.5463081],[9.9680895,47.5462689],[9.9712464,47.544249],[9.9648355,47.538031],[9.9683952,47.5280172],[9.965262,47.5208928],[9.9956949,47.5027787],[9.9873585,47.4984652],[10.0007641,47.4821056],[10.023014,47.4841071],[10.0374328,47.4891775],[10.0447745,47.4876222],[10.0541256,47.4758854],[10.0534684,47.4668571],[10.064681,47.4636357],[10.0699906,47.4559503],[10.0805676,47.4553604],[10.0885672,47.4602924],[10.091638,47.4589276],[10.0938486,47.4404644],[10.1055856,47.4287167],[10.0937374,47.4168811],[10.07418,47.4147226],[10.0691405,47.410176],[10.0862396,47.3995221],[10.0828437,47.3938062],[10.0998387,47.3547604],[10.1193354,47.375613],[10.1416871,47.36718],[10.1658749,47.3688749],[10.1695804,47.3712997],[10.1693975,47.3858299],[10.1813043,47.3872516],[10.181849,47.3924258],[10.1950843,47.3893456],[10.1998763,47.3833352],[10.2125912,47.3803897],[10.227051,47.388895],[10.2361856,47.3819213],[10.2316784,47.3789694],[10.2371623,47.3735651],[10.2169885,47.3543552],[10.2171047,47.3498849],[10.2042369,47.3367531],[10.2074173,47.3323161],[10.1995092,47.3264601],[10.2111311,47.3189838],[10.2159718,47.311064],[10.2123593,47.3112242],[10.1991314,47.2975423],[10.1896365,47.2939449],[10.1796106,47.2960256],[10.172077,47.2790762],[10.1740416,47.2702482],[10.1783421,47.2701114],[10.174493,47.263697],[10.218842,47.255327],[10.223433,47.249833],[10.210873,47.247805],[10.1977606,47.236662],[10.207913,47.232802],[10.214282,47.216842],[10.21269,47.204315],[10.1996265,47.195388],[10.1995066,47.1852535],[10.2115119,47.1712368],[10.2091987,47.1653713],[10.20851,47.159483],[10.213206,47.1576984],[10.222203,47.15323],[10.2216565,47.1492513],[10.214808,47.143515],[10.203327,47.142152],[10.208868,47.131643],[10.186295,47.12886],[10.186525,47.119455],[10.172877,47.120333],[10.162993,47.113607],[10.157657,47.114262],[10.154415,47.105778],[10.132428,47.081218],[10.1345877,47.0639183],[10.1508456,47.0618412],[10.156932,47.048827],[10.1441816,47.0335527],[10.1232555,47.0220943],[10.1328399,47.0120428],[10.1544702,47.0054497],[10.159614,46.9988153],[10.1544222,46.9929855],[10.1600074,46.9839969],[10.1446293,46.9830135],[10.1349173,46.9658398],[10.1350134,46.9548285],[10.1268364,46.9434986],[10.0977188,46.9267603],[10.0995372,46.9171215],[10.1092134,46.908337],[10.1090833,46.8943061],[10.1249668,46.8801373],[10.1414741,46.8746789],[10.1396666,46.8621658],[10.1450621,46.8510986],[10.1394105,46.8473781],[10.1230851,46.8484838],[10.1191237,46.8441698],[10.1051833,46.8408981],[10.0919546,46.851426],[10.0926536,46.8581775],[10.087123,46.861277],[10.0548814,46.8617049],[10.0508964,46.8644202],[10.0519245,46.8740502],[10.0389144,46.8861128],[10.0322055,46.8880172],[10.0178184,46.9016148],[10.0049435,46.8988926],[9.9824336,46.9061986],[9.9779314,46.9160343],[9.9665663,46.9122226],[9.9590704,46.9160246],[9.946121,46.9123495],[9.9375809,46.9132426],[9.9215303,46.918824],[9.9123097,46.9260554],[9.9063207,46.9253006],[9.8944853,46.9316447],[9.8761296,46.9346278],[9.8807063,46.9401115],[9.8765706,46.9407057],[9.8748781,46.9503903],[9.8787197,46.9570665],[9.8707312,46.9632091],[9.8848165,46.9854648],[9.8923039,46.9903589],[9.8887771,47.0007231],[9.870696,47.0096514],[9.8711507,47.0130577],[9.8803497,47.0172237],[9.8777935,47.0205525],[9.8597449,47.0232098],[9.8527287,47.0164129],[9.8361195,47.012531],[9.8235302,47.0198587],[9.8075641,47.0235627],[9.7849142,47.0384853],[9.7480774,47.0369227],[9.7418488,47.042675],[9.718211,47.0433745],[9.7070102,47.0480458],[9.7075964,47.0538077],[9.69756,47.0523884],[9.6839177,47.0576471],[9.6818398,47.0620979],[9.6774319,47.061409],[9.6582148,47.0581823],[9.6450573,47.059775],[9.6415752,47.0559826],[9.6365412,47.051703],[9.6263272,47.0513274],[9.6070544,47.0607725],[9.6133977,47.0694958],[9.6115341,47.0794024],[9.6186894,47.0781689],[9.6233873,47.0825788],[9.6334608,47.0834395],[9.6356428,47.0955277],[9.6285845,47.1075584],[9.6208286,47.1103155],[9.6350298,47.1281316],[9.6246665,47.1326485],[9.6225823,47.1413535],[9.6258673,47.1458981],[9.6205943,47.1516392],[9.6089021,47.1477494],[9.5967871,47.1629415],[9.5794635,47.1711566],[9.5645583,47.1702904],[9.5730168,47.1755955],[9.5725939,47.1907921],[9.5803175,47.1957775],[9.5847667,47.2053225],[9.5687023,47.2196758],[9.5585129,47.2241649],[9.5517611,47.2237671],[9.5667871,47.2428808],[9.5307265,47.2705781],[9.5461876,47.2800507],[9.556344,47.2982863],[9.588051,47.3173029],[9.5996599,47.3454983],[9.6107327,47.355706],[9.6244598,47.3661451],[9.6587582,47.369461],[9.6725468,47.3802057],[9.673111,47.3919406],[9.6516178,47.404626],[9.6455139,47.4311951],[9.6451212,47.4378008],[9.6579866,47.4477909],[9.6589756,47.4522045],[9.6223413,47.457472],[9.609044,47.4705422],[9.6029186,47.4619769],[9.5951426,47.4633095],[9.5821741,47.4827585],[9.562202,47.4959175],[9.550566,47.5371757],[9.5827036,47.5359236],[9.6046496,47.5295205],[9.7347836,47.5339558],[9.7351711,47.5466141],[9.7416436,47.5549858],[9.7471037,47.5556923],[9.7433711,47.5586655],[9.7520662,47.5674668],[9.7480649,47.5705239],[9.7563218,47.5726206],[9.7563266,47.5796315],[9.7619689,47.5809636],[9.7655314,47.5891166],[9.7693306,47.5873852],[9.7769663,47.5954393],[9.7915143,47.5935211],[9.7999911,47.5961057],[9.81414,47.5880685],[9.8238141,47.5871045],[9.8272819,47.579972],[9.8207906,47.5707624],[9.8256191,47.5592156],[9.8171007,47.5533268],[9.8157872,47.5476661],[9.8502301,47.5416393],[9.8583884,47.5338767],[9.8745052,47.5285372],[9.8780368,47.5387569],[9.8751486,47.543427],[9.8812471,47.5481426],[9.8891039,47.5439867],[9.8993513,47.54475],[9.9066603,47.5421716],[9.913579,47.532546],[9.9218947,47.5296364],[9.9335226,47.5326499],[9.9410791,47.5382227],[9.9636997,47.5347198],[9.9588294,47.5431278],[9.9631795,47.54229],[9.9680512,47.5463081]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"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","polygon":[[[9.5436683,47.4847893],[9.6145139,47.4505807],[9.6135938,47.3827196],[9.4424603,47.2479843],[9.4461405,47.0959963],[9.4286592,47.0891059],[9.4249789,47.0151345],[9.8528128,47.0019594],[9.8574132,46.898956],[9.9669019,46.889525],[10.0451081,46.849897],[10.1582771,46.833534],[10.1591972,46.8920401],[10.1471804,46.8924787],[10.1511549,46.9433055],[10.1631717,46.9428673],[10.1646986,46.9623816],[10.1785187,46.9668098],[10.1757585,47.1035121],[10.2291227,47.1022595],[10.2208421,47.2436121],[10.2613253,47.4126142],[10.1242344,47.4057648],[10.093872,47.4779493],[10.0046249,47.5071683],[9.9862234,47.5612116],[9.8436121,47.5624533],[9.8408519,47.6071356],[9.539988,47.6065153],[9.5436683,47.4847893]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"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","polygon":[[[9.5436683,47.4847893],[9.6145139,47.4505807],[9.6135938,47.3827196],[9.4424603,47.2479843],[9.4461405,47.0959963],[9.4286592,47.0891059],[9.4249789,47.0151345],[9.8528128,47.0019594],[9.8574132,46.898956],[9.9669019,46.889525],[10.0451081,46.849897],[10.1582771,46.833534],[10.1591972,46.8920401],[10.1471804,46.8924787],[10.1511549,46.9433055],[10.1631717,46.9428673],[10.1646986,46.9623816],[10.1785187,46.9668098],[10.1757585,47.1035121],[10.2291227,47.1022595],[10.2208421,47.2436121],[10.2613253,47.4126142],[10.1242344,47.4057648],[10.093872,47.4779493],[10.0046249,47.5071683],[9.9862234,47.5612116],[9.8436121,47.5624533],[9.8408519,47.6071356],[9.539988,47.6065153],[9.5436683,47.4847893]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"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","polygon":[[[10.1703925,46.8297883],[10.1710791,46.93644],[10.1841254,46.9411282],[10.1854987,47.1015707],[10.239057,47.104375],[10.2428336,47.1561117],[10.2569098,47.1870362],[10.2455802,47.2759749],[10.2531333,47.323472],[10.2689261,47.3262646],[10.2644629,47.41102],[10.1319403,47.4086966],[10.1343436,47.4610652],[10.1175208,47.4615294],[10.1188941,47.4733659],[10.0873084,47.4742942],[10.0849051,47.5072362],[10.0684256,47.5070043],[10.0673956,47.521497],[10.0234503,47.5242791],[10.000791,47.5794276],[9.8490424,47.5775748],[9.8504157,47.6146181],[9.7275061,47.6127666],[9.7202963,47.5908903],[9.7034735,47.5891536],[9.7031302,47.5449087],[9.6821875,47.5449087],[9.6804709,47.5534826],[9.5639128,47.5493117],[9.5620246,47.5395782],[9.5517249,47.5395782],[9.5517249,47.5340154],[9.5216841,47.5347108],[9.5270056,47.3049672],[9.505033,47.3026391],[9.5009131,47.2336806],[9.5235724,47.2322819],[9.5242591,47.165566],[9.5448584,47.1640488],[9.5438284,47.1544774],[9.5723242,47.1540105],[9.5702643,47.128089],[9.590177,47.128673],[9.5918936,47.1002853],[9.5723242,47.1001685],[9.5771308,47.0286063],[9.7240729,47.0304785],[9.7230429,47.0174892],[9.7745413,47.0156166],[9.776258,47.0055504],[9.7927374,47.0039115],[9.7947974,46.9912671],[9.8387427,46.9931405],[9.840116,46.9034933],[9.8902411,46.9072462],[9.8854346,46.887071],[9.959249,46.8914116],[9.9619956,46.8767458],[10.0001044,46.8786233],[9.9966712,46.857146],[10.0186438,46.8565591],[10.0234503,46.8307278],[10.1703925,46.8297883]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="}];
23645
23646 var presets = {"aerialway":{"fields":["aerialway"],"geometry":["point","vertex","line"],"tags":{"aerialway":"*"},"terms":["ski lift","funifor","funitel"],"searchable":false,"name":"Aerialway"},"aeroway":{"icon":"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},"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},"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"},"aerialway/station":{"icon":"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":"airport","geometry":["point","area"],"fields":["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],"terms":["airplane","airport","aerodrome"],"tags":{"aeroway":"aerodrome"},"name":"Airport"},"aeroway/apron":{"icon":"airport","geometry":["area"],"terms":["ramp"],"fields":["ref","surface"],"tags":{"aeroway":"apron"},"name":"Apron"},"aeroway/gate":{"icon":"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":"heliport","geometry":["point","area"],"fields":["ref"],"terms":["helicopter","helipad","heliport"],"tags":{"aeroway":"helipad"},"name":"Helipad"},"aeroway/runway":{"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":"airport","geometry":["point","area"],"terms":["airport","aerodrome"],"fields":["name","operator","building_area"],"tags":{"aeroway":"terminal"},"name":"Airport Terminal"},"amenity/bus_station":{"icon":"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":"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":"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":"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/register_office":{"icon":"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":"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":"swimming","geometry":["point","vertex","area"],"tags":{"amenity":"swimming_pool"},"reference":{"key":"leisure","value":"swimming_pool"},"name":"Swimming Pool","searchable":false},"amenity/animal_boarding":{"icon":"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":"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":"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":"theatre","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"arts_centre"},"name":"Arts Center"},"amenity/atm":{"icon":"bank","fields":["operator","currency_multi","drive_through"],"geometry":["point","vertex"],"terms":["money","cash","machine"],"tags":{"amenity":"atm"},"name":"ATM"},"amenity/bank":{"icon":"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":"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":"bbq","fields":["covered","fuel"],"geometry":["point"],"terms":["bbq","grill"],"tags":{"amenity":"bbq"},"name":"Barbecue/Grill"},"amenity/bench":{"icon":"poi-bench","fields":["backrest"],"geometry":["point","vertex","line"],"terms":["seat"],"tags":{"amenity":"bench"},"name":"Bench"},"amenity/bicycle_parking":{"icon":"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":"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":"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":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"geometry":["point","area"],"tags":{"amenity":"biergarten"},"terms":["beer","bier","booze"],"name":"Beer Garden"},"amenity/boat_rental":{"fields":["name","operator","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"boat_rental"},"name":"Boat Rental"},"amenity/bureau_de_change":{"icon":"bank","fields":["name","operator","currency_multi"],"geometry":["point","vertex"],"terms":["bureau de change","money changer"],"tags":{"amenity":"bureau_de_change"},"name":"Currency Exchange"},"amenity/cafe":{"icon":"cafe","fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bistro","coffee","tea"],"tags":{"amenity":"cafe"},"name":"Cafe"},"amenity/car_pooling":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","area"],"tags":{"amenity":"car_pooling"},"name":"Car Pooling"},"amenity/car_rental":{"icon":"car","fields":["name","operator","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_rental"},"name":"Car Rental"},"amenity/car_sharing":{"icon":"car","fields":["name","operator","capacity","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_sharing"},"name":"Car Sharing"},"amenity/car_wash":{"icon":"car","fields":["address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_wash"},"name":"Car Wash"},"amenity/casino":{"icon":"poi-dice","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":"car","fields":["operator","capacity"],"geometry":["point"],"tags":{"amenity":"charging_station"},"terms":["EV","Electric Vehicle","Supercharger"],"name":"Charging Station"},"amenity/childcare":{"icon":"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":"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":"hospital","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":"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":"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":"poi-clock","fields":["name","support","display","visibility","date"],"geometry":["point","vertex"],"tags":{"amenity":"clock"},"name":"Clock"},"amenity/college":{"icon":"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":"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":"car","geometry":["point","area"],"tags":{"amenity":"compressed_air"},"name":"Compressed Air"},"amenity/courthouse":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"courthouse"},"name":"Courthouse"},"amenity/crematorium":{"icon":"cemetery","fields":["name","website","phone","opening_hours","wheelchair"],"geometry":["area","point"],"tags":{"amenity":"crematorium"},"terms":["cemetery","funeral"],"name":"Crematorium"},"amenity/dentist":{"icon":"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/doctors":{"icon":"hospital","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":"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":"drinking-water","geometry":["point"],"tags":{"amenity":"drinking_water"},"terms":["fountain","potable"],"name":"Drinking Water"},"amenity/driving_school":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"driving_school"},"name":"Driving School"},"amenity/embassy":{"icon":"embassy","fields":["name","country","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"embassy"},"name":"Embassy"},"amenity/fast_food":{"icon":"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/fire_station":{"icon":"fire-station","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"fire_station"},"name":"Fire Station"},"amenity/food_court":{"icon":"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":"poi-fountain","geometry":["point","area"],"tags":{"amenity":"fountain"},"name":"Fountain"},"amenity/fuel":{"icon":"fuel","fields":["name","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":"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":"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":"poi-binoculars","geometry":["point","vertex","area"],"terms":["game","gun","lookout","rifle","shoot*","wild","watch"],"tags":{"amenity":"hunting_stand"},"name":"Hunting Stand"},"amenity/ice_cream":{"icon":"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":"poi-mast","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":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["kindergarden","pre-school"],"tags":{"amenity":"kindergarten"},"name":"Preschool/Kindergarten Grounds"},"amenity/library":{"icon":"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":"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":"shop","fields":["name","operator","address","building","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"marketplace"},"name":"Marketplace"},"amenity/motorcycle_parking":{"icon":"scooter","fields":["capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"tags":{"amenity":"motorcycle_parking"},"name":"Motorcycle Parking"},"amenity/music_school":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["school of music"],"tags":{"amenity":"music_school"},"name":"Music School"},"amenity/nightclub":{"icon":"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":"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":"parking","fields":["operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay"],"geometry":["point","vertex","area"],"tags":{"amenity":"parking"},"terms":[],"name":"Car Parking"},"amenity/pavilion":{"icon":"shelter","fields":["bin","bench"],"geometry":["point","vertex","area"],"tags":{"amenity":"shelter","shelter_type":"pavilion"},"name":"Pavilion"},"amenity/pharmacy":{"icon":"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":["drug*","med*","prescription"],"name":"Pharmacy"},"amenity/place_of_worship":{"icon":"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":"buddhism","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":"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":"poi-hinduist","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":"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":"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":"poi-shintoist","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":"poi-sikhist","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":"poi-taoist","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":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["museum","astronomy","observatory"],"tags":{"amenity":"planetarium"},"name":"Planetarium"},"amenity/police":{"icon":"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":"post","fields":["operator","collection_times","drive_through","ref"],"geometry":["point","vertex"],"tags":{"amenity":"post_box"},"terms":["letter","post"],"name":"Mailbox"},"amenity/post_office":{"icon":"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":"prison","fields":["name","operator","address"],"geometry":["point","area"],"terms":["cell","jail"],"tags":{"amenity":"prison"},"name":"Prison Grounds"},"amenity/pub":{"icon":"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":"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":"library","fields":["name","operator","capacity","website"],"geometry":["point","area"],"terms":["library","bookcrossing"],"tags":{"amenity":"public_bookcase"},"name":"Public Bookcase"},"amenity/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":"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":{"icon":"recycling","fields":["recycling_accepts","collection_times"],"geometry":["point","area"],"terms":["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling"},"addTags":{"amenity":"recycling","recycling_type":"container"},"removeTags":{"amenity":"recycling","recycling_type":"container"},"reference":{"key":"amenity","value":"recycling"},"name":"Recycling Container"},"amenity/restaurant":{"icon":"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/sanitary_dump_station":{"icon":"poi-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":"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":"shelter","fields":["name","shelter_type","bin"],"geometry":["point","vertex","area"],"terms":["lean-to","gazebo","picnic"],"tags":{"amenity":"shelter"},"name":"Shelter"},"amenity/shower":{"icon":"poi-shower","fields":["operator","opening_hours","fee","supervised","building_area"],"geometry":["point","vertex","area"],"terms":["rain closet"],"tags":{"amenity":"shower"},"name":"Shower"},"amenity/smoking_area":{"fields":["name","shelter","bin","bench","opening_hours"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"smoking_area"},"name":"Smoking Area"},"amenity/social_facility":{"icon":"poi-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":"poi-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":"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":"poi-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":"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":"karaoke","fields":["name","studio","address","building_area"],"geometry":["point","area"],"terms":["recording","radio","television"],"tags":{"amenity":"studio"},"name":"Studio"},"amenity/taxi":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","vertex","area"],"terms":["cab"],"tags":{"amenity":"taxi"},"name":"Taxi Stand"},"amenity/telephone":{"icon":"telephone","fields":["operator","phone","fee","payment_multi","covered","indoor"],"geometry":["point","vertex"],"tags":{"amenity":"telephone"},"terms":["phone"],"name":"Telephone"},"amenity/theatre":{"icon":"theatre","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["theatre","performance","play","musical"],"tags":{"amenity":"theatre"},"name":"Theater"},"amenity/toilets":{"icon":"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":"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":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["college"],"tags":{"amenity":"university"},"name":"University Grounds"},"amenity/vending_machine":{"icon":"poi-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":"poi-vending-machine","fields":["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":"poi-vending-machine","fields":["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/condoms":{"icon":"poi-vending-machine","fields":["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":"poi-vending-machine","fields":["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/excrement_bags":{"icon":"poi-vending-machine","fields":["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":"poi-vending-machine","fields":["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/newspapers":{"icon":"poi-vending-machine","fields":["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":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parcel","mail","pickup"],"tags":{"amenity":"vending_machine","vending":"parcel_pickup;parcel_mail_in"},"reference":{"key":"vending","value":"parcel_pickup;parcel_mail_in"},"name":"Parcel Pickup/Dropoff Vending Machine"},"amenity/vending_machine/parking_tickets":{"icon":"poi-vending-machine","fields":["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":"poi-vending-machine","fields":["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/sweets":{"icon":"poi-vending-machine","fields":["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":"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":"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":"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":"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":"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":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"water_point"},"name":"RV Drinking Water"},"amenity/watering_place":{"icon":"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":"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":"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":"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":"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":"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":"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":"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":"poi-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/pirate_ship":{"icon":"amusement-park","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":"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":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride"],"tags":{"attraction":"roller_coaster"},"name":"Roller Coaster"},"attraction/train":{"icon":"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":"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":"roadblock","geometry":["point","vertex","line","area"],"tags":{"barrier":"*"},"fields":["barrier"],"name":"Barrier","matchScore":0.4},"barrier/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"barrier":"entrance"},"name":"Entrance","searchable":false},"barrier/block":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"block"},"name":"Block"},"barrier/bollard":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"bollard"},"name":"Bollard"},"barrier/border_control":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"border_control"},"name":"Border Control"},"barrier/cattle_grid":{"icon":"barrier","geometry":["vertex"],"tags":{"barrier":"cattle_grid"},"name":"Cattle Grid"},"barrier/city_wall":{"icon":"barrier","fields":["height"],"geometry":["line","area"],"tags":{"barrier":"city_wall"},"name":"City Wall"},"barrier/cycle_barrier":{"icon":"roadblock","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"cycle_barrier"},"name":"Cycle Barrier"},"barrier/ditch":{"icon":"roadblock","geometry":["line","area"],"tags":{"barrier":"ditch"},"name":"Trench","matchScore":0.25},"barrier/fence":{"icon":"fence","fields":["fence_type","height"],"geometry":["line"],"tags":{"barrier":"fence"},"name":"Fence","matchScore":0.25},"barrier/gate":{"icon":"barrier","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"gate"},"name":"Gate"},"barrier/hedge":{"fields":["height"],"geometry":["line","area"],"tags":{"barrier":"hedge"},"name":"Hedge","matchScore":0.25},"barrier/kerb":{"icon":"wheelchair","fields":["kerb","tactile_paving"],"geometry":["vertex","line"],"tags":{"barrier":"kerb"},"name":"Kerb"},"barrier/kissing_gate":{"icon":"barrier","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"kissing_gate"},"name":"Kissing Gate"},"barrier/lift_gate":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"lift_gate"},"name":"Lift Gate"},"barrier/retaining_wall":{"geometry":["line","area"],"tags":{"barrier":"retaining_wall"},"name":"Retaining Wall"},"barrier/stile":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"stile"},"name":"Stile"},"barrier/toll_booth":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"toll_booth"},"name":"Toll Booth"},"barrier/wall":{"icon":"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"]},"building":{"icon":"home","fields":["name","building","levels","address"],"geometry":["point","area"],"tags":{"building":"*"},"matchScore":0.6,"terms":[],"name":"Building"},"building/bunker":{"fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bunker"},"matchScore":0.5,"name":"Bunker","searchable":false},"building/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"building":"entrance"},"name":"Entrance/Exit","searchable":false},"building/train_station":{"icon":"building","fields":["name","address","levels"],"geometry":["point","vertex","area"],"tags":{"building":"train_station"},"matchScore":0.5,"name":"Train Station","searchable":false},"building/apartments":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"apartments"},"matchScore":0.5,"name":"Apartments"},"building/barn":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"barn"},"matchScore":0.5,"name":"Barn"},"building/boathouse":{"icon":"harbor","fields":["name","levels","address"],"geometry":["area"],"tags":{"building":"boathouse"},"matchScore":0.5,"terms":[],"name":"Boathouse"},"building/bungalow":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bungalow"},"terms":["home","detached"],"matchScore":0.5,"name":"Bungalow"},"building/cabin":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cabin"},"matchScore":0.5,"name":"Cabin"},"building/cathedral":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cathedral"},"matchScore":0.5,"name":"Cathedral Building"},"building/chapel":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"chapel"},"matchScore":0.5,"name":"Chapel Building"},"building/church":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"church"},"matchScore":0.5,"name":"Church Building"},"building/civic":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"civic"},"matchScore":0.5,"name":"Civic Building"},"building/college":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["university"],"tags":{"building":"college"},"matchScore":0.5,"name":"College Building"},"building/commercial":{"icon":"suitcase","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"commercial"},"matchScore":0.5,"name":"Commercial Building"},"building/construction":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"construction"},"matchScore":0.5,"name":"Building Under Construction"},"building/detached":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"detached"},"terms":["home","single","family","residence","dwelling"],"matchScore":0.5,"name":"Detached House"},"building/dormitory":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"dormitory"},"matchScore":0.5,"name":"Dormitory"},"building/farm_auxiliary":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"farm_auxiliary"},"matchScore":0.5,"name":"Farm Building"},"building/farm":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"farm"},"matchScore":0.5,"name":"Farm House"},"building/garage":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garage"},"matchScore":0.5,"name":"Garage"},"building/garages":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garages"},"matchScore":0.5,"name":"Garages"},"building/greenhouse":{"icon":"garden-center","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"greenhouse"},"matchScore":0.5,"name":"Greenhouse"},"building/hospital":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"hospital"},"matchScore":0.5,"name":"Hospital Building"},"building/hotel":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"hotel"},"matchScore":0.5,"name":"Hotel Building"},"building/house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"house"},"terms":["home","family","residence","dwelling"],"matchScore":0.5,"name":"House"},"building/hut":{"geometry":["area"],"fields":["name"],"tags":{"building":"hut"},"matchScore":0.5,"name":"Hut"},"building/industrial":{"icon":"industry","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"industrial"},"matchScore":0.5,"name":"Industrial Building"},"building/kindergarten":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["kindergarden","pre-school"],"tags":{"building":"kindergarten"},"matchScore":0.5,"name":"Preschool/Kindergarten Building"},"building/mosque":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"mosque"},"matchScore":0.5,"name":"Mosque Building"},"building/public":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"public"},"matchScore":0.5,"name":"Public Building"},"building/residential":{"icon":"residential-community","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"residential"},"matchScore":0.5,"name":"Residential Building"},"building/retail":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"retail"},"matchScore":0.5,"name":"Retail Building"},"building/roof":{"icon":"shelter","fields":["name","address"],"geometry":["area"],"tags":{"building":"roof"},"matchScore":0.5,"name":"Roof"},"building/ruins":{"icon":"poi-ruins","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"ruins"},"matchScore":0.5,"name":"Building Ruins"},"building/school":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"building":"school"},"matchScore":0.5,"name":"School Building"},"building/semidetached_house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"semidetached_house"},"terms":["home","double","duplex","twin","family","residence","dwelling"],"matchScore":0.5,"name":"Semi-Detached House"},"building/service":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"service"},"matchScore":0.5,"name":"Service Building"},"building/shed":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"shed"},"matchScore":0.5,"name":"Shed"},"building/stable":{"icon":"horse-riding","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"stable"},"matchScore":0.5,"name":"Stable"},"building/stadium":{"icon":"stadium","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"stadium"},"matchScore":0.5,"name":"Stadium Building"},"building/static_caravan":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"building/temple":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"temple"},"matchScore":0.5,"name":"Temple Building"},"building/terrace":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"terrace"},"terms":["home","terrace","brownstone","family","residence","dwelling"],"matchScore":0.5,"name":"Row Houses"},"building/transportation":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"transportation"},"matchScore":0.5,"name":"Transportation Building"},"building/university":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["college"],"tags":{"building":"university"},"matchScore":0.5,"name":"University Building"},"building/warehouse":{"icon":"warehouse","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"warehouse"},"matchScore":0.5,"name":"Warehouse"},"camp_site/camp_pitch":{"icon":"campsite","fields":["name","ref"],"geometry":["point","area"],"terms":["tent","rv"],"tags":{"camp_site":"camp_pitch"},"name":"Camp Pitch"},"club":{"icon":"heart","fields":["name","club","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"club":"*"},"terms":["social"],"name":"Club"},"craft":{"icon":"poi-tool","fields":["name","craft","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"*"},"terms":[],"name":"Craft"},"craft/jeweler":{"icon":"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":"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":"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":"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":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"basket_maker"},"name":"Basket Maker"},"craft/beekeeper":{"icon":"farm","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"beekeeper"},"name":"Beekeeper"},"craft/blacksmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"blacksmith"},"name":"Blacksmith"},"craft/boatbuilder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"boatbuilder"},"matchScore":0.4,"name":"Boat Builder"},"craft/bookbinder":{"icon":"library","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["book repair"],"tags":{"craft":"bookbinder"},"name":"Bookbinder"},"craft/brewery":{"icon":"poi-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":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["woodworker"],"tags":{"craft":"carpenter"},"name":"Carpenter"},"craft/carpet_layer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"carpet_layer"},"name":"Carpet Layer"},"craft/caterer":{"icon":"restaurant","fields":["name","cuisine","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"caterer"},"name":"Caterer"},"craft/chimney_sweeper":{"icon":"poi-chimney","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"chimney_sweeper"},"name":"Chimney Sweeper"},"craft/clockmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"clockmaker"},"name":"Clockmaker"},"craft/confectionery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet","candy"],"tags":{"craft":"confectionery"},"name":"Candy Maker"},"craft/distillery":{"icon":"poi-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":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["seamstress"],"tags":{"craft":"dressmaker"},"name":"Dressmaker"},"craft/electrician":{"icon":"poi-power","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["power","wire"],"tags":{"craft":"electrician"},"name":"Electrician"},"craft/electronics_repair":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"electronics_repair"},"name":"Electronics Repair Shop"},"craft/gardener":{"icon":"garden","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscaper","grounds keeper"],"tags":{"craft":"gardener"},"name":"Gardener"},"craft/glaziery":{"icon":"fire-station","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass","stained-glass","window"],"tags":{"craft":"glaziery"},"name":"Glaziery"},"craft/handicraft":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"handicraft"},"name":"Handicraft"},"craft/hvac":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["heat*","vent*","air conditioning"],"tags":{"craft":"hvac"},"name":"HVAC"},"craft/insulator":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"insulation"},"name":"Insulator"},"craft/key_cutter":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"key_cutter"},"name":"Key Cutter"},"craft/metal_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"metal_construction"},"name":"Metal Construction"},"craft/painter":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"painter"},"name":"Painter"},"craft/photographer":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"photographer"},"name":"Photographer"},"craft/photographic_laboratory":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["film"],"tags":{"craft":"photographic_laboratory"},"name":"Photographic Laboratory"},"craft/plasterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"plasterer"},"name":"Plasterer"},"craft/plumber":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pipe"],"tags":{"craft":"plumber"},"name":"Plumber"},"craft/pottery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ceramic"],"tags":{"craft":"pottery"},"name":"Pottery"},"craft/rigger":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"rigger"},"name":"Rigger"},"craft/roofer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"roofer"},"name":"Roofer"},"craft/saddler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"saddler"},"name":"Saddler"},"craft/sailmaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sailmaker"},"name":"Sailmaker"},"craft/sawmill":{"icon":"logging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lumber"],"tags":{"craft":"sawmill"},"name":"Sawmill"},"craft/scaffolder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"scaffolder"},"name":"Scaffolder"},"craft/sculptor":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sculptor"},"name":"Sculptor"},"craft/shoemaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cobbler"],"tags":{"craft":"shoemaker"},"name":"Shoemaker"},"craft/stonemason":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["masonry"],"tags":{"craft":"stonemason"},"name":"Stonemason"},"craft/tiler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tiler"},"name":"Tiler"},"craft/tinsmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tinsmith"},"name":"Tinsmith"},"craft/upholsterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"upholsterer"},"name":"Upholsterer"},"craft/watchmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"watchmaker"},"name":"Watchmaker"},"craft/window_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass"],"tags":{"craft":"window_construction"},"name":"Window Construction"},"craft/winery":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"winery"},"name":"Winery"},"embankment":{"geometry":["line"],"tags":{"embankment":"yes"},"name":"Embankment","matchScore":0.2},"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":"hospital","fields":["name","operator","building_area","address"],"geometry":["point","area"],"terms":["EMS","EMT","rescue"],"tags":{"emergency":"ambulance_station"},"name":"Ambulance Station"},"emergency/defibrillator":{"icon":"defibrillator","fields":["ref","access","opening_hours","indoor","phone"],"geometry":["point","vertex"],"terms":["AED"],"tags":{"emergency":"defibrillator"},"name":"Defibrillator"},"emergency/fire_hydrant":{"icon":"poi-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/life_ring":{"icon":"circle-stroked","fields":["ref","operator"],"geometry":["point","vertex"],"terms":["life buoy","kisby ring","kisbie ring","perry buoy"],"tags":{"emergency":"life_ring"},"name":"Life Ring"},"emergency/phone":{"icon":"emergency-phone","fields":["operator"],"geometry":["point","vertex"],"tags":{"emergency":"phone"},"name":"Emergency Phone"},"emergency/water_tank":{"icon":"water","fields":["name","operator","ref"],"geometry":["point","vertex"],"terms":["water tank","cistern","reservoir"],"tags":{"emergency":"water_tank"},"name":"Emergency Water Tank"},"entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"entrance":"*"},"fields":["entrance","access_simple","address"],"name":"Entrance/Exit"},"footway/crossing-raised":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"footway/crossing":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing"},"reference":{"key":"footway","value":"crossing"},"terms":[],"name":"Street Crossing"},"footway/crosswalk-raised":{"icon":"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","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"footway/crosswalk":{"icon":"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"],"name":"Pedestrian Crosswalk"},"footway/sidewalk":{"icon":"highway-footway","fields":["surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"footway","footway":"sidewalk"},"reference":{"key":"footway","value":"sidewalk"},"terms":[],"name":"Sidewalk"},"ford":{"geometry":["vertex"],"tags":{"ford":"yes"},"name":"Ford"},"golf/bunker":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"bunker","natural":"sand"},"terms":["hazard","bunker"],"reference":{"key":"golf","value":"bunker"},"name":"Sand Trap"},"golf/fairway":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"fairway","landuse":"grass"},"reference":{"key":"golf","value":"fairway"},"name":"Fairway"},"golf/green":{"icon":"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":"golf","fields":["name","ref_golf_hole","par","handicap"],"geometry":["line"],"tags":{"golf":"hole"},"name":"Golf Hole"},"golf/lateral_water_hazard_area":{"icon":"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":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/rough":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"rough","landuse":"grass"},"reference":{"key":"golf","value":"rough"},"name":"Rough"},"golf/tee":{"icon":"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":"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":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"water_hazard"},"name":"Water Hazard"},"healthcare":{"icon":"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":"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":"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":"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":"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":"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":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["terminal","illness"],"tags":{"healthcare":"hospice"},"name":"Hospice"},"healthcare/midwife":{"icon":"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":"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":"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":"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":"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":"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":"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":"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":"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":"highway-bridleway","geometry":["line"],"tags":{"highway":"bridleway"},"terms":["bridleway","equestrian","horse"],"name":"Bridle Path"},"highway/bus_guideway":{"icon":"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":"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-raised":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"highway/crossing":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing"},"reference":{"key":"highway","value":"crossing"},"terms":[],"name":"Street Crossing"},"highway/crosswalk-raised":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"highway/crosswalk":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra"},"reference":{"key":"highway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"highway/cycleway":{"icon":"highway-cycleway","fields":["name","oneway","surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"cycleway"},"terms":["bike"],"name":"Cycle Path"},"highway/elevator":{"icon":"poi-elevator","fields":["access_simple","opening_hours","maxweight","ref"],"geometry":["vertex"],"tags":{"highway":"elevator"},"terms":["lift"],"name":"Elevator"},"highway/footway":{"icon":"highway-footway","fields":["name","surface","lit","width","structure","access"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"footway"},"name":"Foot Path"},"highway/give_way":{"icon":"poi-yield","fields":["direction_vertex"],"geometry":["vertex"],"tags":{"highway":"give_way"},"terms":["give way","yield","sign"],"name":"Yield Sign"},"highway/living_street":{"icon":"highway-living-street","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],"geometry":["line"],"tags":{"highway":"living_street"},"name":"Living Street"},"highway/mini_roundabout":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"mini_roundabout"},"fields":["direction_clock"],"name":"Mini-Roundabout"},"highway/motorway_junction":{"icon":"poi-junction","geometry":["vertex"],"tags":{"highway":"motorway_junction"},"fields":["ref_highway_junction"],"name":"Motorway Junction / Exit"},"highway/motorway_link":{"icon":"highway-motorway-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"motorway_link"},"addTags":{"highway":"motorway_link","oneway":"yes"},"removeTags":{"highway":"motorway_link","oneway":"yes"},"terms":["ramp","on ramp","off ramp"],"name":"Motorway Link"},"highway/motorway":{"icon":"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","thruway","turnpike"],"name":"Motorway"},"highway/path":{"icon":"highway-path","fields":["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","ref"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"path"},"name":"Path"},"highway/pedestrian_area":{"icon":"poi-foot","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":"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":"highway-primary-link","fields":["name","oneway","maxspeed","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],"geometry":["line"],"tags":{"highway":"primary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Primary Link"},"highway/primary":{"icon":"highway-primary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"primary"},"terms":[],"name":"Primary Road"},"highway/raceway":{"icon":"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":"highway-residential","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"residential"},"terms":[],"name":"Residential Road"},"highway/rest_area":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"rest_area"},"terms":["rest stop"],"name":"Rest Area"},"highway/road":{"icon":"highway-road","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"road"},"terms":[],"name":"Unknown Road"},"highway/secondary_link":{"icon":"highway-secondary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Secondary Link"},"highway/secondary":{"icon":"highway-secondary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary"},"terms":[],"name":"Secondary Road"},"highway/service":{"icon":"highway-service","fields":["name","service","oneway","maxspeed","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"service"},"terms":[],"name":"Service Road"},"highway/service/alley":{"icon":"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":"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":"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":"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":"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":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"services"},"terms":["services","travel plaza","service station"],"name":"Service Area"},"highway/speed_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["direction","ref"],"tags":{"highway":"speed_camera"},"terms":[],"name":"Speed Camera"},"highway/steps":{"icon":"highway-steps","fields":["surface","lit","width","incline_steps","handrail","step_count"],"geometry":["line"],"tags":{"highway":"steps"},"terms":["stairs","staircase"],"name":"Steps"},"highway/stop":{"icon":"poi-stop","fields":["stop","direction_vertex"],"geometry":["vertex"],"tags":{"highway":"stop"},"terms":["stop","halt","sign"],"name":"Stop Sign"},"highway/street_lamp":{"icon":"poi-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":"highway-tertiary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Tertiary Link"},"highway/tertiary":{"icon":"highway-tertiary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary"},"terms":[],"name":"Tertiary Road"},"highway/track":{"icon":"highway-track","fields":["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],"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":"poi-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":"highway-trunk-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"trunk_link"},"terms":["ramp","on ramp","off ramp"],"name":"Trunk Link"},"highway/trunk":{"icon":"highway-trunk","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"trunk"},"terms":[],"name":"Trunk Road"},"highway/turning_circle":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"turning_circle"},"terms":["cul-de-sac"],"name":"Turning Circle"},"highway/turning_loop":{"icon":"circle","geometry":["vertex"],"tags":{"highway":"turning_loop"},"terms":["cul-de-sac"],"name":"Turning Loop (Island)"},"highway/unclassified":{"icon":"highway-unclassified","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"unclassified"},"terms":[],"name":"Minor/Unclassified Road"},"historic":{"icon":"poi-ruins","fields":["historic","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"*"},"name":"Historic Site"},"historic/archaeological_site":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"archaeological_site"},"name":"Archaeological Site"},"historic/boundary_stone":{"icon":"poi-milestone","fields":["name","inscription"],"geometry":["point","vertex"],"tags":{"historic":"boundary_stone"},"name":"Boundary Stone"},"historic/castle":{"icon":"castle","fields":["name","castle_type","building_area","historic/civilization"],"geometry":["point","area"],"tags":{"historic":"castle"},"name":"Castle"},"historic/memorial":{"icon":"monument","fields":["name","memorial","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"memorial"},"name":"Memorial"},"historic/monument":{"icon":"monument","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"monument"},"name":"Monument"},"historic/ruins":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"ruins"},"name":"Ruins"},"historic/tomb":{"icon":"cemetery","fields":["name","tomb","building_area","inscription"],"geometry":["point","area"],"tags":{"historic":"tomb"},"name":"Tomb"},"historic/wayside_cross":{"icon":"religious-christian","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_cross"},"name":"Wayside Cross"},"historic/wayside_shrine":{"icon":"landmark","fields":["name","religion","denomination","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_shrine"},"name":"Wayside Shrine"},"junction":{"icon":"poi-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":"farm","fields":["name","operator","crop"],"geometry":["point","area"],"tags":{"landuse":"farm"},"terms":[],"name":"Farmland","searchable":false},"landuse/allotments":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"allotments"},"terms":["allotment","garden"],"name":"Community Garden"},"landuse/aquaculture":{"icon":"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":"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":"cemetery","fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"cemetery"},"terms":[],"name":"Cemetery"},"landuse/churchyard":{"fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"churchyard"},"terms":[],"name":"Churchyard"},"landuse/commercial":{"icon":"suitcase","fields":["name"],"geometry":["area"],"tags":{"landuse":"commercial"},"terms":[],"matchScore":0.9,"name":"Commercial Area"},"landuse/construction":{"fields":["name","construction","operator"],"geometry":["area"],"tags":{"landuse":"construction"},"terms":[],"name":"Construction"},"landuse/farmland":{"icon":"farm","fields":["name","operator","crop","produce"],"geometry":["area"],"tags":{"landuse":"farmland"},"terms":["crop","grow","plant"],"name":"Farmland"},"landuse/farmyard":{"icon":"farm","fields":["name","operator","crop"],"geometry":["area"],"tags":{"landuse":"farmyard"},"terms":["crop","grow","plant"],"name":"Farmyard"},"landuse/forest":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle","produce"],"geometry":["area"],"tags":{"landuse":"forest"},"terms":["tree"],"name":"Forest"},"landuse/garages":{"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":"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":"harbor","fields":["name","operator"],"geometry":["area"],"terms":["boat"],"tags":{"landuse":"harbour"},"name":"Harbor"},"landuse/industrial":{"icon":"industry","fields":["name"],"geometry":["area"],"tags":{"landuse":"industrial"},"terms":[],"matchScore":0.9,"name":"Industrial Area"},"landuse/industrial/scrap_yard":{"icon":"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":"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":"garden","geometry":["area"],"fields":["name"],"tags":{"landuse":"meadow"},"terms":[],"name":"Meadow"},"landuse/military":{"icon":"poi-military","fields":["name"],"geometry":["area"],"tags":{"landuse":"military"},"terms":[],"matchScore":0.9,"name":"Military Area"},"landuse/military/airfield":{"icon":"airfield","fields":["name","iata","icao"],"geometry":["point","area"],"tags":{"military":"airfield"},"addTags":{"landuse":"military","military":"airfield"},"removeTags":{"landuse":"military","military":"airfield"},"terms":["air force","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],"name":"Military Airfield"},"landuse/military/barracks":{"icon":"poi-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":"poi-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":"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":"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":"poi-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":"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":"poi-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":"poi-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":"poi-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":"poi-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":"park-alt1","fields":["name","operator","trees"],"geometry":["area"],"tags":{"landuse":"orchard"},"terms":["fruit"],"name":"Orchard"},"landuse/plant_nursery":{"icon":"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":"rail","fields":["operator"],"geometry":["area"],"tags":{"landuse":"railway"},"terms":["rail","train","track"],"name":"Railway Corridor"},"landuse/recreation_ground":{"icon":"pitch","geometry":["area"],"fields":["name"],"tags":{"landuse":"recreation_ground"},"terms":["playing fields"],"name":"Recreation Ground"},"landuse/religious":{"geometry":["area"],"fields":["name","religion","denomination"],"tags":{"landuse":"religious"},"terms":[],"name":"Religious Area"},"landuse/residential":{"icon":"building","geometry":["area"],"tags":{"landuse":"residential"},"terms":[],"matchScore":0.9,"name":"Residential Area"},"landuse/retail":{"icon":"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":"pitch","fields":["name","leisure"],"geometry":["point","vertex","area"],"tags":{"leisure":"*"},"name":"Leisure"},"leisure/adult_gaming_centre":{"icon":"poi-dice","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":"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/bird_hide":{"icon":"poi-binoculars","fields":["building_area"],"geometry":["point","area"],"tags":{"leisure":"bird_hide"},"terms":["machan","ornithology"],"name":"Bird Hide"},"leisure/bowling_alley":{"icon":"poi-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":"poi-foot","geometry":["point","area"],"fields":["name"],"terms":["open space"],"tags":{"leisure":"common"},"name":"Common"},"leisure/dance":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ballroom","jive","swing","tango","waltz"],"tags":{"leisure":"dance"},"name":"Dance Hall"},"leisure/dog_park":{"icon":"dog-park","geometry":["point","area"],"fields":["name"],"terms":[],"tags":{"leisure":"dog_park"},"name":"Dog Park"},"leisure/firepit":{"icon":"fire-station","geometry":["point","area"],"tags":{"leisure":"firepit"},"terms":["fireplace","campfire"],"name":"Firepit"},"leisure/fitness_centre":{"icon":"pitch","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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"garden","fields":["name","access_simple"],"geometry":["point","vertex","area"],"tags":{"leisure":"garden"},"name":"Garden"},"leisure/golf_course":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["links"],"tags":{"leisure":"golf_course"},"name":"Golf Course"},"leisure/hackerspace":{"icon":"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":"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":"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":"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":"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":"park","geometry":["point","area"],"fields":["name"],"tags":{"leisure":"nature_reserve"},"terms":["protected","wildlife"],"name":"Nature Reserve"},"leisure/park":{"icon":"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":"picnic-site","geometry":["point"],"tags":{"leisure":"picnic_table"},"terms":["bench"],"name":"Picnic Table"},"leisure/pitch":{"icon":"pitch","fields":["sport","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch"},"terms":["field"],"name":"Sport Pitch"},"leisure/pitch/american_football":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"american_football"},"reference":{"key":"sport","value":"american_football"},"terms":[],"name":"American Football Field"},"leisure/pitch/baseball":{"icon":"baseball","fields":["lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"baseball"},"reference":{"key":"sport","value":"baseball"},"terms":[],"name":"Baseball Diamond"},"leisure/pitch/basketball":{"icon":"basketball","fields":["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":"basketball","fields":["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":"pitch","fields":["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":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"bowls"},"reference":{"key":"sport","value":"bowls"},"terms":[],"name":"Bowling Green"},"leisure/pitch/cricket":{"icon":"cricket","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"cricket"},"reference":{"key":"sport","value":"cricket"},"terms":[],"name":"Cricket Field"},"leisure/pitch/equestrian":{"icon":"horse-riding","fields":["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":"america-football","fields":["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":"america-football","fields":["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":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"skateboard"},"reference":{"key":"sport","value":"skateboard"},"terms":[],"name":"Skate Park"},"leisure/pitch/soccer":{"icon":"soccer","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"soccer"},"reference":{"key":"sport","value":"soccer"},"terms":["football"],"name":"Soccer Field"},"leisure/pitch/table_tennis":{"icon":"tennis","fields":["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":"tennis","fields":["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":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"volleyball"},"reference":{"key":"sport","value":"volleyball"},"terms":[],"name":"Volleyball Court"},"leisure/playground":{"icon":"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":"lodging","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"resort"},"name":"Resort"},"leisure/running_track":{"icon":"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":{"fields":["name","operator","address","opening_hours","access_simple","fee"],"geometry":["point","area"],"tags":{"leisure":"sauna"},"name":"Sauna"},"leisure/slipway":{"icon":"poi-beach","geometry":["point","line"],"terms":["boat launch","boat ramp"],"tags":{"leisure":"slipway"},"name":"Slipway"},"leisure/sports_centre":{"icon":"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":"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":"pitch","fields":["name","sport","address"],"geometry":["point","area"],"tags":{"leisure":"stadium"},"name":"Stadium"},"leisure/swimming_pool":{"icon":"swimming","fields":["name","access_simple","operator","address"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"swimming_pool"},"name":"Swimming Pool"},"leisure/track":{"icon":"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":"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":"poi-storage-tank","fields":["name","man_made"],"geometry":["point","vertex","line","area"],"tags":{"man_made":"*"},"name":"Man Made"},"man_made/embankment":{"geometry":["line"],"tags":{"man_made":"embankment"},"name":"Embankment","searchable":false},"man_made/adit":{"icon":"triangle","geometry":["point","area"],"fields":["operator","direction"],"terms":["entrance","underground","mine","cave"],"tags":{"man_made":"adit"},"name":"Adit"},"man_made/breakwater":{"geometry":["line","area"],"tags":{"man_made":"breakwater"},"name":"Breakwater"},"man_made/bridge":{"geometry":["area"],"tags":{"man_made":"bridge"},"name":"Bridge"},"man_made/chimney":{"icon":"poi-chimney","geometry":["point","area"],"tags":{"man_made":"chimney"},"name":"Chimney"},"man_made/crane":{"icon":"poi-crane","fields":["operator","height","crane/type"],"geometry":["point","line","vertex","area"],"tags":{"man_made":"crane"},"name":"Crane"},"man_made/cutline":{"geometry":["line"],"tags":{"man_made":"cutline"},"name":"Cut line"},"man_made/flagpole":{"icon":"embassy","geometry":["point"],"tags":{"man_made":"flagpole"},"name":"Flagpole"},"man_made/gasometer":{"icon":"poi-storage-tank","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":"lighthouse","fields":["building_area"],"geometry":["point","area"],"tags":{"man_made":"lighthouse"},"name":"Lighthouse"},"man_made/mast":{"icon":"poi-mast","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/monitoring_station":{"icon":"poi-mast","geometry":["point","area"],"fields":["monitoring_multi","operator"],"terms":["weather","earthquake","seismology","air","gps"],"tags":{"man_made":"monitoring_station"},"name":"Monitoring Station"},"man_made/observation":{"icon":"poi-tower","geometry":["point","area"],"terms":["lookout tower","fire tower"],"tags":{"man_made":"tower","tower:type":"observation"},"name":"Observation Tower"},"man_made/petroleum_well":{"icon":"poi-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":{"geometry":["line","area"],"terms":["dock","jetty"],"tags":{"man_made":"pier"},"name":"Pier"},"man_made/pipeline":{"icon":"pipeline-line","fields":["location","operator","substance"],"geometry":["line"],"tags":{"man_made":"pipeline"},"name":"Pipeline"},"man_made/pumping_station":{"icon":"water","geometry":["point","area"],"tags":{"man_made":"pumping_station"},"name":"Pumping Station"},"man_made/silo":{"icon":"poi-silo","fields":["building_area","crop"],"geometry":["point","area"],"terms":["grain","corn","wheat"],"tags":{"man_made":"silo"},"name":"Silo"},"man_made/storage_tank":{"icon":"poi-storage-tank","fields":["building_area","content"],"geometry":["point","area"],"terms":["water","oil","gas","petrol"],"tags":{"man_made":"storage_tank"},"name":"Storage Tank"},"man_made/surveillance_camera":{"icon":"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/surveillance":{"icon":"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/survey_point":{"icon":"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":"poi-tower","fields":["tower/type","tower/construction","height"],"geometry":["point","area"],"tags":{"man_made":"tower"},"name":"Tower"},"man_made/wastewater_plant":{"icon":"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":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_tower"},"name":"Water Tower"},"man_made/water_well":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_well"},"name":"Water Well"},"man_made/water_works":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"tags":{"man_made":"water_works"},"name":"Water Works"},"man_made/watermill":{"icon":"buddhism","fields":["building_area"],"geometry":["point","area"],"terms":["water","wheel","mill"],"tags":{"man_made":"watermill"},"name":"Watermill"},"man_made/windmill":{"icon":"poi-windmill","fields":["building_area"],"geometry":["point","area"],"terms":["wind","wheel","mill"],"tags":{"man_made":"windmill"},"name":"Windmill"},"man_made/works":{"icon":"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":"circle-stroked","fields":["manhole","operator","label","ref"],"geometry":["point","vertex"],"tags":{"manhole":"*"},"terms":["cover","hole","sewer","sewage","telecom"],"name":"Manhole"},"manhole/drain":{"icon":"water","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"drain"},"terms":["cover","drain","hole","rain","sewer","sewage","storm"],"name":"Storm Drain"},"manhole/telecom":{"icon":"circle-stroked","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"telecom"},"terms":["cover","phone","hole","telecom","telephone","bt"],"name":"Telecom Manhole"},"natural":{"icon":"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":"poi-beach","geometry":["point","area"],"fields":["name"],"tags":{"natural":"bay"},"terms":[],"name":"Bay"},"natural/beach":{"icon":"poi-beach","fields":["surface"],"geometry":["point","area"],"tags":{"natural":"beach"},"terms":["shore"],"name":"Beach"},"natural/cave_entrance":{"icon":"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":"triangle","geometry":["point","vertex","line","area"],"tags":{"natural":"cliff"},"terms":["escarpment"],"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/peak":{"icon":"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/ridge":{"geometry":["line"],"tags":{"natural":"ridge"},"terms":["crest"],"name":"Ridge"},"natural/saddle":{"icon":"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":"water","fields":["name","intermittent"],"geometry":["point","vertex"],"tags":{"natural":"spring"},"terms":[],"name":"Spring"},"natural/tree_row":{"icon":"park","fields":["leaf_type","leaf_cycle","denotation"],"geometry":["line"],"tags":{"natural":"tree_row"},"terms":[],"name":"Tree row"},"natural/tree":{"icon":"park","fields":["leaf_type_singular","leaf_cycle_singular","denotation"],"geometry":["point","vertex"],"tags":{"natural":"tree"},"terms":[],"name":"Tree"},"natural/volcano":{"icon":"volcano","fields":["name","elevation","volcano/status","volcano/type"],"geometry":["point","vertex"],"tags":{"natural":"volcano"},"terms":["mountain","crater"],"name":"Volcano"},"natural/water":{"icon":"water","fields":["water"],"geometry":["area"],"tags":{"natural":"water"},"name":"Water"},"natural/water/lake":{"icon":"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":"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":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"reservoir"},"reference":{"key":"natural","value":"water"},"name":"Reservoir"},"natural/wetland":{"icon":"wetland","fields":["wetland"],"geometry":["point","area"],"tags":{"natural":"wetland"},"terms":["bog","marsh","reedbed","swamp","tidalflat"],"name":"Wetland"},"natural/wood":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle"],"geometry":["point","area"],"tags":{"natural":"wood"},"terms":["tree"],"name":"Wood"},"noexit/yes":{"icon":"barrier","geometry":["vertex"],"terms":["no exit","road end","dead end"],"tags":{"noexit":"yes"},"reference":{"key":"noexit","value":"*"},"name":"No Exit"},"office":{"icon":"suitcase","fields":["name","office","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"*"},"terms":[],"name":"Office"},"office/administrative":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"administrative"},"terms":[],"searchable":false,"name":"Administrative Office"},"office/physician":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"physician"},"searchable":false,"name":"Physician"},"office/travel_agent":{"icon":"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":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"accountant"},"terms":[],"name":"Accountant Office"},"office/adoption_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"adoption_agency"},"terms":[],"name":"Adoption Agency"},"office/advertising_agency":{"icon":"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":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"architect"},"terms":[],"name":"Architect Office"},"office/association":{"icon":"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":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"charity"},"terms":["charitable organization"],"name":"Charity Office"},"office/company":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"company"},"terms":[],"name":"Corporate Office"},"office/coworking":{"icon":"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":"school","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"educational_institution"},"terms":[],"name":"Educational Institution"},"office/employment_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"employment_agency"},"terms":["job"],"name":"Employment Agency"},"office/energy_supplier":{"icon":"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":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"estate_agent"},"terms":[],"name":"Real Estate Office"},"office/financial":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"financial"},"terms":[],"name":"Financial Office"},"office/forestry":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"forestry"},"terms":["forest","ranger"],"name":"Forestry Office"},"office/foundation":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"foundation"},"terms":[],"name":"Foundation Office"},"office/government":{"icon":"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":"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":"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":"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":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"insurance"},"terms":[],"name":"Insurance Office"},"office/it":{"icon":"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":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer"},"terms":[],"name":"Law Office"},"office/lawyer/notary":{"icon":"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":"warehouse","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"moving_company"},"terms":["relocation"],"name":"Moving Company Office"},"office/newspaper":{"icon":"library","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"newspaper"},"terms":[],"name":"Newspaper Office"},"office/ngo":{"icon":"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":"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":"town-hall","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"political_party"},"terms":[],"name":"Political Party"},"office/private_investigator":{"icon":"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":"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/research":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"research"},"terms":[],"name":"Research Office"},"office/surveyor":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"surveyor"},"terms":[],"name":"Surveyor Office"},"office/tax_advisor":{"icon":"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":"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":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"therapist"},"terms":["therapy"],"name":"Therapist Office"},"office/water_utility":{"icon":"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":{"icon":"skiing","fields":["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],"geometry":["point","line","area"],"terms":["ski","sled","sleigh","snowboard","nordic","downhill","snowmobile"],"tags":{"piste:type":"*"},"name":"Piste/Ski Trail"},"place/farm":{"icon":"farm","geometry":["point","area"],"fields":["name"],"tags":{"place":"farm"},"name":"Farm","searchable":false},"place/city":{"icon":"city","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"city"},"name":"City"},"place/hamlet":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"hamlet"},"name":"Hamlet"},"place/island":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"island"},"name":"Island"},"place/islet":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"islet"},"name":"Islet"},"place/isolated_dwelling":{"icon":"home","geometry":["point","area"],"fields":["name"],"tags":{"place":"isolated_dwelling"},"name":"Isolated Dwelling"},"place/locality":{"icon":"triangle-stroked","geometry":["point","area"],"fields":["name"],"tags":{"place":"locality"},"name":"Locality"},"place/neighbourhood":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"neighbourhood"},"terms":["neighbourhood"],"name":"Neighborhood"},"place/plot":{"icon":"triangle-stroked","fields":["name"],"geometry":["point","area"],"tags":{"place":"plot"},"terms":["tract","land","lot","parcel"],"name":"Plot"},"place/quarter":{"icon":"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":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"suburb"},"terms":["boro","borough","quarter"],"name":"Borough / Suburb"},"place/town":{"icon":"town","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"town"},"name":"Town"},"place/village":{"icon":"village","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"village"},"name":"Village"},"playground/balance_beam":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"balancebeam"},"name":"Play Balance Beam"},"playground/basket_spinner":{"icon":"playground","geometry":["point"],"terms":["basket rotator"],"tags":{"playground":"basketrotator"},"name":"Basket Spinner"},"playground/basket_swing":{"icon":"playground","geometry":["point"],"tags":{"playground":"basketswing"},"name":"Basket Swing"},"playground/climbing_frame":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"climbingframe"},"name":"Climbing Frame"},"playground/cushion":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"cushion"},"name":"Bouncy Cushion"},"playground/horizontal_bar":{"icon":"pitch","fields":["height"],"geometry":["point"],"terms":["high bar"],"tags":{"playground":"horizontal_bar"},"name":"Play Horizontal Bar"},"playground/rocker":{"icon":"playground","geometry":["point"],"tags":{"playground":"springy"},"name":"Spring Rider","terms":["spring rocker","springy rocker"]},"playground/roundabout":{"icon":"stadium","fields":["bench"],"geometry":["point","area"],"tags":{"playground":"roundabout"},"name":"Play Roundabout","terms":["merry-go-round"]},"playground/sandpit":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"sandpit"},"name":"Sandpit"},"playground/seesaw":{"icon":"playground","geometry":["point"],"tags":{"playground":"seesaw"},"name":"Seesaw"},"playground/slide":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"slide"},"name":"Slide"},"playground/structure":{"icon":"pitch","geometry":["point","area"],"tags":{"playground":"structure"},"name":"Play Structure"},"playground/swing":{"icon":"playground","fields":["playground/baby","wheelchair"],"geometry":["point"],"tags":{"playground":"swing"},"name":"Swing"},"playground/zipwire":{"icon":"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":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"sub_station"},"reference":{"key":"power","value":"substation"},"name":"Substation","searchable":false},"power/generator":{"icon":"poi-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/source_nuclear":{"icon":"poi-nuclear","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":"poi-wind","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":"power-line","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"line"},"name":"Power Line"},"power/minor_line":{"icon":"power-line","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"minor_line"},"name":"Minor Power Line"},"power/plant":{"icon":"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":["vertex"],"tags":{"power":"pole"},"name":"Power Pole"},"power/substation":{"icon":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"substation"},"name":"Substation"},"power/switch":{"icon":"poi-power","fields":["switch","operator","location","cables","voltage","ref"],"geometry":["point","vertex","area"],"tags":{"power":"switch"},"name":"Power Switch"},"power/tower":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"tower"},"name":"High-Voltage Tower"},"power/transformer":{"icon":"poi-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":"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":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"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":"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":"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":"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":"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":["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stop / Platform"},"public_transport/linear_platform_train":{"icon":"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":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"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":"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":"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":"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":"bus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"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":"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":"poi-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":"poi-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":"poi-subway","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":["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stop / Platform"},"public_transport/platform_train":{"icon":"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":"poi-tram","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"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":"poi-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":"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":"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":"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":"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":"poi-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":"poi-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":"poi-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":"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":"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":"poi-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":"poi-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":"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":"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":"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":"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":"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":"poi-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":"poi-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":"poi-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":"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":"poi-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":"poi-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":"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":"rail","geometry":["point","vertex"],"tags":{"railway":"halt"},"terms":["break","interrupt","rest","wait","interruption"],"name":"Train Station (Halt / Request)","searchable":false},"railway/platform":{"icon":"highway-footway","fields":["name","ref_platform","surface","lit","shelter"],"geometry":["line","area"],"tags":{"railway":"platform"},"name":"Train Stop / Platform","searchable":false},"railway/station":{"icon":"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":"poi-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":"railway-abandoned","geometry":["line"],"tags":{"railway":"abandoned"},"fields":["name","structure","service_rail"],"terms":[],"name":"Abandoned Railway"},"railway/buffer_stop":{"icon":"poi-buffer-stop","geometry":["vertex"],"tags":{"railway":"buffer_stop"},"terms":["stop","halt","buffer"],"name":"Buffer Stop"},"railway/crossing":{"icon":"cross","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":"roadblock","geometry":["vertex"],"tags":{"railway":"derail"},"terms":["derailer"],"name":"Railway Derailer"},"railway/disused":{"icon":"railway-disused","geometry":["line"],"tags":{"railway":"disused"},"fields":["structure","service_rail"],"terms":[],"name":"Disused Railway"},"railway/funicular":{"icon":"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":"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":"railway-light-rail","geometry":["line"],"tags":{"railway":"light_rail"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","trolley"],"name":"Light Rail"},"railway/milestone":{"icon":"poi-milestone","geometry":["point","vertex"],"fields":["railway/position"],"tags":{"railway":"milestone"},"terms":["milestone","marker"],"name":"Railway Milestone"},"railway/miniature":{"icon":"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":"railway-monorail","geometry":["line"],"tags":{"railway":"monorail"},"fields":["name","structure","electrified","service_rail"],"terms":[],"name":"Monorail"},"railway/narrow_gauge":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"narrow_gauge"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["narrow gauge railway","narrow gauge railroad"],"name":"Narrow Gauge Rail"},"railway/rail":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"rail"},"fields":["name","structure","gauge","electrified","maxspeed","service_rail"],"terms":[],"name":"Rail"},"railway/signal":{"icon":"poi-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":"entrance","geometry":["point","vertex"],"fields":["name"],"tags":{"railway":"subway_entrance"},"terms":["metro","transit"],"name":"Subway Entrance"},"railway/subway":{"icon":"railway-subway","geometry":["line"],"tags":{"railway":"subway"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["metro","transit"],"name":"Subway"},"railway/switch":{"icon":"poi-junction","geometry":["vertex"],"tags":{"railway":"switch"},"terms":["switch","points"],"name":"Railway Switch"},"railway/train_wash":{"icon":"rail","geometry":["point","vertex","area"],"fields":["operator","building_area"],"tags":{"railway":"wash"},"terms":["wash","clean"],"name":"Train Wash"},"railway/tram":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"tram"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","tram","trolley"],"name":"Tram"},"relation":{"icon":"relation","fields":["name","relation"],"geometry":["relation"],"tags":{},"name":"Relation"},"route/ferry":{"icon":"ferry-line","geometry":["line"],"fields":["name","operator","duration","access"],"tags":{"route":"ferry"},"name":"Ferry Route"},"shop":{"icon":"shop","fields":["name","shop","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"*"},"terms":[],"name":"Shop"},"shop/fishmonger":{"icon":"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":"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":"shop","fields":["name","address","building_area"],"geometry":["point","area"],"tags":{"shop":"vacant"},"name":"Vacant Shop","searchable":false},"shop/agrarian":{"icon":"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":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"antiques"},"name":"Antiques Shop"},"shop/appliance":{"icon":"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":"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":"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":"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":"bakery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bakery"},"name":"Bakery"},"shop/bathroom_furnishing":{"icon":"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":"shop","fields":["name","operator","address","building_area","opening_hours","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["spa","salon","tanning"],"tags":{"shop":"beauty"},"name":"Beauty Shop"},"shop/beauty/nails":{"icon":"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":"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":"lodging","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bed"},"name":"Bedding/Mattress Store"},"shop/beverages":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"beverages"},"name":"Beverage Store"},"shop/bicycle":{"icon":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["betting"],"tags":{"shop":"bookmaker"},"name":"Bookmaker"},"shop/books":{"icon":"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":"shop","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"boutique"},"name":"Boutique"},"shop/butcher":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["meat"],"tags":{"shop":"butcher"},"name":"Butcher"},"shop/candles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"candles"},"name":"Candle Shop"},"shop/car_parts":{"icon":"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":"car","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":"car","fields":["name","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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["rug"],"tags":{"shop":"carpet"},"name":"Carpet Store"},"shop/charity":{"icon":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"cheese"},"name":"Cheese Store"},"shop/chemist":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"chemist"},"terms":["med*","drug*","gift"],"name":"Drugstore"},"shop/chocolate":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"chocolate"},"name":"Chocolate Store"},"shop/clothes":{"icon":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"coffee"},"name":"Coffee Store"},"shop/computer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"computer"},"name":"Computer Store"},"shop/confectionery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sweet"],"tags":{"shop":"confectionery"},"name":"Candy Store"},"shop/convenience":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"convenience"},"name":"Convenience Store"},"shop/copyshop":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"copyshop"},"name":"Copy Store"},"shop/cosmetics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"cosmetics"},"name":"Cosmetics Store"},"shop/craft":{"icon":"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":"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":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"department_store"},"name":"Department Store"},"shop/doityourself":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"doityourself"},"name":"DIY Store"},"shop/dry_cleaning":{"icon":"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":"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":"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":"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":"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":"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":"shop","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"fashion"},"name":"Fashion Store"},"shop/florist":{"icon":"florist","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["flower"],"tags":{"shop":"florist"},"name":"Florist"},"shop/frame":{"icon":"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":"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":"shop","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":"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":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["fruit","vegetable"],"tags":{"shop":"greengrocer"},"name":"Greengrocer"},"shop/hairdresser":{"icon":"hairdresser","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["barber"],"tags":{"shop":"hairdresser"},"name":"Hairdresser"},"shop/hardware":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"hardware"},"name":"Hardware Store"},"shop/health_food":{"icon":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"herbalist"},"name":"Herbalist"},"shop/hifi":{"icon":"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":"shop","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":"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":"shop","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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"kiosk"},"name":"Kiosk"},"shop/kitchen":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"kitchen"},"name":"Kitchen Design Store"},"shop/laundry":{"icon":"laundry","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"laundry"},"name":"Laundry"},"shop/leather":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"leather"},"name":"Leather Store"},"shop/locksmith":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["key","lockpick"],"tags":{"shop":"locksmith"},"name":"Locksmith"},"shop/lottery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"lottery"},"name":"Lottery Shop"},"shop/mall":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["shopping"],"tags":{"shop":"mall"},"name":"Mall"},"shop/massage":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"massage"},"name":"Massage Shop"},"shop/medical_supply":{"icon":"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":"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":"bank","fields":["name","operator","address","building_area","opening_hours","currency_multi"],"geometry":["point","area"],"tags":{"shop":"money_lender"},"name":"Money Lender"},"shop/motorcycle":{"icon":"scooter","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["bike"],"tags":{"shop":"motorcycle"},"name":"Motorcycle Dealership"},"shop/music":{"icon":"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":"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":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["eye","glasses"],"tags":{"shop":"optician"},"name":"Optician"},"shop/organic":{"icon":"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":"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":"water","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"paint"},"name":"Paint Store"},"shop/pastry":{"icon":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pawnbroker"},"name":"Pawn Shop"},"shop/perfumery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"perfumery"},"name":"Perfume Store"},"shop/pet":{"icon":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pyrotechnics"},"name":"Fireworks Store"},"shop/radiotechnics":{"icon":"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":"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":"swimming","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"scuba_diving"},"name":"Scuba Diving Shop"},"shop/seafood":{"icon":"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":"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/shoes":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"shoes"},"name":"Shoe Store"},"shop/sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"sports"},"name":"Sporting Goods Store"},"shop/stationery":{"icon":"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":"shop","fields":["name","operator","address","building","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"storage_rental"},"name":"Storage Rental"},"shop/supermarket":{"icon":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tattoo"},"name":"Tattoo Parlor"},"shop/tea":{"icon":"teahouse","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tea"},"name":"Tea Store"},"shop/ticket":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"ticket"},"name":"Ticket Seller"},"shop/tiles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tiles"},"name":"Tile Shop"},"shop/tobacco":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tobacco"},"name":"Tobacco Shop"},"shop/toys":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"toys"},"name":"Toy Store"},"shop/trade":{"icon":"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":"suitcase","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"travel_agency"},"name":"Travel Agency"},"shop/tyres":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tyres"},"name":"Tire Store"},"shop/vacuum_cleaner":{"icon":"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":"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":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"watches"},"name":"Watches Shop"},"shop/water_sports":{"icon":"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":"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":"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":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"window_blind"},"name":"Window Blind Store"},"shop/wine":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"wine"},"name":"Wine Shop"},"tourism":{"icon":"attraction","fields":["name","tourism"],"geometry":["point","vertex","area"],"tags":{"tourism":"*"},"name":"Tourism"},"tourism/alpine_hut":{"icon":"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":"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":"aquarium","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fish","sea","water"],"tags":{"tourism":"aquarium"},"name":"Aquarium"},"tourism/artwork":{"icon":"art-gallery","fields":["name","artwork_type","artist"],"geometry":["point","vertex","area"],"tags":{"tourism":"artwork"},"terms":["mural","sculpture","statue"],"name":"Artwork"},"tourism/attraction":{"icon":"star","fields":["name","operator","address"],"geometry":["point","vertex","area"],"tags":{"tourism":"attraction"},"name":"Tourist Attraction"},"tourism/camp_site":{"icon":"campsite","fields":["name","operator","address","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":"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":"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":"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":"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":"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":"lodging","fields":["name","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":"information","fields":["information","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information"},"name":"Information"},"tourism/information/board":{"icon":"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":"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":"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":"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":"lodging","fields":["name","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":"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":"picnic-site","fields":["name","operator","address","smoking"],"geometry":["point","vertex","area"],"terms":["camp"],"tags":{"tourism":"picnic_site"},"name":"Picnic Site"},"tourism/theme_park":{"icon":"amusement-park","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"tourism":"theme_park"},"name":"Theme Park"},"tourism/viewpoint":{"icon":"poi-binoculars","geometry":["point","vertex"],"fields":["direction"],"tags":{"tourism":"viewpoint"},"name":"Viewpoint"},"tourism/wilderness_hut":{"icon":"lodging","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["wilderness hut","backcountry hut","bothy"],"tags":{"tourism":"wilderness_hut"},"name":"Wilderness Hut"},"tourism/zoo":{"icon":"zoo","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["animal"],"tags":{"tourism":"zoo"},"name":"Zoo"},"traffic_calming":{"icon":"poi-warning","fields":["traffic_calming","direction_vertex"],"geometry":["vertex","line"],"tags":{"traffic_calming":"*"},"terms":["bump","hump","slow","speed"],"name":"Traffic Calming"},"traffic_calming/bump":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["hump","speed","slow"],"tags":{"traffic_calming":"bump"},"name":"Speed Bump"},"traffic_calming/chicane":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["driveway link","speed","slow"],"tags":{"traffic_calming":"chicane"},"name":"Traffic Chicane"},"traffic_calming/choker":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"choker"},"name":"Traffic Choker"},"traffic_calming/cushion":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["bump","hump","speed","slow"],"tags":{"traffic_calming":"cushion"},"name":"Speed Cushion"},"traffic_calming/dip":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"dip"},"name":"Dip"},"traffic_calming/hump":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["bump","speed","slow"],"tags":{"traffic_calming":"hump"},"name":"Speed Hump"},"traffic_calming/island":{"icon":"poi-warning","geometry":["vertex"],"terms":["circle","roundabout","slow"],"tags":{"traffic_calming":"island"},"name":"Traffic Island"},"traffic_calming/rumble_strip":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["audible lines","sleeper lines","growlers"],"tags":{"traffic_calming":"rumble_strip"},"name":"Rumble Strip"},"traffic_calming/table":{"icon":"poi-warning","fields":["surface"],"geometry":["vertex"],"tags":{"traffic_calming":"table"},"terms":["flat top","hump","speed","slow"],"name":"Speed Table"},"type/multipolygon":{"icon":"multipolygon","geometry":["area","relation"],"tags":{"type":"multipolygon"},"removeTags":{},"name":"Multipolygon","searchable":false,"matchScore":0.1},"type/boundary":{"icon":"boundary","fields":["name","boundary"],"geometry":["relation"],"tags":{"type":"boundary"},"name":"Boundary"},"type/boundary/administrative":{"icon":"boundary","fields":["name","admin_level"],"geometry":["relation"],"tags":{"type":"boundary","boundary":"administrative"},"reference":{"key":"boundary","value":"administrative"},"name":"Administrative Boundary"},"type/restriction":{"icon":"restriction","fields":["name","restriction","except"],"geometry":["relation"],"tags":{"type":"restriction"},"name":"Restriction"},"type/restriction/no_left_turn":{"icon":"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":"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":"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":"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":"restriction-only-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_left_turn"},"name":"Left Turn Only"},"type/restriction/only_right_turn":{"icon":"restriction-only-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_right_turn"},"name":"Right Turn Only"},"type/restriction/only_straight_on":{"icon":"restriction-only-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_straight_on"},"name":"No Turns"},"type/route_master":{"icon":"route-master","fields":["name","route_master","ref","operator","network"],"geometry":["relation"],"tags":{"type":"route_master"},"name":"Route Master"},"type/route":{"icon":"route","fields":["name","route","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route"},"name":"Route"},"type/route/bicycle":{"icon":"route-bicycle","fields":["name","ref_route","network_bicycle","cycle_network"],"geometry":["relation"],"tags":{"type":"route","route":"bicycle"},"name":"Cycle Route"},"type/route/bus":{"icon":"route-bus","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"bus"},"name":"Bus Route"},"type/route/detour":{"icon":"route-detour","fields":["name","ref_route"],"geometry":["relation"],"tags":{"type":"route","route":"detour"},"name":"Detour Route"},"type/route/ferry":{"icon":"route-ferry","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"ferry"},"name":"Ferry Route"},"type/route/foot":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"foot"},"name":"Foot Route"},"type/route/hiking":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"hiking"},"name":"Hiking Route"},"type/route/horse":{"icon":"route-horse","fields":["name","ref_route","operator","network_horse"],"geometry":["relation"],"tags":{"type":"route","route":"horse"},"name":"Riding Route"},"type/route/light_rail":{"icon":"route-light-rail","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"light_rail"},"name":"Light Rail Route"},"type/route/pipeline":{"icon":"route-pipeline","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"pipeline"},"name":"Pipeline Route"},"type/route/piste":{"icon":"route-piste","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"piste"},"name":"Piste/Ski Route"},"type/route/power":{"icon":"route-power","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"power"},"name":"Power Route"},"type/route/road":{"icon":"route-road","fields":["name","ref_route","network_road"],"geometry":["relation"],"tags":{"type":"route","route":"road"},"name":"Road Route"},"type/route/subway":{"icon":"route-subway","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"subway"},"name":"Subway Route"},"type/route/train":{"icon":"route-train","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"train"},"name":"Train Route"},"type/route/tram":{"icon":"route-tram","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"tram"},"name":"Tram Route"},"type/site":{"icon":"relation","fields":["name","site"],"geometry":["relation"],"tags":{"type":"site"},"name":"Site"},"type/waterway":{"icon":"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":"harbor","fields":["name","operator"],"geometry":["area","vertex","point"],"tags":{"waterway":"boatyard"},"name":"Boatyard"},"waterway/canal":{"icon":"waterway-canal","fields":["name","width","intermittent"],"geometry":["line"],"tags":{"waterway":"canal"},"name":"Canal"},"waterway/dam":{"icon":"dam","geometry":["point","vertex","line","area"],"fields":["name"],"tags":{"waterway":"dam"},"name":"Dam"},"waterway/ditch":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"ditch"},"name":"Ditch"},"waterway/dock":{"icon":"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":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"drain"},"name":"Drain"},"waterway/fuel":{"icon":"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/river":{"icon":"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":"water","geometry":["area"],"tags":{"waterway":"riverbank"},"name":"Riverbank"},"waterway/sanitary_dump_station":{"icon":"poi-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":"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":"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":"drinking-water","geometry":["area","vertex","point"],"tags":{"waterway":"water_point"},"name":"Marine Drinking Water"},"waterway/waterfall":{"icon":"water","fields":["name","height","width","intermittent"],"geometry":["vertex"],"terms":["fall"],"tags":{"waterway":"waterfall"},"name":"Waterfall"},"waterway/weir":{"icon":"dam","geometry":["vertex","line"],"tags":{"waterway":"weir"},"name":"Weir"},"amenity/arts_centre/Świetlica wiejska":{"tags":{"name":"Świetlica wiejska","amenity":"arts_centre"},"name":"Świetlica wiejska","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/arts_centre/Дом культуры":{"tags":{"name":"Дом культуры","amenity":"arts_centre"},"name":"Дом культуры","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/bank/ABANCA":{"tags":{"name":"ABANCA","amenity":"bank"},"name":"ABANCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABN AMRO":{"tags":{"name":"ABN AMRO","amenity":"bank"},"name":"ABN AMRO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABSA":{"tags":{"name":"ABSA","amenity":"bank"},"name":"ABSA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AIB":{"tags":{"name":"AIB","amenity":"bank"},"name":"AIB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ANZ":{"tags":{"name":"ANZ","amenity":"bank"},"name":"ANZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ASB Bank":{"tags":{"name":"ASB Bank","amenity":"bank"},"name":"ASB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ATB Financial":{"tags":{"name":"ATB Financial","amenity":"bank"},"name":"ATB Financial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AXA":{"tags":{"name":"AXA","amenity":"bank"},"name":"AXA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Agribank":{"tags":{"name":"Agribank","amenity":"bank"},"name":"Agribank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Akbank":{"tags":{"name":"Akbank","amenity":"bank"},"name":"Akbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alior Bank":{"tags":{"name":"Alior Bank","amenity":"bank"},"name":"Alior Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allahabad Bank":{"tags":{"name":"Allahabad Bank","amenity":"bank"},"name":"Allahabad Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allied Bank":{"tags":{"name":"Allied Bank","amenity":"bank"},"name":"Allied Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alpha Bank":{"tags":{"name":"Alpha Bank","amenity":"bank"},"name":"Alpha Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Andhra Bank":{"tags":{"name":"Andhra Bank","amenity":"bank"},"name":"Andhra Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Antonveneta":{"tags":{"name":"Antonveneta","amenity":"bank"},"name":"Antonveneta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Argenta":{"tags":{"name":"Argenta","amenity":"bank"},"name":"Argenta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Asia United Bank":{"tags":{"name":"Asia United Bank","amenity":"bank"},"name":"Asia United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Askari Bank":{"tags":{"name":"Askari Bank","amenity":"bank"},"name":"Askari Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Associated Bank":{"tags":{"name":"Associated Bank","amenity":"bank"},"name":"Associated Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Axis Bank":{"tags":{"name":"Axis Bank","amenity":"bank"},"name":"Axis Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAC":{"tags":{"name":"BAC","amenity":"bank"},"name":"BAC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAWAG PSK":{"tags":{"name":"BAWAG PSK","amenity":"bank"},"name":"BAWAG PSK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BB&T":{"tags":{"name":"BB&T","amenity":"bank"},"name":"BB&T","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBBank":{"tags":{"name":"BBBank","amenity":"bank"},"name":"BBBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBK":{"tags":{"name":"BBK","amenity":"bank"},"name":"BBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA":{"tags":{"name":"BBVA","amenity":"bank"},"name":"BBVA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Bancomer":{"tags":{"name":"BBVA Bancomer","amenity":"bank"},"name":"BBVA Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Compass":{"tags":{"name":"BBVA Compass","amenity":"bank"},"name":"BBVA Compass","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Continental":{"tags":{"name":"BBVA Continental","amenity":"bank"},"name":"BBVA Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Francés":{"tags":{"name":"BBVA Francés","amenity":"bank"},"name":"BBVA Francés","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCA":{"tags":{"name":"BCA","amenity":"bank"},"name":"BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCI":{"tags":{"name":"BCI","amenity":"bank"},"name":"BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCP":{"tags":{"name":"BCP","amenity":"bank"},"name":"BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCR":{"tags":{"name":"BCR","amenity":"bank"},"name":"BCR","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BDO":{"tags":{"name":"BDO","amenity":"bank"},"name":"BDO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BGŻ BNP Paribas":{"tags":{"name":"BGŻ BNP Paribas","amenity":"bank"},"name":"BGŻ BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMCE":{"tags":{"name":"BMCE","amenity":"bank"},"name":"BMCE","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMN":{"tags":{"name":"BMN","amenity":"bank"},"name":"BMN","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO":{"tags":{"name":"BMO","amenity":"bank"},"name":"BMO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO Harris Bank":{"tags":{"name":"BMO Harris Bank","amenity":"bank"},"name":"BMO Harris Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNA":{"tags":{"name":"BNA","amenity":"bank"},"name":"BNA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNI":{"tags":{"name":"BNI","amenity":"bank"},"name":"BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNL":{"tags":{"name":"BNL","amenity":"bank"},"name":"BNL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas":{"tags":{"name":"BNP Paribas","amenity":"bank"},"name":"BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas Fortis":{"tags":{"name":"BNP Paribas Fortis","amenity":"bank"},"name":"BNP Paribas Fortis","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BOC":{"tags":{"name":"BOC","amenity":"bank"},"name":"BOC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPH":{"tags":{"name":"BPH","amenity":"bank"},"name":"BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI":{"tags":{"name":"BPI","amenity":"bank"},"name":"BPI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI Family Savings Bank":{"tags":{"name":"BPI Family Savings Bank","amenity":"bank"},"name":"BPI Family Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRD":{"tags":{"name":"BRD","amenity":"bank"},"name":"BRD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRED":{"tags":{"name":"BRED","amenity":"bank"},"name":"BRED","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRI":{"tags":{"name":"BRI","amenity":"bank"},"name":"BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BW-Bank":{"tags":{"name":"BW-Bank","amenity":"bank"},"name":"BW-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BZ WBK":{"tags":{"name":"BZ WBK","amenity":"bank"},"name":"BZ WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banamex":{"tags":{"name":"Banamex","amenity":"bank"},"name":"Banamex","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banc Sabadell":{"tags":{"name":"Banc Sabadell","amenity":"bank"},"name":"Banc Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Intesa":{"tags":{"name":"Banca Intesa","amenity":"bank"},"name":"Banca Intesa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca March":{"tags":{"name":"Banca March","amenity":"bank"},"name":"Banca March","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Milano":{"tags":{"name":"Banca Popolare di Milano","amenity":"bank"},"name":"Banca Popolare di Milano","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Novara":{"tags":{"name":"Banca Popolare di Novara","amenity":"bank"},"name":"Banca Popolare di Novara","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Sondrio":{"tags":{"name":"Banca Popolare di Sondrio","amenity":"bank"},"name":"Banca Popolare di Sondrio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Verona":{"tags":{"name":"Banca Popolare di Verona","amenity":"bank"},"name":"Banca Popolare di Verona","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Vicenza":{"tags":{"name":"Banca Popolare di Vicenza","amenity":"bank"},"name":"Banca Popolare di Vicenza","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Românească":{"tags":{"name":"Banca Românească","amenity":"bank"},"name":"Banca Românească","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Sella":{"tags":{"name":"Banca Sella","amenity":"bank"},"name":"Banca Sella","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Transilvania":{"tags":{"name":"Banca Transilvania","amenity":"bank"},"name":"Banca Transilvania","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Agrario":{"tags":{"name":"Banco Agrario","amenity":"bank"},"name":"Banco Agrario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Azteca":{"tags":{"name":"Banco Azteca","amenity":"bank"},"name":"Banco Azteca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco BCI":{"tags":{"name":"Banco BCI","amenity":"bank"},"name":"Banco BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Bradesco":{"tags":{"name":"Banco Bradesco","amenity":"bank"},"name":"Banco Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Continental":{"tags":{"name":"Banco Continental","amenity":"bank"},"name":"Banco Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Estado":{"tags":{"name":"Banco Estado","amenity":"bank"},"name":"Banco Estado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Fassil":{"tags":{"name":"Banco Fassil","amenity":"bank"},"name":"Banco Fassil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco G&T Continental":{"tags":{"name":"Banco G&T Continental","amenity":"bank"},"name":"Banco G&T Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco General":{"tags":{"name":"Banco General","amenity":"bank"},"name":"Banco General","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Industrial":{"tags":{"name":"Banco Industrial","amenity":"bank"},"name":"Banco Industrial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Internacional":{"tags":{"name":"Banco Internacional","amenity":"bank"},"name":"Banco Internacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Itaú":{"tags":{"name":"Banco Itaú","amenity":"bank"},"name":"Banco Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nacional":{"tags":{"name":"Banco Nacional","amenity":"bank"},"name":"Banco Nacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nación":{"tags":{"name":"Banco Nación","amenity":"bank"},"name":"Banco Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pastor":{"tags":{"name":"Banco Pastor","amenity":"bank"},"name":"Banco Pastor","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pichincha":{"tags":{"name":"Banco Pichincha","amenity":"bank"},"name":"Banco Pichincha","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Popular":{"tags":{"name":"Banco Popular","amenity":"bank"},"name":"Banco Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Provincia":{"tags":{"name":"Banco Provincia","amenity":"bank"},"name":"Banco Provincia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sabadell":{"tags":{"name":"Banco Sabadell","amenity":"bank"},"name":"Banco Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Santander":{"tags":{"name":"Banco Santander","amenity":"bank"},"name":"Banco Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sol":{"tags":{"name":"Banco Sol","amenity":"bank"},"name":"Banco Sol","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Bogotá":{"tags":{"name":"Banco de Bogotá","amenity":"bank"},"name":"Banco de Bogotá","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Chile":{"tags":{"name":"Banco de Chile","amenity":"bank"},"name":"Banco de Chile","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Costa Rica":{"tags":{"name":"Banco de Costa Rica","amenity":"bank"},"name":"Banco de Costa Rica","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Desarrollo Banrural":{"tags":{"name":"Banco de Desarrollo Banrural","amenity":"bank"},"name":"Banco de Desarrollo Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Occidente":{"tags":{"name":"Banco de Occidente","amenity":"bank"},"name":"Banco de Occidente","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Venezuela":{"tags":{"name":"Banco de Venezuela","amenity":"bank"},"name":"Banco de Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación":{"tags":{"name":"Banco de la Nación","amenity":"bank"},"name":"Banco de la Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación Argentina":{"tags":{"name":"Banco de la Nación Argentina","amenity":"bank"},"name":"Banco de la Nación Argentina","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Napoli":{"tags":{"name":"Banco di Napoli","amenity":"bank"},"name":"Banco di Napoli","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Sardegna":{"tags":{"name":"Banco di Sardegna","amenity":"bank"},"name":"Banco di Sardegna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Brasil":{"tags":{"name":"Banco do Brasil","amenity":"bank"},"name":"Banco do Brasil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Nordeste":{"tags":{"name":"Banco do Nordeste","amenity":"bank"},"name":"Banco do Nordeste","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BancoEstado":{"tags":{"name":"BancoEstado","amenity":"bank"},"name":"BancoEstado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancolombia":{"tags":{"name":"Bancolombia","amenity":"bank"},"name":"Bancolombia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancomer":{"tags":{"name":"Bancomer","amenity":"bank"},"name":"Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancpost":{"tags":{"name":"Bancpost","amenity":"bank"},"name":"Bancpost","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banesco":{"tags":{"name":"Banesco","amenity":"bank"},"name":"Banesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bangkok Bank":{"tags":{"name":"Bangkok Bank","amenity":"bank"},"name":"Bangkok Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Al Habib":{"tags":{"name":"Bank Al Habib","amenity":"bank"},"name":"Bank Al Habib","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Alfalah":{"tags":{"name":"Bank Alfalah","amenity":"bank"},"name":"Bank Alfalah","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Austria":{"tags":{"name":"Bank Austria","amenity":"bank"},"name":"Bank Austria","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BCA":{"tags":{"name":"Bank BCA","amenity":"bank"},"name":"Bank BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BNI":{"tags":{"name":"Bank BNI","amenity":"bank"},"name":"Bank BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BPH":{"tags":{"name":"Bank BPH","amenity":"bank"},"name":"Bank BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BRI":{"tags":{"name":"Bank BRI","amenity":"bank"},"name":"Bank BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Danamon":{"tags":{"name":"Bank Danamon","amenity":"bank"},"name":"Bank Danamon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mandiri":{"tags":{"name":"Bank Mandiri","amenity":"bank"},"name":"Bank Mandiri","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mega":{"tags":{"name":"Bank Mega","amenity":"bank"},"name":"Bank Mega","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Spółdzielczy":{"tags":{"name":"Bank Spółdzielczy","amenity":"bank"},"name":"Bank Spółdzielczy","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Zachodni WBK":{"tags":{"name":"Bank Zachodni WBK","amenity":"bank"},"name":"Bank Zachodni WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Africa":{"tags":{"name":"Bank of Africa","amenity":"bank"},"name":"Bank of Africa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of America":{"tags":{"name":"Bank of America","amenity":"bank"},"name":"Bank of America","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Baroda":{"tags":{"name":"Bank of Baroda","amenity":"bank"},"name":"Bank of Baroda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ceylon":{"tags":{"name":"Bank of Ceylon","amenity":"bank"},"name":"Bank of Ceylon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of China":{"tags":{"name":"Bank of China","amenity":"bank"},"name":"Bank of China","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Commerce":{"tags":{"name":"Bank of Commerce","amenity":"bank"},"name":"Bank of Commerce","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of India":{"tags":{"name":"Bank of India","amenity":"bank"},"name":"Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ireland":{"tags":{"name":"Bank of Ireland","amenity":"bank"},"name":"Bank of Ireland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Montreal":{"tags":{"name":"Bank of Montreal","amenity":"bank"},"name":"Bank of Montreal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of New Zealand":{"tags":{"name":"Bank of New Zealand","amenity":"bank"},"name":"Bank of New Zealand","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Scotland":{"tags":{"name":"Bank of Scotland","amenity":"bank"},"name":"Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of the West":{"tags":{"name":"Bank of the West","amenity":"bank"},"name":"Bank of the West","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankia":{"tags":{"name":"Bankia","amenity":"bank"},"name":"Bankia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankinter":{"tags":{"name":"Bankinter","amenity":"bank"},"name":"Bankinter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banner Bank":{"tags":{"name":"Banner Bank","amenity":"bank"},"name":"Banner Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banorte":{"tags":{"name":"Banorte","amenity":"bank"},"name":"Banorte","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Atlantique":{"tags":{"name":"Banque Atlantique","amenity":"bank"},"name":"Banque Atlantique","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Nationale":{"tags":{"name":"Banque Nationale","amenity":"bank"},"name":"Banque Nationale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Populaire":{"tags":{"name":"Banque Populaire","amenity":"bank"},"name":"Banque Populaire","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrisul":{"tags":{"name":"Banrisul","amenity":"bank"},"name":"Banrisul","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrural":{"tags":{"name":"Banrural","amenity":"bank"},"name":"Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Barclays":{"tags":{"name":"Barclays","amenity":"bank"},"name":"Barclays","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bcc":{"tags":{"name":"Bcc","amenity":"bank"},"name":"Bcc","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Belfius":{"tags":{"name":"Belfius","amenity":"bank"},"name":"Belfius","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bendigo Bank":{"tags":{"name":"Bendigo Bank","amenity":"bank"},"name":"Bendigo Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Berliner Volksbank":{"tags":{"name":"Berliner Volksbank","amenity":"bank"},"name":"Berliner Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bicentenario":{"tags":{"name":"Bicentenario","amenity":"bank"},"name":"Bicentenario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bradesco":{"tags":{"name":"Bradesco","amenity":"bank"},"name":"Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Budapest Bank":{"tags":{"name":"Budapest Bank","amenity":"bank"},"name":"Budapest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CBAO":{"tags":{"name":"CBAO","amenity":"bank"},"name":"CBAO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CEC Bank":{"tags":{"name":"CEC Bank","amenity":"bank"},"name":"CEC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CGD":{"tags":{"name":"CGD","amenity":"bank"},"name":"CGD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIB Bank":{"tags":{"name":"CIB Bank","amenity":"bank"},"name":"CIB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIBC":{"tags":{"name":"CIBC","amenity":"bank"},"name":"CIBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIC":{"tags":{"name":"CIC","amenity":"bank"},"name":"CIC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIMB Bank":{"tags":{"name":"CIMB Bank","amenity":"bank"},"name":"CIMB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CNEP":{"tags":{"name":"CNEP","amenity":"bank"},"name":"CNEP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse Desjardins":{"tags":{"name":"Caisse Desjardins","amenity":"bank"},"name":"Caisse Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse d'Épargne":{"tags":{"name":"Caisse d'Épargne","amenity":"bank"},"name":"Caisse d'Épargne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa":{"tags":{"name":"Caixa","amenity":"bank"},"name":"Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Econômica Federal":{"tags":{"name":"Caixa Econômica Federal","amenity":"bank"},"name":"Caixa Econômica Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Geral de Depósitos":{"tags":{"name":"Caixa Geral de Depósitos","amenity":"bank"},"name":"Caixa Geral de Depósitos","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CaixaBank":{"tags":{"name":"CaixaBank","amenity":"bank"},"name":"CaixaBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Círculo":{"tags":{"name":"Caja Círculo","amenity":"bank"},"name":"Caja Círculo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Duero":{"tags":{"name":"Caja Duero","amenity":"bank"},"name":"Caja Duero","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja España":{"tags":{"name":"Caja España","amenity":"bank"},"name":"Caja España","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural":{"tags":{"name":"Caja Rural","amenity":"bank"},"name":"Caja Rural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural de Jaén":{"tags":{"name":"Caja Rural de Jaén","amenity":"bank"},"name":"Caja Rural de Jaén","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CajaSur":{"tags":{"name":"CajaSur","amenity":"bank"},"name":"CajaSur","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajamar":{"tags":{"name":"Cajamar","amenity":"bank"},"name":"Cajamar","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajero Automatico Bancared":{"tags":{"name":"Cajero Automatico Bancared","amenity":"bank"},"name":"Cajero Automatico Bancared","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Canara Bank":{"tags":{"name":"Canara Bank","amenity":"bank"},"name":"Canara Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Capital One":{"tags":{"name":"Capital One","amenity":"bank"},"name":"Capital One","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Carige":{"tags":{"name":"Carige","amenity":"bank"},"name":"Carige","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cariparma":{"tags":{"name":"Cariparma","amenity":"bank"},"name":"Cariparma","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cassa di Risparmio del Veneto":{"tags":{"name":"Cassa di Risparmio del Veneto","amenity":"bank"},"name":"Cassa di Risparmio del Veneto","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CatalunyaCaixa":{"tags":{"name":"CatalunyaCaixa","amenity":"bank"},"name":"CatalunyaCaixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Central Bank of India":{"tags":{"name":"Central Bank of India","amenity":"bank"},"name":"Central Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Chase":{"tags":{"name":"Chase","amenity":"bank"},"name":"Chase","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank":{"tags":{"name":"China Bank","amenity":"bank"},"name":"China Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank Savings":{"tags":{"name":"China Bank Savings","amenity":"bank"},"name":"China Bank Savings","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Construction Bank":{"tags":{"name":"China Construction Bank","amenity":"bank"},"name":"China Construction Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citibank":{"tags":{"name":"Citibank","amenity":"bank"},"name":"Citibank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citizens Bank":{"tags":{"name":"Citizens Bank","amenity":"bank"},"name":"Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Clydesdale Bank":{"tags":{"name":"Clydesdale Bank","amenity":"bank"},"name":"Clydesdale Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Columbia Bank":{"tags":{"name":"Columbia Bank","amenity":"bank"},"name":"Columbia Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Comerica Bank":{"tags":{"name":"Comerica Bank","amenity":"bank"},"name":"Comerica Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerce Bank":{"tags":{"name":"Commerce Bank","amenity":"bank"},"name":"Commerce Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank":{"tags":{"name":"Commercial Bank","amenity":"bank"},"name":"Commercial Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank of Ceylon PLC":{"tags":{"name":"Commercial Bank of Ceylon PLC","amenity":"bank"},"name":"Commercial Bank of Ceylon PLC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerzbank":{"tags":{"name":"Commerzbank","amenity":"bank"},"name":"Commerzbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commonwealth Bank":{"tags":{"name":"Commonwealth Bank","amenity":"bank"},"name":"Commonwealth Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Corporation Bank":{"tags":{"name":"Corporation Bank","amenity":"bank"},"name":"Corporation Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credem":{"tags":{"name":"Credem","amenity":"bank"},"name":"Credem","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credicoop":{"tags":{"name":"Credicoop","amenity":"bank"},"name":"Credicoop","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Agricole":{"tags":{"name":"Credit Agricole","amenity":"bank"},"name":"Credit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Suisse":{"tags":{"name":"Credit Suisse","amenity":"bank"},"name":"Credit Suisse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crelan":{"tags":{"name":"Crelan","amenity":"bank"},"name":"Crelan","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Agricole":{"tags":{"name":"Crédit Agricole","amenity":"bank"},"name":"Crédit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel":{"tags":{"name":"Crédit Mutuel","amenity":"bank"},"name":"Crédit Mutuel","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel de Bretagne":{"tags":{"name":"Crédit Mutuel de Bretagne","amenity":"bank"},"name":"Crédit Mutuel de Bretagne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit du Nord":{"tags":{"name":"Crédit du Nord","amenity":"bank"},"name":"Crédit du Nord","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédito Agrícola":{"tags":{"name":"Crédito Agrícola","amenity":"bank"},"name":"Crédito Agrícola","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cбербанк":{"tags":{"name":"Cбербанк","amenity":"bank"},"name":"Cбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Danske Bank":{"tags":{"name":"Danske Bank","amenity":"bank"},"name":"Danske Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Davivienda":{"tags":{"name":"Davivienda","amenity":"bank"},"name":"Davivienda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/De Venezuela":{"tags":{"name":"De Venezuela","amenity":"bank"},"name":"De Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Denizbank":{"tags":{"name":"Denizbank","amenity":"bank"},"name":"Denizbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Desjardins":{"tags":{"name":"Desjardins","amenity":"bank"},"name":"Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Deutsche Bank":{"tags":{"name":"Deutsche Bank","amenity":"bank"},"name":"Deutsche Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Dubai Islamic Bank":{"tags":{"name":"Dubai Islamic Bank","amenity":"bank"},"name":"Dubai Islamic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/EastWest Bank":{"tags":{"name":"EastWest Bank","amenity":"bank"},"name":"EastWest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ecobank":{"tags":{"name":"Ecobank","amenity":"bank"},"name":"Ecobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Erste Bank":{"tags":{"name":"Erste Bank","amenity":"bank"},"name":"Erste Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Eurobank":{"tags":{"name":"Eurobank","amenity":"bank"},"name":"Eurobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Express Union":{"tags":{"name":"Express Union","amenity":"bank"},"name":"Express Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/FNB":{"tags":{"name":"FNB","amenity":"bank"},"name":"FNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Federal Bank":{"tags":{"name":"Federal Bank","amenity":"bank"},"name":"Federal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Fifth Third Bank":{"tags":{"name":"Fifth Third Bank","amenity":"bank"},"name":"Fifth Third Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Finansbank":{"tags":{"name":"Finansbank","amenity":"bank"},"name":"Finansbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Bank":{"tags":{"name":"First Bank","amenity":"bank"},"name":"First Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Citizens Bank":{"tags":{"name":"First Citizens Bank","amenity":"bank"},"name":"First Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First National Bank":{"tags":{"name":"First National Bank","amenity":"bank"},"name":"First National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Galicia":{"tags":{"name":"Galicia","amenity":"bank"},"name":"Galicia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti":{"tags":{"name":"Garanti","amenity":"bank"},"name":"Garanti","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti Bankası":{"tags":{"name":"Garanti Bankası","amenity":"bank"},"name":"Garanti Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Getin Bank":{"tags":{"name":"Getin Bank","amenity":"bank"},"name":"Getin Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Groupama":{"tags":{"name":"Groupama","amenity":"bank"},"name":"Groupama","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HDFC Bank":{"tags":{"name":"HDFC Bank","amenity":"bank"},"name":"HDFC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HNB":{"tags":{"name":"HNB","amenity":"bank"},"name":"HNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HSBC":{"tags":{"name":"HSBC","amenity":"bank"},"name":"HSBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halifax":{"tags":{"name":"Halifax","amenity":"bank"},"name":"Halifax","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halkbank":{"tags":{"name":"Halkbank","amenity":"bank"},"name":"Halkbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hamburger Sparkasse":{"tags":{"name":"Hamburger Sparkasse","amenity":"bank"},"name":"Hamburger Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Handelsbanken":{"tags":{"name":"Handelsbanken","amenity":"bank"},"name":"Handelsbanken","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hong Leong Bank":{"tags":{"name":"Hong Leong Bank","amenity":"bank"},"name":"Hong Leong Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hrvatska poštanska banka":{"tags":{"name":"Hrvatska poštanska banka","amenity":"bank"},"name":"Hrvatska poštanska banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Huntington Bank":{"tags":{"name":"Huntington Bank","amenity":"bank"},"name":"Huntington Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HypoVereinsbank":{"tags":{"name":"HypoVereinsbank","amenity":"bank"},"name":"HypoVereinsbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICBC":{"tags":{"name":"ICBC","amenity":"bank"},"name":"ICBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICICI Bank":{"tags":{"name":"ICICI Bank","amenity":"bank"},"name":"ICICI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IDBI Bank":{"tags":{"name":"IDBI Bank","amenity":"bank"},"name":"IDBI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING":{"tags":{"name":"ING","amenity":"bank"},"name":"ING","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING Bank Śląski":{"tags":{"name":"ING Bank Śląski","amenity":"bank"},"name":"ING Bank Śląski","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IberCaja":{"tags":{"name":"IberCaja","amenity":"bank"},"name":"IberCaja","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Bank":{"tags":{"name":"Indian Bank","amenity":"bank"},"name":"Indian Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Overseas Bank":{"tags":{"name":"Indian Overseas Bank","amenity":"bank"},"name":"Indian Overseas Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Interbank":{"tags":{"name":"Interbank","amenity":"bank"},"name":"Interbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Intesa San Paolo":{"tags":{"name":"Intesa San Paolo","amenity":"bank"},"name":"Intesa San Paolo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Itaú":{"tags":{"name":"Itaú","amenity":"bank"},"name":"Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/K&H Bank":{"tags":{"name":"K&H Bank","amenity":"bank"},"name":"K&H Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/KBC":{"tags":{"name":"KBC","amenity":"bank"},"name":"KBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kasa Stefczyka":{"tags":{"name":"Kasa Stefczyka","amenity":"bank"},"name":"Kasa Stefczyka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Key Bank":{"tags":{"name":"Key Bank","amenity":"bank"},"name":"Key Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Komerční banka":{"tags":{"name":"Komerční banka","amenity":"bank"},"name":"Komerční banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse":{"tags":{"name":"Kreissparkasse","amenity":"bank"},"name":"Kreissparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse Köln":{"tags":{"name":"Kreissparkasse Köln","amenity":"bank"},"name":"Kreissparkasse Köln","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kutxabank":{"tags":{"name":"Kutxabank","amenity":"bank"},"name":"Kutxabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/LCL":{"tags":{"name":"LCL","amenity":"bank"},"name":"LCL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Banque Postale":{"tags":{"name":"La Banque Postale","amenity":"bank"},"name":"La Banque Postale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Caixa":{"tags":{"name":"La Caixa","amenity":"bank"},"name":"La Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Laboral Kutxa":{"tags":{"name":"Laboral Kutxa","amenity":"bank"},"name":"Laboral Kutxa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Landbank":{"tags":{"name":"Landbank","amenity":"bank"},"name":"Landbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Liberbank":{"tags":{"name":"Liberbank","amenity":"bank"},"name":"Liberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Lloyds Bank":{"tags":{"name":"Lloyds Bank","amenity":"bank"},"name":"Lloyds Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/M&T Bank":{"tags":{"name":"M&T Bank","amenity":"bank"},"name":"M&T Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB":{"tags":{"name":"MCB","amenity":"bank"},"name":"MCB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB Bank":{"tags":{"name":"MCB Bank","amenity":"bank"},"name":"MCB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MONETA Money Bank":{"tags":{"name":"MONETA Money Bank","amenity":"bank"},"name":"MONETA Money Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Macro":{"tags":{"name":"Macro","amenity":"bank"},"name":"Macro","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Maybank":{"tags":{"name":"Maybank","amenity":"bank"},"name":"Maybank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Meezan Bank":{"tags":{"name":"Meezan Bank","amenity":"bank"},"name":"Meezan Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Mercantil":{"tags":{"name":"Mercantil","amenity":"bank"},"name":"Mercantil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metro Bank":{"tags":{"name":"Metro Bank","amenity":"bank"},"name":"Metro Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metrobank":{"tags":{"name":"Metrobank","amenity":"bank"},"name":"Metrobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium BCP":{"tags":{"name":"Millennium BCP","amenity":"bank"},"name":"Millennium BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium Bank":{"tags":{"name":"Millennium Bank","amenity":"bank"},"name":"Millennium Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Monte dei Paschi di Siena":{"tags":{"name":"Monte dei Paschi di Siena","amenity":"bank"},"name":"Monte dei Paschi di Siena","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Montepio":{"tags":{"name":"Montepio","amenity":"bank"},"name":"Montepio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NAB":{"tags":{"name":"NAB","amenity":"bank"},"name":"NAB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NSB":{"tags":{"name":"NSB","amenity":"bank"},"name":"NSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NatWest":{"tags":{"name":"NatWest","amenity":"bank"},"name":"NatWest","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/National Bank":{"tags":{"name":"National Bank","amenity":"bank"},"name":"National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nationwide":{"tags":{"name":"Nationwide","amenity":"bank"},"name":"Nationwide","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nedbank":{"tags":{"name":"Nedbank","amenity":"bank"},"name":"Nedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nordea":{"tags":{"name":"Nordea","amenity":"bank"},"name":"Nordea","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Novo Banco":{"tags":{"name":"Novo Banco","amenity":"bank"},"name":"Novo Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OLB":{"tags":{"name":"OLB","amenity":"bank"},"name":"OLB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OTP":{"tags":{"name":"OTP","amenity":"bank"},"name":"OTP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oberbank":{"tags":{"name":"Oberbank","amenity":"bank"},"name":"Oberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Occidental de Descuento":{"tags":{"name":"Occidental de Descuento","amenity":"bank"},"name":"Occidental de Descuento","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oldenburgische Landesbank":{"tags":{"name":"Oldenburgische Landesbank","amenity":"bank"},"name":"Oldenburgische Landesbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/One Network Bank":{"tags":{"name":"One Network Bank","amenity":"bank"},"name":"One Network Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Osuuspankki":{"tags":{"name":"Osuuspankki","amenity":"bank"},"name":"Osuuspankki","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PBZ":{"tags":{"name":"PBZ","amenity":"bank"},"name":"PBZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO":{"tags":{"name":"PKO","amenity":"bank"},"name":"PKO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO BP":{"tags":{"name":"PKO BP","amenity":"bank"},"name":"PKO BP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNB":{"tags":{"name":"PNB","amenity":"bank"},"name":"PNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC":{"tags":{"name":"PNC","amenity":"bank"},"name":"PNC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC Bank":{"tags":{"name":"PNC Bank","amenity":"bank"},"name":"PNC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PSBank":{"tags":{"name":"PSBank","amenity":"bank"},"name":"PSBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Patagonia":{"tags":{"name":"Patagonia","amenity":"bank"},"name":"Patagonia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Pekao SA":{"tags":{"name":"Pekao SA","amenity":"bank"},"name":"Pekao SA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Peoples Bank":{"tags":{"name":"Peoples Bank","amenity":"bank"},"name":"Peoples Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Philippine National Bank":{"tags":{"name":"Philippine National Bank","amenity":"bank"},"name":"Philippine National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Piraeus Bank":{"tags":{"name":"Piraeus Bank","amenity":"bank"},"name":"Piraeus Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Popular":{"tags":{"name":"Popular","amenity":"bank"},"name":"Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank":{"tags":{"name":"Postbank","amenity":"bank"},"name":"Postbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank Finanzcenter":{"tags":{"name":"Postbank Finanzcenter","amenity":"bank"},"name":"Postbank Finanzcenter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Provincial":{"tags":{"name":"Provincial","amenity":"bank"},"name":"Provincial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Public Bank":{"tags":{"name":"Public Bank","amenity":"bank"},"name":"Public Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Punjab National Bank":{"tags":{"name":"Punjab National Bank","amenity":"bank"},"name":"Punjab National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC":{"tags":{"name":"RBC","amenity":"bank"},"name":"RBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC Financial Group":{"tags":{"name":"RBC Financial Group","amenity":"bank"},"name":"RBC Financial Group","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBS":{"tags":{"name":"RBS","amenity":"bank"},"name":"RBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC":{"tags":{"name":"RCBC","amenity":"bank"},"name":"RCBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC Savings Bank":{"tags":{"name":"RCBC Savings Bank","amenity":"bank"},"name":"RCBC Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Rabobank":{"tags":{"name":"Rabobank","amenity":"bank"},"name":"Rabobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisen Polbank":{"tags":{"name":"Raiffeisen Polbank","amenity":"bank"},"name":"Raiffeisen Polbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisenbank":{"tags":{"name":"Raiffeisenbank","amenity":"bank"},"name":"Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Regions Bank":{"tags":{"name":"Regions Bank","amenity":"bank"},"name":"Regions Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Republic Bank":{"tags":{"name":"Republic Bank","amenity":"bank"},"name":"Republic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank":{"tags":{"name":"Royal Bank","amenity":"bank"},"name":"Royal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Canada":{"tags":{"name":"Royal Bank of Canada","amenity":"bank"},"name":"Royal Bank of Canada","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Scotland":{"tags":{"name":"Royal Bank of Scotland","amenity":"bank"},"name":"Royal Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SEB":{"tags":{"name":"SEB","amenity":"bank"},"name":"SEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SNS Bank":{"tags":{"name":"SNS Bank","amenity":"bank"},"name":"SNS Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sabadell":{"tags":{"name":"Sabadell","amenity":"bank"},"name":"Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sampath Bank":{"tags":{"name":"Sampath Bank","amenity":"bank"},"name":"Sampath Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander":{"tags":{"name":"Santander","amenity":"bank"},"name":"Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Consumer Bank":{"tags":{"name":"Santander Consumer Bank","amenity":"bank"},"name":"Santander Consumer Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Río":{"tags":{"name":"Santander Río","amenity":"bank"},"name":"Santander Río","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Totta":{"tags":{"name":"Santander Totta","amenity":"bank"},"name":"Santander Totta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sberbank":{"tags":{"name":"Sberbank","amenity":"bank"},"name":"Sberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Scotiabank":{"tags":{"name":"Scotiabank","amenity":"bank"},"name":"Scotiabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Security Bank":{"tags":{"name":"Security Bank","amenity":"bank"},"name":"Security Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sicredi":{"tags":{"name":"Sicredi","amenity":"bank"},"name":"Sicredi","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Slovenská sporiteľňa":{"tags":{"name":"Slovenská sporiteľňa","amenity":"bank"},"name":"Slovenská sporiteľňa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Société Générale":{"tags":{"name":"Société Générale","amenity":"bank"},"name":"Société Générale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparda-Bank":{"tags":{"name":"Sparda-Bank","amenity":"bank"},"name":"Sparda-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse":{"tags":{"name":"Sparkasse","amenity":"bank"},"name":"Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse Aachen":{"tags":{"name":"Sparkasse Aachen","amenity":"bank"},"name":"Sparkasse Aachen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse KölnBonn":{"tags":{"name":"Sparkasse KölnBonn","amenity":"bank"},"name":"Sparkasse KölnBonn","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stadtsparkasse":{"tags":{"name":"Stadtsparkasse","amenity":"bank"},"name":"Stadtsparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stanbic Bank":{"tags":{"name":"Stanbic Bank","amenity":"bank"},"name":"Stanbic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Bank":{"tags":{"name":"Standard Bank","amenity":"bank"},"name":"Standard Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered":{"tags":{"name":"Standard Chartered","amenity":"bank"},"name":"Standard Chartered","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered Bank":{"tags":{"name":"Standard Chartered Bank","amenity":"bank"},"name":"Standard Chartered Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/State Bank of India":{"tags":{"name":"State Bank of India","amenity":"bank"},"name":"State Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SunTrust":{"tags":{"name":"SunTrust","amenity":"bank"},"name":"SunTrust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Supervielle":{"tags":{"name":"Supervielle","amenity":"bank"},"name":"Supervielle","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Swedbank":{"tags":{"name":"Swedbank","amenity":"bank"},"name":"Swedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Syndicate Bank":{"tags":{"name":"Syndicate Bank","amenity":"bank"},"name":"Syndicate Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TCF Bank":{"tags":{"name":"TCF Bank","amenity":"bank"},"name":"TCF Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Bank":{"tags":{"name":"TD Bank","amenity":"bank"},"name":"TD Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Canada Trust":{"tags":{"name":"TD Canada Trust","amenity":"bank"},"name":"TD Canada Trust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TEB":{"tags":{"name":"TEB","amenity":"bank"},"name":"TEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TSB":{"tags":{"name":"TSB","amenity":"bank"},"name":"TSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Takarékszövetkezet":{"tags":{"name":"Takarékszövetkezet","amenity":"bank"},"name":"Takarékszövetkezet","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Targobank":{"tags":{"name":"Targobank","amenity":"bank"},"name":"Targobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Tatra banka":{"tags":{"name":"Tatra banka","amenity":"bank"},"name":"Tatra banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Türkiye İş Bankası":{"tags":{"name":"Türkiye İş Bankası","amenity":"bank"},"name":"Türkiye İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UBS":{"tags":{"name":"UBS","amenity":"bank"},"name":"UBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCO Bank":{"tags":{"name":"UCO Bank","amenity":"bank"},"name":"UCO Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCPB":{"tags":{"name":"UCPB","amenity":"bank"},"name":"UCPB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UOB":{"tags":{"name":"UOB","amenity":"bank"},"name":"UOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/US Bank":{"tags":{"name":"US Bank","amenity":"bank"},"name":"US Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ulster Bank":{"tags":{"name":"Ulster Bank","amenity":"bank"},"name":"Ulster Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Umpqua Bank":{"tags":{"name":"Umpqua Bank","amenity":"bank"},"name":"Umpqua Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UniCredit Bank":{"tags":{"name":"UniCredit Bank","amenity":"bank"},"name":"UniCredit Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicaja Banco":{"tags":{"name":"Unicaja Banco","amenity":"bank"},"name":"Unicaja Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicredit Banca":{"tags":{"name":"Unicredit Banca","amenity":"bank"},"name":"Unicredit Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Union Bank":{"tags":{"name":"Union Bank","amenity":"bank"},"name":"Union Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/United Bank":{"tags":{"name":"United Bank","amenity":"bank"},"name":"United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VR-Bank":{"tags":{"name":"VR-Bank","amenity":"bank"},"name":"VR-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vakıfbank":{"tags":{"name":"Vakıfbank","amenity":"bank"},"name":"Vakıfbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Veneto Banca":{"tags":{"name":"Veneto Banca","amenity":"bank"},"name":"Veneto Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vijaya Bank":{"tags":{"name":"Vijaya Bank","amenity":"bank"},"name":"Vijaya Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volks- und Raiffeisenbank":{"tags":{"name":"Volks- und Raiffeisenbank","amenity":"bank"},"name":"Volks- und Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank":{"tags":{"name":"Volksbank","amenity":"bank"},"name":"Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Mittelhessen":{"tags":{"name":"Volksbank Mittelhessen","amenity":"bank"},"name":"Volksbank Mittelhessen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Raiffeisenbank":{"tags":{"name":"Volksbank Raiffeisenbank","amenity":"bank"},"name":"Volksbank Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VÚB":{"tags":{"name":"VÚB","amenity":"bank"},"name":"VÚB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Washington Federal":{"tags":{"name":"Washington Federal","amenity":"bank"},"name":"Washington Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Wells Fargo":{"tags":{"name":"Wells Fargo","amenity":"bank"},"name":"Wells Fargo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Western Union":{"tags":{"name":"Western Union","amenity":"bank"},"name":"Western Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Westpac":{"tags":{"name":"Westpac","amenity":"bank"},"name":"Westpac","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Bank":{"tags":{"name":"Yorkshire Bank","amenity":"bank"},"name":"Yorkshire Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Building Society":{"tags":{"name":"Yorkshire Building Society","amenity":"bank"},"name":"Yorkshire Building Society","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Zagrebačka banka":{"tags":{"name":"Zagrebačka banka","amenity":"bank"},"name":"Zagrebačka banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ziraat Bankası":{"tags":{"name":"Ziraat Bankası","amenity":"bank"},"name":"Ziraat Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/mBank":{"tags":{"name":"mBank","amenity":"bank"},"name":"mBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ČSOB":{"tags":{"name":"ČSOB","amenity":"bank"},"name":"ČSOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Česká spořitelna":{"tags":{"name":"Česká spořitelna","amenity":"bank"},"name":"Česká spořitelna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/İş Bankası":{"tags":{"name":"İş Bankası","amenity":"bank"},"name":"İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Εθνική Τράπεζα":{"tags":{"name":"Εθνική Τράπεζα","amenity":"bank"},"name":"Εθνική Τράπεζα","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Πειραιώς":{"tags":{"name":"Πειραιώς","amenity":"bank"},"name":"Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Τράπεζα Πειραιώς":{"tags":{"name":"Τράπεζα Πειραιώς","amenity":"bank"},"name":"Τράπεζα Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Авангард":{"tags":{"name":"Авангард","amenity":"bank"},"name":"Авангард","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Альфа-Банк":{"tags":{"name":"Альфа-Банк","amenity":"bank"},"name":"Альфа-Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банк Москвы":{"tags":{"name":"Банк Москвы","amenity":"bank"},"name":"Банк Москвы","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банка ДСК":{"tags":{"name":"Банка ДСК","amenity":"bank"},"name":"Банка ДСК","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белагропромбанк":{"tags":{"name":"Белагропромбанк","amenity":"bank"},"name":"Белагропромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Беларусбанк":{"tags":{"name":"Беларусбанк","amenity":"bank"},"name":"Беларусбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белинвестбанк":{"tags":{"name":"Белинвестбанк","amenity":"bank"},"name":"Белинвестбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Бинбанк":{"tags":{"name":"Бинбанк","amenity":"bank"},"name":"Бинбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ":{"tags":{"name":"ВТБ","amenity":"bank"},"name":"ВТБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ24":{"tags":{"name":"ВТБ24","amenity":"bank"},"name":"ВТБ24","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Возрождение":{"tags":{"name":"Возрождение","amenity":"bank"},"name":"Возрождение","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Газпромбанк":{"tags":{"name":"Газпромбанк","amenity":"bank"},"name":"Газпромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Генбанк":{"tags":{"name":"Генбанк","amenity":"bank"},"name":"Генбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Казкоммерцбанк":{"tags":{"name":"Казкоммерцбанк","amenity":"bank"},"name":"Казкоммерцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/МДМ Банк":{"tags":{"name":"МДМ Банк","amenity":"bank"},"name":"МДМ Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Московский индустриальный банк":{"tags":{"name":"Московский индустриальный банк","amenity":"bank"},"name":"Московский индустриальный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Мособлбанк":{"tags":{"name":"Мособлбанк","amenity":"bank"},"name":"Мособлбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Народный банк":{"tags":{"name":"Народный банк","amenity":"bank"},"name":"Народный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ОТП Банк":{"tags":{"name":"ОТП Банк","amenity":"bank"},"name":"ОТП Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Открытие":{"tags":{"name":"Открытие","amenity":"bank"},"name":"Открытие","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ощадбанк":{"tags":{"name":"Ощадбанк","amenity":"bank"},"name":"Ощадбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПУМБ":{"tags":{"name":"ПУМБ","amenity":"bank"},"name":"ПУМБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Почта Банк":{"tags":{"name":"Почта Банк","amenity":"bank"},"name":"Почта Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПриватБанк":{"tags":{"name":"ПриватБанк","amenity":"bank"},"name":"ПриватБанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приватбанк":{"tags":{"name":"Приватбанк","amenity":"bank"},"name":"Приватбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приднестровский Сбербанк":{"tags":{"name":"Приднестровский Сбербанк","amenity":"bank"},"name":"Приднестровский Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приорбанк":{"tags":{"name":"Приорбанк","amenity":"bank"},"name":"Приорбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Промсвязьбанк":{"tags":{"name":"Промсвязьбанк","amenity":"bank"},"name":"Промсвязьбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/РНКБ":{"tags":{"name":"РНКБ","amenity":"bank"},"name":"РНКБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен":{"tags":{"name":"Райффайзен","amenity":"bank"},"name":"Райффайзен","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен Банк Аваль":{"tags":{"name":"Райффайзен Банк Аваль","amenity":"bank"},"name":"Райффайзен Банк Аваль","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзенбанк":{"tags":{"name":"Райффайзенбанк","amenity":"bank"},"name":"Райффайзенбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Росбанк":{"tags":{"name":"Росбанк","amenity":"bank"},"name":"Росбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Россельхозбанк":{"tags":{"name":"Россельхозбанк","amenity":"bank"},"name":"Россельхозбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Русский стандарт":{"tags":{"name":"Русский стандарт","amenity":"bank"},"name":"Русский стандарт","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Сбербанк":{"tags":{"name":"Сбербанк","amenity":"bank"},"name":"Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Совкомбанк":{"tags":{"name":"Совкомбанк","amenity":"bank"},"name":"Совкомбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/УкрСиббанк":{"tags":{"name":"УкрСиббанк","amenity":"bank"},"name":"УкрСиббанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Укрсоцбанк":{"tags":{"name":"Укрсоцбанк","amenity":"bank"},"name":"Укрсоцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Уралсиб":{"tags":{"name":"Уралсиб","amenity":"bank"},"name":"Уралсиб","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Хоум Кредит":{"tags":{"name":"Хоум Кредит","amenity":"bank"},"name":"Хоум Кредит","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק הפועלים":{"tags":{"name":"בנק הפועלים","amenity":"bank"},"name":"בנק הפועלים","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק לאומי":{"tags":{"name":"בנק לאומי","amenity":"bank"},"name":"בנק לאומי","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک":{"tags":{"name":"بانک","amenity":"bank"},"name":"بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک آینده":{"tags":{"name":"بانک آینده","amenity":"bank"},"name":"بانک آینده","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک اقتصاد نوین":{"tags":{"name":"بانک اقتصاد نوین","amenity":"bank"},"name":"بانک اقتصاد نوین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک انصار":{"tags":{"name":"بانک انصار","amenity":"bank"},"name":"بانک انصار","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک تجارت":{"tags":{"name":"بانک تجارت","amenity":"bank"},"name":"بانک تجارت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه":{"tags":{"name":"بانک رفاه","amenity":"bank"},"name":"بانک رفاه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه کارگران":{"tags":{"name":"بانک رفاه کارگران","amenity":"bank"},"name":"بانک رفاه کارگران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک سپه":{"tags":{"name":"بانک سپه","amenity":"bank"},"name":"بانک سپه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک شهر":{"tags":{"name":"بانک شهر","amenity":"bank"},"name":"بانک شهر","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک صادرات":{"tags":{"name":"بانک صادرات","amenity":"bank"},"name":"بانک صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک قوامین":{"tags":{"name":"بانک قوامین","amenity":"bank"},"name":"بانک قوامین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مسکن":{"tags":{"name":"بانک مسکن","amenity":"bank"},"name":"بانک مسکن","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملت":{"tags":{"name":"بانک ملت","amenity":"bank"},"name":"بانک ملت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی":{"tags":{"name":"بانک ملی","amenity":"bank"},"name":"بانک ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی ایران":{"tags":{"name":"بانک ملی ایران","amenity":"bank"},"name":"بانک ملی ایران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مهر اقتصاد":{"tags":{"name":"بانک مهر اقتصاد","amenity":"bank"},"name":"بانک مهر اقتصاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پارسیان":{"tags":{"name":"بانک پارسیان","amenity":"bank"},"name":"بانک پارسیان","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پاسارگاد":{"tags":{"name":"بانک پاسارگاد","amenity":"bank"},"name":"بانک پاسارگاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک کشاورزی":{"tags":{"name":"بانک کشاورزی","amenity":"bank"},"name":"بانک کشاورزی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/صادرات":{"tags":{"name":"صادرات","amenity":"bank"},"name":"صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ملی":{"tags":{"name":"ملی","amenity":"bank"},"name":"ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/پست بانک":{"tags":{"name":"پست بانک","amenity":"bank"},"name":"پست بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงเทพ":{"tags":{"name":"ธนาคารกรุงเทพ","amenity":"bank"},"name":"ธนาคารกรุงเทพ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงไทย":{"tags":{"name":"ธนาคารกรุงไทย","amenity":"bank"},"name":"ธนาคารกรุงไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกสิกรไทย":{"tags":{"name":"ธนาคารกสิกรไทย","amenity":"bank"},"name":"ธนาคารกสิกรไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารออมสิน":{"tags":{"name":"ธนาคารออมสิน","amenity":"bank"},"name":"ธนาคารออมสิน","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารไทยพาณิชย์":{"tags":{"name":"ธนาคารไทยพาณิชย์","amenity":"bank"},"name":"ธนาคารไทยพาณิชย์","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/みずほ銀行":{"tags":{"name":"みずほ銀行","amenity":"bank"},"name":"みずほ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/りそな銀行":{"tags":{"name":"りそな銀行","amenity":"bank"},"name":"りそな銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三井住友銀行":{"tags":{"name":"三井住友銀行","amenity":"bank"},"name":"三井住友銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三菱東京UFJ銀行":{"tags":{"name":"三菱東京UFJ銀行","amenity":"bank"},"name":"三菱東京UFJ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国农业银行":{"tags":{"name":"中国农业银行","amenity":"bank"},"name":"中国农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国工商银行":{"tags":{"name":"中国工商银行","amenity":"bank"},"name":"中国工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国建设银行":{"tags":{"name":"中国建设银行","amenity":"bank"},"name":"中国建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国邮政储蓄银行":{"tags":{"name":"中国邮政储蓄银行","amenity":"bank"},"name":"中国邮政储蓄银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国银行":{"tags":{"name":"中国银行","amenity":"bank"},"name":"中国银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/交通银行":{"tags":{"name":"交通银行","amenity":"bank"},"name":"交通银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都中央信用金庫":{"tags":{"name":"京都中央信用金庫","amenity":"bank"},"name":"京都中央信用金庫","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都銀行":{"tags":{"name":"京都銀行","amenity":"bank"},"name":"京都銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/农业银行":{"tags":{"name":"农业银行","amenity":"bank"},"name":"农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/北海道銀行":{"tags":{"name":"北海道銀行","amenity":"bank"},"name":"北海道銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/合作金庫銀行":{"tags":{"name":"合作金庫銀行","amenity":"bank"},"name":"合作金庫銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/土地銀行":{"tags":{"name":"土地銀行","amenity":"bank"},"name":"土地銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/工商银行":{"tags":{"name":"工商银行","amenity":"bank"},"name":"工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/建设银行":{"tags":{"name":"建设银行","amenity":"bank"},"name":"建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/彰化銀行":{"tags":{"name":"彰化銀行","amenity":"bank"},"name":"彰化銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/招商银行":{"tags":{"name":"招商银行","amenity":"bank"},"name":"招商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/横浜銀行":{"tags":{"name":"横浜銀行","amenity":"bank"},"name":"横浜銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/第一銀行":{"tags":{"name":"第一銀行","amenity":"bank"},"name":"第一銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/華南銀行":{"tags":{"name":"華南銀行","amenity":"bank"},"name":"華南銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/국민은행":{"tags":{"name":"국민은행","name:en":"Gungmin Bank","amenity":"bank"},"name":"국민은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/기업은행":{"tags":{"name":"기업은행","amenity":"bank"},"name":"기업은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/농협":{"tags":{"name":"농협","amenity":"bank"},"name":"농협","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/새마을금고":{"tags":{"name":"새마을금고","amenity":"bank"},"name":"새마을금고","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/신한은행":{"tags":{"name":"신한은행","name:en":"Sinhan Bank","amenity":"bank"},"name":"신한은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/우리은행":{"tags":{"name":"우리은행","name:en":"Uri Bank","amenity":"bank"},"name":"우리은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/하나은행":{"tags":{"name":"하나은행","amenity":"bank"},"name":"하나은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bar/Bar Centrale":{"tags":{"name":"Bar Centrale","amenity":"bar"},"name":"Bar Centrale","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Bar Sport":{"tags":{"name":"Bar Sport","amenity":"bar"},"name":"Bar Sport","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Beach Bar":{"tags":{"name":"Beach Bar","amenity":"bar"},"name":"Beach Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Pool Bar":{"tags":{"name":"Pool Bar","amenity":"bar"},"name":"Pool Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bicycle_rental/Bicing":{"tags":{"name":"Bicing","amenity":"bicycle_rental"},"name":"Bicing","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Call a Bike":{"tags":{"name":"Call a Bike","amenity":"bicycle_rental"},"name":"Call a Bike","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Grid":{"tags":{"name":"Grid","amenity":"bicycle_rental"},"name":"Grid","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Mibici":{"tags":{"name":"Mibici","amenity":"bicycle_rental"},"name":"Mibici","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/metropolradruhr":{"tags":{"name":"metropolradruhr","amenity":"bicycle_rental"},"name":"metropolradruhr","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bureau_de_change/Abitab":{"tags":{"name":"Abitab","amenity":"bureau_de_change"},"name":"Abitab","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Change":{"tags":{"name":"Change","amenity":"bureau_de_change"},"name":"Change","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Travelex":{"tags":{"name":"Travelex","amenity":"bureau_de_change"},"name":"Travelex","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/cafe/85度C":{"tags":{"name":"85度C","amenity":"cafe"},"name":"85度C","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bar Kafe":{"tags":{"name":"Bar Kafe","amenity":"cafe"},"name":"Bar Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Barista":{"tags":{"name":"Barista","amenity":"cafe"},"name":"Barista","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bonafide":{"tags":{"name":"Bonafide","amenity":"cafe"},"name":"Bonafide","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Coffee Day":{"tags":{"name":"Cafe Coffee Day","amenity":"cafe"},"name":"Cafe Coffee Day","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Nero":{"tags":{"name":"Cafe Nero","amenity":"cafe"},"name":"Cafe Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafeteria":{"tags":{"name":"Cafeteria","amenity":"cafe"},"name":"Cafeteria","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafetería":{"tags":{"name":"Cafetería","amenity":"cafe"},"name":"Cafetería","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caffè Nero":{"tags":{"name":"Caffè Nero","amenity":"cafe"},"name":"Caffè Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Amazon":{"tags":{"name":"Café Amazon","amenity":"cafe"},"name":"Café Amazon","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Central":{"tags":{"name":"Café Central","amenity":"cafe"},"name":"Café Central","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café de la Place":{"tags":{"name":"Café de la Place","amenity":"cafe"},"name":"Café de la Place","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café des Sports":{"tags":{"name":"Café des Sports","amenity":"cafe"},"name":"Café des Sports","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caribou Coffee":{"tags":{"name":"Caribou Coffee","amenity":"cafe"},"name":"Caribou Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Fellows":{"tags":{"name":"Coffee Fellows","amenity":"cafe"},"name":"Coffee Fellows","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee House":{"tags":{"name":"Coffee House","amenity":"cafe"},"name":"Coffee House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Island":{"tags":{"name":"Coffee Island","amenity":"cafe"},"name":"Coffee Island","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Time":{"tags":{"name":"Coffee Time","amenity":"cafe"},"name":"Coffee Time","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Costa":{"tags":{"name":"Costa","amenity":"cafe"},"name":"Costa","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Country Style":{"tags":{"name":"Country Style","amenity":"cafe"},"name":"Country Style","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Dunkin' Donuts":{"tags":{"name":"Dunkin' Donuts","cuisine":"donut","amenity":"cafe"},"name":"Dunkin' Donuts","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Dolomiti":{"tags":{"name":"Eiscafe Dolomiti","amenity":"cafe"},"name":"Eiscafe Dolomiti","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Venezia":{"tags":{"name":"Eiscafe Venezia","amenity":"cafe"},"name":"Eiscafe Venezia","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Espresso House":{"tags":{"name":"Espresso House","amenity":"cafe"},"name":"Espresso House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Havanna":{"tags":{"name":"Havanna","amenity":"cafe"},"name":"Havanna","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Internet Cafe":{"tags":{"name":"Internet Cafe","amenity":"cafe"},"name":"Internet Cafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Kafe":{"tags":{"name":"Kafe","amenity":"cafe"},"name":"Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Krispy Kreme":{"tags":{"name":"Krispy Kreme","amenity":"cafe"},"name":"Krispy Kreme","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Le Pain Quotidien":{"tags":{"name":"Le Pain Quotidien","amenity":"cafe"},"name":"Le Pain Quotidien","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/McCafé":{"tags":{"name":"McCafé","amenity":"cafe","cuisine":"coffee_shop"},"name":"McCafé","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Peet's Coffee & Tea":{"tags":{"name":"Peet's Coffee & Tea","amenity":"cafe"},"name":"Peet's Coffee & Tea","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Pret A Manger":{"tags":{"name":"Pret A Manger","amenity":"cafe"},"name":"Pret A Manger","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Prime":{"tags":{"name":"Prime","amenity":"cafe"},"name":"Prime","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Second Cup":{"tags":{"name":"Second Cup","amenity":"cafe"},"name":"Second Cup","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Segafredo":{"tags":{"name":"Segafredo","amenity":"cafe"},"name":"Segafredo","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Starbucks":{"tags":{"name":"Starbucks","cuisine":"coffee_shop","amenity":"cafe"},"name":"Starbucks","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Bean & Tea Leaf":{"tags":{"name":"The Coffee Bean & Tea Leaf","amenity":"cafe"},"name":"The Coffee Bean & Tea Leaf","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Club":{"tags":{"name":"The Coffee Club","amenity":"cafe"},"name":"The Coffee Club","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Tim Hortons":{"tags":{"name":"Tim Hortons","amenity":"cafe"},"name":"Tim Hortons","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Traveler's Coffee":{"tags":{"name":"Traveler's Coffee","amenity":"cafe"},"name":"Traveler's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Wayne's Coffee":{"tags":{"name":"Wayne's Coffee","amenity":"cafe"},"name":"Wayne's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Бистро":{"tags":{"name":"Бистро","amenity":"cafe"},"name":"Бистро","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Буфет":{"tags":{"name":"Буфет","amenity":"cafe"},"name":"Буфет","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Встреча":{"tags":{"name":"Встреча","amenity":"cafe"},"name":"Встреча","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Даблби":{"tags":{"name":"Даблби","amenity":"cafe"},"name":"Даблби","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Закусочная":{"tags":{"name":"Закусочная","amenity":"cafe"},"name":"Закусочная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофе Хауз":{"tags":{"name":"Кофе Хауз","amenity":"cafe"},"name":"Кофе Хауз","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофейня":{"tags":{"name":"Кофейня","amenity":"cafe"},"name":"Кофейня","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Лакомка":{"tags":{"name":"Лакомка","amenity":"cafe"},"name":"Лакомка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Летнее кафе":{"tags":{"name":"Летнее кафе","amenity":"cafe"},"name":"Летнее кафе","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пельменная":{"tags":{"name":"Пельменная","amenity":"cafe"},"name":"Пельменная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пиццерия":{"tags":{"name":"Пиццерия","amenity":"cafe"},"name":"Пиццерия","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Рандеву":{"tags":{"name":"Рандеву","amenity":"cafe"},"name":"Рандеву","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Сказка":{"tags":{"name":"Сказка","amenity":"cafe"},"name":"Сказка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Старбакс":{"tags":{"name":"Старбакс","amenity":"cafe"},"name":"Старбакс","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Столовая":{"tags":{"name":"Столовая","amenity":"cafe"},"name":"Столовая","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Уют":{"tags":{"name":"Уют","amenity":"cafe"},"name":"Уют","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Хуторок":{"tags":{"name":"Хуторок","amenity":"cafe"},"name":"Хуторок","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шашлычная":{"tags":{"name":"Шашлычная","amenity":"cafe"},"name":"Шашлычная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколад":{"tags":{"name":"Шоколад","amenity":"cafe"},"name":"Шоколад","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколадница":{"tags":{"name":"Шоколадница","amenity":"cafe"},"name":"Шоколадница","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ארומה":{"tags":{"name":"ארומה","amenity":"cafe"},"name":"ארומה","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/مقهى":{"tags":{"name":"مقهى","amenity":"cafe"},"name":"مقهى","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/คาเฟ่ อเมซอน":{"tags":{"name":"คาเฟ่ อเมซอน","amenity":"cafe"},"name":"คาเฟ่ อเมซอน","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/エクセルシオール カフェ":{"tags":{"name":"エクセルシオール カフェ","amenity":"cafe"},"name":"エクセルシオール カフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ド・クリエ":{"tags":{"name":"カフェ・ド・クリエ","name:en":"Cafe de CRIE","amenity":"cafe"},"name":"カフェ・ド・クリエ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ベローチェ":{"tags":{"name":"カフェ・ベローチェ","amenity":"cafe"},"name":"カフェ・ベローチェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/コメダ珈琲店":{"tags":{"name":"コメダ珈琲店","amenity":"cafe"},"name":"コメダ珈琲店","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/サンマルクカフェ":{"tags":{"name":"サンマルクカフェ","amenity":"cafe"},"name":"サンマルクカフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/スターバックス":{"tags":{"name":"スターバックス","name:en":"Starbucks","amenity":"cafe"},"name":"スターバックス","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/タリーズコーヒー":{"tags":{"name":"タリーズコーヒー","amenity":"cafe"},"name":"タリーズコーヒー","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ドトールコーヒーショップ":{"tags":{"name":"ドトールコーヒーショップ","amenity":"cafe"},"name":"ドトールコーヒーショップ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/星巴克":{"tags":{"name":"星巴克","amenity":"cafe"},"name":"星巴克","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/스타벅스":{"tags":{"name":"스타벅스","amenity":"cafe"},"name":"스타벅스","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/car_rental/Alamo":{"tags":{"name":"Alamo","amenity":"car_rental"},"name":"Alamo","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Avis":{"tags":{"name":"Avis","amenity":"car_rental"},"name":"Avis","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Budget":{"tags":{"name":"Budget","amenity":"car_rental"},"name":"Budget","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Enterprise":{"tags":{"name":"Enterprise","amenity":"car_rental"},"name":"Enterprise","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Enterprise Rent-a-Car":{"tags":{"name":"Enterprise Rent-a-Car","amenity":"car_rental"},"name":"Enterprise Rent-a-Car","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Europcar":{"tags":{"name":"Europcar","amenity":"car_rental"},"name":"Europcar","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Hertz":{"tags":{"name":"Hertz","amenity":"car_rental"},"name":"Hertz","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Localiza":{"tags":{"name":"Localiza","amenity":"car_rental"},"name":"Localiza","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Sixt":{"tags":{"name":"Sixt","amenity":"car_rental"},"name":"Sixt","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Thrifty":{"tags":{"name":"Thrifty","amenity":"car_rental"},"name":"Thrifty","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/U-Haul":{"tags":{"name":"U-Haul","amenity":"car_rental"},"name":"U-Haul","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/オリックスレンタカー":{"tags":{"name":"オリックスレンタカー","amenity":"car_rental"},"name":"オリックスレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/トヨタレンタカー":{"tags":{"name":"トヨタレンタカー","amenity":"car_rental"},"name":"トヨタレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/トヨタレンタリース":{"tags":{"name":"トヨタレンタリース","amenity":"car_rental"},"name":"トヨタレンタリース","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/ニッポンレンタカー":{"tags":{"name":"ニッポンレンタカー","amenity":"car_rental"},"name":"ニッポンレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_wash/Autolavaggio":{"tags":{"name":"Autolavaggio","amenity":"car_wash"},"name":"Autolavaggio","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/H-E-B Car Wash":{"tags":{"name":"H-E-B Car Wash","amenity":"car_wash"},"name":"H-E-B Car Wash","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Lavage Auto":{"tags":{"name":"Lavage Auto","amenity":"car_wash"},"name":"Lavage Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Lavazh":{"tags":{"name":"Lavazh","amenity":"car_wash"},"name":"Lavazh","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia":{"tags":{"name":"Myjnia","amenity":"car_wash"},"name":"Myjnia","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia bezdotykowa":{"tags":{"name":"Myjnia bezdotykowa","amenity":"car_wash"},"name":"Myjnia bezdotykowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia samochodowa":{"tags":{"name":"Myjnia samochodowa","amenity":"car_wash"},"name":"Myjnia samochodowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Spălătorie Auto":{"tags":{"name":"Spălătorie Auto","amenity":"car_wash"},"name":"Spălătorie Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Spălătorie auto":{"tags":{"name":"Spălătorie auto","amenity":"car_wash"},"name":"Spălătorie auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Автомийка":{"tags":{"name":"Автомийка","amenity":"car_wash"},"name":"Автомийка","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinema City":{"tags":{"name":"Cinema City","amenity":"cinema"},"name":"Cinema City","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinemark":{"tags":{"name":"Cinemark","amenity":"cinema"},"name":"Cinemark","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinemex":{"tags":{"name":"Cinemex","amenity":"cinema"},"name":"Cinemex","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinepolis":{"tags":{"name":"Cinepolis","amenity":"cinema"},"name":"Cinepolis","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cineworld":{"tags":{"name":"Cineworld","amenity":"cinema"},"name":"Cineworld","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Odeon":{"tags":{"name":"Odeon","amenity":"cinema"},"name":"Odeon","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/clinic/ФАП":{"tags":{"name":"ФАП","healthcare":"clinic","amenity":"clinic"},"name":"ФАП","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Aspen Dental":{"tags":{"name":"Aspen Dental","healthcare":"dentist","amenity":"dentist"},"name":"Aspen Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Family Dentistry":{"tags":{"name":"Family Dentistry","healthcare":"dentist","amenity":"dentist"},"name":"Family Dentistry","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Vitaldent":{"tags":{"name":"Vitaldent","healthcare":"dentist","amenity":"dentist"},"name":"Vitaldent","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматолог":{"tags":{"name":"Стоматолог","healthcare":"dentist","amenity":"dentist"},"name":"Стоматолог","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматологія":{"tags":{"name":"Стоматологія","healthcare":"dentist","amenity":"dentist"},"name":"Стоматологія","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Háziorvosi rendelő":{"tags":{"name":"Háziorvosi rendelő","healthcare":"doctor","amenity":"doctors"},"name":"Háziorvosi rendelő","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Инвитро":{"tags":{"name":"Инвитро","healthcare":"doctor","amenity":"doctors"},"name":"Инвитро","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/driving_school/Автодром":{"tags":{"name":"Автодром","amenity":"driving_school"},"name":"Автодром","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/fast_food/A&W":{"tags":{"name":"A&W","amenity":"fast_food"},"name":"A&W","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Ali Baba":{"tags":{"name":"Ali Baba","amenity":"fast_food"},"name":"Ali Baba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Angel's Burger":{"tags":{"name":"Angel's Burger","amenity":"fast_food"},"name":"Angel's Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Antalya":{"tags":{"name":"Antalya","amenity":"fast_food"},"name":"Antalya","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Arby's":{"tags":{"name":"Arby's","amenity":"fast_food"},"name":"Arby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Bistro":{"tags":{"name":"Asia Bistro","amenity":"fast_food"},"name":"Asia Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Wok":{"tags":{"name":"Asia Wok","amenity":"fast_food"},"name":"Asia Wok","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Baskin-Robbins":{"tags":{"name":"Baskin-Robbins","amenity":"fast_food"},"name":"Baskin-Robbins","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bistro":{"tags":{"name":"Bistro","amenity":"fast_food"},"name":"Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bob's":{"tags":{"name":"Bob's","amenity":"fast_food"},"name":"Bob's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bojangles":{"tags":{"name":"Bojangles","amenity":"fast_food"},"name":"Bojangles","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Booster Juice":{"tags":{"name":"Booster Juice","amenity":"fast_food"},"name":"Booster Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Boston Market":{"tags":{"name":"Boston Market","amenity":"fast_food"},"name":"Boston Market","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Braum's":{"tags":{"name":"Braum's","amenity":"fast_food"},"name":"Braum's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger King":{"tags":{"name":"Burger King","cuisine":"burger","amenity":"fast_food"},"name":"Burger King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger Machine":{"tags":{"name":"Burger Machine","amenity":"fast_food"},"name":"Burger Machine","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Büfé":{"tags":{"name":"Büfé","amenity":"fast_food"},"name":"Büfé","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Captain D's":{"tags":{"name":"Captain D's","amenity":"fast_food"},"name":"Captain D's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Carl's Jr.":{"tags":{"name":"Carl's Jr.","cuisine":"burger","amenity":"fast_food"},"name":"Carl's Jr.","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chick-fil-A":{"tags":{"name":"Chick-fil-A","cuisine":"chicken","amenity":"fast_food"},"name":"Chick-fil-A","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chicken Express":{"tags":{"name":"Chicken Express","amenity":"fast_food"},"name":"Chicken Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chipotle":{"tags":{"name":"Chipotle","cuisine":"mexican","amenity":"fast_food"},"name":"Chipotle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chowking":{"tags":{"name":"Chowking","amenity":"fast_food"},"name":"Chowking","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Church's Chicken":{"tags":{"name":"Church's Chicken","amenity":"fast_food"},"name":"Church's Chicken","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/CoCo壱番屋":{"tags":{"name":"CoCo壱番屋","amenity":"fast_food"},"name":"CoCo壱番屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cold Stone Creamery":{"tags":{"name":"Cold Stone Creamery","amenity":"fast_food"},"name":"Cold Stone Creamery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cook Out":{"tags":{"name":"Cook Out","amenity":"fast_food"},"name":"Cook Out","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Culver's":{"tags":{"name":"Culver's","amenity":"fast_food"},"name":"Culver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/DQ":{"tags":{"name":"DQ","amenity":"fast_food"},"name":"DQ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Dairy Queen":{"tags":{"name":"Dairy Queen","amenity":"fast_food"},"name":"Dairy Queen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Del Taco":{"tags":{"name":"Del Taco","amenity":"fast_food"},"name":"Del Taco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Domino's Pizza":{"tags":{"name":"Domino's Pizza","cuisine":"pizza","amenity":"fast_food"},"name":"Domino's Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/El Pollo Loco":{"tags":{"name":"El Pollo Loco","amenity":"fast_food"},"name":"El Pollo Loco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Everest":{"tags":{"name":"Everest","amenity":"fast_food"},"name":"Everest","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Extreme Pita":{"tags":{"name":"Extreme Pita","amenity":"fast_food"},"name":"Extreme Pita","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fazoli's":{"tags":{"name":"Fazoli's","amenity":"fast_food"},"name":"Fazoli's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Firehouse Subs":{"tags":{"name":"Firehouse Subs","amenity":"fast_food"},"name":"Firehouse Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish & Chips":{"tags":{"name":"Fish & Chips","amenity":"fast_food"},"name":"Fish & Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish and Chips":{"tags":{"name":"Fish and Chips","amenity":"fast_food"},"name":"Fish and Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Five Guys":{"tags":{"name":"Five Guys","amenity":"fast_food"},"name":"Five Guys","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Greenwich":{"tags":{"name":"Greenwich","amenity":"fast_food"},"name":"Greenwich","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Habib's":{"tags":{"name":"Habib's","amenity":"fast_food"},"name":"Habib's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hallo Pizza":{"tags":{"name":"Hallo Pizza","amenity":"fast_food"},"name":"Hallo Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hardee's":{"tags":{"name":"Hardee's","cuisine":"burger","amenity":"fast_food"},"name":"Hardee's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Harvey's":{"tags":{"name":"Harvey's","amenity":"fast_food"},"name":"Harvey's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hesburger":{"tags":{"name":"Hesburger","amenity":"fast_food"},"name":"Hesburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hungry Jacks":{"tags":{"name":"Hungry Jacks","cuisine":"burger","amenity":"fast_food"},"name":"Hungry Jacks","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/In-N-Out Burger":{"tags":{"name":"In-N-Out Burger","amenity":"fast_food"},"name":"In-N-Out Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul":{"tags":{"name":"Istanbul","amenity":"fast_food"},"name":"Istanbul","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul Kebab":{"tags":{"name":"Istanbul Kebab","amenity":"fast_food"},"name":"Istanbul Kebab","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jack in the Box":{"tags":{"name":"Jack in the Box","cuisine":"burger","amenity":"fast_food"},"name":"Jack in the Box","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jamba Juice":{"tags":{"name":"Jamba Juice","amenity":"fast_food"},"name":"Jamba Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jersey Mike's Subs":{"tags":{"name":"Jersey Mike's Subs","amenity":"fast_food"},"name":"Jersey Mike's Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jimmy John's":{"tags":{"name":"Jimmy John's","cuisine":"sandwich","amenity":"fast_food"},"name":"Jimmy John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jollibee":{"tags":{"name":"Jollibee","amenity":"fast_food"},"name":"Jollibee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC":{"tags":{"name":"KFC","cuisine":"chicken","amenity":"fast_food"},"name":"KFC","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC/Taco Bell":{"tags":{"name":"KFC/Taco Bell","amenity":"fast_food"},"name":"KFC/Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebab House":{"tags":{"name":"Kebab House","amenity":"fast_food"},"name":"Kebab House","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebabai":{"tags":{"name":"Kebabai","amenity":"fast_food"},"name":"Kebabai","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kochlöffel":{"tags":{"name":"Kochlöffel","amenity":"fast_food"},"name":"Kochlöffel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kotipizza":{"tags":{"name":"Kotipizza","amenity":"fast_food"},"name":"Kotipizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Krystal":{"tags":{"name":"Krystal","amenity":"fast_food"},"name":"Krystal","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars":{"tags":{"name":"Little Caesars","amenity":"fast_food"},"name":"Little Caesars","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars Pizza":{"tags":{"name":"Little Caesars Pizza","amenity":"fast_food"},"name":"Little Caesars Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Long John Silver's":{"tags":{"name":"Long John Silver's","amenity":"fast_food"},"name":"Long John Silver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Lotteria":{"tags":{"name":"Lotteria","amenity":"fast_food"},"name":"Lotteria","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Max":{"tags":{"name":"Max","amenity":"fast_food"},"name":"Max","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/McDonald's":{"tags":{"name":"McDonald's","cuisine":"burger","amenity":"fast_food"},"name":"McDonald's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Minute Burger":{"tags":{"name":"Minute Burger","amenity":"fast_food"},"name":"Minute Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Mr. Sub":{"tags":{"name":"Mr. Sub","amenity":"fast_food"},"name":"Mr. Sub","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/New York Pizza":{"tags":{"name":"New York Pizza","amenity":"fast_food"},"name":"New York Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Nordsee":{"tags":{"name":"Nordsee","amenity":"fast_food"},"name":"Nordsee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Panda Express":{"tags":{"name":"Panda Express","cuisine":"chinese","amenity":"fast_food"},"name":"Panda Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa John's":{"tags":{"name":"Papa John's","cuisine":"pizza","amenity":"fast_food"},"name":"Papa John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa Murphy's":{"tags":{"name":"Papa Murphy's","amenity":"fast_food"},"name":"Papa Murphy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pinulito":{"tags":{"name":"Pinulito","amenity":"fast_food"},"name":"Pinulito","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pita Pit":{"tags":{"name":"Pita Pit","amenity":"fast_food"},"name":"Pita Pit","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Hut Delivery":{"tags":{"name":"Pizza Hut Delivery","amenity":"fast_food"},"name":"Pizza Hut Delivery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza King":{"tags":{"name":"Pizza King","amenity":"fast_food"},"name":"Pizza King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Nova":{"tags":{"name":"Pizza Nova","amenity":"fast_food"},"name":"Pizza Nova","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Pizza":{"tags":{"name":"Pizza Pizza","amenity":"fast_food"},"name":"Pizza Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Campero":{"tags":{"name":"Pollo Campero","amenity":"fast_food"},"name":"Pollo Campero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Granjero":{"tags":{"name":"Pollo Granjero","amenity":"fast_food"},"name":"Pollo Granjero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeye's":{"tags":{"name":"Popeye's","cuisine":"chicken","amenity":"fast_food"},"name":"Popeye's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeyes Louisiana Kitchen":{"tags":{"name":"Popeyes Louisiana Kitchen","amenity":"fast_food"},"name":"Popeyes Louisiana Kitchen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Qdoba":{"tags":{"name":"Qdoba","amenity":"fast_food"},"name":"Qdoba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quick":{"tags":{"name":"Quick","amenity":"fast_food"},"name":"Quick","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quiznos":{"tags":{"name":"Quiznos","amenity":"fast_food"},"name":"Quiznos","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Rally's":{"tags":{"name":"Rally's","amenity":"fast_food"},"name":"Rally's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Red Rooster":{"tags":{"name":"Red Rooster","amenity":"fast_food"},"name":"Red Rooster","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sbarro":{"tags":{"name":"Sbarro","amenity":"fast_food"},"name":"Sbarro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Schlotzsky's Deli":{"tags":{"name":"Schlotzsky's Deli","amenity":"fast_food"},"name":"Schlotzsky's Deli","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sibylla":{"tags":{"name":"Sibylla","amenity":"fast_food"},"name":"Sibylla","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sonic":{"tags":{"name":"Sonic","cuisine":"burger","amenity":"fast_food"},"name":"Sonic","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Steers":{"tags":{"name":"Steers","amenity":"fast_food"},"name":"Steers","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Subway":{"tags":{"name":"Subway","amenity":"fast_food"},"name":"Subway","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bell":{"tags":{"name":"Taco Bell","cuisine":"mexican","amenity":"fast_food"},"name":"Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bueno":{"tags":{"name":"Taco Bueno","amenity":"fast_food"},"name":"Taco Bueno","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Cabana":{"tags":{"name":"Taco Cabana","amenity":"fast_food"},"name":"Taco Cabana","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Del Mar":{"tags":{"name":"Taco Del Mar","amenity":"fast_food"},"name":"Taco Del Mar","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco John's":{"tags":{"name":"Taco John's","amenity":"fast_food"},"name":"Taco John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Time":{"tags":{"name":"Taco Time","amenity":"fast_food"},"name":"Taco Time","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Telepizza":{"tags":{"name":"Telepizza","amenity":"fast_food"},"name":"Telepizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Thai Express":{"tags":{"name":"Thai Express","amenity":"fast_food"},"name":"Thai Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/The Pizza Company":{"tags":{"name":"The Pizza Company","amenity":"fast_food"},"name":"The Pizza Company","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wendy's":{"tags":{"name":"Wendy's","cuisine":"burger","amenity":"fast_food"},"name":"Wendy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Whataburger":{"tags":{"name":"Whataburger","amenity":"fast_food"},"name":"Whataburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/White Castle":{"tags":{"name":"White Castle","amenity":"fast_food"},"name":"White Castle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wienerschnitzel":{"tags":{"name":"Wienerschnitzel","amenity":"fast_food"},"name":"Wienerschnitzel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wimpy":{"tags":{"name":"Wimpy","amenity":"fast_food"},"name":"Wimpy","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Zaxby's":{"tags":{"name":"Zaxby's","amenity":"fast_food"},"name":"Zaxby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Γρηγόρης":{"tags":{"name":"Γρηγόρης","amenity":"fast_food"},"name":"Γρηγόρης","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Бургер Кинг":{"tags":{"name":"Бургер Кинг","amenity":"fast_food"},"name":"Бургер Кинг","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Крошка Картошка":{"tags":{"name":"Крошка Картошка","amenity":"fast_food"},"name":"Крошка Картошка","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Макдоналдс":{"tags":{"name":"Макдоналдс","name:en":"McDonald's","amenity":"fast_food"},"name":"Макдоналдс","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Робин Сдобин":{"tags":{"name":"Робин Сдобин","amenity":"fast_food"},"name":"Робин Сдобин","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Русский Аппетит":{"tags":{"name":"Русский Аппетит","amenity":"fast_food"},"name":"Русский Аппетит","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Сабвэй":{"tags":{"name":"Сабвэй","amenity":"fast_food"},"name":"Сабвэй","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Стардог!s":{"tags":{"name":"Стардог!s","amenity":"fast_food"},"name":"Стардог!s","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Теремок":{"tags":{"name":"Теремок","amenity":"fast_food"},"name":"Теремок","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаверма":{"tags":{"name":"Шаверма","amenity":"fast_food"},"name":"Шаверма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаурма":{"tags":{"name":"Шаурма","amenity":"fast_food"},"name":"Шаурма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かっぱ寿司":{"tags":{"name":"かっぱ寿司","amenity":"fast_food"},"name":"かっぱ寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かつや":{"tags":{"name":"かつや","amenity":"fast_food"},"name":"かつや","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/くら寿司":{"tags":{"name":"くら寿司","amenity":"fast_food"},"name":"くら寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/すき家":{"tags":{"name":"すき家","name:en":"SUKIYA","amenity":"fast_food"},"name":"すき家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/なか卯":{"tags":{"name":"なか卯","amenity":"fast_food"},"name":"なか卯","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっかほっか亭":{"tags":{"name":"ほっかほっか亭","amenity":"fast_food"},"name":"ほっかほっか亭","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっともっと":{"tags":{"name":"ほっともっと","amenity":"fast_food"},"name":"ほっともっと","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/オリジン弁当":{"tags":{"name":"オリジン弁当","amenity":"fast_food"},"name":"オリジン弁当","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ケンタッキーフライドチキン":{"tags":{"name":"ケンタッキーフライドチキン","cuisine":"chicken","name:en":"KFC","amenity":"fast_food"},"name":"ケンタッキーフライドチキン","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/サブウェイ":{"tags":{"name":"サブウェイ","amenity":"fast_food"},"name":"サブウェイ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/スシロー":{"tags":{"name":"スシロー","amenity":"fast_food"},"name":"スシロー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/マクドナルド":{"tags":{"name":"マクドナルド","cuisine":"burger","name:en":"McDonald's","amenity":"fast_food"},"name":"マクドナルド","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ミスタードーナツ":{"tags":{"name":"ミスタードーナツ","amenity":"fast_food"},"name":"ミスタードーナツ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/モスバーガー":{"tags":{"name":"モスバーガー","name:en":"MOS BURGER","amenity":"fast_food"},"name":"モスバーガー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ロッテリア":{"tags":{"name":"ロッテリア","amenity":"fast_food"},"name":"ロッテリア","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/吉野家":{"tags":{"name":"吉野家","amenity":"fast_food"},"name":"吉野家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/幸楽苑":{"tags":{"name":"幸楽苑","amenity":"fast_food"},"name":"幸楽苑","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/摩斯漢堡":{"tags":{"name":"摩斯漢堡","amenity":"fast_food"},"name":"摩斯漢堡","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/松屋":{"tags":{"name":"松屋","name:en":"Matsuya","amenity":"fast_food"},"name":"松屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/肯德基":{"tags":{"name":"肯德基","amenity":"fast_food"},"name":"肯德基","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麥當勞":{"tags":{"name":"麥當勞","amenity":"fast_food"},"name":"麥當勞","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麦当劳":{"tags":{"name":"麦当劳","amenity":"fast_food"},"name":"麦当劳","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/롯데리아":{"tags":{"name":"롯데리아","amenity":"fast_food"},"name":"롯데리아","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fuel/76":{"tags":{"name":"76","amenity":"fuel"},"name":"76","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/1-2-3":{"tags":{"name":"1-2-3","amenity":"fuel"},"name":"1-2-3","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ADNOC":{"tags":{"name":"ADNOC","amenity":"fuel"},"name":"ADNOC","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ANP":{"tags":{"name":"ANP","amenity":"fuel"},"name":"ANP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ARAL":{"tags":{"name":"ARAL","amenity":"fuel"},"name":"ARAL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Aegean":{"tags":{"name":"Aegean","amenity":"fuel"},"name":"Aegean","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Afriquia":{"tags":{"name":"Afriquia","amenity":"fuel"},"name":"Afriquia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Agip":{"tags":{"name":"Agip","amenity":"fuel"},"name":"Agip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Agrola":{"tags":{"name":"Agrola","amenity":"fuel"},"name":"Agrola","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Alon":{"tags":{"name":"Alon","amenity":"fuel"},"name":"Alon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Alpet":{"tags":{"name":"Alpet","amenity":"fuel"},"name":"Alpet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Api":{"tags":{"name":"Api","amenity":"fuel"},"name":"Api","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Aral":{"tags":{"name":"Aral","amenity":"fuel"},"name":"Aral","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Arco":{"tags":{"name":"Arco","amenity":"fuel"},"name":"Arco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Avanti":{"tags":{"name":"Avanti","amenity":"fuel"},"name":"Avanti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Avia":{"tags":{"name":"Avia","amenity":"fuel"},"name":"Avia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BEBECO":{"tags":{"name":"BEBECO","amenity":"fuel"},"name":"BEBECO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BFT":{"tags":{"name":"BFT","amenity":"fuel"},"name":"BFT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BHPetrol":{"tags":{"name":"BHPetrol","amenity":"fuel"},"name":"BHPetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BP":{"tags":{"name":"BP","amenity":"fuel"},"name":"BP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BR":{"tags":{"name":"BR","amenity":"fuel"},"name":"BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bangchak":{"tags":{"name":"Bangchak","amenity":"fuel"},"name":"Bangchak","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Benzina":{"tags":{"name":"Benzina","amenity":"fuel"},"name":"Benzina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bharat Petroleum":{"tags":{"name":"Bharat Petroleum","amenity":"fuel"},"name":"Bharat Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bliska":{"tags":{"name":"Bliska","amenity":"fuel"},"name":"Bliska","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CAMPSA":{"tags":{"name":"CAMPSA","amenity":"fuel"},"name":"CAMPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CARREFOUR":{"tags":{"name":"CARREFOUR","amenity":"fuel"},"name":"CARREFOUR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CEPSA":{"tags":{"name":"CEPSA","amenity":"fuel"},"name":"CEPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CNG":{"tags":{"name":"CNG","amenity":"fuel"},"name":"CNG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Caltex":{"tags":{"name":"Caltex","amenity":"fuel"},"name":"Caltex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Campsa":{"tags":{"name":"Campsa","amenity":"fuel"},"name":"Campsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Casey's General Store":{"tags":{"name":"Casey's General Store","amenity":"fuel"},"name":"Casey's General Store","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cenex":{"tags":{"name":"Cenex","amenity":"fuel"},"name":"Cenex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cepsa":{"tags":{"name":"Cepsa","amenity":"fuel"},"name":"Cepsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ceypetco":{"tags":{"name":"Ceypetco","amenity":"fuel"},"name":"Ceypetco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Chevron":{"tags":{"name":"Chevron","amenity":"fuel"},"name":"Chevron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Citgo":{"tags":{"name":"Citgo","amenity":"fuel"},"name":"Citgo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Clark":{"tags":{"name":"Clark","amenity":"fuel"},"name":"Clark","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Coles Express":{"tags":{"name":"Coles Express","amenity":"fuel"},"name":"Coles Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Conoco":{"tags":{"name":"Conoco","amenity":"fuel"},"name":"Conoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Copec":{"tags":{"name":"Copec","amenity":"fuel"},"name":"Copec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Copetrol":{"tags":{"name":"Copetrol","amenity":"fuel"},"name":"Copetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cosmo":{"tags":{"name":"Cosmo","amenity":"fuel"},"name":"Cosmo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Costco Gas":{"tags":{"name":"Costco Gas","amenity":"fuel"},"name":"Costco Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Costco Gasoline":{"tags":{"name":"Costco Gasoline","amenity":"fuel"},"name":"Costco Gasoline","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Crodux":{"tags":{"name":"Crodux","amenity":"fuel"},"name":"Crodux","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Delta":{"tags":{"name":"Delta","amenity":"fuel"},"name":"Delta","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Diamond Shamrock":{"tags":{"name":"Diamond Shamrock","amenity":"fuel"},"name":"Diamond Shamrock","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Drummed Fuel":{"tags":{"name":"Drummed Fuel","amenity":"fuel"},"name":"Drummed Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/EKO":{"tags":{"name":"EKO","amenity":"fuel"},"name":"EKO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ENEOS":{"tags":{"name":"ENEOS","amenity":"fuel"},"name":"ENEOS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ENI":{"tags":{"name":"ENI","amenity":"fuel"},"name":"ENI","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ERG":{"tags":{"name":"ERG","amenity":"fuel"},"name":"ERG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Elan":{"tags":{"name":"Elan","amenity":"fuel"},"name":"Elan","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Eneos":{"tags":{"name":"Eneos","amenity":"fuel"},"name":"Eneos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Engen":{"tags":{"name":"Engen","amenity":"fuel"},"name":"Engen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Eni":{"tags":{"name":"Eni","amenity":"fuel"},"name":"Eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Erg":{"tags":{"name":"Erg","amenity":"fuel"},"name":"Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Esso":{"tags":{"name":"Esso","amenity":"fuel"},"name":"Esso","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Esso Express":{"tags":{"name":"Esso Express","amenity":"fuel"},"name":"Esso Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/EuroOil":{"tags":{"name":"EuroOil","amenity":"fuel"},"name":"EuroOil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Exxon":{"tags":{"name":"Exxon","amenity":"fuel"},"name":"Exxon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/F24":{"tags":{"name":"F24","amenity":"fuel"},"name":"F24","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Firezone":{"tags":{"name":"Firezone","amenity":"fuel"},"name":"Firezone","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Flying V":{"tags":{"name":"Flying V","amenity":"fuel"},"name":"Flying V","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/GALP":{"tags":{"name":"GALP","amenity":"fuel"},"name":"GALP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Gazprom":{"tags":{"name":"Gazprom","amenity":"fuel"},"name":"Gazprom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/GetGo":{"tags":{"name":"GetGo","amenity":"fuel"},"name":"GetGo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Goil":{"tags":{"name":"Goil","amenity":"fuel"},"name":"Goil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Gulf":{"tags":{"name":"Gulf","amenity":"fuel"},"name":"Gulf","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/H-E-B Fuel":{"tags":{"name":"H-E-B Fuel","amenity":"fuel"},"name":"H-E-B Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/H-E-B Gas":{"tags":{"name":"H-E-B Gas","amenity":"fuel"},"name":"H-E-B Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HEM":{"tags":{"name":"HEM","amenity":"fuel"},"name":"HEM","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HP":{"tags":{"name":"HP","amenity":"fuel"},"name":"HP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HP Petrol Pump":{"tags":{"name":"HP Petrol Pump","amenity":"fuel"},"name":"HP Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Helios":{"tags":{"name":"Helios","amenity":"fuel"},"name":"Helios","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Hess":{"tags":{"name":"Hess","amenity":"fuel"},"name":"Hess","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Hindustan Petroleum":{"tags":{"name":"Hindustan Petroleum","amenity":"fuel"},"name":"Hindustan Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Holiday":{"tags":{"name":"Holiday","amenity":"fuel"},"name":"Holiday","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Husky":{"tags":{"name":"Husky","amenity":"fuel"},"name":"Husky","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/IES":{"tags":{"name":"IES","amenity":"fuel"},"name":"IES","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/IP":{"tags":{"name":"IP","amenity":"fuel"},"name":"IP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Independent Fuel Station":{"tags":{"name":"Independent Fuel Station","amenity":"fuel"},"name":"Independent Fuel Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Indian Oil":{"tags":{"name":"Indian Oil","amenity":"fuel"},"name":"Indian Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Indipend.":{"tags":{"name":"Indipend.","amenity":"fuel"},"name":"Indipend.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ingo":{"tags":{"name":"Ingo","amenity":"fuel"},"name":"Ingo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ipiranga":{"tags":{"name":"Ipiranga","amenity":"fuel"},"name":"Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Irving":{"tags":{"name":"Irving","amenity":"fuel"},"name":"Irving","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/JA-SS":{"tags":{"name":"JA-SS","amenity":"fuel"},"name":"JA-SS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/JOMO":{"tags":{"name":"JOMO","amenity":"fuel"},"name":"JOMO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Jet":{"tags":{"name":"Jet","amenity":"fuel"},"name":"Jet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Jetti":{"tags":{"name":"Jetti","amenity":"fuel"},"name":"Jetti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kangaroo":{"tags":{"name":"Kangaroo","amenity":"fuel"},"name":"Kangaroo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kobil":{"tags":{"name":"Kobil","amenity":"fuel"},"name":"Kobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kroger Fuel":{"tags":{"name":"Kroger Fuel","amenity":"fuel"},"name":"Kroger Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kum & Go":{"tags":{"name":"Kum & Go","amenity":"fuel"},"name":"Kum & Go","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kwik Trip":{"tags":{"name":"Kwik Trip","amenity":"fuel"},"name":"Kwik Trip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LPG":{"tags":{"name":"LPG","amenity":"fuel"},"name":"LPG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LPG Station":{"tags":{"name":"LPG Station","amenity":"fuel"},"name":"LPG Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LUKOIL":{"tags":{"name":"LUKOIL","amenity":"fuel"},"name":"LUKOIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Liberty":{"tags":{"name":"Liberty","amenity":"fuel"},"name":"Liberty","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lotos":{"tags":{"name":"Lotos","amenity":"fuel"},"name":"Lotos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lotos Optima":{"tags":{"name":"Lotos Optima","amenity":"fuel"},"name":"Lotos Optima","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Love's":{"tags":{"name":"Love's","amenity":"fuel"},"name":"Love's","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lukoil":{"tags":{"name":"Lukoil","amenity":"fuel"},"name":"Lukoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MEROIL":{"tags":{"name":"MEROIL","amenity":"fuel"},"name":"MEROIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MOL":{"tags":{"name":"MOL","amenity":"fuel"},"name":"MOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MRS":{"tags":{"name":"MRS","amenity":"fuel"},"name":"MRS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Marathon":{"tags":{"name":"Marathon","amenity":"fuel"},"name":"Marathon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Maverik":{"tags":{"name":"Maverik","amenity":"fuel"},"name":"Maverik","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Maxol":{"tags":{"name":"Maxol","amenity":"fuel"},"name":"Maxol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Metano":{"tags":{"name":"Metano","amenity":"fuel"},"name":"Metano","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Migrol":{"tags":{"name":"Migrol","amenity":"fuel"},"name":"Migrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Minipump":{"tags":{"name":"Minipump","amenity":"fuel"},"name":"Minipump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mobil":{"tags":{"name":"Mobil","amenity":"fuel"},"name":"Mobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mobile":{"tags":{"name":"Mobile","amenity":"fuel"},"name":"Mobile","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mol":{"tags":{"name":"Mol","amenity":"fuel"},"name":"Mol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Moya":{"tags":{"name":"Moya","amenity":"fuel"},"name":"Moya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Murphy USA":{"tags":{"name":"Murphy USA","amenity":"fuel"},"name":"Murphy USA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Neste":{"tags":{"name":"Neste","amenity":"fuel"},"name":"Neste","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OIL!":{"tags":{"name":"OIL!","amenity":"fuel"},"name":"OIL!","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OK":{"tags":{"name":"OK","amenity":"fuel"},"name":"OK","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OKQ8":{"tags":{"name":"OKQ8","amenity":"fuel"},"name":"OKQ8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OMV":{"tags":{"name":"OMV","amenity":"fuel"},"name":"OMV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Oilibya":{"tags":{"name":"Oilibya","amenity":"fuel"},"name":"Oilibya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Opet":{"tags":{"name":"Opet","amenity":"fuel"},"name":"Opet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Orlen":{"tags":{"name":"Orlen","amenity":"fuel"},"name":"Orlen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PETRONOR":{"tags":{"name":"PETRONOR","amenity":"fuel"},"name":"PETRONOR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PSO":{"tags":{"name":"PSO","amenity":"fuel"},"name":"PSO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PSO Petrol Pump":{"tags":{"name":"PSO Petrol Pump","amenity":"fuel"},"name":"PSO Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PT":{"tags":{"name":"PT","amenity":"fuel"},"name":"PT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PTT":{"tags":{"name":"PTT","amenity":"fuel"},"name":"PTT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PV Oil":{"tags":{"name":"PV Oil","amenity":"fuel"},"name":"PV Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pacific Pride":{"tags":{"name":"Pacific Pride","amenity":"fuel"},"name":"Pacific Pride","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pecsa":{"tags":{"name":"Pecsa","amenity":"fuel"},"name":"Pecsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pemex":{"tags":{"name":"Pemex","amenity":"fuel"},"name":"Pemex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pertamina":{"tags":{"name":"Pertamina","amenity":"fuel"},"name":"Pertamina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petro":{"tags":{"name":"Petro","amenity":"fuel"},"name":"Petro","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petro-Canada":{"tags":{"name":"Petro-Canada","amenity":"fuel"},"name":"Petro-Canada","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrobras":{"tags":{"name":"Petrobras","amenity":"fuel"},"name":"Petrobras","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrochina":{"tags":{"name":"Petrochina","amenity":"fuel"},"name":"Petrochina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petroecuador":{"tags":{"name":"Petroecuador","amenity":"fuel"},"name":"Petroecuador","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrol Ofisi":{"tags":{"name":"Petrol Ofisi","amenity":"fuel"},"name":"Petrol Ofisi","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrolimex":{"tags":{"name":"Petrolimex","amenity":"fuel"},"name":"Petrolimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrom":{"tags":{"name":"Petrom","amenity":"fuel"},"name":"Petrom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petron":{"tags":{"name":"Petron","amenity":"fuel"},"name":"Petron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petronas":{"tags":{"name":"Petronas","amenity":"fuel"},"name":"Petronas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petroperu":{"tags":{"name":"Petroperu","amenity":"fuel"},"name":"Petroperu","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Phillips 66":{"tags":{"name":"Phillips 66","amenity":"fuel"},"name":"Phillips 66","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Phoenix":{"tags":{"name":"Phoenix","amenity":"fuel"},"name":"Phoenix","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pilot":{"tags":{"name":"Pilot","amenity":"fuel"},"name":"Pilot","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pioneer":{"tags":{"name":"Pioneer","amenity":"fuel"},"name":"Pioneer","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto":{"tags":{"name":"Posto","amenity":"fuel"},"name":"Posto","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Atem":{"tags":{"name":"Posto Atem","amenity":"fuel"},"name":"Posto Atem","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto BR":{"tags":{"name":"Posto BR","amenity":"fuel"},"name":"Posto BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Ipiranga":{"tags":{"name":"Posto Ipiranga","amenity":"fuel"},"name":"Posto Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Shell":{"tags":{"name":"Posto Shell","amenity":"fuel"},"name":"Posto Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Primax":{"tags":{"name":"Primax","amenity":"fuel"},"name":"Primax","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Prio":{"tags":{"name":"Prio","amenity":"fuel"},"name":"Prio","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Puma":{"tags":{"name":"Puma","amenity":"fuel"},"name":"Puma","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q1":{"tags":{"name":"Q1","amenity":"fuel"},"name":"Q1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q8":{"tags":{"name":"Q8","amenity":"fuel"},"name":"Q8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q8 Easy":{"tags":{"name":"Q8 Easy","amenity":"fuel"},"name":"Q8 Easy","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/QuikTrip":{"tags":{"name":"QuikTrip","amenity":"fuel"},"name":"QuikTrip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/REPSOL":{"tags":{"name":"REPSOL","amenity":"fuel"},"name":"REPSOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/RaceTrac":{"tags":{"name":"RaceTrac","amenity":"fuel"},"name":"RaceTrac","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Repsol":{"tags":{"name":"Repsol","amenity":"fuel"},"name":"Repsol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Rompetrol":{"tags":{"name":"Rompetrol","amenity":"fuel"},"name":"Rompetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Rubis":{"tags":{"name":"Rubis","amenity":"fuel"},"name":"Rubis","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/SB Tank":{"tags":{"name":"SB Tank","amenity":"fuel"},"name":"SB Tank","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/SPBU":{"tags":{"name":"SPBU","amenity":"fuel"},"name":"SPBU","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sasol":{"tags":{"name":"Sasol","amenity":"fuel"},"name":"Sasol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sea Oil":{"tags":{"name":"Sea Oil","amenity":"fuel"},"name":"Sea Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sheetz":{"tags":{"name":"Sheetz","amenity":"fuel"},"name":"Sheetz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Shell":{"tags":{"name":"Shell","amenity":"fuel"},"name":"Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Shell Express":{"tags":{"name":"Shell Express","amenity":"fuel"},"name":"Shell Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinclair":{"tags":{"name":"Sinclair","amenity":"fuel"},"name":"Sinclair","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinopec":{"tags":{"name":"Sinopec","amenity":"fuel"},"name":"Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinopec Fuel":{"tags":{"name":"Sinopec Fuel","amenity":"fuel"},"name":"Sinopec Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Slovnaft":{"tags":{"name":"Slovnaft","amenity":"fuel"},"name":"Slovnaft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Socar":{"tags":{"name":"Socar","amenity":"fuel"},"name":"Socar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sokimex":{"tags":{"name":"Sokimex","amenity":"fuel"},"name":"Sokimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Speedway":{"tags":{"name":"Speedway","amenity":"fuel"},"name":"Speedway","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/St1":{"tags":{"name":"St1","amenity":"fuel"},"name":"St1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Star":{"tags":{"name":"Star","amenity":"fuel"},"name":"Star","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Star Oil":{"tags":{"name":"Star Oil","amenity":"fuel"},"name":"Star Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Station Service E. Leclerc":{"tags":{"name":"Station Service E. Leclerc","amenity":"fuel"},"name":"Station Service E. Leclerc","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Statoil":{"tags":{"name":"Statoil","amenity":"fuel"},"name":"Statoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sunoco":{"tags":{"name":"Sunoco","amenity":"fuel"},"name":"Sunoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tamoil":{"tags":{"name":"Tamoil","amenity":"fuel"},"name":"Tamoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tango":{"tags":{"name":"Tango","amenity":"fuel"},"name":"Tango","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Teboil":{"tags":{"name":"Teboil","amenity":"fuel"},"name":"Teboil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tela":{"tags":{"name":"Tela","amenity":"fuel"},"name":"Tela","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Terpel":{"tags":{"name":"Terpel","amenity":"fuel"},"name":"Terpel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Texaco":{"tags":{"name":"Texaco","amenity":"fuel"},"name":"Texaco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tinq":{"tags":{"name":"Tinq","amenity":"fuel"},"name":"Tinq","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Topaz":{"tags":{"name":"Topaz","amenity":"fuel"},"name":"Topaz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total":{"tags":{"name":"Total","amenity":"fuel"},"name":"Total","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total Access":{"tags":{"name":"Total Access","amenity":"fuel"},"name":"Total Access","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total Erg":{"tags":{"name":"Total Erg","amenity":"fuel"},"name":"Total Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/TotalErg":{"tags":{"name":"TotalErg","amenity":"fuel"},"name":"TotalErg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Turkey Hill":{"tags":{"name":"Turkey Hill","amenity":"fuel"},"name":"Turkey Hill","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Turmöl":{"tags":{"name":"Turmöl","amenity":"fuel"},"name":"Turmöl","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ultramar":{"tags":{"name":"Ultramar","amenity":"fuel"},"name":"Ultramar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/United":{"tags":{"name":"United","amenity":"fuel"},"name":"United","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Uno":{"tags":{"name":"Uno","amenity":"fuel"},"name":"Uno","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Uno-X":{"tags":{"name":"Uno-X","amenity":"fuel"},"name":"Uno-X","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Valero":{"tags":{"name":"Valero","amenity":"fuel"},"name":"Valero","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Vito":{"tags":{"name":"Vito","amenity":"fuel"},"name":"Vito","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/WOG":{"tags":{"name":"WOG","amenity":"fuel"},"name":"WOG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Westfalen":{"tags":{"name":"Westfalen","amenity":"fuel"},"name":"Westfalen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Woolworths Petrol":{"tags":{"name":"Woolworths Petrol","amenity":"fuel"},"name":"Woolworths Petrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Z":{"tags":{"name":"Z","amenity":"fuel"},"name":"Z","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/bft":{"tags":{"name":"bft","amenity":"fuel"},"name":"bft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/eni":{"tags":{"name":"eni","amenity":"fuel"},"name":"eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化 Sinopec":{"tags":{"name":"中国石化 Sinopec","amenity":"fuel"},"name":"中国石化 Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/出光":{"tags":{"name":"出光","name:en":"IDEMITSU","amenity":"fuel"},"name":"出光","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/hospital/Cruz Roja":{"tags":{"name":"Cruz Roja","healthcare":"hospital","amenity":"hospital"},"name":"Cruz Roja","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/IMSS":{"tags":{"name":"IMSS","healthcare":"hospital","amenity":"hospital"},"name":"IMSS","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Инфекционное отделение":{"tags":{"name":"Инфекционное отделение","healthcare":"hospital","amenity":"hospital"},"name":"Инфекционное отделение","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Кожно-венерологический диспансер":{"tags":{"name":"Кожно-венерологический диспансер","healthcare":"hospital","amenity":"hospital"},"name":"Кожно-венерологический диспансер","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Районная больница":{"tags":{"name":"Районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Роддом":{"tags":{"name":"Роддом","healthcare":"hospital","amenity":"hospital"},"name":"Роддом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Родильный дом":{"tags":{"name":"Родильный дом","healthcare":"hospital","amenity":"hospital"},"name":"Родильный дом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Скорая помощь":{"tags":{"name":"Скорая помощь","healthcare":"hospital","amenity":"hospital"},"name":"Скорая помощь","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/ЦРБ":{"tags":{"name":"ЦРБ","healthcare":"hospital","amenity":"hospital"},"name":"ЦРБ","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Центральная районная больница":{"tags":{"name":"Центральная районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Центральная районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{"tags":{"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","healthcare":"hospital","amenity":"hospital"},"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/ice_cream/Grido":{"tags":{"name":"Grido","amenity":"ice_cream"},"name":"Grido","icon":"ice-cream","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"suggestion":true},"amenity/kindergarten/Anganwadi":{"tags":{"name":"Anganwadi","amenity":"kindergarten"},"name":"Anganwadi","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Arche Noah":{"tags":{"name":"Arche Noah","amenity":"kindergarten"},"name":"Arche Noah","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/CONAFE Preescolar":{"tags":{"name":"CONAFE Preescolar","amenity":"kindergarten"},"name":"CONAFE Preescolar","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Educacion Inicial de CONAFE No Escolarizado":{"tags":{"name":"Educacion Inicial de CONAFE No Escolarizado","amenity":"kindergarten"},"name":"Educacion Inicial de CONAFE No Escolarizado","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Estefania Casta�eda":{"tags":{"name":"Estefania Casta�eda","amenity":"kindergarten"},"name":"Estefania Casta�eda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Evangelischer Kindergarten":{"tags":{"name":"Evangelischer Kindergarten","amenity":"kindergarten"},"name":"Evangelischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Federico Froebel":{"tags":{"name":"Federico Froebel","amenity":"kindergarten"},"name":"Federico Froebel","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Gabriela Mistral":{"tags":{"name":"Gabriela Mistral","amenity":"kindergarten"},"name":"Gabriela Mistral","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jean Piaget":{"tags":{"name":"Jean Piaget","amenity":"kindergarten"},"name":"Jean Piaget","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Katholischer Kindergarten":{"tags":{"name":"Katholischer Kindergarten","amenity":"kindergarten"},"name":"Katholischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten Regenbogen":{"tags":{"name":"Kindergarten Regenbogen","amenity":"kindergarten"},"name":"Kindergarten Regenbogen","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Josef":{"tags":{"name":"Kindergarten St. Josef","amenity":"kindergarten"},"name":"Kindergarten St. Josef","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Martin":{"tags":{"name":"Kindergarten St. Martin","amenity":"kindergarten"},"name":"Kindergarten St. Martin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Maria Montessori":{"tags":{"name":"Maria Montessori","amenity":"kindergarten"},"name":"Maria Montessori","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/PAUD":{"tags":{"name":"PAUD","amenity":"kindergarten"},"name":"PAUD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Pusteblume":{"tags":{"name":"Pusteblume","amenity":"kindergarten"},"name":"Pusteblume","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Rosaura Zapata":{"tags":{"name":"Rosaura Zapata","amenity":"kindergarten"},"name":"Rosaura Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Sor Juana Ines De La Cruz":{"tags":{"name":"Sor Juana Ines De La Cruz","amenity":"kindergarten"},"name":"Sor Juana Ines De La Cruz","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Spatzennest":{"tags":{"name":"Spatzennest","amenity":"kindergarten"},"name":"Spatzennest","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Städtischer Kindergarten":{"tags":{"name":"Städtischer Kindergarten","amenity":"kindergarten"},"name":"Städtischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Villa Kunterbunt":{"tags":{"name":"Villa Kunterbunt","amenity":"kindergarten"},"name":"Villa Kunterbunt","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldkindergarten":{"tags":{"name":"Waldkindergarten","amenity":"kindergarten"},"name":"Waldkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldorfkindergarten":{"tags":{"name":"Waldorfkindergarten","amenity":"kindergarten"},"name":"Waldorfkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Óvoda":{"tags":{"name":"Óvoda","amenity":"kindergarten"},"name":"Óvoda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детсад":{"tags":{"name":"Детсад","amenity":"kindergarten"},"name":"Детсад","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад Солнышко":{"tags":{"name":"Детский сад Солнышко","amenity":"kindergarten"},"name":"Детский сад Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад № 1":{"tags":{"name":"Детский сад № 1","amenity":"kindergarten"},"name":"Детский сад № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №1":{"tags":{"name":"Детский сад №1","amenity":"kindergarten"},"name":"Детский сад №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №10":{"tags":{"name":"Детский сад №10","amenity":"kindergarten"},"name":"Детский сад №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №11":{"tags":{"name":"Детский сад №11","amenity":"kindergarten"},"name":"Детский сад №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №12":{"tags":{"name":"Детский сад №12","amenity":"kindergarten"},"name":"Детский сад №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №13":{"tags":{"name":"Детский сад №13","amenity":"kindergarten"},"name":"Детский сад №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №14":{"tags":{"name":"Детский сад №14","amenity":"kindergarten"},"name":"Детский сад №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №15":{"tags":{"name":"Детский сад №15","amenity":"kindergarten"},"name":"Детский сад №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №16":{"tags":{"name":"Детский сад №16","amenity":"kindergarten"},"name":"Детский сад №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №17":{"tags":{"name":"Детский сад №17","amenity":"kindergarten"},"name":"Детский сад №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №18":{"tags":{"name":"Детский сад №18","amenity":"kindergarten"},"name":"Детский сад №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №19":{"tags":{"name":"Детский сад №19","amenity":"kindergarten"},"name":"Детский сад №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №2":{"tags":{"name":"Детский сад №2","amenity":"kindergarten"},"name":"Детский сад №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №22":{"tags":{"name":"Детский сад №22","amenity":"kindergarten"},"name":"Детский сад №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №24":{"tags":{"name":"Детский сад №24","amenity":"kindergarten"},"name":"Детский сад №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №25":{"tags":{"name":"Детский сад №25","amenity":"kindergarten"},"name":"Детский сад №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №27":{"tags":{"name":"Детский сад №27","amenity":"kindergarten"},"name":"Детский сад №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №29":{"tags":{"name":"Детский сад №29","amenity":"kindergarten"},"name":"Детский сад №29","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №3":{"tags":{"name":"Детский сад №3","amenity":"kindergarten"},"name":"Детский сад №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №33":{"tags":{"name":"Детский сад №33","amenity":"kindergarten"},"name":"Детский сад №33","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №4":{"tags":{"name":"Детский сад №4","amenity":"kindergarten"},"name":"Детский сад №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №5":{"tags":{"name":"Детский сад №5","amenity":"kindergarten"},"name":"Детский сад №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №6":{"tags":{"name":"Детский сад №6","amenity":"kindergarten"},"name":"Детский сад №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №7":{"tags":{"name":"Детский сад №7","amenity":"kindergarten"},"name":"Детский сад №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №8":{"tags":{"name":"Детский сад №8","amenity":"kindergarten"},"name":"Детский сад №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №9":{"tags":{"name":"Детский сад №9","amenity":"kindergarten"},"name":"Детский сад №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Дитячий садок":{"tags":{"name":"Дитячий садок","amenity":"kindergarten"},"name":"Дитячий садок","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Солнышко":{"tags":{"name":"Солнышко","amenity":"kindergarten"},"name":"Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/საბავშვო ბაღი":{"tags":{"name":"საბავშვო ბაღი","amenity":"kindergarten"},"name":"საბავშვო ბაღი","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/中央保育所":{"tags":{"name":"中央保育所","amenity":"kindergarten"},"name":"中央保育所","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/library/Biblioteca Comunale":{"tags":{"name":"Biblioteca Comunale","amenity":"library"},"name":"Biblioteca Comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Biblioteca comunale":{"tags":{"name":"Biblioteca comunale","amenity":"library"},"name":"Biblioteca comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Biblioteka Publiczna":{"tags":{"name":"Biblioteka Publiczna","amenity":"library"},"name":"Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bibliothèque Municipale":{"tags":{"name":"Bibliothèque Municipale","amenity":"library"},"name":"Bibliothèque Municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bibliothèque municipale":{"tags":{"name":"Bibliothèque municipale","amenity":"library"},"name":"Bibliothèque municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bücherei":{"tags":{"name":"Bücherei","amenity":"library"},"name":"Bücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Central Library":{"tags":{"name":"Central Library","amenity":"library"},"name":"Central Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Gemeindebücherei":{"tags":{"name":"Gemeindebücherei","amenity":"library"},"name":"Gemeindebücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Gminna Biblioteka Publiczna":{"tags":{"name":"Gminna Biblioteka Publiczna","amenity":"library"},"name":"Gminna Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Miejska Biblioteka Publiczna":{"tags":{"name":"Miejska Biblioteka Publiczna","amenity":"library"},"name":"Miejska Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Médiathèque":{"tags":{"name":"Médiathèque","amenity":"library"},"name":"Médiathèque","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Městská knihovna":{"tags":{"name":"Městská knihovna","amenity":"library"},"name":"Městská knihovna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Public Library":{"tags":{"name":"Public Library","amenity":"library"},"name":"Public Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Stadtbibliothek":{"tags":{"name":"Stadtbibliothek","amenity":"library"},"name":"Stadtbibliothek","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Stadtbücherei":{"tags":{"name":"Stadtbücherei","amenity":"library"},"name":"Stadtbücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Городская библиотека":{"tags":{"name":"Городская библиотека","amenity":"library"},"name":"Городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Детская библиотека":{"tags":{"name":"Детская библиотека","amenity":"library"},"name":"Детская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Центральная библиотека":{"tags":{"name":"Центральная библиотека","amenity":"library"},"name":"Центральная библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Центральная городская библиотека":{"tags":{"name":"Центральная городская библиотека","amenity":"library"},"name":"Центральная городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/图书馆":{"tags":{"name":"图书馆","amenity":"library"},"name":"图书馆","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/pharmacy/36.6":{"tags":{"name":"36.6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"36.6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Adler-Apotheke":{"tags":{"name":"Adler-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Adler-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Alte Apotheke":{"tags":{"name":"Alte Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Alte Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Apollo Pharmacy":{"tags":{"name":"Apollo Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apollo Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Apotek":{"tags":{"name":"Apotek","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Apotek Hjärtat":{"tags":{"name":"Apotek Hjärtat","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek Hjärtat","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Apotheke am Markt":{"tags":{"name":"Apotheke am Markt","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotheke am Markt","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Bahnhof Apotheke":{"tags":{"name":"Bahnhof Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Bahnhof-Apotheke":{"tags":{"name":"Bahnhof-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Bartell Drugs":{"tags":{"name":"Bartell Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bartell Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Benavides":{"tags":{"name":"Benavides","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benavides","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Benu":{"tags":{"name":"Benu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Boots":{"tags":{"name":"Boots","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Boots","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Botica":{"tags":{"name":"Botica","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Botica","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Brunnen-Apotheke":{"tags":{"name":"Brunnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Brunnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Burg-Apotheke":{"tags":{"name":"Burg-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Burg-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Bären-Apotheke":{"tags":{"name":"Bären-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bären-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/CVS":{"tags":{"name":"CVS","healthcare":"pharmacy","amenity":"pharmacy"},"name":"CVS","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Camelia":{"tags":{"name":"Camelia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Camelia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Catena":{"tags":{"name":"Catena","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Catena","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Chemist Warehouse":{"tags":{"name":"Chemist Warehouse","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Chemist Warehouse","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Clicks":{"tags":{"name":"Clicks","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Clicks","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Cruz Azul":{"tags":{"name":"Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Cruz Verde":{"tags":{"name":"Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Dbam o Zdrowie":{"tags":{"name":"Dbam o Zdrowie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dbam o Zdrowie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Dr. Max":{"tags":{"name":"Dr. Max","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dr. Max","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Droga Raia":{"tags":{"name":"Droga Raia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Droga Raia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Drogaria São Paulo":{"tags":{"name":"Drogaria São Paulo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogaria São Paulo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Drogasil":{"tags":{"name":"Drogasil","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogasil","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Duane Reade":{"tags":{"name":"Duane Reade","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Duane Reade","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Eczane":{"tags":{"name":"Eczane","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eczane","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Engel-Apotheke":{"tags":{"name":"Engel-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Engel-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Eurovaistinė":{"tags":{"name":"Eurovaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eurovaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Familiprix":{"tags":{"name":"Familiprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Familiprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacenter":{"tags":{"name":"Farmacenter","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacenter","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacia Centrale":{"tags":{"name":"Farmacia Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacia Comunale":{"tags":{"name":"Farmacia Comunale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Comunale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacia Guadalajara":{"tags":{"name":"Farmacia Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacia del Ahorro":{"tags":{"name":"Farmacia del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Ahumada":{"tags":{"name":"Farmacias Ahumada","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Ahumada","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Azul":{"tags":{"name":"Farmacias Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Verde":{"tags":{"name":"Farmacias Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Económicas":{"tags":{"name":"Farmacias Económicas","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Económicas","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Guadalajara":{"tags":{"name":"Farmacias Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias SalcoBrand":{"tags":{"name":"Farmacias SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Sana Sana":{"tags":{"name":"Farmacias Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias Similares":{"tags":{"name":"Farmacias Similares","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Similares","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacias del Ahorro":{"tags":{"name":"Farmacias del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmacity":{"tags":{"name":"Farmacity","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacity","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmahorro":{"tags":{"name":"Farmahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Farmatodo":{"tags":{"name":"Farmatodo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmatodo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Felicia":{"tags":{"name":"Felicia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Felicia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Fybeca":{"tags":{"name":"Fybeca","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Fybeca","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Generika Drugstore":{"tags":{"name":"Generika Drugstore","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Generika Drugstore","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Gintarinė vaistinė":{"tags":{"name":"Gintarinė vaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gintarinė vaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Guardian":{"tags":{"name":"Guardian","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Guardian","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Gyógyszertár":{"tags":{"name":"Gyógyszertár","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gyógyszertár","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/H-E-B Pharmacy":{"tags":{"name":"H-E-B Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"H-E-B Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Hirsch-Apotheke":{"tags":{"name":"Hirsch-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hirsch-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Hubertus Apotheke":{"tags":{"name":"Hubertus Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hubertus Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Inkafarma":{"tags":{"name":"Inkafarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Inkafarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Jean Coutu":{"tags":{"name":"Jean Coutu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Jean Coutu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Kinney Drugs":{"tags":{"name":"Kinney Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kinney Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Kur-Apotheke":{"tags":{"name":"Kur-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kur-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Linden-Apotheke":{"tags":{"name":"Linden-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Linden-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Ljekarna":{"tags":{"name":"Ljekarna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ljekarna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Lloyds Pharmacy":{"tags":{"name":"Lloyds Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lloyds Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Lékárna":{"tags":{"name":"Lékárna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lékárna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Löwen-Apotheke":{"tags":{"name":"Löwen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Löwen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Marien-Apotheke":{"tags":{"name":"Marien-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Marien-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Markt-Apotheke":{"tags":{"name":"Markt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Markt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Mercury Drug":{"tags":{"name":"Mercury Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mercury Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Mifarma":{"tags":{"name":"Mifarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mifarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Mēness aptieka":{"tags":{"name":"Mēness aptieka","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mēness aptieka","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Neue Apotheke":{"tags":{"name":"Neue Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Neue Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pague Menos":{"tags":{"name":"Pague Menos","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pague Menos","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Panvel":{"tags":{"name":"Panvel","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Panvel","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Park-Apotheke":{"tags":{"name":"Park-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Park-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie Centrale":{"tags":{"name":"Pharmacie Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie Principale":{"tags":{"name":"Pharmacie Principale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Principale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie de l'Hôtel de Ville":{"tags":{"name":"Pharmacie de l'Hôtel de Ville","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de l'Hôtel de Ville","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Gare":{"tags":{"name":"Pharmacie de la Gare","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Gare","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Mairie":{"tags":{"name":"Pharmacie de la Mairie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Mairie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Poste":{"tags":{"name":"Pharmacie de la Poste","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Poste","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie du Centre":{"tags":{"name":"Pharmacie du Centre","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Centre","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie du Marché":{"tags":{"name":"Pharmacie du Marché","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Marché","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmacie du Parc":{"tags":{"name":"Pharmacie du Parc","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Parc","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmaprix":{"tags":{"name":"Pharmaprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmaprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Pharmasave":{"tags":{"name":"Pharmasave","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmasave","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Punkt Apteczny":{"tags":{"name":"Punkt Apteczny","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Punkt Apteczny","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rathaus-Apotheke":{"tags":{"name":"Rathaus-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rathaus-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rats-Apotheke":{"tags":{"name":"Rats-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rats-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rexall":{"tags":{"name":"Rexall","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rexall","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rite Aid":{"tags":{"name":"Rite Aid","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rite Aid","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rose Pharmacy":{"tags":{"name":"Rose Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rose Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rosen-Apotheke":{"tags":{"name":"Rosen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rosen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Rowlands Pharmacy":{"tags":{"name":"Rowlands Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rowlands Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/SalcoBrand":{"tags":{"name":"SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Sana Sana":{"tags":{"name":"Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Schloss-Apotheke":{"tags":{"name":"Schloss-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Schloss-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Sensiblu":{"tags":{"name":"Sensiblu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sensiblu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Shoppers Drug Mart":{"tags":{"name":"Shoppers Drug Mart","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Shoppers Drug Mart","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Sonnen-Apotheke":{"tags":{"name":"Sonnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sonnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/South Star Drug":{"tags":{"name":"South Star Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"South Star Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Stadt-Apotheke":{"tags":{"name":"Stadt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stadt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Stern-Apotheke":{"tags":{"name":"Stern-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stern-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Superdrug":{"tags":{"name":"Superdrug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Superdrug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/São João":{"tags":{"name":"São João","healthcare":"pharmacy","amenity":"pharmacy"},"name":"São João","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/The Generics Pharmacy":{"tags":{"name":"The Generics Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"The Generics Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Uniprix":{"tags":{"name":"Uniprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Uniprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Walgreens":{"tags":{"name":"Walgreens","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Walgreens Pharmacy":{"tags":{"name":"Walgreens Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Walmart Pharmacy":{"tags":{"name":"Walmart Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walmart Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Well Pharmacy":{"tags":{"name":"Well Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Well Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/centro naturista":{"tags":{"name":"centro naturista","healthcare":"pharmacy","amenity":"pharmacy"},"name":"centro naturista","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/А5":{"tags":{"name":"А5","healthcare":"pharmacy","amenity":"pharmacy"},"name":"А5","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Айболит":{"tags":{"name":"Айболит","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Айболит","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека 36,6":{"tags":{"name":"Аптека 36,6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека 36,6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека низких цен":{"tags":{"name":"Аптека низких цен","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низких цен","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека низьких цін":{"tags":{"name":"Аптека низьких цін","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низьких цін","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека от склада":{"tags":{"name":"Аптека от склада","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека от склада","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека №1":{"tags":{"name":"Аптека №1","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека №1","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптечный пункт":{"tags":{"name":"Аптечный пункт","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптечный пункт","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Арніка":{"tags":{"name":"Арніка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Арніка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Бережная аптека":{"tags":{"name":"Бережная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Бережная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Будь здоров":{"tags":{"name":"Будь здоров","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Будь здоров","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Вита":{"tags":{"name":"Вита","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Вита","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Горздрав":{"tags":{"name":"Горздрав","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Горздрав","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Живика":{"tags":{"name":"Живика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Живика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Здоровье":{"tags":{"name":"Здоровье","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Здоровье","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Имплозия":{"tags":{"name":"Имплозия","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Имплозия","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Классика":{"tags":{"name":"Классика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Классика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Ладушка":{"tags":{"name":"Ладушка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ладушка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Мед-сервіс":{"tags":{"name":"Мед-сервіс","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мед-сервіс","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Мелодия здоровья":{"tags":{"name":"Мелодия здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мелодия здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Невис":{"tags":{"name":"Невис","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Невис","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Норма":{"tags":{"name":"Норма","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Норма","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Озерки":{"tags":{"name":"Озерки","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Озерки","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Панацея":{"tags":{"name":"Панацея","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Панацея","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Первая помощь":{"tags":{"name":"Первая помощь","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Первая помощь","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Планета здоровья":{"tags":{"name":"Планета здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Планета здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Ригла":{"tags":{"name":"Ригла","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ригла","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Семейная":{"tags":{"name":"Семейная","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Семейная","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Социальная аптека":{"tags":{"name":"Социальная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Социальная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Столички":{"tags":{"name":"Столички","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Столички","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармакопейка":{"tags":{"name":"Фармакопейка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакопейка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармакор":{"tags":{"name":"Фармакор","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакор","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармация":{"tags":{"name":"Фармация","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармация","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармленд":{"tags":{"name":"Фармленд","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармленд","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Центральная аптека":{"tags":{"name":"Центральная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Центральная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/סופר-פארם":{"tags":{"name":"סופר-פארם","healthcare":"pharmacy","amenity":"pharmacy"},"name":"סופר-פארם","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/داروخانه":{"tags":{"name":"داروخانه","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/داروخانه شبانه روزی":{"tags":{"name":"داروخانه شبانه روزی","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه شبانه روزی","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/صيدلية":{"tags":{"name":"صيدلية","healthcare":"pharmacy","amenity":"pharmacy"},"name":"صيدلية","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/くすりの福太郎":{"tags":{"name":"くすりの福太郎","healthcare":"pharmacy","amenity":"pharmacy"},"name":"くすりの福太郎","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/さくら薬局":{"tags":{"name":"さくら薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"さくら薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/ウエルシア":{"tags":{"name":"ウエルシア","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ウエルシア","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/カワチ薬品":{"tags":{"name":"カワチ薬品","healthcare":"pharmacy","amenity":"pharmacy"},"name":"カワチ薬品","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/クリエイト":{"tags":{"name":"クリエイト","healthcare":"pharmacy","amenity":"pharmacy"},"name":"クリエイト","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/サンドラッグ":{"tags":{"name":"サンドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"サンドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/スギ薬局":{"tags":{"name":"スギ薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"スギ薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/セイジョー":{"tags":{"name":"セイジョー","healthcare":"pharmacy","amenity":"pharmacy"},"name":"セイジョー","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/ツルハドラッグ":{"tags":{"name":"ツルハドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ツルハドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/ドラッグてらしま (Drug Terashima)":{"tags":{"name":"ドラッグてらしま (Drug Terashima)","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ドラッグてらしま (Drug Terashima)","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/マツモトキヨシ":{"tags":{"name":"マツモトキヨシ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"マツモトキヨシ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/丁丁藥局":{"tags":{"name":"丁丁藥局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"丁丁藥局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pub/Black Bull":{"tags":{"name":"Black Bull","amenity":"pub"},"name":"Black Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Commercial Hotel":{"tags":{"name":"Commercial Hotel","amenity":"pub"},"name":"Commercial Hotel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Cross Keys":{"tags":{"name":"Cross Keys","amenity":"pub"},"name":"Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Irish Pub":{"tags":{"name":"Irish Pub","amenity":"pub"},"name":"Irish Pub","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Kings Arms":{"tags":{"name":"Kings Arms","amenity":"pub"},"name":"Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Kings Head":{"tags":{"name":"Kings Head","amenity":"pub"},"name":"Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/New Inn":{"tags":{"name":"New Inn","amenity":"pub"},"name":"New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Prince of Wales":{"tags":{"name":"Prince of Wales","amenity":"pub"},"name":"Prince of Wales","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Queens Head":{"tags":{"name":"Queens Head","amenity":"pub"},"name":"Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Red Lion":{"tags":{"name":"Red Lion","amenity":"pub"},"name":"Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Rose & Crown":{"tags":{"name":"Rose & Crown","amenity":"pub"},"name":"Rose & Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Rose and Crown":{"tags":{"name":"Rose and Crown","amenity":"pub"},"name":"Rose and Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Royal Oak":{"tags":{"name":"Royal Oak","amenity":"pub"},"name":"Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Albion":{"tags":{"name":"The Albion","amenity":"pub"},"name":"The Albion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Anchor":{"tags":{"name":"The Anchor","amenity":"pub"},"name":"The Anchor","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Angel":{"tags":{"name":"The Angel","amenity":"pub"},"name":"The Angel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Beehive":{"tags":{"name":"The Beehive","amenity":"pub"},"name":"The Beehive","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bell":{"tags":{"name":"The Bell","amenity":"pub"},"name":"The Bell","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bell Inn":{"tags":{"name":"The Bell Inn","amenity":"pub"},"name":"The Bell Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Black Horse":{"tags":{"name":"The Black Horse","amenity":"pub"},"name":"The Black Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bull":{"tags":{"name":"The Bull","amenity":"pub"},"name":"The Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Castle":{"tags":{"name":"The Castle","amenity":"pub"},"name":"The Castle","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Chequers":{"tags":{"name":"The Chequers","amenity":"pub"},"name":"The Chequers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Cricketers":{"tags":{"name":"The Cricketers","amenity":"pub"},"name":"The Cricketers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Cross Keys":{"tags":{"name":"The Cross Keys","amenity":"pub"},"name":"The Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Crown":{"tags":{"name":"The Crown","amenity":"pub"},"name":"The Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Crown Inn":{"tags":{"name":"The Crown Inn","amenity":"pub"},"name":"The Crown Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Fox":{"tags":{"name":"The Fox","amenity":"pub"},"name":"The Fox","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The George":{"tags":{"name":"The George","amenity":"pub"},"name":"The George","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Green Man":{"tags":{"name":"The Green Man","amenity":"pub"},"name":"The Green Man","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Greyhound":{"tags":{"name":"The Greyhound","amenity":"pub"},"name":"The Greyhound","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Kings Arms":{"tags":{"name":"The Kings Arms","amenity":"pub"},"name":"The Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Kings Head":{"tags":{"name":"The Kings Head","amenity":"pub"},"name":"The Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The New Inn":{"tags":{"name":"The New Inn","amenity":"pub"},"name":"The New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Plough":{"tags":{"name":"The Plough","amenity":"pub"},"name":"The Plough","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Plough Inn":{"tags":{"name":"The Plough Inn","amenity":"pub"},"name":"The Plough Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Queens Head":{"tags":{"name":"The Queens Head","amenity":"pub"},"name":"The Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Railway":{"tags":{"name":"The Railway","amenity":"pub"},"name":"The Railway","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Red Lion":{"tags":{"name":"The Red Lion","amenity":"pub"},"name":"The Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Rising Sun":{"tags":{"name":"The Rising Sun","amenity":"pub"},"name":"The Rising Sun","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Royal Oak":{"tags":{"name":"The Royal Oak","amenity":"pub"},"name":"The Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Ship":{"tags":{"name":"The Ship","amenity":"pub"},"name":"The Ship","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Ship Inn":{"tags":{"name":"The Ship Inn","amenity":"pub"},"name":"The Ship Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Star":{"tags":{"name":"The Star","amenity":"pub"},"name":"The Star","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Star Inn":{"tags":{"name":"The Star Inn","amenity":"pub"},"name":"The Star Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Sun Inn":{"tags":{"name":"The Sun Inn","amenity":"pub"},"name":"The Sun Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Swan":{"tags":{"name":"The Swan","amenity":"pub"},"name":"The Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Swan Inn":{"tags":{"name":"The Swan Inn","amenity":"pub"},"name":"The Swan Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Victoria":{"tags":{"name":"The Victoria","amenity":"pub"},"name":"The Victoria","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Wheatsheaf":{"tags":{"name":"The Wheatsheaf","amenity":"pub"},"name":"The Wheatsheaf","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Hart":{"tags":{"name":"The White Hart","amenity":"pub"},"name":"The White Hart","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Horse":{"tags":{"name":"The White Horse","amenity":"pub"},"name":"The White Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Lion":{"tags":{"name":"The White Lion","amenity":"pub"},"name":"The White Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Swan":{"tags":{"name":"The White Swan","amenity":"pub"},"name":"The White Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/魚民":{"tags":{"name":"魚民","amenity":"pub"},"name":"魚民","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/鳥貴族":{"tags":{"name":"鳥貴族","amenity":"pub"},"name":"鳥貴族","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/restaurant/Adler":{"tags":{"name":"Adler","amenity":"restaurant"},"name":"Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adria":{"tags":{"name":"Adria","amenity":"restaurant"},"name":"Adria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adyar Ananda Bhavan":{"tags":{"name":"Adyar Ananda Bhavan","amenity":"restaurant"},"name":"Adyar Ananda Bhavan","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Akropolis":{"tags":{"name":"Akropolis","amenity":"restaurant"},"name":"Akropolis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Alte Post":{"tags":{"name":"Alte Post","amenity":"restaurant"},"name":"Alte Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Applebee's":{"tags":{"name":"Applebee's","amenity":"restaurant"},"name":"Applebee's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Asia":{"tags":{"name":"Asia","amenity":"restaurant"},"name":"Asia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athen":{"tags":{"name":"Athen","amenity":"restaurant"},"name":"Athen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athos":{"tags":{"name":"Athos","amenity":"restaurant"},"name":"Athos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Autogrill":{"tags":{"name":"Autogrill","amenity":"restaurant"},"name":"Autogrill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bahnhof":{"tags":{"name":"Bahnhof","amenity":"restaurant"},"name":"Bahnhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Italia":{"tags":{"name":"Bella Italia","amenity":"restaurant"},"name":"Bella Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Napoli":{"tags":{"name":"Bella Napoli","amenity":"restaurant"},"name":"Bella Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Big Boy":{"tags":{"name":"Big Boy","amenity":"restaurant"},"name":"Big Boy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bob Evans":{"tags":{"name":"Bob Evans","amenity":"restaurant"},"name":"Bob Evans","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bonefish Grill":{"tags":{"name":"Bonefish Grill","amenity":"restaurant"},"name":"Bonefish Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Boston Pizza":{"tags":{"name":"Boston Pizza","amenity":"restaurant"},"name":"Boston Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Grill":{"tags":{"name":"Buffalo Grill","amenity":"restaurant"},"name":"Buffalo Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Wild Wings":{"tags":{"name":"Buffalo Wild Wings","amenity":"restaurant"},"name":"Buffalo Wild Wings","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bären":{"tags":{"name":"Bären","amenity":"restaurant"},"name":"Bären","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/California Pizza Kitchen":{"tags":{"name":"California Pizza Kitchen","amenity":"restaurant"},"name":"California Pizza Kitchen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Canteen":{"tags":{"name":"Canteen","amenity":"restaurant"},"name":"Canteen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Capri":{"tags":{"name":"Capri","amenity":"restaurant"},"name":"Capri","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carluccio's":{"tags":{"name":"Carluccio's","amenity":"restaurant"},"name":"Carluccio's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carpe Diem":{"tags":{"name":"Carpe Diem","amenity":"restaurant"},"name":"Carpe Diem","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carrabba's Italian Grill":{"tags":{"name":"Carrabba's Italian Grill","amenity":"restaurant"},"name":"Carrabba's Italian Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casa Mia":{"tags":{"name":"Casa Mia","amenity":"restaurant"},"name":"Casa Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casablanca":{"tags":{"name":"Casablanca","amenity":"restaurant"},"name":"Casablanca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cheesecake Factory":{"tags":{"name":"Cheesecake Factory","amenity":"restaurant"},"name":"Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chifa":{"tags":{"name":"Chifa","amenity":"restaurant"},"name":"Chifa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chili's":{"tags":{"name":"Chili's","amenity":"restaurant"},"name":"Chili's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Buffet":{"tags":{"name":"China Buffet","amenity":"restaurant"},"name":"China Buffet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Garden":{"tags":{"name":"China Garden","amenity":"restaurant"},"name":"China Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China House":{"tags":{"name":"China House","amenity":"restaurant"},"name":"China House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Town":{"tags":{"name":"China Town","amenity":"restaurant"},"name":"China Town","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Wok":{"tags":{"name":"China Wok","amenity":"restaurant"},"name":"China Wok","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chiquito":{"tags":{"name":"Chiquito","amenity":"restaurant"},"name":"Chiquito","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chuck E. Cheese's":{"tags":{"name":"Chuck E. Cheese's","amenity":"restaurant"},"name":"Chuck E. Cheese's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cici's Pizza":{"tags":{"name":"Cici's Pizza","amenity":"restaurant"},"name":"Cici's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comedor":{"tags":{"name":"Comedor","amenity":"restaurant"},"name":"Comedor","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comida China":{"tags":{"name":"Comida China","amenity":"restaurant"},"name":"Comida China","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Courtepaille":{"tags":{"name":"Courtepaille","amenity":"restaurant"},"name":"Courtepaille","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cracker Barrel":{"tags":{"name":"Cracker Barrel","amenity":"restaurant"},"name":"Cracker Barrel","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Grasso":{"tags":{"name":"Da Grasso","amenity":"restaurant"},"name":"Da Grasso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Vinci":{"tags":{"name":"Da Vinci","amenity":"restaurant"},"name":"Da Vinci","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Delphi":{"tags":{"name":"Delphi","amenity":"restaurant"},"name":"Delphi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Denny's":{"tags":{"name":"Denny's","amenity":"restaurant"},"name":"Denny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Deutsches Haus":{"tags":{"name":"Deutsches Haus","amenity":"restaurant"},"name":"Deutsches Haus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dionysos":{"tags":{"name":"Dionysos","amenity":"restaurant"},"name":"Dionysos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dolce Vita":{"tags":{"name":"Dolce Vita","amenity":"restaurant"},"name":"Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dorfkrug":{"tags":{"name":"Dorfkrug","amenity":"restaurant"},"name":"Dorfkrug","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/East Side Mario's":{"tags":{"name":"East Side Mario's","amenity":"restaurant"},"name":"East Side Mario's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Greco":{"tags":{"name":"El Greco","amenity":"restaurant"},"name":"El Greco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Paso":{"tags":{"name":"El Paso","amenity":"restaurant"},"name":"El Paso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Rancho":{"tags":{"name":"El Rancho","amenity":"restaurant"},"name":"El Rancho","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Europa":{"tags":{"name":"Europa","amenity":"restaurant"},"name":"Europa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Famous Dave's":{"tags":{"name":"Famous Dave's","amenity":"restaurant"},"name":"Famous Dave's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Flunch":{"tags":{"name":"Flunch","amenity":"restaurant"},"name":"Flunch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Frankie & Benny's":{"tags":{"name":"Frankie & Benny's","amenity":"restaurant"},"name":"Frankie & Benny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Friendly's":{"tags":{"name":"Friendly's","amenity":"restaurant"},"name":"Friendly's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus Krone":{"tags":{"name":"Gasthaus Krone","amenity":"restaurant"},"name":"Gasthaus Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus zur Linde":{"tags":{"name":"Gasthaus zur Linde","amenity":"restaurant"},"name":"Gasthaus zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthof zur Post":{"tags":{"name":"Gasthof zur Post","amenity":"restaurant"},"name":"Gasthof zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Corral":{"tags":{"name":"Golden Corral","amenity":"restaurant"},"name":"Golden Corral","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Dragon":{"tags":{"name":"Golden Dragon","amenity":"restaurant"},"name":"Golden Dragon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Great Wall":{"tags":{"name":"Great Wall","amenity":"restaurant"},"name":"Great Wall","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Grüner Baum":{"tags":{"name":"Grüner Baum","amenity":"restaurant"},"name":"Grüner Baum","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gusto":{"tags":{"name":"Gusto","amenity":"restaurant"},"name":"Gusto","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hard Rock Cafe":{"tags":{"name":"Hard Rock Cafe","amenity":"restaurant"},"name":"Hard Rock Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Harvester":{"tags":{"name":"Harvester","amenity":"restaurant"},"name":"Harvester","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hellas":{"tags":{"name":"Hellas","amenity":"restaurant"},"name":"Hellas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hippopotamus":{"tags":{"name":"Hippopotamus","amenity":"restaurant"},"name":"Hippopotamus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirsch":{"tags":{"name":"Hirsch","amenity":"restaurant"},"name":"Hirsch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirschen":{"tags":{"name":"Hirschen","amenity":"restaurant"},"name":"Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hong Kong":{"tags":{"name":"Hong Kong","amenity":"restaurant"},"name":"Hong Kong","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hooters":{"tags":{"name":"Hooters","amenity":"restaurant"},"name":"Hooters","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IHOP":{"tags":{"name":"IHOP","amenity":"restaurant"},"name":"IHOP","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IL Патио":{"tags":{"name":"IL Патио","amenity":"restaurant"},"name":"IL Патио","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jason's Deli":{"tags":{"name":"Jason's Deli","amenity":"restaurant"},"name":"Jason's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Joe's Crab Shack":{"tags":{"name":"Joe's Crab Shack","amenity":"restaurant"},"name":"Joe's Crab Shack","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jägerhof":{"tags":{"name":"Jägerhof","amenity":"restaurant"},"name":"Jägerhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kantine":{"tags":{"name":"Kantine","amenity":"restaurant"},"name":"Kantine","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kelsey's":{"tags":{"name":"Kelsey's","amenity":"restaurant"},"name":"Kelsey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kirchenwirt":{"tags":{"name":"Kirchenwirt","amenity":"restaurant"},"name":"Kirchenwirt","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreta":{"tags":{"name":"Kreta","amenity":"restaurant"},"name":"Kreta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreuz":{"tags":{"name":"Kreuz","amenity":"restaurant"},"name":"Kreuz","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Krone":{"tags":{"name":"Krone","amenity":"restaurant"},"name":"Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kudu":{"tags":{"name":"Kudu","amenity":"restaurant"},"name":"Kudu","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Escale":{"tags":{"name":"L'Escale","amenity":"restaurant"},"name":"L'Escale","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Osteria":{"tags":{"name":"L'Osteria","amenity":"restaurant"},"name":"L'Osteria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Bodega":{"tags":{"name":"La Bodega","amenity":"restaurant"},"name":"La Bodega","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Boucherie":{"tags":{"name":"La Boucherie","amenity":"restaurant"},"name":"La Boucherie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Cantina":{"tags":{"name":"La Cantina","amenity":"restaurant"},"name":"La Cantina","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casa":{"tags":{"name":"La Casa","amenity":"restaurant"},"name":"La Casa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casona":{"tags":{"name":"La Casona","amenity":"restaurant"},"name":"La Casona","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Dolce Vita":{"tags":{"name":"La Dolce Vita","amenity":"restaurant"},"name":"La Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Fontana":{"tags":{"name":"La Fontana","amenity":"restaurant"},"name":"La Fontana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Gondola":{"tags":{"name":"La Gondola","amenity":"restaurant"},"name":"La Gondola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Hacienda":{"tags":{"name":"La Hacienda","amenity":"restaurant"},"name":"La Hacienda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pataterie":{"tags":{"name":"La Pataterie","amenity":"restaurant"},"name":"La Pataterie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pergola":{"tags":{"name":"La Pergola","amenity":"restaurant"},"name":"La Pergola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Perla":{"tags":{"name":"La Perla","amenity":"restaurant"},"name":"La Perla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazza":{"tags":{"name":"La Piazza","amenity":"restaurant"},"name":"La Piazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazzetta":{"tags":{"name":"La Piazzetta","amenity":"restaurant"},"name":"La Piazzetta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Place":{"tags":{"name":"La Place","amenity":"restaurant"},"name":"La Place","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Scala":{"tags":{"name":"La Scala","amenity":"restaurant"},"name":"La Scala","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Strada":{"tags":{"name":"La Strada","amenity":"restaurant"},"name":"La Strada","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tagliatella":{"tags":{"name":"La Tagliatella","amenity":"restaurant"},"name":"La Tagliatella","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tasca":{"tags":{"name":"La Tasca","amenity":"restaurant"},"name":"La Tasca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Taverna":{"tags":{"name":"La Taverna","amenity":"restaurant"},"name":"La Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrasse":{"tags":{"name":"La Terrasse","amenity":"restaurant"},"name":"La Terrasse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terraza":{"tags":{"name":"La Terraza","amenity":"restaurant"},"name":"La Terraza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrazza":{"tags":{"name":"La Terrazza","amenity":"restaurant"},"name":"La Terrazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Trattoria":{"tags":{"name":"La Trattoria","amenity":"restaurant"},"name":"La Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lamm":{"tags":{"name":"Lamm","amenity":"restaurant"},"name":"Lamm","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Linde":{"tags":{"name":"Linde","amenity":"restaurant"},"name":"Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lindenhof":{"tags":{"name":"Lindenhof","amenity":"restaurant"},"name":"Lindenhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Chef":{"tags":{"name":"Little Chef","amenity":"restaurant"},"name":"Little Chef","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Italy":{"tags":{"name":"Little Italy","amenity":"restaurant"},"name":"Little Italy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Logan's Roadhouse":{"tags":{"name":"Logan's Roadhouse","amenity":"restaurant"},"name":"Logan's Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/LongHorn Steakhouse":{"tags":{"name":"LongHorn Steakhouse","amenity":"restaurant"},"name":"LongHorn Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lotus":{"tags":{"name":"Lotus","amenity":"restaurant"},"name":"Lotus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Léon de Bruxelles":{"tags":{"name":"Léon de Bruxelles","amenity":"restaurant"},"name":"Léon de Bruxelles","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Löwen":{"tags":{"name":"Löwen","amenity":"restaurant"},"name":"Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/MK Restaurants":{"tags":{"name":"MK Restaurants","amenity":"restaurant"},"name":"MK Restaurants","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Maharaja":{"tags":{"name":"Maharaja","amenity":"restaurant"},"name":"Maharaja","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mamma Mia":{"tags":{"name":"Mamma Mia","amenity":"restaurant"},"name":"Mamma Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mandarin":{"tags":{"name":"Mandarin","amenity":"restaurant"},"name":"Mandarin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mang Inasal":{"tags":{"name":"Mang Inasal","amenity":"restaurant"},"name":"Mang Inasal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco Polo":{"tags":{"name":"Marco Polo","amenity":"restaurant"},"name":"Marco Polo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco's Pizza":{"tags":{"name":"Marco's Pizza","amenity":"restaurant"},"name":"Marco's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/McAlister's Deli":{"tags":{"name":"McAlister's Deli","amenity":"restaurant"},"name":"McAlister's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mediterraneo":{"tags":{"name":"Mediterraneo","amenity":"restaurant"},"name":"Mediterraneo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mellow Mushroom":{"tags":{"name":"Mellow Mushroom","amenity":"restaurant"},"name":"Mellow Mushroom","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mensa":{"tags":{"name":"Mensa","amenity":"restaurant"},"name":"Mensa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Milano":{"tags":{"name":"Milano","amenity":"restaurant"},"name":"Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mimi's Cafe":{"tags":{"name":"Mimi's Cafe","amenity":"restaurant"},"name":"Mimi's Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Moe's Southwest Grill":{"tags":{"name":"Moe's Southwest Grill","amenity":"restaurant"},"name":"Moe's Southwest Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mykonos":{"tags":{"name":"Mykonos","amenity":"restaurant"},"name":"Mykonos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mythos":{"tags":{"name":"Mythos","amenity":"restaurant"},"name":"Mythos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Nando's":{"tags":{"name":"Nando's","amenity":"restaurant"},"name":"Nando's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Noodles & Company":{"tags":{"name":"Noodles & Company","amenity":"restaurant"},"name":"Noodles & Company","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/O'Charley's":{"tags":{"name":"O'Charley's","amenity":"restaurant"},"name":"O'Charley's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Oasis":{"tags":{"name":"Oasis","amenity":"restaurant"},"name":"Oasis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ocean Basket":{"tags":{"name":"Ocean Basket","amenity":"restaurant"},"name":"Ocean Basket","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ochsen":{"tags":{"name":"Ochsen","amenity":"restaurant"},"name":"Ochsen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Old Chicago":{"tags":{"name":"Old Chicago","amenity":"restaurant"},"name":"Old Chicago","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olive Garden":{"tags":{"name":"Olive Garden","amenity":"restaurant"},"name":"Olive Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olympia":{"tags":{"name":"Olympia","amenity":"restaurant"},"name":"Olympia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Osaka":{"tags":{"name":"Osaka","amenity":"restaurant"},"name":"Osaka","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Outback Steakhouse":{"tags":{"name":"Outback Steakhouse","amenity":"restaurant"},"name":"Outback Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/P.F. Chang's":{"tags":{"name":"P.F. Chang's","amenity":"restaurant"},"name":"P.F. Chang's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pancake House":{"tags":{"name":"Pancake House","amenity":"restaurant"},"name":"Pancake House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panda":{"tags":{"name":"Panda","amenity":"restaurant"},"name":"Panda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panera Bread":{"tags":{"name":"Panera Bread","amenity":"restaurant"},"name":"Panera Bread","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panorama":{"tags":{"name":"Panorama","amenity":"restaurant"},"name":"Panorama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Parrilla":{"tags":{"name":"Parrilla","amenity":"restaurant"},"name":"Parrilla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Peking":{"tags":{"name":"Peking","amenity":"restaurant"},"name":"Peking","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Perkins":{"tags":{"name":"Perkins","amenity":"restaurant"},"name":"Perkins","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pinocchio":{"tags":{"name":"Pinocchio","amenity":"restaurant"},"name":"Pinocchio","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Express":{"tags":{"name":"Pizza Express","amenity":"restaurant"},"name":"Pizza Express","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Factory":{"tags":{"name":"Pizza Factory","amenity":"restaurant"},"name":"Pizza Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza House":{"tags":{"name":"Pizza House","amenity":"restaurant"},"name":"Pizza House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Hut":{"tags":{"name":"Pizza Hut","cuisine":"pizza","amenity":"restaurant"},"name":"Pizza Hut","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Ranch":{"tags":{"name":"Pizza Ranch","amenity":"restaurant"},"name":"Pizza Ranch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Italia":{"tags":{"name":"Pizzeria Italia","amenity":"restaurant"},"name":"Pizzeria Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Milano":{"tags":{"name":"Pizzeria Milano","amenity":"restaurant"},"name":"Pizzeria Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Napoli":{"tags":{"name":"Pizzeria Napoli","amenity":"restaurant"},"name":"Pizzeria Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Roma":{"tags":{"name":"Pizzeria Roma","amenity":"restaurant"},"name":"Pizzeria Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Venezia":{"tags":{"name":"Pizzeria Venezia","amenity":"restaurant"},"name":"Pizzeria Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poivre Rouge":{"tags":{"name":"Poivre Rouge","amenity":"restaurant"},"name":"Poivre Rouge","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pomodoro":{"tags":{"name":"Pomodoro","amenity":"restaurant"},"name":"Pomodoro","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Portofino":{"tags":{"name":"Portofino","amenity":"restaurant"},"name":"Portofino","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poseidon":{"tags":{"name":"Poseidon","amenity":"restaurant"},"name":"Poseidon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Prezzo":{"tags":{"name":"Prezzo","amenity":"restaurant"},"name":"Prezzo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Qdoba Mexican Grill":{"tags":{"name":"Qdoba Mexican Grill","amenity":"restaurant"},"name":"Qdoba Mexican Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ratskeller":{"tags":{"name":"Ratskeller","amenity":"restaurant"},"name":"Ratskeller","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Lobster":{"tags":{"name":"Red Lobster","amenity":"restaurant"},"name":"Red Lobster","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Robin":{"tags":{"name":"Red Robin","amenity":"restaurant"},"name":"Red Robin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Restaurante Universitário":{"tags":{"name":"Restaurante Universitário","amenity":"restaurant"},"name":"Restaurante Universitário","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rhodos":{"tags":{"name":"Rhodos","amenity":"restaurant"},"name":"Rhodos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ristorante Del Arte":{"tags":{"name":"Ristorante Del Arte","amenity":"restaurant"},"name":"Ristorante Del Arte","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Roma":{"tags":{"name":"Roma","amenity":"restaurant"},"name":"Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rose":{"tags":{"name":"Rose","amenity":"restaurant"},"name":"Rose","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Round Table Pizza":{"tags":{"name":"Round Table Pizza","amenity":"restaurant"},"name":"Round Table Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ruby Tuesday":{"tags":{"name":"Ruby Tuesday","amenity":"restaurant"},"name":"Ruby Tuesday","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössle":{"tags":{"name":"Rössle","amenity":"restaurant"},"name":"Rössle","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössli":{"tags":{"name":"Rössli","amenity":"restaurant"},"name":"Rössli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Saigon":{"tags":{"name":"Saigon","amenity":"restaurant"},"name":"Saigon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sakura":{"tags":{"name":"Sakura","amenity":"restaurant"},"name":"Sakura","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/San Marco":{"tags":{"name":"San Marco","amenity":"restaurant"},"name":"San Marco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Santorini":{"tags":{"name":"Santorini","amenity":"restaurant"},"name":"Santorini","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schwarzer Adler":{"tags":{"name":"Schwarzer Adler","amenity":"restaurant"},"name":"Schwarzer Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schützenhaus":{"tags":{"name":"Schützenhaus","amenity":"restaurant"},"name":"Schützenhaus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shakey's":{"tags":{"name":"Shakey's","amenity":"restaurant"},"name":"Shakey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shalimar":{"tags":{"name":"Shalimar","amenity":"restaurant"},"name":"Shalimar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shanghai":{"tags":{"name":"Shanghai","amenity":"restaurant"},"name":"Shanghai","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shari's":{"tags":{"name":"Shari's","amenity":"restaurant"},"name":"Shari's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shoney's":{"tags":{"name":"Shoney's","amenity":"restaurant"},"name":"Shoney's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sizzler":{"tags":{"name":"Sizzler","amenity":"restaurant"},"name":"Sizzler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sonne":{"tags":{"name":"Sonne","amenity":"restaurant"},"name":"Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sphinx":{"tags":{"name":"Sphinx","amenity":"restaurant"},"name":"Sphinx","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sportheim":{"tags":{"name":"Sportheim","amenity":"restaurant"},"name":"Sportheim","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Spur":{"tags":{"name":"Spur","amenity":"restaurant"},"name":"Spur","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak 'n Shake":{"tags":{"name":"Steak 'n Shake","cuisine":"burger","amenity":"restaurant"},"name":"Steak 'n Shake","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak House":{"tags":{"name":"Steak House","amenity":"restaurant"},"name":"Steak House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sternen":{"tags":{"name":"Sternen","amenity":"restaurant"},"name":"Sternen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sunset Grill":{"tags":{"name":"Sunset Grill","amenity":"restaurant"},"name":"Sunset Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi":{"tags":{"name":"Sushi","amenity":"restaurant"},"name":"Sushi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi Bar":{"tags":{"name":"Sushi Bar","amenity":"restaurant"},"name":"Sushi Bar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Swiss Chalet":{"tags":{"name":"Swiss Chalet","amenity":"restaurant"},"name":"Swiss Chalet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Syrtaki":{"tags":{"name":"Syrtaki","amenity":"restaurant"},"name":"Syrtaki","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/TGI Friday's":{"tags":{"name":"TGI Friday's","amenity":"restaurant"},"name":"TGI Friday's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taj Mahal":{"tags":{"name":"Taj Mahal","amenity":"restaurant"},"name":"Taj Mahal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taste of India":{"tags":{"name":"Taste of India","amenity":"restaurant"},"name":"Taste of India","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taverna":{"tags":{"name":"Taverna","amenity":"restaurant"},"name":"Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Texas Roadhouse":{"tags":{"name":"Texas Roadhouse","amenity":"restaurant"},"name":"Texas Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/The Cheesecake Factory":{"tags":{"name":"The Cheesecake Factory","amenity":"restaurant"},"name":"The Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toby Carvery":{"tags":{"name":"Toby Carvery","amenity":"restaurant"},"name":"Toby Carvery","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Tony Roma's":{"tags":{"name":"Tony Roma's","amenity":"restaurant"},"name":"Tony Roma's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toscana":{"tags":{"name":"Toscana","amenity":"restaurant"},"name":"Toscana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Trattoria":{"tags":{"name":"Trattoria","amenity":"restaurant"},"name":"Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Traube":{"tags":{"name":"Traube","amenity":"restaurant"},"name":"Traube","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vapiano":{"tags":{"name":"Vapiano","amenity":"restaurant"},"name":"Vapiano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Venezia":{"tags":{"name":"Venezia","amenity":"restaurant"},"name":"Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Village Inn":{"tags":{"name":"Village Inn","amenity":"restaurant"},"name":"Village Inn","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vips":{"tags":{"name":"Vips","amenity":"restaurant"},"name":"Vips","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waffle House":{"tags":{"name":"Waffle House","amenity":"restaurant"},"name":"Waffle House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wagamama":{"tags":{"name":"Wagamama","amenity":"restaurant"},"name":"Wagamama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waldschänke":{"tags":{"name":"Waldschänke","amenity":"restaurant"},"name":"Waldschänke","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Warung":{"tags":{"name":"Warung","amenity":"restaurant"},"name":"Warung","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wasabi":{"tags":{"name":"Wasabi","amenity":"restaurant"},"name":"Wasabi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zizzi":{"tags":{"name":"Zizzi","amenity":"restaurant"},"name":"Zizzi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zorbas":{"tags":{"name":"Zorbas","amenity":"restaurant"},"name":"Zorbas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Hirschen":{"tags":{"name":"Zum Hirschen","amenity":"restaurant"},"name":"Zum Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Löwen":{"tags":{"name":"Zum Löwen","amenity":"restaurant"},"name":"Zum Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Krone":{"tags":{"name":"Zur Krone","amenity":"restaurant"},"name":"Zur Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Linde":{"tags":{"name":"Zur Linde","amenity":"restaurant"},"name":"Zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Post":{"tags":{"name":"Zur Post","amenity":"restaurant"},"name":"Zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Sonne":{"tags":{"name":"Zur Sonne","amenity":"restaurant"},"name":"Zur Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Евразия":{"tags":{"name":"Евразия","amenity":"restaurant"},"name":"Евразия","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ресторан":{"tags":{"name":"Ресторан","amenity":"restaurant"},"name":"Ресторан","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Тануки":{"tags":{"name":"Тануки","amenity":"restaurant"},"name":"Тануки","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Якитория":{"tags":{"name":"Якитория","amenity":"restaurant"},"name":"Якитория","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/رستوران":{"tags":{"name":"رستوران","amenity":"restaurant"},"name":"رستوران","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/مطعم":{"tags":{"name":"مطعم","amenity":"restaurant"},"name":"مطعم","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/はま寿司":{"tags":{"name":"はま寿司","amenity":"restaurant"},"name":"はま寿司","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/びっくりドンキー":{"tags":{"name":"びっくりドンキー","amenity":"restaurant"},"name":"びっくりドンキー","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/やよい軒":{"tags":{"name":"やよい軒","amenity":"restaurant"},"name":"やよい軒","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ガスト":{"tags":{"name":"ガスト","name:en":"Gusto","amenity":"restaurant"},"name":"ガスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ココス":{"tags":{"name":"ココス","amenity":"restaurant"},"name":"ココス","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリア":{"tags":{"name":"サイゼリア","amenity":"restaurant"},"name":"サイゼリア","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリヤ":{"tags":{"name":"サイゼリヤ","amenity":"restaurant"},"name":"サイゼリヤ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョイフル":{"tags":{"name":"ジョイフル","amenity":"restaurant"},"name":"ジョイフル","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョナサン":{"tags":{"name":"ジョナサン","amenity":"restaurant"},"name":"ジョナサン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョリーパスタ":{"tags":{"name":"ジョリーパスタ","amenity":"restaurant"},"name":"ジョリーパスタ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/デニーズ":{"tags":{"name":"デニーズ","amenity":"restaurant"},"name":"デニーズ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/バーミヤン":{"tags":{"name":"バーミヤン","amenity":"restaurant"},"name":"バーミヤン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ロイヤルホスト":{"tags":{"name":"ロイヤルホスト","amenity":"restaurant"},"name":"ロイヤルホスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/丸亀製麺":{"tags":{"name":"丸亀製麺","amenity":"restaurant"},"name":"丸亀製麺","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/八方雲集":{"tags":{"name":"八方雲集","amenity":"restaurant"},"name":"八方雲集","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/夢庵":{"tags":{"name":"夢庵","amenity":"restaurant"},"name":"夢庵","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大戸屋":{"tags":{"name":"大戸屋","amenity":"restaurant"},"name":"大戸屋","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大阪王将":{"tags":{"name":"大阪王将","amenity":"restaurant"},"name":"大阪王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/天下一品":{"tags":{"name":"天下一品","amenity":"restaurant"},"name":"天下一品","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/安楽亭":{"tags":{"name":"安楽亭","amenity":"restaurant"},"name":"安楽亭","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/牛角":{"tags":{"name":"牛角","amenity":"restaurant"},"name":"牛角","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/食堂":{"tags":{"name":"食堂","amenity":"restaurant"},"name":"食堂","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/餃子の王将":{"tags":{"name":"餃子の王将","amenity":"restaurant"},"name":"餃子の王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/바다횟집 (Bada Fish Restaurant)":{"tags":{"name":"바다횟집 (Bada Fish Restaurant)","amenity":"restaurant"},"name":"바다횟집 (Bada Fish Restaurant)","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/school/Adolfo Lopez Mateos":{"tags":{"name":"Adolfo Lopez Mateos","amenity":"school"},"name":"Adolfo Lopez Mateos","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Agustin Ya�ez":{"tags":{"name":"Agustin Ya�ez","amenity":"school"},"name":"Agustin Ya�ez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Albert-Schweitzer-Schule":{"tags":{"name":"Albert-Schweitzer-Schule","amenity":"school"},"name":"Albert-Schweitzer-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Amado Nervo":{"tags":{"name":"Amado Nervo","amenity":"school"},"name":"Amado Nervo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Astrid-Lindgren-Schule":{"tags":{"name":"Astrid-Lindgren-Schule","amenity":"school"},"name":"Astrid-Lindgren-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Benito Juarez":{"tags":{"name":"Benito Juarez","amenity":"school"},"name":"Benito Juarez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Brown School":{"tags":{"name":"Brown School","amenity":"school"},"name":"Brown School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/CEM":{"tags":{"name":"CEM","amenity":"school"},"name":"CEM","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Center School":{"tags":{"name":"Center School","amenity":"school"},"name":"Center School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central Elementary School":{"tags":{"name":"Central Elementary School","amenity":"school"},"name":"Central Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central High School":{"tags":{"name":"Central High School","amenity":"school"},"name":"Central High School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central School":{"tags":{"name":"Central School","amenity":"school"},"name":"Central School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Colegio San José":{"tags":{"name":"Colegio San José","amenity":"school"},"name":"Colegio San José","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Collège Jean Moulin":{"tags":{"name":"Collège Jean Moulin","amenity":"school"},"name":"Collège Jean Moulin","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Collège privé Saint-Joseph":{"tags":{"name":"Collège privé Saint-Joseph","amenity":"school"},"name":"Collège privé Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Cuauhtemoc":{"tags":{"name":"Cuauhtemoc","amenity":"school"},"name":"Cuauhtemoc","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Curso Comunitario":{"tags":{"name":"Curso Comunitario","amenity":"school"},"name":"Curso Comunitario","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Cursos Comunitarios":{"tags":{"name":"Cursos Comunitarios","amenity":"school"},"name":"Cursos Comunitarios","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/EPP":{"tags":{"name":"EPP","amenity":"school"},"name":"EPP","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Emiliano Zapata":{"tags":{"name":"Emiliano Zapata","amenity":"school"},"name":"Emiliano Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Fairview Elementary School":{"tags":{"name":"Fairview Elementary School","amenity":"school"},"name":"Fairview Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Fairview School":{"tags":{"name":"Fairview School","amenity":"school"},"name":"Fairview School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco I Madero":{"tags":{"name":"Francisco I Madero","amenity":"school"},"name":"Francisco I Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco I. Madero":{"tags":{"name":"Francisco I. Madero","amenity":"school"},"name":"Francisco I. Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco Villa":{"tags":{"name":"Francisco Villa","amenity":"school"},"name":"Francisco Villa","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Franklin Elementary School":{"tags":{"name":"Franklin Elementary School","amenity":"school"},"name":"Franklin Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Franklin School":{"tags":{"name":"Franklin School","amenity":"school"},"name":"Franklin School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Garfield Elementary School":{"tags":{"name":"Garfield Elementary School","amenity":"school"},"name":"Garfield Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Garfield School":{"tags":{"name":"Garfield School","amenity":"school"},"name":"Garfield School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Gimnazjum nr 1":{"tags":{"name":"Gimnazjum nr 1","amenity":"school"},"name":"Gimnazjum nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Government School":{"tags":{"name":"Government School","amenity":"school"},"name":"Government School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Gregorio Torres Quintero":{"tags":{"name":"Gregorio Torres Quintero","amenity":"school"},"name":"Gregorio Torres Quintero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Groupe Scolaire":{"tags":{"name":"Groupe Scolaire","amenity":"school"},"name":"Groupe Scolaire","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Guadalupe Victoria":{"tags":{"name":"Guadalupe Victoria","amenity":"school"},"name":"Guadalupe Victoria","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Highland School":{"tags":{"name":"Highland School","amenity":"school"},"name":"Highland School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Hillcrest Elementary School":{"tags":{"name":"Hillcrest Elementary School","amenity":"school"},"name":"Hillcrest Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Cross School":{"tags":{"name":"Holy Cross School","amenity":"school"},"name":"Holy Cross School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Family School":{"tags":{"name":"Holy Family School","amenity":"school"},"name":"Holy Family School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Trinity School":{"tags":{"name":"Holy Trinity School","amenity":"school"},"name":"Holy Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ignacio Allende":{"tags":{"name":"Ignacio Allende","amenity":"school"},"name":"Ignacio Allende","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ignacio Zaragoza":{"tags":{"name":"Ignacio Zaragoza","amenity":"school"},"name":"Ignacio Zaragoza","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Immaculate Conception School":{"tags":{"name":"Immaculate Conception School","amenity":"school"},"name":"Immaculate Conception School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jackson Elementary School":{"tags":{"name":"Jackson Elementary School","amenity":"school"},"name":"Jackson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jackson School":{"tags":{"name":"Jackson School","amenity":"school"},"name":"Jackson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jefferson Elementary School":{"tags":{"name":"Jefferson Elementary School","amenity":"school"},"name":"Jefferson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jefferson School":{"tags":{"name":"Jefferson School","amenity":"school"},"name":"Jefferson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Clemente Orozco":{"tags":{"name":"Jose Clemente Orozco","amenity":"school"},"name":"Jose Clemente Orozco","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Ma Morelos Y Pavon":{"tags":{"name":"Jose Ma Morelos Y Pavon","amenity":"school"},"name":"Jose Ma Morelos Y Pavon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Vasconcelos":{"tags":{"name":"Jose Vasconcelos","amenity":"school"},"name":"Jose Vasconcelos","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Josefa Ortiz De Dominguez":{"tags":{"name":"Josefa Ortiz De Dominguez","amenity":"school"},"name":"Josefa Ortiz De Dominguez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Juan Escutia":{"tags":{"name":"Juan Escutia","amenity":"school"},"name":"Juan Escutia","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Justo Sierra":{"tags":{"name":"Justo Sierra","amenity":"school"},"name":"Justo Sierra","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Kumon":{"tags":{"name":"Kumon","amenity":"school"},"name":"Kumon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lazaro Cardenas":{"tags":{"name":"Lazaro Cardenas","amenity":"school"},"name":"Lazaro Cardenas","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lazaro Cardenas Del Rio":{"tags":{"name":"Lazaro Cardenas Del Rio","amenity":"school"},"name":"Lazaro Cardenas Del Rio","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Leona Vicario":{"tags":{"name":"Leona Vicario","amenity":"school"},"name":"Leona Vicario","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Liberty Elementary School":{"tags":{"name":"Liberty Elementary School","amenity":"school"},"name":"Liberty Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Liberty School":{"tags":{"name":"Liberty School","amenity":"school"},"name":"Liberty School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lincoln Elementary School":{"tags":{"name":"Lincoln Elementary School","amenity":"school"},"name":"Lincoln Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lincoln School":{"tags":{"name":"Lincoln School","amenity":"school"},"name":"Lincoln School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Longfellow Elementary School":{"tags":{"name":"Longfellow Elementary School","amenity":"school"},"name":"Longfellow Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Longfellow School":{"tags":{"name":"Longfellow School","amenity":"school"},"name":"Longfellow School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Madison Elementary School":{"tags":{"name":"Madison Elementary School","amenity":"school"},"name":"Madison Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Manuel Lopez Cotilla":{"tags":{"name":"Manuel Lopez Cotilla","amenity":"school"},"name":"Manuel Lopez Cotilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Maple Grove School":{"tags":{"name":"Maple Grove School","amenity":"school"},"name":"Maple Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/McKinley Elementary School":{"tags":{"name":"McKinley Elementary School","amenity":"school"},"name":"McKinley Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/McKinley School":{"tags":{"name":"McKinley School","amenity":"school"},"name":"McKinley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miguel Hidalgo":{"tags":{"name":"Miguel Hidalgo","amenity":"school"},"name":"Miguel Hidalgo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miguel Hidalgo Y Costilla":{"tags":{"name":"Miguel Hidalgo Y Costilla","amenity":"school"},"name":"Miguel Hidalgo Y Costilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miller School":{"tags":{"name":"Miller School","amenity":"school"},"name":"Miller School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mount Pleasant School":{"tags":{"name":"Mount Pleasant School","amenity":"school"},"name":"Mount Pleasant School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mount Zion School":{"tags":{"name":"Mount Zion School","amenity":"school"},"name":"Mount Zion School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mountain View Elementary School":{"tags":{"name":"Mountain View Elementary School","amenity":"school"},"name":"Mountain View Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/New Hope School":{"tags":{"name":"New Hope School","amenity":"school"},"name":"New Hope School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Nicolas Bravo":{"tags":{"name":"Nicolas Bravo","amenity":"school"},"name":"Nicolas Bravo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ni�os Heroes":{"tags":{"name":"Ni�os Heroes","amenity":"school"},"name":"Ni�os Heroes","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Nombre En Tramite":{"tags":{"name":"Nombre En Tramite","amenity":"school"},"name":"Nombre En Tramite","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/North Elementary School":{"tags":{"name":"North Elementary School","amenity":"school"},"name":"North Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Oak Grove School":{"tags":{"name":"Oak Grove School","amenity":"school"},"name":"Oak Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pedro Moreno":{"tags":{"name":"Pedro Moreno","amenity":"school"},"name":"Pedro Moreno","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pestalozzischule":{"tags":{"name":"Pestalozzischule","amenity":"school"},"name":"Pestalozzischule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pine Grove School":{"tags":{"name":"Pine Grove School","amenity":"school"},"name":"Pine Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant Hill School":{"tags":{"name":"Pleasant Hill School","amenity":"school"},"name":"Pleasant Hill School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant Valley School":{"tags":{"name":"Pleasant Valley School","amenity":"school"},"name":"Pleasant Valley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant View School":{"tags":{"name":"Pleasant View School","amenity":"school"},"name":"Pleasant View School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Primaria Comunitaria":{"tags":{"name":"Primaria Comunitaria","amenity":"school"},"name":"Primaria Comunitaria","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ramon Corona":{"tags":{"name":"Ramon Corona","amenity":"school"},"name":"Ramon Corona","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ricardo Flores Magon":{"tags":{"name":"Ricardo Flores Magon","amenity":"school"},"name":"Ricardo Flores Magon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Riverside School":{"tags":{"name":"Riverside School","amenity":"school"},"name":"Riverside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Roosevelt Elementary School":{"tags":{"name":"Roosevelt Elementary School","amenity":"school"},"name":"Roosevelt Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Roosevelt School":{"tags":{"name":"Roosevelt School","amenity":"school"},"name":"Roosevelt School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/SD":{"tags":{"name":"SD","amenity":"school"},"name":"SD","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/SDN":{"tags":{"name":"SDN","amenity":"school"},"name":"SDN","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Sacred Heart School":{"tags":{"name":"Sacred Heart School","amenity":"school"},"name":"Sacred Heart School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Francis School":{"tags":{"name":"Saint Francis School","amenity":"school"},"name":"Saint Francis School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint James School":{"tags":{"name":"Saint James School","amenity":"school"},"name":"Saint James School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Johns School":{"tags":{"name":"Saint Johns School","amenity":"school"},"name":"Saint Johns School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Joseph School":{"tags":{"name":"Saint Joseph School","amenity":"school"},"name":"Saint Joseph School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Josephs School":{"tags":{"name":"Saint Josephs School","amenity":"school"},"name":"Saint Josephs School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Kizito Primary School":{"tags":{"name":"Saint Kizito Primary School","amenity":"school"},"name":"Saint Kizito Primary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Mary School":{"tags":{"name":"Saint Mary School","amenity":"school"},"name":"Saint Mary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Marys School":{"tags":{"name":"Saint Marys School","amenity":"school"},"name":"Saint Marys School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Patricks School":{"tags":{"name":"Saint Patricks School","amenity":"school"},"name":"Saint Patricks School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Paul School":{"tags":{"name":"Saint Paul School","amenity":"school"},"name":"Saint Paul School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Pauls School":{"tags":{"name":"Saint Pauls School","amenity":"school"},"name":"Saint Pauls School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Peters School":{"tags":{"name":"Saint Peters School","amenity":"school"},"name":"Saint Peters School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Schillerschule":{"tags":{"name":"Schillerschule","amenity":"school"},"name":"Schillerschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 1":{"tags":{"name":"School Number 1","amenity":"school"},"name":"School Number 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 2":{"tags":{"name":"School Number 2","amenity":"school"},"name":"School Number 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 3":{"tags":{"name":"School Number 3","amenity":"school"},"name":"School Number 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 4":{"tags":{"name":"School Number 4","amenity":"school"},"name":"School Number 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Smith School":{"tags":{"name":"Smith School","amenity":"school"},"name":"Smith School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/South Elementary School":{"tags":{"name":"South Elementary School","amenity":"school"},"name":"South Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Sunnyside School":{"tags":{"name":"Sunnyside School","amenity":"school"},"name":"Sunnyside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 1":{"tags":{"name":"Szkoła Podstawowa nr 1","amenity":"school"},"name":"Szkoła Podstawowa nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 2":{"tags":{"name":"Szkoła Podstawowa nr 2","amenity":"school"},"name":"Szkoła Podstawowa nr 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 3":{"tags":{"name":"Szkoła Podstawowa nr 3","amenity":"school"},"name":"Szkoła Podstawowa nr 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Trinity School":{"tags":{"name":"Trinity School","amenity":"school"},"name":"Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/UNIDAD EDUCATIVA":{"tags":{"name":"UNIDAD EDUCATIVA","amenity":"school"},"name":"UNIDAD EDUCATIVA","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Union School":{"tags":{"name":"Union School","amenity":"school"},"name":"Union School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Valentin Gomez Farias":{"tags":{"name":"Valentin Gomez Farias","amenity":"school"},"name":"Valentin Gomez Farias","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Venustiano Carranza":{"tags":{"name":"Venustiano Carranza","amenity":"school"},"name":"Venustiano Carranza","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Vicente Guerrero":{"tags":{"name":"Vicente Guerrero","amenity":"school"},"name":"Vicente Guerrero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Volkshochschule":{"tags":{"name":"Volkshochschule","amenity":"school"},"name":"Volkshochschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Volksschule":{"tags":{"name":"Volksschule","amenity":"school"},"name":"Volksschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Washington Elementary School":{"tags":{"name":"Washington Elementary School","amenity":"school"},"name":"Washington Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Washington School":{"tags":{"name":"Washington School","amenity":"school"},"name":"Washington School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/West Elementary School":{"tags":{"name":"West Elementary School","amenity":"school"},"name":"West Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/White School":{"tags":{"name":"White School","amenity":"school"},"name":"White School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Wilson Elementary School":{"tags":{"name":"Wilson Elementary School","amenity":"school"},"name":"Wilson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Wilson School":{"tags":{"name":"Wilson School","amenity":"school"},"name":"Wilson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Általános iskola":{"tags":{"name":"Általános iskola","amenity":"school"},"name":"Általános iskola","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Jules Ferry":{"tags":{"name":"École Jules Ferry","amenity":"school"},"name":"École Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Notre-Dame":{"tags":{"name":"École Notre-Dame","amenity":"school"},"name":"École Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Saint-Joseph":{"tags":{"name":"École Saint-Joseph","amenity":"school"},"name":"École Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire Jean Jaurès":{"tags":{"name":"École primaire Jean Jaurès","amenity":"school"},"name":"École primaire Jean Jaurès","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire Jules Ferry":{"tags":{"name":"École primaire Jules Ferry","amenity":"school"},"name":"École primaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Notre-Dame":{"tags":{"name":"École primaire privée Notre-Dame","amenity":"school"},"name":"École primaire privée Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Saint-Joseph":{"tags":{"name":"École primaire privée Saint-Joseph","amenity":"school"},"name":"École primaire privée Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Sainte-Marie":{"tags":{"name":"École primaire privée Sainte-Marie","amenity":"school"},"name":"École primaire privée Sainte-Marie","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École élémentaire Jules Ferry":{"tags":{"name":"École élémentaire Jules Ferry","amenity":"school"},"name":"École élémentaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Școala Generală":{"tags":{"name":"Școala Generală","amenity":"school"},"name":"Școala Generală","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Școală":{"tags":{"name":"Școală","amenity":"school"},"name":"Școală","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Вечерняя школа":{"tags":{"name":"Вечерняя школа","amenity":"school"},"name":"Вечерняя школа","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Гимназия №1":{"tags":{"name":"Гимназия №1","amenity":"school"},"name":"Гимназия №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №1":{"tags":{"name":"Средняя школа №1","amenity":"school"},"name":"Средняя школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №2":{"tags":{"name":"Средняя школа №2","amenity":"school"},"name":"Средняя школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №3":{"tags":{"name":"Средняя школа №3","amenity":"school"},"name":"Средняя школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 1":{"tags":{"name":"Школа № 1","amenity":"school"},"name":"Школа № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 2":{"tags":{"name":"Школа № 2","amenity":"school"},"name":"Школа № 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 3":{"tags":{"name":"Школа № 3","amenity":"school"},"name":"Школа № 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 4":{"tags":{"name":"Школа № 4","amenity":"school"},"name":"Школа № 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 5":{"tags":{"name":"Школа № 5","amenity":"school"},"name":"Школа № 5","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №1":{"tags":{"name":"Школа №1","amenity":"school"},"name":"Школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №10":{"tags":{"name":"Школа №10","amenity":"school"},"name":"Школа №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №11":{"tags":{"name":"Школа №11","amenity":"school"},"name":"Школа №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №12":{"tags":{"name":"Школа №12","amenity":"school"},"name":"Школа №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №13":{"tags":{"name":"Школа №13","amenity":"school"},"name":"Школа №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №14":{"tags":{"name":"Школа №14","amenity":"school"},"name":"Школа №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №15":{"tags":{"name":"Школа №15","amenity":"school"},"name":"Школа №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №16":{"tags":{"name":"Школа №16","amenity":"school"},"name":"Школа №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №17":{"tags":{"name":"Школа №17","amenity":"school"},"name":"Школа №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №18":{"tags":{"name":"Школа №18","amenity":"school"},"name":"Школа №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №19":{"tags":{"name":"Школа №19","amenity":"school"},"name":"Школа №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №2":{"tags":{"name":"Школа №2","amenity":"school"},"name":"Школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №20":{"tags":{"name":"Школа №20","amenity":"school"},"name":"Школа №20","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №21":{"tags":{"name":"Школа №21","amenity":"school"},"name":"Школа №21","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №22":{"tags":{"name":"Школа №22","amenity":"school"},"name":"Школа №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №23":{"tags":{"name":"Школа №23","amenity":"school"},"name":"Школа №23","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №24":{"tags":{"name":"Школа №24","amenity":"school"},"name":"Школа №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №25":{"tags":{"name":"Школа №25","amenity":"school"},"name":"Школа №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №26":{"tags":{"name":"Школа №26","amenity":"school"},"name":"Школа №26","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №27":{"tags":{"name":"Школа №27","amenity":"school"},"name":"Школа №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №28":{"tags":{"name":"Школа №28","amenity":"school"},"name":"Школа №28","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №3":{"tags":{"name":"Школа №3","amenity":"school"},"name":"Школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №31":{"tags":{"name":"Школа №31","amenity":"school"},"name":"Школа №31","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №35":{"tags":{"name":"Школа №35","amenity":"school"},"name":"Школа №35","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №4":{"tags":{"name":"Школа №4","amenity":"school"},"name":"Школа №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №5":{"tags":{"name":"Школа №5","amenity":"school"},"name":"Школа №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №6":{"tags":{"name":"Школа №6","amenity":"school"},"name":"Школа №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №7":{"tags":{"name":"Школа №7","amenity":"school"},"name":"Школа №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №8":{"tags":{"name":"Школа №8","amenity":"school"},"name":"Школа №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №9":{"tags":{"name":"Школа №9","amenity":"school"},"name":"Школа №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/مدرسة":{"tags":{"name":"مدرسة","amenity":"school"},"name":"مدرسة","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/مدرسه":{"tags":{"name":"مدرسه","amenity":"school"},"name":"مدرسه","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立南中学校":{"tags":{"name":"市立南中学校","amenity":"school"},"name":"市立南中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立南小学校":{"tags":{"name":"市立南小学校","amenity":"school"},"name":"市立南小学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立東中学校":{"tags":{"name":"市立東中学校","amenity":"school"},"name":"市立東中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/social_facility/Safe Haven":{"tags":{"name":"Safe Haven","amenity":"social_facility"},"name":"Safe Haven","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Детский дом":{"tags":{"name":"Детский дом","amenity":"social_facility"},"name":"Детский дом","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Социальный участковый":{"tags":{"name":"Социальный участковый","amenity":"social_facility"},"name":"Социальный участковый","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/theatre/Amfiteatr":{"tags":{"name":"Amfiteatr","amenity":"theatre"},"name":"Amfiteatr","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheater":{"tags":{"name":"Amphitheater","amenity":"theatre"},"name":"Amphitheater","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheatre":{"tags":{"name":"Amphitheatre","amenity":"theatre"},"name":"Amphitheatre","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Freilichtbühne":{"tags":{"name":"Freilichtbühne","amenity":"theatre"},"name":"Freilichtbühne","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Comunale":{"tags":{"name":"Teatro Comunale","amenity":"theatre"},"name":"Teatro Comunale","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"leisure/fitness_centre/LA Fitness":{"tags":{"name":"LA Fitness","leisure":"fitness_centre"},"name":"LA Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Planet Fitness":{"tags":{"name":"Planet Fitness","leisure":"fitness_centre"},"name":"Planet Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Snap Fitness":{"tags":{"name":"Snap Fitness","leisure":"fitness_centre"},"name":"Snap Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/playground/Çocuk Parkı":{"tags":{"name":"Çocuk Parkı","leisure":"playground"},"name":"Çocuk Parkı","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/playground/놀이터":{"tags":{"name":"놀이터","leisure":"playground"},"name":"놀이터","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/sports_centre/Anytime Fitness":{"tags":{"name":"Anytime Fitness","leisure":"sports_centre"},"name":"Anytime Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Complejo Municipal de Deportes":{"tags":{"name":"Complejo Municipal de Deportes","leisure":"sports_centre"},"name":"Complejo Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Complexe Sportif":{"tags":{"name":"Complexe Sportif","leisure":"sports_centre"},"name":"Complexe Sportif","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Curves":{"tags":{"name":"Curves","leisure":"sports_centre"},"name":"Curves","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Fitness First":{"tags":{"name":"Fitness First","leisure":"sports_centre"},"name":"Fitness First","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Gold's Gym":{"tags":{"name":"Gold's Gym","leisure":"sports_centre"},"name":"Gold's Gym","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Kieser Training":{"tags":{"name":"Kieser Training","leisure":"sports_centre"},"name":"Kieser Training","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Life Time Fitness":{"tags":{"name":"Life Time Fitness","leisure":"sports_centre"},"name":"Life Time Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/McFit":{"tags":{"name":"McFit","leisure":"sports_centre"},"name":"McFit","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Mrs. Sporty":{"tags":{"name":"Mrs. Sporty","leisure":"sports_centre"},"name":"Mrs. Sporty","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Orlik":{"tags":{"name":"Orlik","leisure":"sports_centre"},"name":"Orlik","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Pabellón Municipal de Deportes":{"tags":{"name":"Pabellón Municipal de Deportes","leisure":"sports_centre"},"name":"Pabellón Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Palestra Comunale":{"tags":{"name":"Palestra Comunale","leisure":"sports_centre"},"name":"Palestra Comunale","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Salle Omnisport":{"tags":{"name":"Salle Omnisport","leisure":"sports_centre"},"name":"Salle Omnisport","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Virgin Active":{"tags":{"name":"Virgin Active","leisure":"sports_centre"},"name":"Virgin Active","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/YMCA":{"tags":{"name":"YMCA","leisure":"sports_centre"},"name":"YMCA","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/ДЮСШ":{"tags":{"name":"ДЮСШ","leisure":"sports_centre"},"name":"ДЮСШ","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Ледовый дворец":{"tags":{"name":"Ледовый дворец","leisure":"sports_centre"},"name":"Ледовый дворец","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/体育館":{"tags":{"name":"体育館","leisure":"sports_centre"},"name":"体育館","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/swimming_pool/Schwimmerbecken":{"tags":{"name":"Schwimmerbecken","leisure":"swimming_pool"},"name":"Schwimmerbecken","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/Yüzme Havuzu":{"tags":{"name":"Yüzme Havuzu","leisure":"swimming_pool"},"name":"Yüzme Havuzu","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/プール":{"tags":{"name":"プール","leisure":"swimming_pool"},"name":"プール","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/游泳池":{"tags":{"name":"游泳池","leisure":"swimming_pool"},"name":"游泳池","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"man_made/windmill/De Hoop":{"tags":{"name":"De Hoop","man_made":"windmill"},"name":"De Hoop","icon":"poi-windmill","geometry":["point","area"],"fields":["building_area"],"suggestion":true},"shop/alcohol/Alko":{"tags":{"name":"Alko","shop":"alcohol"},"name":"Alko","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/BC Liquor Store":{"tags":{"name":"BC Liquor Store","shop":"alcohol"},"name":"BC Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/BWS":{"tags":{"name":"BWS","shop":"alcohol"},"name":"BWS","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Bargain Booze":{"tags":{"name":"Bargain Booze","shop":"alcohol"},"name":"Bargain Booze","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Beer Store":{"tags":{"name":"Beer Store","shop":"alcohol"},"name":"Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Botilleria":{"tags":{"name":"Botilleria","shop":"alcohol"},"name":"Botilleria","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Dan Murphy's":{"tags":{"name":"Dan Murphy's","shop":"alcohol"},"name":"Dan Murphy's","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Gall & Gall":{"tags":{"name":"Gall & Gall","shop":"alcohol"},"name":"Gall & Gall","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/LCBO":{"tags":{"name":"LCBO","shop":"alcohol"},"name":"LCBO","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquor Depot":{"tags":{"name":"Liquor Depot","shop":"alcohol"},"name":"Liquor Depot","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquor Store":{"tags":{"name":"Liquor Store","shop":"alcohol"},"name":"Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquorland":{"tags":{"name":"Liquorland","shop":"alcohol"},"name":"Liquorland","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Mitra":{"tags":{"name":"Mitra","shop":"alcohol"},"name":"Mitra","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Nicolas":{"tags":{"name":"Nicolas","shop":"alcohol"},"name":"Nicolas","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/SAQ":{"tags":{"name":"SAQ","shop":"alcohol"},"name":"SAQ","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Systembolaget":{"tags":{"name":"Systembolaget","shop":"alcohol"},"name":"Systembolaget","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/The Beer Store":{"tags":{"name":"The Beer Store","shop":"alcohol"},"name":"The Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Vinmonopolet":{"tags":{"name":"Vinmonopolet","shop":"alcohol"},"name":"Vinmonopolet","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Алкомаркет":{"tags":{"name":"Алкомаркет","shop":"alcohol"},"name":"Алкомаркет","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Ароматный мир":{"tags":{"name":"Ароматный мир","shop":"alcohol"},"name":"Ароматный мир","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Бристоль":{"tags":{"name":"Бристоль","shop":"alcohol"},"name":"Бристоль","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Градус":{"tags":{"name":"Градус","shop":"alcohol"},"name":"Градус","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Живое пиво":{"tags":{"name":"Живое пиво","shop":"alcohol"},"name":"Живое пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Красное & Белое":{"tags":{"name":"Красное & Белое","shop":"alcohol"},"name":"Красное & Белое","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Норман":{"tags":{"name":"Норман","shop":"alcohol"},"name":"Норман","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Отдохни":{"tags":{"name":"Отдохни","shop":"alcohol"},"name":"Отдохни","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Пиво":{"tags":{"name":"Пиво","shop":"alcohol"},"name":"Пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Разливное пиво":{"tags":{"name":"Разливное пиво","shop":"alcohol"},"name":"Разливное пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/baby_goods/Aubert":{"tags":{"name":"Aubert","shop":"baby_goods"},"name":"Aubert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/baby_goods/Babies R Us":{"tags":{"name":"Babies R Us","shop":"baby_goods"},"name":"Babies R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/baby_goods/BabyOne":{"tags":{"name":"BabyOne","shop":"baby_goods"},"name":"BabyOne","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/AILI":{"tags":{"name":"AILI","shop":"bakery"},"name":"AILI","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Anker":{"tags":{"name":"Anker","shop":"bakery"},"name":"Anker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Awiteks":{"tags":{"name":"Awiteks","shop":"bakery"},"name":"Awiteks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Backshop":{"tags":{"name":"Backshop","shop":"bakery"},"name":"Backshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Backwerk":{"tags":{"name":"Backwerk","shop":"bakery"},"name":"Backwerk","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Baguette":{"tags":{"name":"Baguette","shop":"bakery"},"name":"Baguette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bakers Delight":{"tags":{"name":"Bakers Delight","shop":"bakery"},"name":"Bakers Delight","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bakker Bart":{"tags":{"name":"Bakker Bart","shop":"bakery"},"name":"Bakker Bart","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Banette":{"tags":{"name":"Banette","shop":"bakery"},"name":"Banette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Fuchs":{"tags":{"name":"Bäckerei Fuchs","shop":"bakery"},"name":"Bäckerei Fuchs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Grimminger":{"tags":{"name":"Bäckerei Grimminger","shop":"bakery"},"name":"Bäckerei Grimminger","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Müller":{"tags":{"name":"Bäckerei Müller","shop":"bakery"},"name":"Bäckerei Müller","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Schmidt":{"tags":{"name":"Bäckerei Schmidt","shop":"bakery"},"name":"Bäckerei Schmidt","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Schneider":{"tags":{"name":"Bäckerei Schneider","shop":"bakery"},"name":"Bäckerei Schneider","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Cooplands":{"tags":{"name":"Cooplands","shop":"bakery"},"name":"Cooplands","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Dat Backhus":{"tags":{"name":"Dat Backhus","shop":"bakery"},"name":"Dat Backhus","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Der Beck":{"tags":{"name":"Der Beck","shop":"bakery"},"name":"Der Beck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Der Mann":{"tags":{"name":"Der Mann","shop":"bakery"},"name":"Der Mann","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ditsch":{"tags":{"name":"Ditsch","shop":"bakery"},"name":"Ditsch","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Fornetti":{"tags":{"name":"Fornetti","shop":"bakery"},"name":"Fornetti","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Goeken backen":{"tags":{"name":"Goeken backen","shop":"bakery"},"name":"Goeken backen","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Goldilocks":{"tags":{"name":"Goldilocks","shop":"bakery"},"name":"Goldilocks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Greggs":{"tags":{"name":"Greggs","shop":"bakery"},"name":"Greggs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Hofpfisterei":{"tags":{"name":"Hofpfisterei","shop":"bakery"},"name":"Hofpfisterei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ihle":{"tags":{"name":"Ihle","shop":"bakery"},"name":"Ihle","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Julie's Bakeshop":{"tags":{"name":"Julie's Bakeshop","shop":"bakery"},"name":"Julie's Bakeshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/K&U":{"tags":{"name":"K&U","shop":"bakery"},"name":"K&U","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/K&U Bäckerei":{"tags":{"name":"K&U Bäckerei","shop":"bakery"},"name":"K&U Bäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Kamps":{"tags":{"name":"Kamps","shop":"bakery"},"name":"Kamps","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/La Mie Câline":{"tags":{"name":"La Mie Câline","shop":"bakery"},"name":"La Mie Câline","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Le Crobag":{"tags":{"name":"Le Crobag","shop":"bakery"},"name":"Le Crobag","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Le Fournil":{"tags":{"name":"Le Fournil","shop":"bakery"},"name":"Le Fournil","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Lila Bäcker":{"tags":{"name":"Lila Bäcker","shop":"bakery"},"name":"Lila Bäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Lipóti Pékség":{"tags":{"name":"Lipóti Pékség","shop":"bakery"},"name":"Lipóti Pékség","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Marie Blachère":{"tags":{"name":"Marie Blachère","shop":"bakery"},"name":"Marie Blachère","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Mlinar":{"tags":{"name":"Mlinar","shop":"bakery"},"name":"Mlinar","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Musmanni":{"tags":{"name":"Musmanni","shop":"bakery"},"name":"Musmanni","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Oebel":{"tags":{"name":"Oebel","shop":"bakery"},"name":"Oebel","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Paul":{"tags":{"name":"Paul","shop":"bakery"},"name":"Paul","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Red Ribbon":{"tags":{"name":"Red Ribbon","shop":"bakery"},"name":"Red Ribbon","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Schäfer's":{"tags":{"name":"Schäfer's","shop":"bakery"},"name":"Schäfer's","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Sehne":{"tags":{"name":"Sehne","shop":"bakery"},"name":"Sehne","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Stadtbäckerei":{"tags":{"name":"Stadtbäckerei","shop":"bakery"},"name":"Stadtbäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Steinecke":{"tags":{"name":"Steinecke","shop":"bakery"},"name":"Steinecke","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Sternenbäck":{"tags":{"name":"Sternenbäck","shop":"bakery"},"name":"Sternenbäck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ströck":{"tags":{"name":"Ströck","shop":"bakery"},"name":"Ströck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Wiener Feinbäcker":{"tags":{"name":"Wiener Feinbäcker","shop":"bakery"},"name":"Wiener Feinbäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/von Allwörden":{"tags":{"name":"von Allwörden","shop":"bakery"},"name":"von Allwörden","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Булочная":{"tags":{"name":"Булочная","shop":"bakery"},"name":"Булочная","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Горячий хлеб":{"tags":{"name":"Горячий хлеб","shop":"bakery"},"name":"Горячий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Каравай":{"tags":{"name":"Каравай","shop":"bakery"},"name":"Каравай","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Кулиничи":{"tags":{"name":"Кулиничи","shop":"bakery"},"name":"Кулиничи","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Кулиничі":{"tags":{"name":"Кулиничі","shop":"bakery"},"name":"Кулиничі","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Свежий хлеб":{"tags":{"name":"Свежий хлеб","shop":"bakery"},"name":"Свежий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Хлеб":{"tags":{"name":"Хлеб","shop":"bakery"},"name":"Хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/مخبز":{"tags":{"name":"مخبز","shop":"bakery"},"name":"مخبز","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/مخبزة":{"tags":{"name":"مخبزة","shop":"bakery"},"name":"مخبزة","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نان لواش":{"tags":{"name":"نان لواش","shop":"bakery"},"name":"نان لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی":{"tags":{"name":"نانوایی","shop":"bakery"},"name":"نانوایی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی بربری":{"tags":{"name":"نانوایی بربری","shop":"bakery"},"name":"نانوایی بربری","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی سنگک":{"tags":{"name":"نانوایی سنگک","shop":"bakery"},"name":"نانوایی سنگک","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی سنگکی":{"tags":{"name":"نانوایی سنگکی","shop":"bakery"},"name":"نانوایی سنگکی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی لواش":{"tags":{"name":"نانوایی لواش","shop":"bakery"},"name":"نانوایی لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beauty/Sally Beauty Supply":{"tags":{"name":"Sally Beauty Supply","shop":"beauty"},"name":"Sally Beauty Supply","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","opening_hours","payment_multi"],"suggestion":true},"shop/beauty/Yves Rocher":{"tags":{"name":"Yves Rocher","shop":"beauty"},"name":"Yves Rocher","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Matratzen Concord":{"tags":{"name":"Matratzen Concord","shop":"bed"},"name":"Matratzen Concord","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Mattress Firm":{"tags":{"name":"Mattress Firm","shop":"bed"},"name":"Mattress Firm","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Sleepy's":{"tags":{"name":"Sleepy's","shop":"bed"},"name":"Sleepy's","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/50嵐":{"tags":{"name":"50嵐","shop":"beverages"},"name":"50嵐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Dursty":{"tags":{"name":"Dursty","shop":"beverages"},"name":"Dursty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Edeka Getränkemarkt":{"tags":{"name":"Edeka Getränkemarkt","shop":"beverages"},"name":"Edeka Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Fristo":{"tags":{"name":"Fristo","shop":"beverages"},"name":"Fristo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränke Hoffmann":{"tags":{"name":"Getränke Hoffmann","shop":"beverages"},"name":"Getränke Hoffmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränkeland":{"tags":{"name":"Getränkeland","shop":"beverages"},"name":"Getränkeland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränkemarkt":{"tags":{"name":"Getränkemarkt","shop":"beverages"},"name":"Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Orterer Getränkemarkt":{"tags":{"name":"Orterer Getränkemarkt","shop":"beverages"},"name":"Orterer Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Rewe Getränkemarkt":{"tags":{"name":"Rewe Getränkemarkt","shop":"beverages"},"name":"Rewe Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Trinkgut":{"tags":{"name":"Trinkgut","shop":"beverages"},"name":"Trinkgut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/茶湯會":{"tags":{"name":"茶湯會","shop":"beverages"},"name":"茶湯會","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/Halfords":{"tags":{"name":"Halfords","shop":"bicycle"},"name":"Halfords","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/Веломарка":{"tags":{"name":"Веломарка","shop":"bicycle"},"name":"Веломарка","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/サイクルベースあさひ":{"tags":{"name":"サイクルベースあさひ","shop":"bicycle"},"name":"サイクルベースあさひ","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Betfred":{"tags":{"name":"Betfred","shop":"bookmaker"},"name":"Betfred","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Coral":{"tags":{"name":"Coral","shop":"bookmaker"},"name":"Coral","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Ladbrokes":{"tags":{"name":"Ladbrokes","shop":"bookmaker"},"name":"Ladbrokes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Paddy Power":{"tags":{"name":"Paddy Power","shop":"bookmaker"},"name":"Paddy Power","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/William Hill":{"tags":{"name":"William Hill","shop":"bookmaker"},"name":"William Hill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/ΟΠΑΠ":{"tags":{"name":"ΟΠΑΠ","shop":"bookmaker"},"name":"ΟΠΑΠ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Boucherie Charcuterie":{"tags":{"name":"Boucherie Charcuterie","shop":"butcher"},"name":"Boucherie Charcuterie","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Carnicería":{"tags":{"name":"Carnicería","shop":"butcher"},"name":"Carnicería","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Fleischerei Richter":{"tags":{"name":"Fleischerei Richter","shop":"butcher"},"name":"Fleischerei Richter","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Húsbolt":{"tags":{"name":"Húsbolt","shop":"butcher"},"name":"Húsbolt","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Macelleria":{"tags":{"name":"Macelleria","shop":"butcher"},"name":"Macelleria","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Vinzenzmurr":{"tags":{"name":"Vinzenzmurr","shop":"butcher"},"name":"Vinzenzmurr","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Ариант":{"tags":{"name":"Ариант","shop":"butcher"},"name":"Ариант","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Великолукский мясокомбинат":{"tags":{"name":"Великолукский мясокомбинат","shop":"butcher"},"name":"Великолукский мясокомбинат","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясная лавка":{"tags":{"name":"Мясная лавка","shop":"butcher"},"name":"Мясная лавка","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясницкий ряд":{"tags":{"name":"Мясницкий ряд","shop":"butcher"},"name":"Мясницкий ряд","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясной":{"tags":{"name":"Мясной","shop":"butcher"},"name":"Мясной","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясо":{"tags":{"name":"Мясо","shop":"butcher"},"name":"Мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Наша Ряба":{"tags":{"name":"Наша Ряба","shop":"butcher"},"name":"Наша Ряба","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Свежее мясо":{"tags":{"name":"Свежее мясо","shop":"butcher"},"name":"Свежее мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car/Audi":{"tags":{"name":"Audi","shop":"car"},"name":"Audi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/BMW":{"tags":{"name":"BMW","shop":"car"},"name":"BMW","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Chevrolet":{"tags":{"name":"Chevrolet","shop":"car"},"name":"Chevrolet","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Citroën":{"tags":{"name":"Citroën","shop":"car"},"name":"Citroën","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Dacia":{"tags":{"name":"Dacia","shop":"car"},"name":"Dacia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Fiat":{"tags":{"name":"Fiat","shop":"car"},"name":"Fiat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Ford":{"tags":{"name":"Ford","shop":"car"},"name":"Ford","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Honda":{"tags":{"name":"Honda","shop":"car"},"name":"Honda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Hyundai":{"tags":{"name":"Hyundai","shop":"car"},"name":"Hyundai","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Isuzu":{"tags":{"name":"Isuzu","shop":"car"},"name":"Isuzu","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Kia":{"tags":{"name":"Kia","shop":"car"},"name":"Kia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Land Rover":{"tags":{"name":"Land Rover","shop":"car"},"name":"Land Rover","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Lexus":{"tags":{"name":"Lexus","shop":"car"},"name":"Lexus","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mazda":{"tags":{"name":"Mazda","shop":"car"},"name":"Mazda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mercedes-Benz":{"tags":{"name":"Mercedes-Benz","shop":"car"},"name":"Mercedes-Benz","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mitsubishi":{"tags":{"name":"Mitsubishi","shop":"car"},"name":"Mitsubishi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mitsubishi Motors":{"tags":{"name":"Mitsubishi Motors","shop":"car"},"name":"Mitsubishi Motors","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/NISSAN":{"tags":{"name":"NISSAN","shop":"car"},"name":"NISSAN","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Nissan":{"tags":{"name":"Nissan","shop":"car"},"name":"Nissan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Opel":{"tags":{"name":"Opel","shop":"car"},"name":"Opel","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Peugeot":{"tags":{"name":"Peugeot","shop":"car"},"name":"Peugeot","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Porsche":{"tags":{"name":"Porsche","shop":"car"},"name":"Porsche","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Renault":{"tags":{"name":"Renault","shop":"car"},"name":"Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Seat":{"tags":{"name":"Seat","shop":"car"},"name":"Seat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Skoda":{"tags":{"name":"Skoda","shop":"car"},"name":"Skoda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Subaru":{"tags":{"name":"Subaru","shop":"car"},"name":"Subaru","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Suzuki":{"tags":{"name":"Suzuki","shop":"car"},"name":"Suzuki","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Toyota":{"tags":{"name":"Toyota","shop":"car"},"name":"Toyota","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Volkswagen":{"tags":{"name":"Volkswagen","shop":"car"},"name":"Volkswagen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Volvo":{"tags":{"name":"Volvo","shop":"car"},"name":"Volvo","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Advance Auto Parts":{"tags":{"name":"Advance Auto Parts","shop":"car_parts"},"name":"Advance Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/AutoZone":{"tags":{"name":"AutoZone","shop":"car_parts"},"name":"AutoZone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Brezan":{"tags":{"name":"Brezan","shop":"car_parts"},"name":"Brezan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/NAPA Auto Parts":{"tags":{"name":"NAPA Auto Parts","shop":"car_parts"},"name":"NAPA Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Napa Auto Parts":{"tags":{"name":"Napa Auto Parts","shop":"car_parts"},"name":"Napa Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/O'Reilly Auto Parts":{"tags":{"name":"O'Reilly Auto Parts","shop":"car_parts"},"name":"O'Reilly Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Repco":{"tags":{"name":"Repco","shop":"car_parts"},"name":"Repco","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Tokić":{"tags":{"name":"Tokić","shop":"car_parts"},"name":"Tokić","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/repuestos automotrices":{"tags":{"name":"repuestos automotrices","shop":"car_parts"},"name":"repuestos automotrices","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Автозапчастини":{"tags":{"name":"Автозапчастини","shop":"car_parts"},"name":"Автозапчастини","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Автомир":{"tags":{"name":"Автомир","shop":"car_parts"},"name":"Автомир","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/イエローハット":{"tags":{"name":"イエローハット","shop":"car_parts"},"name":"イエローハット","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/オートバックス":{"tags":{"name":"オートバックス","shop":"car_parts"},"name":"オートバックス","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/タイヤ館":{"tags":{"name":"タイヤ館","shop":"car_parts"},"name":"タイヤ館","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/A.T.U":{"tags":{"name":"A.T.U","shop":"car_repair"},"name":"A.T.U","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Bosch Car Service":{"tags":{"name":"Bosch Car Service","shop":"car_repair"},"name":"Bosch Car Service","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Carglass":{"tags":{"name":"Carglass","shop":"car_repair"},"name":"Carglass","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Euromaster":{"tags":{"name":"Euromaster","shop":"car_repair"},"name":"Euromaster","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Feu Vert":{"tags":{"name":"Feu Vert","shop":"car_repair"},"name":"Feu Vert","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Firestone":{"tags":{"name":"Firestone","shop":"car_repair"},"name":"Firestone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Firestone Complete Auto Care":{"tags":{"name":"Firestone Complete Auto Care","shop":"car_repair"},"name":"Firestone Complete Auto Care","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Garage Renault":{"tags":{"name":"Garage Renault","shop":"car_repair"},"name":"Garage Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Gomeria":{"tags":{"name":"Gomeria","shop":"car_repair"},"name":"Gomeria","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Gomería":{"tags":{"name":"Gomería","shop":"car_repair"},"name":"Gomería","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Goodyear":{"tags":{"name":"Goodyear","shop":"car_repair"},"name":"Goodyear","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Grease Monkey":{"tags":{"name":"Grease Monkey","shop":"car_repair"},"name":"Grease Monkey","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Jiffy Lube":{"tags":{"name":"Jiffy Lube","shop":"car_repair"},"name":"Jiffy Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Kwik Fit":{"tags":{"name":"Kwik Fit","shop":"car_repair"},"name":"Kwik Fit","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Lubricentro":{"tags":{"name":"Lubricentro","shop":"car_repair"},"name":"Lubricentro","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Meineke":{"tags":{"name":"Meineke","shop":"car_repair"},"name":"Meineke","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Mekonomen":{"tags":{"name":"Mekonomen","shop":"car_repair"},"name":"Mekonomen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Midas":{"tags":{"name":"Midas","shop":"car_repair"},"name":"Midas","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Mr. Lube":{"tags":{"name":"Mr. Lube","shop":"car_repair"},"name":"Mr. Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Norauto":{"tags":{"name":"Norauto","shop":"car_repair"},"name":"Norauto","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Pep Boys":{"tags":{"name":"Pep Boys","shop":"car_repair"},"name":"Pep Boys","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Pit Stop":{"tags":{"name":"Pit Stop","shop":"car_repair"},"name":"Pit Stop","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Point S":{"tags":{"name":"Point S","shop":"car_repair"},"name":"Point S","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Roady":{"tags":{"name":"Roady","shop":"car_repair"},"name":"Roady","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Sears Auto Center":{"tags":{"name":"Sears Auto Center","shop":"car_repair"},"name":"Sears Auto Center","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Speedy":{"tags":{"name":"Speedy","shop":"car_repair"},"name":"Speedy","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Stacja Kontroli Pojazdów":{"tags":{"name":"Stacja Kontroli Pojazdów","shop":"car_repair"},"name":"Stacja Kontroli Pojazdów","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Taller":{"tags":{"name":"Taller","shop":"car_repair"},"name":"Taller","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Valvoline":{"tags":{"name":"Valvoline","shop":"car_repair"},"name":"Valvoline","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Valvoline Instant Oil Change":{"tags":{"name":"Valvoline Instant Oil Change","shop":"car_repair"},"name":"Valvoline Instant Oil Change","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Wulkanizacja":{"tags":{"name":"Wulkanizacja","shop":"car_repair"},"name":"Wulkanizacja","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/ÖAMTC":{"tags":{"name":"ÖAMTC","shop":"car_repair"},"name":"ÖAMTC","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автомастерская":{"tags":{"name":"Автомастерская","shop":"car_repair"},"name":"Автомастерская","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Авторемонт":{"tags":{"name":"Авторемонт","shop":"car_repair"},"name":"Авторемонт","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автосервис":{"tags":{"name":"Автосервис","shop":"car_repair"},"name":"Автосервис","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автосервис+шиномонтаж":{"tags":{"name":"Автосервис+шиномонтаж","shop":"car_repair"},"name":"Автосервис+шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Замена масла":{"tags":{"name":"Замена масла","shop":"car_repair"},"name":"Замена масла","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/СТО":{"tags":{"name":"СТО","shop":"car_repair"},"name":"СТО","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Шиномонтаж":{"tags":{"name":"Шиномонтаж","shop":"car_repair"},"name":"Шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/шиномонтаж":{"tags":{"name":"шиномонтаж","shop":"car_repair"},"name":"шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/carpet/Carpet Right":{"tags":{"name":"Carpet Right","shop":"carpet"},"name":"Carpet Right","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/carpet/Carpetright":{"tags":{"name":"Carpetright","shop":"carpet"},"name":"Carpetright","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Age UK":{"tags":{"name":"Age UK","shop":"charity"},"name":"Age UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Barnardo's":{"tags":{"name":"Barnardo's","shop":"charity"},"name":"Barnardo's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/British Heart Foundation":{"tags":{"name":"British Heart Foundation","shop":"charity"},"name":"British Heart Foundation","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Cancer Research UK":{"tags":{"name":"Cancer Research UK","shop":"charity"},"name":"Cancer Research UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Oxfam":{"tags":{"name":"Oxfam","shop":"charity"},"name":"Oxfam","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Salvation Army":{"tags":{"name":"Salvation Army","shop":"charity"},"name":"Salvation Army","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Scope":{"tags":{"name":"Scope","shop":"charity"},"name":"Scope","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Sue Ryder":{"tags":{"name":"Sue Ryder","shop":"charity"},"name":"Sue Ryder","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/7 Дней":{"tags":{"name":"7 Дней","shop":"chemist"},"name":"7 Дней","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Bipa":{"tags":{"name":"Bipa","shop":"chemist"},"name":"Bipa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Budnikowsky":{"tags":{"name":"Budnikowsky","shop":"chemist"},"name":"Budnikowsky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Etos":{"tags":{"name":"Etos","shop":"chemist"},"name":"Etos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Kruidvat":{"tags":{"name":"Kruidvat","shop":"chemist"},"name":"Kruidvat","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Matas":{"tags":{"name":"Matas","shop":"chemist"},"name":"Matas","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Müller":{"tags":{"name":"Müller","shop":"chemist"},"name":"Müller","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Rossmann":{"tags":{"name":"Rossmann","shop":"chemist"},"name":"Rossmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Schlecker":{"tags":{"name":"Schlecker","shop":"chemist"},"name":"Schlecker","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Teta":{"tags":{"name":"Teta","shop":"chemist"},"name":"Teta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Trekpleister":{"tags":{"name":"Trekpleister","shop":"chemist"},"name":"Trekpleister","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Watsons":{"tags":{"name":"Watsons","shop":"chemist"},"name":"Watsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/dm":{"tags":{"name":"dm","shop":"chemist"},"name":"dm","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Бытовая химия":{"tags":{"name":"Бытовая химия","shop":"chemist"},"name":"Бытовая химия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Магнит Косметик":{"tags":{"name":"Магнит Косметик","shop":"chemist"},"name":"Магнит Косметик","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Мила":{"tags":{"name":"Мила","shop":"chemist"},"name":"Мила","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Остров чистоты":{"tags":{"name":"Остров чистоты","shop":"chemist"},"name":"Остров чистоты","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Рубль Бум":{"tags":{"name":"Рубль Бум","shop":"chemist"},"name":"Рубль Бум","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Улыбка радуги":{"tags":{"name":"Улыбка радуги","shop":"chemist"},"name":"Улыбка радуги","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/屈臣氏":{"tags":{"name":"屈臣氏","shop":"chemist"},"name":"屈臣氏","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/康是美":{"tags":{"name":"康是美","shop":"chemist"},"name":"康是美","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/AOKI":{"tags":{"name":"AOKI","shop":"clothes"},"name":"AOKI","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/AWG":{"tags":{"name":"AWG","shop":"clothes"},"name":"AWG","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ackermans":{"tags":{"name":"Ackermans","shop":"clothes"},"name":"Ackermans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Adidas":{"tags":{"name":"Adidas","shop":"clothes"},"name":"Adidas","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/American Apparel":{"tags":{"name":"American Apparel","shop":"clothes"},"name":"American Apparel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/American Eagle Outfitters":{"tags":{"name":"American Eagle Outfitters","shop":"clothes"},"name":"American Eagle Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Anthropologie":{"tags":{"name":"Anthropologie","shop":"clothes"},"name":"Anthropologie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ardene":{"tags":{"name":"Ardene","shop":"clothes"},"name":"Ardene","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Armand Thiery":{"tags":{"name":"Armand Thiery","shop":"clothes"},"name":"Armand Thiery","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Banana Republic":{"tags":{"name":"Banana Republic","shop":"clothes"},"name":"Banana Republic","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Benetton":{"tags":{"name":"Benetton","shop":"clothes"},"name":"Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bershka":{"tags":{"name":"Bershka","shop":"clothes"},"name":"Bershka","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bonita":{"tags":{"name":"Bonita","shop":"clothes"},"name":"Bonita","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bonobo":{"tags":{"name":"Bonobo","shop":"clothes"},"name":"Bonobo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Brooks Brothers":{"tags":{"name":"Brooks Brothers","shop":"clothes"},"name":"Brooks Brothers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burberry":{"tags":{"name":"Burberry","shop":"clothes"},"name":"Burberry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burlington Coat Factory":{"tags":{"name":"Burlington Coat Factory","shop":"clothes"},"name":"Burlington Coat Factory","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burton":{"tags":{"name":"Burton","shop":"clothes"},"name":"Burton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/C&A":{"tags":{"name":"C&A","shop":"clothes"},"name":"C&A","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cache Cache":{"tags":{"name":"Cache Cache","shop":"clothes"},"name":"Cache Cache","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Calvin Klein":{"tags":{"name":"Calvin Klein","shop":"clothes"},"name":"Calvin Klein","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Calzedonia":{"tags":{"name":"Calzedonia","shop":"clothes"},"name":"Calzedonia","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Camaïeu":{"tags":{"name":"Camaïeu","shop":"clothes"},"name":"Camaïeu","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Caroll":{"tags":{"name":"Caroll","shop":"clothes"},"name":"Caroll","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Carter's":{"tags":{"name":"Carter's","shop":"clothes"},"name":"Carter's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cecil":{"tags":{"name":"Cecil","shop":"clothes"},"name":"Cecil","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Celio":{"tags":{"name":"Celio","shop":"clothes"},"name":"Celio","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Charles Vögele":{"tags":{"name":"Charles Vögele","shop":"clothes"},"name":"Charles Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Chico's":{"tags":{"name":"Chico's","shop":"clothes"},"name":"Chico's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cropp":{"tags":{"name":"Cropp","shop":"clothes"},"name":"Cropp","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cubus":{"tags":{"name":"Cubus","shop":"clothes"},"name":"Cubus","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Desigual":{"tags":{"name":"Desigual","shop":"clothes"},"name":"Desigual","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Devred":{"tags":{"name":"Devred","shop":"clothes"},"name":"Devred","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Didi":{"tags":{"name":"Didi","shop":"clothes"},"name":"Didi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Diesel":{"tags":{"name":"Diesel","shop":"clothes"},"name":"Diesel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dorothy Perkins":{"tags":{"name":"Dorothy Perkins","shop":"clothes"},"name":"Dorothy Perkins","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dress Barn":{"tags":{"name":"Dress Barn","shop":"clothes"},"name":"Dress Barn","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dressmann":{"tags":{"name":"Dressmann","shop":"clothes"},"name":"Dressmann","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Eddie Bauer":{"tags":{"name":"Eddie Bauer","shop":"clothes"},"name":"Eddie Bauer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Edgars":{"tags":{"name":"Edgars","shop":"clothes"},"name":"Edgars","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Engbers":{"tags":{"name":"Engbers","shop":"clothes"},"name":"Engbers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ernsting's family":{"tags":{"name":"Ernsting's family","shop":"clothes"},"name":"Ernsting's family","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Esprit":{"tags":{"name":"Esprit","shop":"clothes"},"name":"Esprit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Etam":{"tags":{"name":"Etam","shop":"clothes"},"name":"Etam","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Express":{"tags":{"name":"Express","shop":"clothes"},"name":"Express","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Fat Face":{"tags":{"name":"Fat Face","shop":"clothes"},"name":"Fat Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Forever 21":{"tags":{"name":"Forever 21","shop":"clothes"},"name":"Forever 21","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gant":{"tags":{"name":"Gant","shop":"clothes"},"name":"Gant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gap":{"tags":{"name":"Gap","shop":"clothes"},"name":"Gap","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gerry Weber":{"tags":{"name":"Gerry Weber","shop":"clothes"},"name":"Gerry Weber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gina Laura":{"tags":{"name":"Gina Laura","shop":"clothes"},"name":"Gina Laura","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Guess":{"tags":{"name":"Guess","shop":"clothes"},"name":"Guess","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gymboree":{"tags":{"name":"Gymboree","shop":"clothes"},"name":"Gymboree","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gémo":{"tags":{"name":"Gémo","shop":"clothes"},"name":"Gémo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/H&M":{"tags":{"name":"H&M","shop":"clothes"},"name":"H&M","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hallhuber":{"tags":{"name":"Hallhuber","shop":"clothes"},"name":"Hallhuber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/House":{"tags":{"name":"House","shop":"clothes"},"name":"House","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hugo Boss":{"tags":{"name":"Hugo Boss","shop":"clothes"},"name":"Hugo Boss","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Humana":{"tags":{"name":"Humana","shop":"clothes"},"name":"Humana","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hunkemöller":{"tags":{"name":"Hunkemöller","shop":"clothes"},"name":"Hunkemöller","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Intimissimi":{"tags":{"name":"Intimissimi","shop":"clothes"},"name":"Intimissimi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/JBC":{"tags":{"name":"JBC","shop":"clothes"},"name":"JBC","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jack & Jones":{"tags":{"name":"Jack & Jones","shop":"clothes"},"name":"Jack & Jones","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jack Wolfskin":{"tags":{"name":"Jack Wolfskin","shop":"clothes"},"name":"Jack Wolfskin","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jeans Fritz":{"tags":{"name":"Jeans Fritz","shop":"clothes"},"name":"Jeans Fritz","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jennyfer":{"tags":{"name":"Jennyfer","shop":"clothes"},"name":"Jennyfer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jigsaw":{"tags":{"name":"Jigsaw","shop":"clothes"},"name":"Jigsaw","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jules":{"tags":{"name":"Jules","shop":"clothes"},"name":"Jules","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Justice":{"tags":{"name":"Justice","shop":"clothes"},"name":"Justice","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/KappAhl":{"tags":{"name":"KappAhl","shop":"clothes"},"name":"KappAhl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/KiK":{"tags":{"name":"KiK","shop":"clothes"},"name":"KiK","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Kiabi":{"tags":{"name":"Kiabi","shop":"clothes"},"name":"Kiabi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/La Halle":{"tags":{"name":"La Halle","shop":"clothes"},"name":"La Halle","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lacoste":{"tags":{"name":"Lacoste","shop":"clothes"},"name":"Lacoste","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lane Bryant":{"tags":{"name":"Lane Bryant","shop":"clothes"},"name":"Lane Bryant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Levi's":{"tags":{"name":"Levi's","shop":"clothes"},"name":"Levi's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lindex":{"tags":{"name":"Lindex","shop":"clothes"},"name":"Lindex","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Loft":{"tags":{"name":"Loft","shop":"clothes"},"name":"Loft","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mango":{"tags":{"name":"Mango","shop":"clothes"},"name":"Mango","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Marc O'Polo":{"tags":{"name":"Marc O'Polo","shop":"clothes"},"name":"Marc O'Polo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mark's":{"tags":{"name":"Mark's","shop":"clothes"},"name":"Mark's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Marshalls":{"tags":{"name":"Marshalls","shop":"clothes"},"name":"Marshalls","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Massimo Dutti":{"tags":{"name":"Massimo Dutti","shop":"clothes"},"name":"Massimo Dutti","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Matalan":{"tags":{"name":"Matalan","shop":"clothes"},"name":"Matalan","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Maurices":{"tags":{"name":"Maurices","shop":"clothes"},"name":"Maurices","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Max Mara":{"tags":{"name":"Max Mara","shop":"clothes"},"name":"Max Mara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Men's Wearhouse":{"tags":{"name":"Men's Wearhouse","shop":"clothes"},"name":"Men's Wearhouse","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mexx":{"tags":{"name":"Mexx","shop":"clothes"},"name":"Mexx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Michael Kors":{"tags":{"name":"Michael Kors","shop":"clothes"},"name":"Michael Kors","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mim":{"tags":{"name":"Mim","shop":"clothes"},"name":"Mim","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Monsoon":{"tags":{"name":"Monsoon","shop":"clothes"},"name":"Monsoon","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mr Price":{"tags":{"name":"Mr Price","shop":"clothes"},"name":"Mr Price","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/NKD":{"tags":{"name":"NKD","shop":"clothes"},"name":"NKD","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/New Look":{"tags":{"name":"New Look","shop":"clothes"},"name":"New Look","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/New Yorker":{"tags":{"name":"New Yorker","shop":"clothes"},"name":"New Yorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/NewYorker":{"tags":{"name":"NewYorker","shop":"clothes"},"name":"NewYorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Next":{"tags":{"name":"Next","shop":"clothes"},"name":"Next","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Nike":{"tags":{"name":"Nike","shop":"clothes"},"name":"Nike","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Nordstrom Rack":{"tags":{"name":"Nordstrom Rack","shop":"clothes"},"name":"Nordstrom Rack","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/OVS":{"tags":{"name":"OVS","shop":"clothes"},"name":"OVS","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Okaïdi":{"tags":{"name":"Okaïdi","shop":"clothes"},"name":"Okaïdi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Old Navy":{"tags":{"name":"Old Navy","shop":"clothes"},"name":"Old Navy","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Only":{"tags":{"name":"Only","shop":"clothes"},"name":"Only","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Orchestra":{"tags":{"name":"Orchestra","shop":"clothes"},"name":"Orchestra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Original Marines":{"tags":{"name":"Original Marines","shop":"clothes"},"name":"Original Marines","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Orsay":{"tags":{"name":"Orsay","shop":"clothes"},"name":"Orsay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Outfit":{"tags":{"name":"Outfit","shop":"clothes"},"name":"Outfit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Outlet":{"tags":{"name":"Outlet","shop":"clothes"},"name":"Outlet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Palmers":{"tags":{"name":"Palmers","shop":"clothes"},"name":"Palmers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Peacocks":{"tags":{"name":"Peacocks","shop":"clothes"},"name":"Peacocks","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Peek & Cloppenburg":{"tags":{"name":"Peek & Cloppenburg","shop":"clothes"},"name":"Peek & Cloppenburg","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pep":{"tags":{"name":"Pep","shop":"clothes"},"name":"Pep","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pepco":{"tags":{"name":"Pepco","shop":"clothes"},"name":"Pepco","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Petit Bateau":{"tags":{"name":"Petit Bateau","shop":"clothes"},"name":"Petit Bateau","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pimkie":{"tags":{"name":"Pimkie","shop":"clothes"},"name":"Pimkie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Plato's Closet":{"tags":{"name":"Plato's Closet","shop":"clothes"},"name":"Plato's Closet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Primark":{"tags":{"name":"Primark","shop":"clothes"},"name":"Primark","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Promod":{"tags":{"name":"Promod","shop":"clothes"},"name":"Promod","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pull & Bear":{"tags":{"name":"Pull & Bear","shop":"clothes"},"name":"Pull & Bear","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Reitmans":{"tags":{"name":"Reitmans","shop":"clothes"},"name":"Reitmans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Reserved":{"tags":{"name":"Reserved","shop":"clothes"},"name":"Reserved","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/River Island":{"tags":{"name":"River Island","shop":"clothes"},"name":"River Island","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ross":{"tags":{"name":"Ross","shop":"clothes"},"name":"Ross","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sela":{"tags":{"name":"Sela","shop":"clothes"},"name":"Sela","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sergent Major":{"tags":{"name":"Sergent Major","shop":"clothes"},"name":"Sergent Major","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Shoeby":{"tags":{"name":"Shoeby","shop":"clothes"},"name":"Shoeby","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sisley":{"tags":{"name":"Sisley","shop":"clothes"},"name":"Sisley","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Springfield":{"tags":{"name":"Springfield","shop":"clothes"},"name":"Springfield","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Stefanel":{"tags":{"name":"Stefanel","shop":"clothes"},"name":"Stefanel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Steps":{"tags":{"name":"Steps","shop":"clothes"},"name":"Steps","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Stradivarius":{"tags":{"name":"Stradivarius","shop":"clothes"},"name":"Stradivarius","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Street One":{"tags":{"name":"Street One","shop":"clothes"},"name":"Street One","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Superdry":{"tags":{"name":"Superdry","shop":"clothes"},"name":"Superdry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/TJ Maxx":{"tags":{"name":"TJ Maxx","shop":"clothes"},"name":"TJ Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/TK Maxx":{"tags":{"name":"TK Maxx","shop":"clothes"},"name":"TK Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Takko":{"tags":{"name":"Takko","shop":"clothes"},"name":"Takko","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Talbots":{"tags":{"name":"Talbots","shop":"clothes"},"name":"Talbots","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tally Weijl":{"tags":{"name":"Tally Weijl","shop":"clothes"},"name":"Tally Weijl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tati":{"tags":{"name":"Tati","shop":"clothes"},"name":"Tati","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Terranova":{"tags":{"name":"Terranova","shop":"clothes"},"name":"Terranova","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tesha":{"tags":{"name":"Tesha","shop":"clothes"},"name":"Tesha","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tezenis":{"tags":{"name":"Tezenis","shop":"clothes"},"name":"Tezenis","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The Children's Place":{"tags":{"name":"The Children's Place","shop":"clothes"},"name":"The Children's Place","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The North Face":{"tags":{"name":"The North Face","shop":"clothes"},"name":"The North Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The Sting":{"tags":{"name":"The Sting","shop":"clothes"},"name":"The Sting","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Timberland":{"tags":{"name":"Timberland","shop":"clothes"},"name":"Timberland","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Toko Pakaian":{"tags":{"name":"Toko Pakaian","shop":"clothes"},"name":"Toko Pakaian","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tom Tailor":{"tags":{"name":"Tom Tailor","shop":"clothes"},"name":"Tom Tailor","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tommy Hilfiger":{"tags":{"name":"Tommy Hilfiger","shop":"clothes"},"name":"Tommy Hilfiger","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Topshop":{"tags":{"name":"Topshop","shop":"clothes"},"name":"Topshop","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Triumph":{"tags":{"name":"Triumph","shop":"clothes"},"name":"Triumph","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Truworths":{"tags":{"name":"Truworths","shop":"clothes"},"name":"Truworths","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ulla Popken":{"tags":{"name":"Ulla Popken","shop":"clothes"},"name":"Ulla Popken","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Uniqlo":{"tags":{"name":"Uniqlo","shop":"clothes"},"name":"Uniqlo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/United Colors of Benetton":{"tags":{"name":"United Colors of Benetton","shop":"clothes"},"name":"United Colors of Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Urban Outfitters":{"tags":{"name":"Urban Outfitters","shop":"clothes"},"name":"Urban Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Vero Moda":{"tags":{"name":"Vero Moda","shop":"clothes"},"name":"Vero Moda","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Victoria's Secret":{"tags":{"name":"Victoria's Secret","shop":"clothes"},"name":"Victoria's Secret","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Vögele":{"tags":{"name":"Vögele","shop":"clothes"},"name":"Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/WE":{"tags":{"name":"WE","shop":"clothes"},"name":"WE","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Wibra":{"tags":{"name":"Wibra","shop":"clothes"},"name":"Wibra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Winners":{"tags":{"name":"Winners","shop":"clothes"},"name":"Winners","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Yamamay":{"tags":{"name":"Yamamay","shop":"clothes"},"name":"Yamamay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Zara":{"tags":{"name":"Zara","shop":"clothes"},"name":"Zara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Zeeman":{"tags":{"name":"Zeeman","shop":"clothes"},"name":"Zeeman","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/mister*lady":{"tags":{"name":"mister*lady","shop":"clothes"},"name":"mister*lady","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/s.Oliver":{"tags":{"name":"s.Oliver","shop":"clothes"},"name":"s.Oliver","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Детская одежда":{"tags":{"name":"Детская одежда","shop":"clothes"},"name":"Детская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Женская одежда":{"tags":{"name":"Женская одежда","shop":"clothes"},"name":"Женская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Липненски":{"tags":{"name":"Липненски","shop":"clothes"},"name":"Липненски","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Московская ярмарка":{"tags":{"name":"Московская ярмарка","shop":"clothes"},"name":"Московская ярмарка","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Одежда":{"tags":{"name":"Одежда","shop":"clothes"},"name":"Одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Смешные цены":{"tags":{"name":"Смешные цены","shop":"clothes"},"name":"Смешные цены","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Спецодежда":{"tags":{"name":"Спецодежда","shop":"clothes"},"name":"Спецодежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/しまむら":{"tags":{"name":"しまむら","shop":"clothes"},"name":"しまむら","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/ユニクロ":{"tags":{"name":"ユニクロ","shop":"clothes"},"name":"ユニクロ","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/ワークマン":{"tags":{"name":"ワークマン","shop":"clothes"},"name":"ワークマン","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/洋服の青山":{"tags":{"name":"洋服の青山","shop":"clothes"},"name":"洋服の青山","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/西松屋":{"tags":{"name":"西松屋","shop":"clothes"},"name":"西松屋","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/coffee/Nespresso":{"tags":{"name":"Nespresso","shop":"coffee"},"name":"Nespresso","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/coffee/Tchibo":{"tags":{"name":"Tchibo","shop":"coffee"},"name":"Tchibo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/Apple Store":{"tags":{"name":"Apple Store","shop":"computer"},"name":"Apple Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/DNS":{"tags":{"name":"DNS","shop":"computer"},"name":"DNS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/PC World":{"tags":{"name":"PC World","shop":"computer"},"name":"PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/ДНС":{"tags":{"name":"ДНС","shop":"computer"},"name":"ДНС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Fagyizó":{"tags":{"name":"Fagyizó","shop":"confectionery"},"name":"Fagyizó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Hussel":{"tags":{"name":"Hussel","shop":"confectionery"},"name":"Hussel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Leonidas":{"tags":{"name":"Leonidas","shop":"confectionery"},"name":"Leonidas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/T. SN":{"tags":{"name":"T. SN","shop":"confectionery"},"name":"T. SN","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Thorntons":{"tags":{"name":"Thorntons","shop":"confectionery"},"name":"Thorntons","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/711":{"tags":{"name":"711","shop":"convenience"},"name":"711","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/777":{"tags":{"name":"777","shop":"convenience"},"name":"777","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/24 часа":{"tags":{"name":"24 часа","shop":"convenience"},"name":"24 часа","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/7-Eleven":{"tags":{"name":"7-Eleven","shop":"convenience"},"name":"7-Eleven","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/8 à Huit":{"tags":{"name":"8 à Huit","shop":"convenience"},"name":"8 à Huit","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/99 Speedmart":{"tags":{"name":"99 Speedmart","shop":"convenience"},"name":"99 Speedmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ABC":{"tags":{"name":"ABC","shop":"convenience"},"name":"ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/AMPM":{"tags":{"name":"AMPM","shop":"convenience"},"name":"AMPM","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Aibė":{"tags":{"name":"Aibė","shop":"convenience"},"name":"Aibė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alepa":{"tags":{"name":"Alepa","shop":"convenience"},"name":"Alepa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alfamart":{"tags":{"name":"Alfamart","shop":"convenience"},"name":"Alfamart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alimentara":{"tags":{"name":"Alimentara","shop":"convenience"},"name":"Alimentara","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Almacen":{"tags":{"name":"Almacen","shop":"convenience"},"name":"Almacen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Almacén":{"tags":{"name":"Almacén","shop":"convenience"},"name":"Almacén","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/BP Shop":{"tags":{"name":"BP Shop","shop":"convenience"},"name":"BP Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Baqala":{"tags":{"name":"Baqala","shop":"convenience"},"name":"Baqala","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Best One":{"tags":{"name":"Best One","shop":"convenience"},"name":"Best One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Best-One":{"tags":{"name":"Best-One","shop":"convenience"},"name":"Best-One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Bodega":{"tags":{"name":"Bodega","shop":"convenience"},"name":"Bodega","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Bonjour":{"tags":{"name":"Bonjour","shop":"convenience"},"name":"Bonjour","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/CBA":{"tags":{"name":"CBA","shop":"convenience"},"name":"CBA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/COOP":{"tags":{"name":"COOP","shop":"convenience"},"name":"COOP","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/COOP Jednota":{"tags":{"name":"COOP Jednota","shop":"convenience"},"name":"COOP Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/CU":{"tags":{"name":"CU","shop":"convenience"},"name":"CU","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Casino Shop":{"tags":{"name":"Casino Shop","shop":"convenience"},"name":"Casino Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Centra":{"tags":{"name":"Centra","shop":"convenience"},"name":"Centra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Central Convenience Store":{"tags":{"name":"Central Convenience Store","shop":"convenience"},"name":"Central Convenience Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Circle K":{"tags":{"name":"Circle K","shop":"convenience"},"name":"Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Coop Jednota":{"tags":{"name":"Coop Jednota","shop":"convenience"},"name":"Coop Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Corner Store":{"tags":{"name":"Corner Store","shop":"convenience"},"name":"Corner Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Costcutter":{"tags":{"name":"Costcutter","shop":"convenience"},"name":"Costcutter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Couche-Tard":{"tags":{"name":"Couche-Tard","shop":"convenience"},"name":"Couche-Tard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Cumberland Farms":{"tags":{"name":"Cumberland Farms","shop":"convenience"},"name":"Cumberland Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Daisy Mart":{"tags":{"name":"Daisy Mart","shop":"convenience"},"name":"Daisy Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Delikatesy":{"tags":{"name":"Delikatesy","shop":"convenience"},"name":"Delikatesy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Dollar General":{"tags":{"name":"Dollar General","shop":"convenience"},"name":"Dollar General","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Dépanneur":{"tags":{"name":"Dépanneur","shop":"convenience"},"name":"Dépanneur","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/FamilyMart":{"tags":{"name":"FamilyMart","shop":"convenience"},"name":"FamilyMart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Food Mart":{"tags":{"name":"Food Mart","shop":"convenience"},"name":"Food Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Four Square":{"tags":{"name":"Four Square","shop":"convenience"},"name":"Four Square","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Fresh":{"tags":{"name":"Fresh","shop":"convenience"},"name":"Fresh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Freshmarket":{"tags":{"name":"Freshmarket","shop":"convenience"},"name":"Freshmarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/GS25":{"tags":{"name":"GS25","shop":"convenience"},"name":"GS25","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Groszek":{"tags":{"name":"Groszek","shop":"convenience"},"name":"Groszek","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Hasty Market":{"tags":{"name":"Hasty Market","shop":"convenience"},"name":"Hasty Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Hruška":{"tags":{"name":"Hruška","shop":"convenience"},"name":"Hruška","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Indomaret":{"tags":{"name":"Indomaret","shop":"convenience"},"name":"Indomaret","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Jednota":{"tags":{"name":"Jednota","shop":"convenience"},"name":"Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Joker":{"tags":{"name":"Joker","shop":"convenience"},"name":"Joker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/K-Market":{"tags":{"name":"K-Market","shop":"convenience"},"name":"K-Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Kangaroo Express":{"tags":{"name":"Kangaroo Express","shop":"convenience"},"name":"Kangaroo Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Kisbolt":{"tags":{"name":"Kisbolt","shop":"convenience"},"name":"Kisbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lawson":{"tags":{"name":"Lawson","shop":"convenience"},"name":"Lawson","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lewiatan":{"tags":{"name":"Lewiatan","shop":"convenience"},"name":"Lewiatan","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lifestyle Express":{"tags":{"name":"Lifestyle Express","shop":"convenience"},"name":"Lifestyle Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Londis":{"tags":{"name":"Londis","shop":"convenience"},"name":"Londis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/M&S Simply Food":{"tags":{"name":"M&S Simply Food","shop":"convenience"},"name":"M&S Simply Food","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mac's":{"tags":{"name":"Mac's","shop":"convenience"},"name":"Mac's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mace":{"tags":{"name":"Mace","shop":"convenience"},"name":"Mace","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin":{"tags":{"name":"Magazin","shop":"convenience"},"name":"Magazin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin Mixt":{"tags":{"name":"Magazin Mixt","shop":"convenience"},"name":"Magazin Mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin Non-Stop":{"tags":{"name":"Magazin Non-Stop","shop":"convenience"},"name":"Magazin Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin mixt":{"tags":{"name":"Magazin mixt","shop":"convenience"},"name":"Magazin mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Maxikiosco":{"tags":{"name":"Maxikiosco","shop":"convenience"},"name":"Maxikiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Małpka Express":{"tags":{"name":"Małpka Express","shop":"convenience"},"name":"Małpka Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/McColl's":{"tags":{"name":"McColl's","shop":"convenience"},"name":"McColl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Migrolino":{"tags":{"name":"Migrolino","shop":"convenience"},"name":"Migrolino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini ABC":{"tags":{"name":"Mini ABC","shop":"convenience"},"name":"Mini ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Market":{"tags":{"name":"Mini Market","shop":"convenience"},"name":"Mini Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Market Non-Stop":{"tags":{"name":"Mini Market Non-Stop","shop":"convenience"},"name":"Mini Market Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Mart":{"tags":{"name":"Mini Mart","shop":"convenience"},"name":"Mini Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Stop":{"tags":{"name":"Mini Stop","shop":"convenience"},"name":"Mini Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Minimercado":{"tags":{"name":"Minimercado","shop":"convenience"},"name":"Minimercado","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mlin i pekare":{"tags":{"name":"Mlin i pekare","shop":"convenience"},"name":"Mlin i pekare","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nasz Sklep":{"tags":{"name":"Nasz Sklep","shop":"convenience"},"name":"Nasz Sklep","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nisa":{"tags":{"name":"Nisa","shop":"convenience"},"name":"Nisa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nisa Local":{"tags":{"name":"Nisa Local","shop":"convenience"},"name":"Nisa Local","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK-Mart":{"tags":{"name":"OK-Mart","shop":"convenience"},"name":"OK-Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK便利商店":{"tags":{"name":"OK便利商店","shop":"convenience"},"name":"OK便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK便利店 Circle K":{"tags":{"name":"OK便利店 Circle K","shop":"convenience"},"name":"OK便利店 Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Odido":{"tags":{"name":"Odido","shop":"convenience"},"name":"Odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/On The Run":{"tags":{"name":"On The Run","shop":"convenience"},"name":"On The Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/On the Run":{"tags":{"name":"On the Run","shop":"convenience"},"name":"On the Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/One Stop":{"tags":{"name":"One Stop","shop":"convenience"},"name":"One Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Oxxo":{"tags":{"name":"Oxxo","shop":"convenience"},"name":"Oxxo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Parduotuvė":{"tags":{"name":"Parduotuvė","shop":"convenience"},"name":"Parduotuvė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Petit Casino":{"tags":{"name":"Petit Casino","shop":"convenience"},"name":"Petit Casino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Plaid Pantry":{"tags":{"name":"Plaid Pantry","shop":"convenience"},"name":"Plaid Pantry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Potraviny":{"tags":{"name":"Potraviny","shop":"convenience"},"name":"Potraviny","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Prehrana":{"tags":{"name":"Prehrana","shop":"convenience"},"name":"Prehrana","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Premier":{"tags":{"name":"Premier","shop":"convenience"},"name":"Premier","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Proxi":{"tags":{"name":"Proxi","shop":"convenience"},"name":"Proxi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Proxy":{"tags":{"name":"Proxy","shop":"convenience"},"name":"Proxy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Pulperia":{"tags":{"name":"Pulperia","shop":"convenience"},"name":"Pulperia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Royal Farms":{"tags":{"name":"Royal Farms","shop":"convenience"},"name":"Royal Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sale":{"tags":{"name":"Sale","shop":"convenience"},"name":"Sale","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sari-sari Store":{"tags":{"name":"Sari-sari Store","shop":"convenience"},"name":"Sari-sari Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Select":{"tags":{"name":"Select","shop":"convenience"},"name":"Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Shell Select":{"tags":{"name":"Shell Select","shop":"convenience"},"name":"Shell Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Shop & Go":{"tags":{"name":"Shop & Go","shop":"convenience"},"name":"Shop & Go","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Siwa":{"tags":{"name":"Siwa","shop":"convenience"},"name":"Siwa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sklep spożywczy":{"tags":{"name":"Sklep spożywczy","shop":"convenience"},"name":"Sklep spożywczy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Smíšené zboží":{"tags":{"name":"Smíšené zboží","shop":"convenience"},"name":"Smíšené zboží","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Społem":{"tags":{"name":"Społem","shop":"convenience"},"name":"Społem","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Spätkauf":{"tags":{"name":"Spätkauf","shop":"convenience"},"name":"Spätkauf","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stewart's":{"tags":{"name":"Stewart's","shop":"convenience"},"name":"Stewart's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stores":{"tags":{"name":"Stores","shop":"convenience"},"name":"Stores","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stripes":{"tags":{"name":"Stripes","shop":"convenience"},"name":"Stripes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Studenac":{"tags":{"name":"Studenac","shop":"convenience"},"name":"Studenac","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sunkus":{"tags":{"name":"Sunkus","shop":"convenience"},"name":"Sunkus","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Słoneczko":{"tags":{"name":"Słoneczko","shop":"convenience"},"name":"Słoneczko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/TESCO Lotus Express":{"tags":{"name":"TESCO Lotus Express","shop":"convenience"},"name":"TESCO Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tesco Express":{"tags":{"name":"Tesco Express","shop":"convenience"},"name":"Tesco Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tesco Lotus Express":{"tags":{"name":"Tesco Lotus Express","shop":"convenience"},"name":"Tesco Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tom Market 89":{"tags":{"name":"Tom Market 89","shop":"convenience"},"name":"Tom Market 89","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/United Dairy Farmers":{"tags":{"name":"United Dairy Farmers","shop":"convenience"},"name":"United Dairy Farmers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Vegyesbolt":{"tags":{"name":"Vegyesbolt","shop":"convenience"},"name":"Vegyesbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Večerka":{"tags":{"name":"Večerka","shop":"convenience"},"name":"Večerka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Vival":{"tags":{"name":"Vival","shop":"convenience"},"name":"Vival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Wawa":{"tags":{"name":"Wawa","shop":"convenience"},"name":"Wawa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Weltladen":{"tags":{"name":"Weltladen","shop":"convenience"},"name":"Weltladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/abc":{"tags":{"name":"abc","shop":"convenience"},"name":"abc","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ampm":{"tags":{"name":"ampm","shop":"convenience"},"name":"ampm","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/best-one":{"tags":{"name":"best-one","shop":"convenience"},"name":"best-one","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/odido":{"tags":{"name":"odido","shop":"convenience"},"name":"odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Élelmiszer":{"tags":{"name":"Élelmiszer","shop":"convenience"},"name":"Élelmiszer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Élelmiszerbolt":{"tags":{"name":"Élelmiszerbolt","shop":"convenience"},"name":"Élelmiszerbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Żabka":{"tags":{"name":"Żabka","shop":"convenience"},"name":"Żabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Žabka":{"tags":{"name":"Žabka","shop":"convenience"},"name":"Žabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Августина":{"tags":{"name":"Августина","shop":"convenience"},"name":"Августина","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Авоська":{"tags":{"name":"Авоська","shop":"convenience"},"name":"Авоська","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Агрокомплекс":{"tags":{"name":"Агрокомплекс","shop":"convenience"},"name":"Агрокомплекс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Альянс":{"tags":{"name":"Альянс","shop":"convenience"},"name":"Альянс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Апельсин":{"tags":{"name":"Апельсин","shop":"convenience"},"name":"Апельсин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ассорти":{"tags":{"name":"Ассорти","shop":"convenience"},"name":"Ассорти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Белорусские продукты":{"tags":{"name":"Белорусские продукты","shop":"convenience"},"name":"Белорусские продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Берёзка":{"tags":{"name":"Берёзка","shop":"convenience"},"name":"Берёзка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Везунчик":{"tags":{"name":"Везунчик","shop":"convenience"},"name":"Везунчик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Весна":{"tags":{"name":"Весна","shop":"convenience"},"name":"Весна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ветеран":{"tags":{"name":"Ветеран","shop":"convenience"},"name":"Ветеран","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Визит":{"tags":{"name":"Визит","shop":"convenience"},"name":"Визит","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Виктория":{"tags":{"name":"Виктория","shop":"convenience"},"name":"Виктория","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ВкусВилл":{"tags":{"name":"ВкусВилл","shop":"convenience"},"name":"ВкусВилл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гастроном":{"tags":{"name":"Гастроном","shop":"convenience"},"name":"Гастроном","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гермес":{"tags":{"name":"Гермес","shop":"convenience"},"name":"Гермес","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гурман":{"tags":{"name":"Гурман","shop":"convenience"},"name":"Гурман","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Домашний":{"tags":{"name":"Домашний","shop":"convenience"},"name":"Домашний","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Елена":{"tags":{"name":"Елена","shop":"convenience"},"name":"Елена","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ермолино":{"tags":{"name":"Ермолино","shop":"convenience"},"name":"Ермолино","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Калинка":{"tags":{"name":"Калинка","shop":"convenience"},"name":"Калинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кировский":{"tags":{"name":"Кировский","shop":"convenience"},"name":"Кировский","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Колобок":{"tags":{"name":"Колобок","shop":"convenience"},"name":"Колобок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Колосок":{"tags":{"name":"Колосок","shop":"convenience"},"name":"Колосок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Копеечка":{"tags":{"name":"Копеечка","shop":"convenience"},"name":"Копеечка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Копейка":{"tags":{"name":"Копейка","shop":"convenience"},"name":"Копейка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Корзинка":{"tags":{"name":"Корзинка","shop":"convenience"},"name":"Корзинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Крамниця":{"tags":{"name":"Крамниця","shop":"convenience"},"name":"Крамниця","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кристалл":{"tags":{"name":"Кристалл","shop":"convenience"},"name":"Кристалл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кулинария":{"tags":{"name":"Кулинария","shop":"convenience"},"name":"Кулинария","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Купец":{"tags":{"name":"Купец","shop":"convenience"},"name":"Купец","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ласточка":{"tags":{"name":"Ласточка","shop":"convenience"},"name":"Ласточка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Лидер":{"tags":{"name":"Лидер","shop":"convenience"},"name":"Лидер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Любимый":{"tags":{"name":"Любимый","shop":"convenience"},"name":"Любимый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Люкс":{"tags":{"name":"Люкс","shop":"convenience"},"name":"Люкс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Магазин при АЗС":{"tags":{"name":"Магазин при АЗС","shop":"convenience"},"name":"Магазин при АЗС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мария-Ра":{"tags":{"name":"Мария-Ра","shop":"convenience"},"name":"Мария-Ра","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Маяк":{"tags":{"name":"Маяк","shop":"convenience"},"name":"Маяк","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Меркурий":{"tags":{"name":"Меркурий","shop":"convenience"},"name":"Меркурий","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мечта":{"tags":{"name":"Мечта","shop":"convenience"},"name":"Мечта","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Минимаркет":{"tags":{"name":"Минимаркет","shop":"convenience"},"name":"Минимаркет","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мираж":{"tags":{"name":"Мираж","shop":"convenience"},"name":"Мираж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Надежда":{"tags":{"name":"Надежда","shop":"convenience"},"name":"Надежда","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ника":{"tags":{"name":"Ника","shop":"convenience"},"name":"Ника","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Оазис":{"tags":{"name":"Оазис","shop":"convenience"},"name":"Оазис","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Олимп":{"tags":{"name":"Олимп","shop":"convenience"},"name":"Олимп","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Подсолнух":{"tags":{"name":"Подсолнух","shop":"convenience"},"name":"Подсолнух","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Престиж":{"tags":{"name":"Престиж","shop":"convenience"},"name":"Престиж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукти":{"tags":{"name":"Продукти","shop":"convenience"},"name":"Продукти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продуктовый":{"tags":{"name":"Продуктовый","shop":"convenience"},"name":"Продуктовый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продуктовый магазин":{"tags":{"name":"Продуктовый магазин","shop":"convenience"},"name":"Продуктовый магазин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукты":{"tags":{"name":"Продукты","shop":"convenience"},"name":"Продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукты 24":{"tags":{"name":"Продукты 24","shop":"convenience"},"name":"Продукты 24","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Радуга":{"tags":{"name":"Радуга","shop":"convenience"},"name":"Радуга","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Родны кут":{"tags":{"name":"Родны кут","shop":"convenience"},"name":"Родны кут","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ромашка":{"tags":{"name":"Ромашка","shop":"convenience"},"name":"Ромашка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Русь":{"tags":{"name":"Русь","shop":"convenience"},"name":"Русь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Светлана":{"tags":{"name":"Светлана","shop":"convenience"},"name":"Светлана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Смак":{"tags":{"name":"Смак","shop":"convenience"},"name":"Смак","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Солнечный":{"tags":{"name":"Солнечный","shop":"convenience"},"name":"Солнечный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Татьяна":{"tags":{"name":"Татьяна","shop":"convenience"},"name":"Татьяна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Тройка":{"tags":{"name":"Тройка","shop":"convenience"},"name":"Тройка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/У Палыча":{"tags":{"name":"У Палыча","shop":"convenience"},"name":"У Палыча","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Универсам":{"tags":{"name":"Универсам","shop":"convenience"},"name":"Универсам","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Фортуна":{"tags":{"name":"Фортуна","shop":"convenience"},"name":"Фортуна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Хороший":{"tags":{"name":"Хороший","shop":"convenience"},"name":"Хороший","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Центральный":{"tags":{"name":"Центральный","shop":"convenience"},"name":"Центральный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Чайка":{"tags":{"name":"Чайка","shop":"convenience"},"name":"Чайка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Шанс":{"tags":{"name":"Шанс","shop":"convenience"},"name":"Шанс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Эконом":{"tags":{"name":"Эконом","shop":"convenience"},"name":"Эконом","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Юбилейный":{"tags":{"name":"Юбилейный","shop":"convenience"},"name":"Юбилейный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Юлия":{"tags":{"name":"Юлия","shop":"convenience"},"name":"Юлия","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/продукты":{"tags":{"name":"продукты","shop":"convenience"},"name":"продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/მარკეტი":{"tags":{"name":"მარკეტი","shop":"convenience"},"name":"მარკეტი","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/サンクス":{"tags":{"name":"サンクス","name:en":"sunkus","shop":"convenience"},"name":"サンクス","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/サークルK":{"tags":{"name":"サークルK","name:en":"Circle K","shop":"convenience"},"name":"サークルK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/スリーエフ":{"tags":{"name":"スリーエフ","shop":"convenience"},"name":"スリーエフ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セイコーマート":{"tags":{"name":"セイコーマート","shop":"convenience"},"name":"セイコーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セブンイレブン":{"tags":{"name":"セブンイレブン","name:en":"7-Eleven","shop":"convenience"},"name":"セブンイレブン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セブンイレブン(Seven-Eleven)":{"tags":{"name":"セブンイレブン(Seven-Eleven)","shop":"convenience"},"name":"セブンイレブン(Seven-Eleven)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セーブオン":{"tags":{"name":"セーブオン","shop":"convenience"},"name":"セーブオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/デイリーヤマザキ":{"tags":{"name":"デイリーヤマザキ","shop":"convenience"},"name":"デイリーヤマザキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ファミリーマート":{"tags":{"name":"ファミリーマート","name:en":"FamilyMart","shop":"convenience"},"name":"ファミリーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ポプラ":{"tags":{"name":"ポプラ","shop":"convenience"},"name":"ポプラ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ミニストップ":{"tags":{"name":"ミニストップ","name:en":"MINISTOP","shop":"convenience"},"name":"ミニストップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ヤマザキショップ":{"tags":{"name":"ヤマザキショップ","shop":"convenience"},"name":"ヤマザキショップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ローソン":{"tags":{"name":"ローソン","name:en":"LAWSON","shop":"convenience"},"name":"ローソン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ローソンストア100":{"tags":{"name":"ローソンストア100","shop":"convenience"},"name":"ローソンストア100","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/全家":{"tags":{"name":"全家","shop":"convenience"},"name":"全家","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/全家便利商店":{"tags":{"name":"全家便利商店","shop":"convenience"},"name":"全家便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/萊爾富":{"tags":{"name":"萊爾富","shop":"convenience"},"name":"萊爾富","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/세븐일레븐":{"tags":{"name":"세븐일레븐","shop":"convenience"},"name":"세븐일레븐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/copyshop/FedEx Office":{"tags":{"name":"FedEx Office","shop":"copyshop"},"name":"FedEx Office","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/copyshop/FedEx Office Print and Ship Center":{"tags":{"name":"FedEx Office Print and Ship Center","shop":"copyshop"},"name":"FedEx Office Print and Ship Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Douglas":{"tags":{"name":"Douglas","shop":"cosmetics"},"name":"Douglas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Lush":{"tags":{"name":"Lush","shop":"cosmetics"},"name":"Lush","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Marionnaud":{"tags":{"name":"Marionnaud","shop":"cosmetics"},"name":"Marionnaud","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Sephora":{"tags":{"name":"Sephora","shop":"cosmetics"},"name":"Sephora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/The Body Shop":{"tags":{"name":"The Body Shop","shop":"cosmetics"},"name":"The Body Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Л'Этуаль":{"tags":{"name":"Л'Этуаль","shop":"cosmetics"},"name":"Л'Этуаль","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Магнит косметик":{"tags":{"name":"Магнит косметик","shop":"cosmetics"},"name":"Магнит косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Магнит-Косметик":{"tags":{"name":"Магнит-Косметик","shop":"cosmetics"},"name":"Магнит-Косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Подружка":{"tags":{"name":"Подружка","shop":"cosmetics"},"name":"Подружка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/craft/Hobby Lobby":{"tags":{"name":"Hobby Lobby","shop":"craft"},"name":"Hobby Lobby","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/craft/Michaels":{"tags":{"name":"Michaels","shop":"craft"},"name":"Michaels","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Argos":{"tags":{"name":"Argos","shop":"department_store"},"name":"Argos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Bed Bath & Beyond":{"tags":{"name":"Bed Bath & Beyond","shop":"department_store"},"name":"Bed Bath & Beyond","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Big Lots":{"tags":{"name":"Big Lots","shop":"department_store"},"name":"Big Lots","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Big W":{"tags":{"name":"Big W","shop":"department_store"},"name":"Big W","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Canadian Tire":{"tags":{"name":"Canadian Tire","shop":"department_store"},"name":"Canadian Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Coppel":{"tags":{"name":"Coppel","shop":"department_store"},"name":"Coppel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Debenhams":{"tags":{"name":"Debenhams","shop":"department_store"},"name":"Debenhams","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Dillard's":{"tags":{"name":"Dillard's","shop":"department_store"},"name":"Dillard's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/El Corte Inglés":{"tags":{"name":"El Corte Inglés","shop":"department_store"},"name":"El Corte Inglés","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Galeria Kaufhof":{"tags":{"name":"Galeria Kaufhof","shop":"department_store"},"name":"Galeria Kaufhof","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/HEMA":{"tags":{"name":"HEMA","shop":"department_store"},"name":"HEMA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Harvey Norman":{"tags":{"name":"Harvey Norman","shop":"department_store"},"name":"Harvey Norman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/JCPenney":{"tags":{"name":"JCPenney","shop":"department_store"},"name":"JCPenney","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Karstadt":{"tags":{"name":"Karstadt","shop":"department_store"},"name":"Karstadt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Kmart":{"tags":{"name":"Kmart","shop":"department_store"},"name":"Kmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Kohl's":{"tags":{"name":"Kohl's","shop":"department_store"},"name":"Kohl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Lojas Americanas":{"tags":{"name":"Lojas Americanas","shop":"department_store"},"name":"Lojas Americanas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Macy's":{"tags":{"name":"Macy's","shop":"department_store"},"name":"Macy's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Marks & Spencer":{"tags":{"name":"Marks & Spencer","shop":"department_store"},"name":"Marks & Spencer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Myer":{"tags":{"name":"Myer","shop":"department_store"},"name":"Myer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Nordstrom":{"tags":{"name":"Nordstrom","shop":"department_store"},"name":"Nordstrom","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Sears":{"tags":{"name":"Sears","shop":"department_store"},"name":"Sears","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Shopko":{"tags":{"name":"Shopko","shop":"department_store"},"name":"Shopko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Target":{"tags":{"name":"Target","shop":"department_store"},"name":"Target","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/The Warehouse":{"tags":{"name":"The Warehouse","shop":"department_store"},"name":"The Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Woolworth":{"tags":{"name":"Woolworth","shop":"department_store"},"name":"Woolworth","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Универмаг":{"tags":{"name":"Универмаг","shop":"department_store"},"name":"Универмаг","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Ace Hardware":{"tags":{"name":"Ace Hardware","shop":"doityourself"},"name":"Ace Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/B&Q":{"tags":{"name":"B&Q","shop":"doityourself"},"name":"B&Q","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bauhaus":{"tags":{"name":"Bauhaus","shop":"doityourself"},"name":"Bauhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Biltema":{"tags":{"name":"Biltema","shop":"doityourself"},"name":"Biltema","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Brico":{"tags":{"name":"Brico","shop":"doityourself"},"name":"Brico","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bricomarché":{"tags":{"name":"Bricomarché","shop":"doityourself"},"name":"Bricomarché","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bricorama":{"tags":{"name":"Bricorama","shop":"doityourself"},"name":"Bricorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bunnings Warehouse":{"tags":{"name":"Bunnings Warehouse","shop":"doityourself"},"name":"Bunnings Warehouse","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Castorama":{"tags":{"name":"Castorama","shop":"doityourself"},"name":"Castorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Easy":{"tags":{"name":"Easy","shop":"doityourself"},"name":"Easy","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Gamma":{"tags":{"name":"Gamma","shop":"doityourself"},"name":"Gamma","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Globus Baumarkt":{"tags":{"name":"Globus Baumarkt","shop":"doityourself"},"name":"Globus Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hagebaumarkt":{"tags":{"name":"Hagebaumarkt","shop":"doityourself"},"name":"Hagebaumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hellweg":{"tags":{"name":"Hellweg","shop":"doityourself"},"name":"Hellweg","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Home Depot":{"tags":{"name":"Home Depot","shop":"doityourself"},"name":"Home Depot","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Home Hardware":{"tags":{"name":"Home Hardware","shop":"doityourself"},"name":"Home Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Homebase":{"tags":{"name":"Homebase","shop":"doityourself"},"name":"Homebase","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hornbach":{"tags":{"name":"Hornbach","shop":"doityourself"},"name":"Hornbach","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hubo":{"tags":{"name":"Hubo","shop":"doityourself"},"name":"Hubo","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Karwei":{"tags":{"name":"Karwei","shop":"doityourself"},"name":"Karwei","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lagerhaus":{"tags":{"name":"Lagerhaus","shop":"doityourself"},"name":"Lagerhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Leroy Merlin":{"tags":{"name":"Leroy Merlin","shop":"doityourself"},"name":"Leroy Merlin","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lowe's":{"tags":{"name":"Lowe's","shop":"doityourself"},"name":"Lowe's","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lowes":{"tags":{"name":"Lowes","shop":"doityourself"},"name":"Lowes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Menards":{"tags":{"name":"Menards","shop":"doityourself"},"name":"Menards","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Mr Bricolage":{"tags":{"name":"Mr Bricolage","shop":"doityourself"},"name":"Mr Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Mr.Bricolage":{"tags":{"name":"Mr.Bricolage","shop":"doityourself"},"name":"Mr.Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/OBI":{"tags":{"name":"OBI","shop":"doityourself"},"name":"OBI","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Point P":{"tags":{"name":"Point P","shop":"doityourself"},"name":"Point P","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Praktiker":{"tags":{"name":"Praktiker","shop":"doityourself"},"name":"Praktiker","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Praxis":{"tags":{"name":"Praxis","shop":"doityourself"},"name":"Praxis","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Rona":{"tags":{"name":"Rona","shop":"doityourself"},"name":"Rona","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Screwfix":{"tags":{"name":"Screwfix","shop":"doityourself"},"name":"Screwfix","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Sonderpreis Baumarkt":{"tags":{"name":"Sonderpreis Baumarkt","shop":"doityourself"},"name":"Sonderpreis Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Tekzen":{"tags":{"name":"Tekzen","shop":"doityourself"},"name":"Tekzen","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Toom Baumarkt":{"tags":{"name":"Toom Baumarkt","shop":"doityourself"},"name":"Toom Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Weldom":{"tags":{"name":"Weldom","shop":"doityourself"},"name":"Weldom","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Wickes":{"tags":{"name":"Wickes","shop":"doityourself"},"name":"Wickes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Леруа Мерлен":{"tags":{"name":"Леруа Мерлен","shop":"doityourself"},"name":"Леруа Мерлен","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Мастер":{"tags":{"name":"Мастер","shop":"doityourself"},"name":"Мастер","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Строитель":{"tags":{"name":"Строитель","shop":"doityourself"},"name":"Строитель","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Стройматериалы":{"tags":{"name":"Стройматериалы","shop":"doityourself"},"name":"Стройматериалы","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/カインズホーム":{"tags":{"name":"カインズホーム","shop":"doityourself"},"name":"カインズホーム","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/コメリ":{"tags":{"name":"コメリ","shop":"doityourself"},"name":"コメリ","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/コーナン":{"tags":{"name":"コーナン","shop":"doityourself"},"name":"コーナン","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Cleaners":{"tags":{"name":"Cleaners","shop":"dry_cleaning"},"name":"Cleaners","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Pressing":{"tags":{"name":"Pressing","shop":"dry_cleaning"},"name":"Pressing","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Диана":{"tags":{"name":"Диана","shop":"dry_cleaning"},"name":"Диана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Химчистка":{"tags":{"name":"Химчистка","shop":"dry_cleaning"},"name":"Химчистка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/ホワイト急便":{"tags":{"name":"ホワイト急便","shop":"dry_cleaning"},"name":"ホワイト急便","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/BCC":{"tags":{"name":"BCC","shop":"electronics"},"name":"BCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Batteries Plus Bulbs":{"tags":{"name":"Batteries Plus Bulbs","shop":"electronics"},"name":"Batteries Plus Bulbs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Best Buy":{"tags":{"name":"Best Buy","shop":"electronics"},"name":"Best Buy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Boulanger":{"tags":{"name":"Boulanger","shop":"electronics"},"name":"Boulanger","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Currys":{"tags":{"name":"Currys","shop":"electronics"},"name":"Currys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Currys PC World":{"tags":{"name":"Currys PC World","shop":"electronics"},"name":"Currys PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Darty":{"tags":{"name":"Darty","shop":"electronics"},"name":"Darty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Elektra":{"tags":{"name":"Elektra","shop":"electronics"},"name":"Elektra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Elgiganten":{"tags":{"name":"Elgiganten","shop":"electronics"},"name":"Elgiganten","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Euronics":{"tags":{"name":"Euronics","shop":"electronics"},"name":"Euronics","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Expert":{"tags":{"name":"Expert","shop":"electronics"},"name":"Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Hartlauer":{"tags":{"name":"Hartlauer","shop":"electronics"},"name":"Hartlauer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Interdiscount":{"tags":{"name":"Interdiscount","shop":"electronics"},"name":"Interdiscount","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/La Curacao":{"tags":{"name":"La Curacao","shop":"electronics"},"name":"La Curacao","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Maplin":{"tags":{"name":"Maplin","shop":"electronics"},"name":"Maplin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Media Expert":{"tags":{"name":"Media Expert","shop":"electronics"},"name":"Media Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Media Markt":{"tags":{"name":"Media Markt","shop":"electronics"},"name":"Media Markt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Musimundo":{"tags":{"name":"Musimundo","shop":"electronics"},"name":"Musimundo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Neonet":{"tags":{"name":"Neonet","shop":"electronics"},"name":"Neonet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/RTV Euro AGD":{"tags":{"name":"RTV Euro AGD","shop":"electronics"},"name":"RTV Euro AGD","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Radio Shack":{"tags":{"name":"Radio Shack","shop":"electronics"},"name":"Radio Shack","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Rogers":{"tags":{"name":"Rogers","shop":"electronics"},"name":"Rogers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Samsung":{"tags":{"name":"Samsung","shop":"electronics"},"name":"Samsung","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Saturn":{"tags":{"name":"Saturn","shop":"electronics"},"name":"Saturn","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Sony":{"tags":{"name":"Sony","shop":"electronics"},"name":"Sony","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/The Source":{"tags":{"name":"The Source","shop":"electronics"},"name":"The Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Unieuro":{"tags":{"name":"Unieuro","shop":"electronics"},"name":"Unieuro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/М.Видео":{"tags":{"name":"М.Видео","shop":"electronics"},"name":"М.Видео","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Фокстрот":{"tags":{"name":"Фокстрот","shop":"electronics"},"name":"Фокстрот","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Эксперт":{"tags":{"name":"Эксперт","shop":"electronics"},"name":"Эксперт","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Эльдорадо":{"tags":{"name":"Эльдорадо","shop":"electronics"},"name":"Эльдорадо","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/エディオン":{"tags":{"name":"エディオン","shop":"electronics"},"name":"エディオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/ケーズデンキ":{"tags":{"name":"ケーズデンキ","shop":"electronics"},"name":"ケーズデンキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/コジマ":{"tags":{"name":"コジマ","shop":"electronics"},"name":"コジマ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/ヤマダ電機":{"tags":{"name":"ヤマダ電機","shop":"electronics"},"name":"ヤマダ電機","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/全國電子":{"tags":{"name":"全國電子","shop":"electronics"},"name":"全國電子","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/燦坤3C":{"tags":{"name":"燦坤3C","shop":"electronics"},"name":"燦坤3C","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/erotic/Orion":{"tags":{"name":"Orion","shop":"erotic"},"name":"Orion","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/fabric/Ткани":{"tags":{"name":"Ткани","shop":"fabric"},"name":"Ткани","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/farm/Hofladen":{"tags":{"name":"Hofladen","shop":"farm"},"name":"Hofladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Blume 2000":{"tags":{"name":"Blume 2000","shop":"florist"},"name":"Blume 2000","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Blumen Risse":{"tags":{"name":"Blumen Risse","shop":"florist"},"name":"Blumen Risse","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Fleuriste":{"tags":{"name":"Fleuriste","shop":"florist"},"name":"Fleuriste","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Interflora":{"tags":{"name":"Interflora","shop":"florist"},"name":"Interflora","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Monceau Fleurs":{"tags":{"name":"Monceau Fleurs","shop":"florist"},"name":"Monceau Fleurs","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Virágbolt":{"tags":{"name":"Virágbolt","shop":"florist"},"name":"Virágbolt","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Квіти":{"tags":{"name":"Квіти","shop":"florist"},"name":"Квіти","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Цветочный магазин":{"tags":{"name":"Цветочный магазин","shop":"florist"},"name":"Цветочный магазин","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Цветы":{"tags":{"name":"Цветы","shop":"florist"},"name":"Цветы","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/frame/rumah penduduk":{"tags":{"name":"rumah penduduk","shop":"frame"},"name":"rumah penduduk","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/funeral_directors/The Co-operative Funeralcare":{"tags":{"name":"The Co-operative Funeralcare","shop":"funeral_directors"},"name":"The Co-operative Funeralcare","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/Ритуальные услуги":{"tags":{"name":"Ритуальные услуги","shop":"funeral_directors"},"name":"Ритуальные услуги","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/furniture/Aaron's":{"tags":{"name":"Aaron's","shop":"furniture"},"name":"Aaron's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Black Red White":{"tags":{"name":"Black Red White","shop":"furniture"},"name":"Black Red White","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Bodzio":{"tags":{"name":"Bodzio","shop":"furniture"},"name":"Bodzio","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/But":{"tags":{"name":"But","shop":"furniture"},"name":"But","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Conforama":{"tags":{"name":"Conforama","shop":"furniture"},"name":"Conforama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/DFS":{"tags":{"name":"DFS","shop":"furniture"},"name":"DFS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Dänisches Bettenlager":{"tags":{"name":"Dänisches Bettenlager","shop":"furniture"},"name":"Dänisches Bettenlager","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Fly":{"tags":{"name":"Fly","shop":"furniture"},"name":"Fly","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Harveys":{"tags":{"name":"Harveys","shop":"furniture"},"name":"Harveys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/IKEA":{"tags":{"name":"IKEA","shop":"furniture"},"name":"IKEA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/JYSK":{"tags":{"name":"JYSK","shop":"furniture"},"name":"JYSK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Kwantum":{"tags":{"name":"Kwantum","shop":"furniture"},"name":"Kwantum","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Leen Bakker":{"tags":{"name":"Leen Bakker","shop":"furniture"},"name":"Leen Bakker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Pier 1 Imports":{"tags":{"name":"Pier 1 Imports","shop":"furniture"},"name":"Pier 1 Imports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Roller":{"tags":{"name":"Roller","shop":"furniture"},"name":"Roller","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/The Brick":{"tags":{"name":"The Brick","shop":"furniture"},"name":"The Brick","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Меблі":{"tags":{"name":"Меблі","shop":"furniture"},"name":"Меблі","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/ニトリ":{"tags":{"name":"ニトリ","shop":"furniture"},"name":"ニトリ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Dehner":{"tags":{"name":"Dehner","shop":"garden_centre"},"name":"Dehner","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Gamm Vert":{"tags":{"name":"Gamm Vert","shop":"garden_centre"},"name":"Gamm Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Jardiland":{"tags":{"name":"Jardiland","shop":"garden_centre"},"name":"Jardiland","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Point Vert":{"tags":{"name":"Point Vert","shop":"garden_centre"},"name":"Point Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Welkoop":{"tags":{"name":"Welkoop","shop":"garden_centre"},"name":"Welkoop","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Семена":{"tags":{"name":"Семена","shop":"garden_centre"},"name":"Семена","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Card Factory":{"tags":{"name":"Card Factory","shop":"gift"},"name":"Card Factory","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Hallmark":{"tags":{"name":"Hallmark","shop":"gift"},"name":"Hallmark","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Подарки":{"tags":{"name":"Подарки","shop":"gift"},"name":"Подарки","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/greengrocer/Frutería":{"tags":{"name":"Frutería","shop":"greengrocer"},"name":"Frutería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/greengrocer/Овощи и фрукты":{"tags":{"name":"Овощи и фрукты","shop":"greengrocer"},"name":"Овощи и фрукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Berber":{"tags":{"name":"Berber","shop":"hairdresser"},"name":"Berber","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Cost Cutters":{"tags":{"name":"Cost Cutters","shop":"hairdresser"},"name":"Cost Cutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Fantastic Sams":{"tags":{"name":"Fantastic Sams","shop":"hairdresser"},"name":"Fantastic Sams","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Figaro":{"tags":{"name":"Figaro","shop":"hairdresser"},"name":"Figaro","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/First Choice Haircutters":{"tags":{"name":"First Choice Haircutters","shop":"hairdresser"},"name":"First Choice Haircutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Franck Provost":{"tags":{"name":"Franck Provost","shop":"hairdresser"},"name":"Franck Provost","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Frizerie":{"tags":{"name":"Frizerie","shop":"hairdresser"},"name":"Frizerie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Great Clips":{"tags":{"name":"Great Clips","shop":"hairdresser"},"name":"Great Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Haarmonie":{"tags":{"name":"Haarmonie","shop":"hairdresser"},"name":"Haarmonie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Haarscharf":{"tags":{"name":"Haarscharf","shop":"hairdresser"},"name":"Haarscharf","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Hair Cuttery":{"tags":{"name":"Hair Cuttery","shop":"hairdresser"},"name":"Hair Cuttery","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Hairkiller":{"tags":{"name":"Hairkiller","shop":"hairdresser"},"name":"Hairkiller","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Jean Louis David":{"tags":{"name":"Jean Louis David","shop":"hairdresser"},"name":"Jean Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Jean-Louis David":{"tags":{"name":"Jean-Louis David","shop":"hairdresser"},"name":"Jean-Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Klier":{"tags":{"name":"Klier","shop":"hairdresser"},"name":"Klier","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Klipp":{"tags":{"name":"Klipp","shop":"hairdresser"},"name":"Klipp","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Le Salon":{"tags":{"name":"Le Salon","shop":"hairdresser"},"name":"Le Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Marco Aldany":{"tags":{"name":"Marco Aldany","shop":"hairdresser"},"name":"Marco Aldany","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Peluquería":{"tags":{"name":"Peluquería","shop":"hairdresser"},"name":"Peluquería","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Salon fryzjerski":{"tags":{"name":"Salon fryzjerski","shop":"hairdresser"},"name":"Salon fryzjerski","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Sport Clips":{"tags":{"name":"Sport Clips","shop":"hairdresser"},"name":"Sport Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Super Cuts":{"tags":{"name":"Super Cuts","shop":"hairdresser"},"name":"Super Cuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Supercuts":{"tags":{"name":"Supercuts","shop":"hairdresser"},"name":"Supercuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Tchip":{"tags":{"name":"Tchip","shop":"hairdresser"},"name":"Tchip","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/The Barber Shop":{"tags":{"name":"The Barber Shop","shop":"hairdresser"},"name":"The Barber Shop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Toni & Guy":{"tags":{"name":"Toni & Guy","shop":"hairdresser"},"name":"Toni & Guy","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Top Hair":{"tags":{"name":"Top Hair","shop":"hairdresser"},"name":"Top Hair","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Локон":{"tags":{"name":"Локон","shop":"hairdresser"},"name":"Локон","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Парикмахерская":{"tags":{"name":"Парикмахерская","shop":"hairdresser"},"name":"Парикмахерская","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Перукарня":{"tags":{"name":"Перукарня","shop":"hairdresser"},"name":"Перукарня","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Салон красоты":{"tags":{"name":"Салон красоты","shop":"hairdresser"},"name":"Салон красоты","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Стиль":{"tags":{"name":"Стиль","shop":"hairdresser"},"name":"Стиль","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Шарм":{"tags":{"name":"Шарм","shop":"hairdresser"},"name":"Шарм","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/حلاق":{"tags":{"name":"حلاق","shop":"hairdresser"},"name":"حلاق","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/1000 мелочей":{"tags":{"name":"1000 мелочей","shop":"hardware"},"name":"1000 мелочей","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Ferretería":{"tags":{"name":"Ferretería","shop":"hardware"},"name":"Ferretería","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Harbor Freight Tools":{"tags":{"name":"Harbor Freight Tools","shop":"hardware"},"name":"Harbor Freight Tools","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Quincaillerie":{"tags":{"name":"Quincaillerie","shop":"hardware"},"name":"Quincaillerie","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/True Value":{"tags":{"name":"True Value","shop":"hardware"},"name":"True Value","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Würth":{"tags":{"name":"Würth","shop":"hardware"},"name":"Würth","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Промтовары":{"tags":{"name":"Промтовары","shop":"hardware"},"name":"Промтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Сантехника":{"tags":{"name":"Сантехника","shop":"hardware"},"name":"Сантехника","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Товары для дома":{"tags":{"name":"Товары для дома","shop":"hardware"},"name":"Товары для дома","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Хозтовары":{"tags":{"name":"Хозтовары","shop":"hardware"},"name":"Хозтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Amplifon":{"tags":{"name":"Amplifon","shop":"hearing_aids"},"name":"Amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Geers":{"tags":{"name":"Geers","shop":"hearing_aids"},"name":"Geers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Kind Hörgeräte":{"tags":{"name":"Kind Hörgeräte","shop":"hearing_aids"},"name":"Kind Hörgeräte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/amplifon":{"tags":{"name":"amplifon","shop":"hearing_aids"},"name":"amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hifi/Bang & Olufsen":{"tags":{"name":"Bang & Olufsen","shop":"hifi"},"name":"Bang & Olufsen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Blokker":{"tags":{"name":"Blokker","shop":"houseware"},"name":"Blokker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Marskramer":{"tags":{"name":"Marskramer","shop":"houseware"},"name":"Marskramer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Xenos":{"tags":{"name":"Xenos","shop":"houseware"},"name":"Xenos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/interior_decoration/Casa":{"tags":{"name":"Casa","shop":"interior_decoration"},"name":"Casa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/interior_decoration/Depot":{"tags":{"name":"Depot","shop":"interior_decoration"},"name":"Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/585":{"tags":{"name":"585","shop":"jewelry"},"name":"585","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Apart":{"tags":{"name":"Apart","shop":"jewelry"},"name":"Apart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Bijou Brigitte":{"tags":{"name":"Bijou Brigitte","shop":"jewelry"},"name":"Bijou Brigitte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Christ":{"tags":{"name":"Christ","shop":"jewelry"},"name":"Christ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Claire's":{"tags":{"name":"Claire's","shop":"jewelry"},"name":"Claire's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Ernest Jones":{"tags":{"name":"Ernest Jones","shop":"jewelry"},"name":"Ernest Jones","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/H Samuel":{"tags":{"name":"H Samuel","shop":"jewelry"},"name":"H Samuel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/James Avery Jewelry":{"tags":{"name":"James Avery Jewelry","shop":"jewelry"},"name":"James Avery Jewelry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Julien d'Orcel":{"tags":{"name":"Julien d'Orcel","shop":"jewelry"},"name":"Julien d'Orcel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Kay Jewelers":{"tags":{"name":"Kay Jewelers","shop":"jewelry"},"name":"Kay Jewelers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Pandora":{"tags":{"name":"Pandora","shop":"jewelry"},"name":"Pandora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Swarovski":{"tags":{"name":"Swarovski","shop":"jewelry"},"name":"Swarovski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Адамас":{"tags":{"name":"Адамас","shop":"jewelry"},"name":"Адамас","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Золото":{"tags":{"name":"Золото","shop":"jewelry"},"name":"Золото","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/KIOS":{"tags":{"name":"KIOS","shop":"kiosk"},"name":"KIOS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kiosko":{"tags":{"name":"Kiosko","shop":"kiosk"},"name":"Kiosko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kiosque":{"tags":{"name":"Kiosque","shop":"kiosk"},"name":"Kiosque","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kolporter":{"tags":{"name":"Kolporter","shop":"kiosk"},"name":"Kolporter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Lietuvos spauda":{"tags":{"name":"Lietuvos spauda","shop":"kiosk"},"name":"Lietuvos spauda","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Narvesen":{"tags":{"name":"Narvesen","shop":"kiosk"},"name":"Narvesen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Pressbyrån":{"tags":{"name":"Pressbyrån","shop":"kiosk"},"name":"Pressbyrån","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Pulpería":{"tags":{"name":"Pulpería","shop":"kiosk"},"name":"Pulpería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/R-Kioski":{"tags":{"name":"R-Kioski","shop":"kiosk"},"name":"R-Kioski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Ruch":{"tags":{"name":"Ruch","shop":"kiosk"},"name":"Ruch","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Tabak Trafik":{"tags":{"name":"Tabak Trafik","shop":"kiosk"},"name":"Tabak Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Tisak":{"tags":{"name":"Tisak","shop":"kiosk"},"name":"Tisak","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trafik":{"tags":{"name":"Trafik","shop":"kiosk"},"name":"Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trafika":{"tags":{"name":"Trafika","shop":"kiosk"},"name":"Trafika","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trinkhalle":{"tags":{"name":"Trinkhalle","shop":"kiosk"},"name":"Trinkhalle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Белсоюзпечать":{"tags":{"name":"Белсоюзпечать","shop":"kiosk"},"name":"Белсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Киоск":{"tags":{"name":"Киоск","shop":"kiosk"},"name":"Киоск","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Мороженое":{"tags":{"name":"Мороженое","shop":"kiosk"},"name":"Мороженое","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/მარკეტი (Market)":{"tags":{"name":"მარკეტი (Market)","shop":"kiosk"},"name":"მარკეტი (Market)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kitchen/Cuisinella":{"tags":{"name":"Cuisinella","shop":"kitchen"},"name":"Cuisinella","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kitchen/Home Utensils":{"tags":{"name":"Home Utensils","shop":"kitchen"},"name":"Home Utensils","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/Launderette":{"tags":{"name":"Launderette","shop":"laundry"},"name":"Launderette","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/Lavandería":{"tags":{"name":"Lavandería","shop":"laundry"},"name":"Lavandería","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/コインランドリー":{"tags":{"name":"コインランドリー","shop":"laundry"},"name":"コインランドリー","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Loteria de la Provincia":{"tags":{"name":"Loteria de la Provincia","shop":"lottery"},"name":"Loteria de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotería Nacional":{"tags":{"name":"Lotería Nacional","shop":"lottery"},"name":"Lotería Nacional","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotería de la Provincia":{"tags":{"name":"Lotería de la Provincia","shop":"lottery"},"name":"Lotería de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotto":{"tags":{"name":"Lotto","shop":"lottery"},"name":"Lotto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lottózó":{"tags":{"name":"Lottózó","shop":"lottery"},"name":"Lottózó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/ONCE":{"tags":{"name":"ONCE","shop":"lottery"},"name":"ONCE","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mall/Торговый центр":{"tags":{"name":"Торговый центр","shop":"mall"},"name":"Торговый центр","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/massage/Massage Envy":{"tags":{"name":"Massage Envy","shop":"massage"},"name":"Massage Envy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/medical_supply/Pofam-Poznań":{"tags":{"name":"Pofam-Poznań","shop":"medical_supply"},"name":"Pofam-Poznań","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/3 Store":{"tags":{"name":"3 Store","shop":"mobile_phone"},"name":"3 Store","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/AT&T":{"tags":{"name":"AT&T","shop":"mobile_phone"},"name":"AT&T","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Bell":{"tags":{"name":"Bell","shop":"mobile_phone"},"name":"Bell","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Bitė":{"tags":{"name":"Bitė","shop":"mobile_phone"},"name":"Bitė","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Boost Mobile":{"tags":{"name":"Boost Mobile","shop":"mobile_phone"},"name":"Boost Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Carphone Warehouse":{"tags":{"name":"Carphone Warehouse","shop":"mobile_phone"},"name":"Carphone Warehouse","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Claro":{"tags":{"name":"Claro","shop":"mobile_phone"},"name":"Claro","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Cricket Wireless":{"tags":{"name":"Cricket Wireless","shop":"mobile_phone"},"name":"Cricket Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Digicel":{"tags":{"name":"Digicel","shop":"mobile_phone"},"name":"Digicel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/EE":{"tags":{"name":"EE","shop":"mobile_phone"},"name":"EE","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/MetroPCS":{"tags":{"name":"MetroPCS","shop":"mobile_phone"},"name":"MetroPCS","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Movistar":{"tags":{"name":"Movistar","shop":"mobile_phone"},"name":"Movistar","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/O2":{"tags":{"name":"O2","shop":"mobile_phone"},"name":"O2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Orange":{"tags":{"name":"Orange","shop":"mobile_phone"},"name":"Orange","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Personal":{"tags":{"name":"Personal","shop":"mobile_phone"},"name":"Personal","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Play":{"tags":{"name":"Play","shop":"mobile_phone"},"name":"Play","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Plus":{"tags":{"name":"Plus","shop":"mobile_phone"},"name":"Plus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/SFR":{"tags":{"name":"SFR","shop":"mobile_phone"},"name":"SFR","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Sprint":{"tags":{"name":"Sprint","shop":"mobile_phone"},"name":"Sprint","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/T-Mobile":{"tags":{"name":"T-Mobile","shop":"mobile_phone"},"name":"T-Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/TIM":{"tags":{"name":"TIM","shop":"mobile_phone"},"name":"TIM","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telcel":{"tags":{"name":"Telcel","shop":"mobile_phone"},"name":"Telcel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Tele2":{"tags":{"name":"Tele2","shop":"mobile_phone"},"name":"Tele2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telekom":{"tags":{"name":"Telekom","shop":"mobile_phone"},"name":"Telekom","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telekom Shop":{"tags":{"name":"Telekom Shop","shop":"mobile_phone"},"name":"Telekom Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telenor":{"tags":{"name":"Telenor","shop":"mobile_phone"},"name":"Telenor","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telus":{"tags":{"name":"Telus","shop":"mobile_phone"},"name":"Telus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/The Phone House":{"tags":{"name":"The Phone House","shop":"mobile_phone"},"name":"The Phone House","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Three":{"tags":{"name":"Three","shop":"mobile_phone"},"name":"Three","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Tim":{"tags":{"name":"Tim","shop":"mobile_phone"},"name":"Tim","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Télécentre":{"tags":{"name":"Télécentre","shop":"mobile_phone"},"name":"Télécentre","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Verizon":{"tags":{"name":"Verizon","shop":"mobile_phone"},"name":"Verizon","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Verizon Wireless":{"tags":{"name":"Verizon Wireless","shop":"mobile_phone"},"name":"Verizon Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Vodafone":{"tags":{"name":"Vodafone","shop":"mobile_phone"},"name":"Vodafone","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Vodafone Shop":{"tags":{"name":"Vodafone Shop","shop":"mobile_phone"},"name":"Vodafone Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Wind":{"tags":{"name":"Wind","shop":"mobile_phone"},"name":"Wind","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Yoigo":{"tags":{"name":"Yoigo","shop":"mobile_phone"},"name":"Yoigo","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/au":{"tags":{"name":"au","shop":"mobile_phone"},"name":"au","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/auショップ":{"tags":{"name":"auショップ","shop":"mobile_phone"},"name":"auショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/mobilcom debitel":{"tags":{"name":"mobilcom debitel","shop":"mobile_phone"},"name":"mobilcom debitel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Алло":{"tags":{"name":"Алло","shop":"mobile_phone"},"name":"Алло","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Билайн":{"tags":{"name":"Билайн","shop":"mobile_phone"},"name":"Билайн","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Евросеть":{"tags":{"name":"Евросеть","shop":"mobile_phone"},"name":"Евросеть","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Київстар":{"tags":{"name":"Київстар","shop":"mobile_phone"},"name":"Київстар","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/МТС":{"tags":{"name":"МТС","shop":"mobile_phone"},"name":"МТС","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Мегафон":{"tags":{"name":"Мегафон","shop":"mobile_phone"},"name":"Мегафон","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Связной":{"tags":{"name":"Связной","shop":"mobile_phone"},"name":"Связной","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Теле2":{"tags":{"name":"Теле2","shop":"mobile_phone"},"name":"Теле2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/ソフトバンクショップ":{"tags":{"name":"ソフトバンクショップ","shop":"mobile_phone"},"name":"ソフトバンクショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/ドコモショップ":{"tags":{"name":"ドコモショップ","shop":"mobile_phone"},"name":"ドコモショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/money_lender/Money Mart":{"tags":{"name":"Money Mart","shop":"money_lender"},"name":"Money Mart","icon":"bank","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","currency_multi"],"suggestion":true},"shop/motorcycle/Harley Davidson":{"tags":{"name":"Harley Davidson","shop":"motorcycle"},"name":"Harley Davidson","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/motorcycle/Yamaha":{"tags":{"name":"Yamaha","shop":"motorcycle"},"name":"Yamaha","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/music/HMV":{"tags":{"name":"HMV","shop":"music"},"name":"HMV","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/musical_instrument/Guitar Center":{"tags":{"name":"Guitar Center","shop":"musical_instrument"},"name":"Guitar Center","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Edicola":{"tags":{"name":"Edicola","shop":"newsagent"},"name":"Edicola","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Maison de la Presse":{"tags":{"name":"Maison de la Presse","shop":"newsagent"},"name":"Maison de la Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Relay":{"tags":{"name":"Relay","shop":"newsagent"},"name":"Relay","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Tabac Presse":{"tags":{"name":"Tabac Presse","shop":"newsagent"},"name":"Tabac Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/WHSmith":{"tags":{"name":"WHSmith","shop":"newsagent"},"name":"WHSmith","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Витебскоблсоюзпечать":{"tags":{"name":"Витебскоблсоюзпечать","shop":"newsagent"},"name":"Витебскоблсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Первая полоса":{"tags":{"name":"Первая полоса","shop":"newsagent"},"name":"Первая полоса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Печать":{"tags":{"name":"Печать","shop":"newsagent"},"name":"Печать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Роспечать":{"tags":{"name":"Роспечать","shop":"newsagent"},"name":"Роспечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Союзпечать":{"tags":{"name":"Союзпечать","shop":"newsagent"},"name":"Союзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Alain Afflelou":{"tags":{"name":"Alain Afflelou","shop":"optician"},"name":"Alain Afflelou","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Apollo":{"tags":{"name":"Apollo","shop":"optician"},"name":"Apollo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Atol":{"tags":{"name":"Atol","shop":"optician"},"name":"Atol","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Boots Opticians":{"tags":{"name":"Boots Opticians","shop":"optician"},"name":"Boots Opticians","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Fielmann":{"tags":{"name":"Fielmann","shop":"optician"},"name":"Fielmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/General Óptica":{"tags":{"name":"General Óptica","shop":"optician"},"name":"General Óptica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Grand Optical":{"tags":{"name":"Grand Optical","shop":"optician"},"name":"Grand Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Générale d'Optique":{"tags":{"name":"Générale d'Optique","shop":"optician"},"name":"Générale d'Optique","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Hakim Optical":{"tags":{"name":"Hakim Optical","shop":"optician"},"name":"Hakim Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Hans Anders":{"tags":{"name":"Hans Anders","shop":"optician"},"name":"Hans Anders","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Krys":{"tags":{"name":"Krys","shop":"optician"},"name":"Krys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Les Opticiens Mutualistes":{"tags":{"name":"Les Opticiens Mutualistes","shop":"optician"},"name":"Les Opticiens Mutualistes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Optic 2000":{"tags":{"name":"Optic 2000","shop":"optician"},"name":"Optic 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Optical Center":{"tags":{"name":"Optical Center","shop":"optician"},"name":"Optical Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Pearle":{"tags":{"name":"Pearle","shop":"optician"},"name":"Pearle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Pearle Vision":{"tags":{"name":"Pearle Vision","shop":"optician"},"name":"Pearle Vision","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Specsavers":{"tags":{"name":"Specsavers","shop":"optician"},"name":"Specsavers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Sunglass Hut":{"tags":{"name":"Sunglass Hut","shop":"optician"},"name":"Sunglass Hut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Synoptik":{"tags":{"name":"Synoptik","shop":"optician"},"name":"Synoptik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Vision Express":{"tags":{"name":"Vision Express","shop":"optician"},"name":"Vision Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/แว่นท็อปเจริญ":{"tags":{"name":"แว่นท็อปเจริญ","shop":"optician"},"name":"แว่นท็อปเจริญ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/メガネスーパー":{"tags":{"name":"メガネスーパー","shop":"optician"},"name":"メガネスーパー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/眼鏡市場":{"tags":{"name":"眼鏡市場","shop":"optician"},"name":"眼鏡市場","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/Mountain Warehouse":{"tags":{"name":"Mountain Warehouse","shop":"outdoor"},"name":"Mountain Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/REI":{"tags":{"name":"REI","shop":"outdoor"},"name":"REI","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/Рыболов":{"tags":{"name":"Рыболов","shop":"outdoor"},"name":"Рыболов","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Benjamin Moore":{"tags":{"name":"Benjamin Moore","shop":"paint"},"name":"Benjamin Moore","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Comex":{"tags":{"name":"Comex","shop":"paint"},"name":"Comex","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Jotun":{"tags":{"name":"Jotun","shop":"paint"},"name":"Jotun","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/National Paints":{"tags":{"name":"National Paints","shop":"paint"},"name":"National Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Sherwin Williams":{"tags":{"name":"Sherwin Williams","shop":"paint"},"name":"Sherwin Williams","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Sherwin-Williams Paints":{"tags":{"name":"Sherwin-Williams Paints","shop":"paint"},"name":"Sherwin-Williams Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Cash Converters":{"tags":{"name":"Cash Converters","shop":"pawnbroker"},"name":"Cash Converters","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Lombard":{"tags":{"name":"Lombard","shop":"pawnbroker"},"name":"Lombard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Palawan Pawnshop":{"tags":{"name":"Palawan Pawnshop","shop":"pawnbroker"},"name":"Palawan Pawnshop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Das Futterhaus":{"tags":{"name":"Das Futterhaus","shop":"pet"},"name":"Das Futterhaus","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Fressnapf":{"tags":{"name":"Fressnapf","shop":"pet"},"name":"Fressnapf","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Global Pet Foods":{"tags":{"name":"Global Pet Foods","shop":"pet"},"name":"Global Pet Foods","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Maxi Zoo":{"tags":{"name":"Maxi Zoo","shop":"pet"},"name":"Maxi Zoo","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Pet Valu":{"tags":{"name":"Pet Valu","shop":"pet"},"name":"Pet Valu","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/PetSmart":{"tags":{"name":"PetSmart","shop":"pet"},"name":"PetSmart","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Petco":{"tags":{"name":"Petco","shop":"pet"},"name":"Petco","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Pets at Home":{"tags":{"name":"Pets at Home","shop":"pet"},"name":"Pets at Home","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Бетховен":{"tags":{"name":"Бетховен","shop":"pet"},"name":"Бетховен","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Зоотовары":{"tags":{"name":"Зоотовары","shop":"pet"},"name":"Зоотовары","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Четыре лапы":{"tags":{"name":"Четыре лапы","shop":"pet"},"name":"Четыре лапы","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/second_hand/Goodwill":{"tags":{"name":"Goodwill","shop":"second_hand"},"name":"Goodwill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/second_hand/Value Village":{"tags":{"name":"Value Village","shop":"second_hand"},"name":"Value Village","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Aldo":{"tags":{"name":"Aldo","shop":"shoes"},"name":"Aldo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Bata":{"tags":{"name":"Bata","shop":"shoes"},"name":"Bata","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Besson Chaussures":{"tags":{"name":"Besson Chaussures","shop":"shoes"},"name":"Besson Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Brantano":{"tags":{"name":"Brantano","shop":"shoes"},"name":"Brantano","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/CCC":{"tags":{"name":"CCC","shop":"shoes"},"name":"CCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Camper":{"tags":{"name":"Camper","shop":"shoes"},"name":"Camper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Chaussea":{"tags":{"name":"Chaussea","shop":"shoes"},"name":"Chaussea","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Clarks":{"tags":{"name":"Clarks","shop":"shoes"},"name":"Clarks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Converse":{"tags":{"name":"Converse","shop":"shoes"},"name":"Converse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Crocs":{"tags":{"name":"Crocs","shop":"shoes"},"name":"Crocs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/DSW":{"tags":{"name":"DSW","shop":"shoes"},"name":"DSW","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Deichmann":{"tags":{"name":"Deichmann","shop":"shoes"},"name":"Deichmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Dosenbach":{"tags":{"name":"Dosenbach","shop":"shoes"},"name":"Dosenbach","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Ecco":{"tags":{"name":"Ecco","shop":"shoes"},"name":"Ecco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Famous Footwear":{"tags":{"name":"Famous Footwear","shop":"shoes"},"name":"Famous Footwear","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Foot Locker":{"tags":{"name":"Foot Locker","shop":"shoes"},"name":"Foot Locker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Geox":{"tags":{"name":"Geox","shop":"shoes"},"name":"Geox","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Kari":{"tags":{"name":"Kari","shop":"shoes"},"name":"Kari","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/La Halle aux Chaussures":{"tags":{"name":"La Halle aux Chaussures","shop":"shoes"},"name":"La Halle aux Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Mephisto":{"tags":{"name":"Mephisto","shop":"shoes"},"name":"Mephisto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Minelli":{"tags":{"name":"Minelli","shop":"shoes"},"name":"Minelli","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/New Balance":{"tags":{"name":"New Balance","shop":"shoes"},"name":"New Balance","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless":{"tags":{"name":"Payless","shop":"shoes"},"name":"Payless","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless Shoe Source":{"tags":{"name":"Payless Shoe Source","shop":"shoes"},"name":"Payless Shoe Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless ShoeSource":{"tags":{"name":"Payless ShoeSource","shop":"shoes"},"name":"Payless ShoeSource","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Quick Schuh":{"tags":{"name":"Quick Schuh","shop":"shoes"},"name":"Quick Schuh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Rack Room Shoes":{"tags":{"name":"Rack Room Shoes","shop":"shoes"},"name":"Rack Room Shoes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Reno":{"tags":{"name":"Reno","shop":"shoes"},"name":"Reno","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Rieker":{"tags":{"name":"Rieker","shop":"shoes"},"name":"Rieker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Salamander":{"tags":{"name":"Salamander","shop":"shoes"},"name":"Salamander","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/San Marina":{"tags":{"name":"San Marina","shop":"shoes"},"name":"San Marina","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Scapino":{"tags":{"name":"Scapino","shop":"shoes"},"name":"Scapino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Shoe Carnival":{"tags":{"name":"Shoe Carnival","shop":"shoes"},"name":"Shoe Carnival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Shoe Zone":{"tags":{"name":"Shoe Zone","shop":"shoes"},"name":"Shoe Zone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Siemes Schuhcenter":{"tags":{"name":"Siemes Schuhcenter","shop":"shoes"},"name":"Siemes Schuhcenter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Skechers":{"tags":{"name":"Skechers","shop":"shoes"},"name":"Skechers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Tamaris":{"tags":{"name":"Tamaris","shop":"shoes"},"name":"Tamaris","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/vanHaren":{"tags":{"name":"vanHaren","shop":"shoes"},"name":"vanHaren","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Éram":{"tags":{"name":"Éram","shop":"shoes"},"name":"Éram","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Ремонт обуви":{"tags":{"name":"Ремонт обуви","shop":"shoes"},"name":"Ремонт обуви","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/ЦентрОбувь":{"tags":{"name":"ЦентрОбувь","shop":"shoes"},"name":"ЦентрОбувь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Юничел":{"tags":{"name":"Юничел","shop":"shoes"},"name":"Юничел","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/東京靴流通センター":{"tags":{"name":"東京靴流通センター","shop":"shoes"},"name":"東京靴流通センター","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Aktiesport":{"tags":{"name":"Aktiesport","shop":"sports"},"name":"Aktiesport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Big 5 Sporting Goods":{"tags":{"name":"Big 5 Sporting Goods","shop":"sports"},"name":"Big 5 Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Decathlon":{"tags":{"name":"Decathlon","shop":"sports"},"name":"Decathlon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Dick's Sporting Goods":{"tags":{"name":"Dick's Sporting Goods","shop":"sports"},"name":"Dick's Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Hervis":{"tags":{"name":"Hervis","shop":"sports"},"name":"Hervis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Intersport":{"tags":{"name":"Intersport","shop":"sports"},"name":"Intersport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/JD Sports":{"tags":{"name":"JD Sports","shop":"sports"},"name":"JD Sports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sport 2000":{"tags":{"name":"Sport 2000","shop":"sports"},"name":"Sport 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sports Authority":{"tags":{"name":"Sports Authority","shop":"sports"},"name":"Sports Authority","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sports Direct":{"tags":{"name":"Sports Direct","shop":"sports"},"name":"Sports Direct","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Спортмастер":{"tags":{"name":"Спортмастер","shop":"sports"},"name":"Спортмастер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Спорттовары":{"tags":{"name":"Спорттовары","shop":"sports"},"name":"Спорттовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Bureau Vallée":{"tags":{"name":"Bureau Vallée","shop":"stationery"},"name":"Bureau Vallée","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Libro":{"tags":{"name":"Libro","shop":"stationery"},"name":"Libro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/McPaper":{"tags":{"name":"McPaper","shop":"stationery"},"name":"McPaper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Office Depot":{"tags":{"name":"Office Depot","shop":"stationery"},"name":"Office Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Office Max":{"tags":{"name":"Office Max","shop":"stationery"},"name":"Office Max","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Officeworks":{"tags":{"name":"Officeworks","shop":"stationery"},"name":"Officeworks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Pagro":{"tags":{"name":"Pagro","shop":"stationery"},"name":"Pagro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Paperchase":{"tags":{"name":"Paperchase","shop":"stationery"},"name":"Paperchase","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Ryman":{"tags":{"name":"Ryman","shop":"stationery"},"name":"Ryman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Staples":{"tags":{"name":"Staples","shop":"stationery"},"name":"Staples","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Канцтовары":{"tags":{"name":"Канцтовары","shop":"stationery"},"name":"Канцтовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/A&O":{"tags":{"name":"A&O","shop":"supermarket"},"name":"A&O","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/A101":{"tags":{"name":"A101","shop":"supermarket"},"name":"A101","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/AD Delhaize":{"tags":{"name":"AD Delhaize","shop":"supermarket"},"name":"AD Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ADEG":{"tags":{"name":"ADEG","shop":"supermarket"},"name":"ADEG","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ahorramás":{"tags":{"name":"Ahorramás","shop":"supermarket"},"name":"Ahorramás","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albert":{"tags":{"name":"Albert","shop":"supermarket"},"name":"Albert","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albert Heijn":{"tags":{"name":"Albert Heijn","shop":"supermarket"},"name":"Albert Heijn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albertsons":{"tags":{"name":"Albertsons","shop":"supermarket"},"name":"Albertsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi":{"tags":{"name":"Aldi","shop":"supermarket"},"name":"Aldi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi Nord":{"tags":{"name":"Aldi Nord","shop":"supermarket"},"name":"Aldi Nord","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi Süd":{"tags":{"name":"Aldi Süd","shop":"supermarket"},"name":"Aldi Süd","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Alimerka":{"tags":{"name":"Alimerka","shop":"supermarket"},"name":"Alimerka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Alnatura":{"tags":{"name":"Alnatura","shop":"supermarket"},"name":"Alnatura","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Asda":{"tags":{"name":"Asda","shop":"supermarket"},"name":"Asda","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Atac":{"tags":{"name":"Atac","shop":"supermarket"},"name":"Atac","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Atacadão":{"tags":{"name":"Atacadão","shop":"supermarket"},"name":"Atacadão","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Auchan":{"tags":{"name":"Auchan","shop":"supermarket"},"name":"Auchan","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/BM":{"tags":{"name":"BM","shop":"supermarket"},"name":"BM","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Biedronka":{"tags":{"name":"Biedronka","shop":"supermarket"},"name":"Biedronka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Big C":{"tags":{"name":"Big C","shop":"supermarket"},"name":"Big C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Billa":{"tags":{"name":"Billa","shop":"supermarket"},"name":"Billa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bim":{"tags":{"name":"Bim","shop":"supermarket"},"name":"Bim","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Biocoop":{"tags":{"name":"Biocoop","shop":"supermarket"},"name":"Biocoop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bodega Aurrera":{"tags":{"name":"Bodega Aurrera","shop":"supermarket"},"name":"Bodega Aurrera","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Budgens":{"tags":{"name":"Budgens","shop":"supermarket"},"name":"Budgens","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bulk Barn":{"tags":{"name":"Bulk Barn","shop":"supermarket"},"name":"Bulk Barn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bunnpris":{"tags":{"name":"Bunnpris","shop":"supermarket"},"name":"Bunnpris","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/CONAD":{"tags":{"name":"CONAD","shop":"supermarket"},"name":"CONAD","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/CRAI":{"tags":{"name":"CRAI","shop":"supermarket"},"name":"CRAI","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Caprabo":{"tags":{"name":"Caprabo","shop":"supermarket"},"name":"Caprabo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Cargills Food City":{"tags":{"name":"Cargills Food City","shop":"supermarket"},"name":"Cargills Food City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour":{"tags":{"name":"Carrefour","shop":"supermarket"},"name":"Carrefour","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour City":{"tags":{"name":"Carrefour City","shop":"supermarket"},"name":"Carrefour City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour Contact":{"tags":{"name":"Carrefour Contact","shop":"supermarket"},"name":"Carrefour Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour Express":{"tags":{"name":"Carrefour Express","shop":"supermarket"},"name":"Carrefour Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Centre Commercial E. Leclerc":{"tags":{"name":"Centre Commercial E. Leclerc","shop":"supermarket"},"name":"Centre Commercial E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Checkers":{"tags":{"name":"Checkers","shop":"supermarket"},"name":"Checkers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Chedraui":{"tags":{"name":"Chedraui","shop":"supermarket"},"name":"Chedraui","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-Op":{"tags":{"name":"Co-Op","shop":"supermarket"},"name":"Co-Op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-op":{"tags":{"name":"Co-op","shop":"supermarket"},"name":"Co-op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-operative":{"tags":{"name":"Co-operative","shop":"supermarket"},"name":"Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coles":{"tags":{"name":"Coles","shop":"supermarket"},"name":"Coles","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Colmado":{"tags":{"name":"Colmado","shop":"supermarket"},"name":"Colmado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Colruyt":{"tags":{"name":"Colruyt","shop":"supermarket"},"name":"Colruyt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Combi":{"tags":{"name":"Combi","shop":"supermarket"},"name":"Combi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Comercial Mexicana":{"tags":{"name":"Comercial Mexicana","shop":"supermarket"},"name":"Comercial Mexicana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Conad":{"tags":{"name":"Conad","shop":"supermarket"},"name":"Conad","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Conad City":{"tags":{"name":"Conad City","shop":"supermarket"},"name":"Conad City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Condis":{"tags":{"name":"Condis","shop":"supermarket"},"name":"Condis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Consum":{"tags":{"name":"Consum","shop":"supermarket"},"name":"Consum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Continente":{"tags":{"name":"Continente","shop":"supermarket"},"name":"Continente","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop":{"tags":{"name":"Coop","shop":"supermarket"},"name":"Coop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop Extra":{"tags":{"name":"Coop Extra","shop":"supermarket"},"name":"Coop Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop Konsum":{"tags":{"name":"Coop Konsum","shop":"supermarket"},"name":"Coop Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Costco":{"tags":{"name":"Costco","shop":"supermarket"},"name":"Costco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coto":{"tags":{"name":"Coto","shop":"supermarket"},"name":"Coto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Countdown":{"tags":{"name":"Countdown","shop":"supermarket"},"name":"Countdown","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coviran":{"tags":{"name":"Coviran","shop":"supermarket"},"name":"Coviran","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Covirán":{"tags":{"name":"Covirán","shop":"supermarket"},"name":"Covirán","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Crai":{"tags":{"name":"Crai","shop":"supermarket"},"name":"Crai","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Cub Foods":{"tags":{"name":"Cub Foods","shop":"supermarket"},"name":"Cub Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dagli'Brugsen":{"tags":{"name":"Dagli'Brugsen","shop":"supermarket"},"name":"Dagli'Brugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Deen":{"tags":{"name":"Deen","shop":"supermarket"},"name":"Deen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Delhaize":{"tags":{"name":"Delhaize","shop":"supermarket"},"name":"Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Delikatesy Centrum":{"tags":{"name":"Delikatesy Centrum","shop":"supermarket"},"name":"Delikatesy Centrum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Denner":{"tags":{"name":"Denner","shop":"supermarket"},"name":"Denner","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Despar":{"tags":{"name":"Despar","shop":"supermarket"},"name":"Despar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Despensa Familiar":{"tags":{"name":"Despensa Familiar","shop":"supermarket"},"name":"Despensa Familiar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia":{"tags":{"name":"Dia","shop":"supermarket"},"name":"Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia %":{"tags":{"name":"Dia %","shop":"supermarket"},"name":"Dia %","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia Market":{"tags":{"name":"Dia Market","shop":"supermarket"},"name":"Dia Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dino":{"tags":{"name":"Dino","shop":"supermarket"},"name":"Dino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dirk van den Broek":{"tags":{"name":"Dirk van den Broek","shop":"supermarket"},"name":"Dirk van den Broek","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Disco":{"tags":{"name":"Disco","shop":"supermarket"},"name":"Disco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Diska":{"tags":{"name":"Diska","shop":"supermarket"},"name":"Diska","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dunnes Stores":{"tags":{"name":"Dunnes Stores","shop":"supermarket"},"name":"Dunnes Stores","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E-Center":{"tags":{"name":"E-Center","shop":"supermarket"},"name":"E-Center","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E. Leclerc":{"tags":{"name":"E. Leclerc","shop":"supermarket"},"name":"E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E. Leclerc Drive":{"tags":{"name":"E. Leclerc Drive","shop":"supermarket"},"name":"E. Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/EMTÉ":{"tags":{"name":"EMTÉ","shop":"supermarket"},"name":"EMTÉ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Edeka":{"tags":{"name":"Edeka","shop":"supermarket"},"name":"Edeka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ekom":{"tags":{"name":"Ekom","shop":"supermarket"},"name":"Ekom","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ekono":{"tags":{"name":"Ekono","shop":"supermarket"},"name":"Ekono","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/El Árbol":{"tags":{"name":"El Árbol","shop":"supermarket"},"name":"El Árbol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eroski":{"tags":{"name":"Eroski","shop":"supermarket"},"name":"Eroski","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Esselunga":{"tags":{"name":"Esselunga","shop":"supermarket"},"name":"Esselunga","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/EuroSpin":{"tags":{"name":"EuroSpin","shop":"supermarket"},"name":"EuroSpin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eurospar":{"tags":{"name":"Eurospar","shop":"supermarket"},"name":"Eurospar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eurospin":{"tags":{"name":"Eurospin","shop":"supermarket"},"name":"Eurospin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Extra":{"tags":{"name":"Extra","shop":"supermarket"},"name":"Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Famiglia Cooperativa":{"tags":{"name":"Famiglia Cooperativa","shop":"supermarket"},"name":"Famiglia Cooperativa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Famila":{"tags":{"name":"Famila","shop":"supermarket"},"name":"Famila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Fareway":{"tags":{"name":"Fareway","shop":"supermarket"},"name":"Fareway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Farmfoods":{"tags":{"name":"Farmfoods","shop":"supermarket"},"name":"Farmfoods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Feneberg":{"tags":{"name":"Feneberg","shop":"supermarket"},"name":"Feneberg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Food Basics":{"tags":{"name":"Food Basics","shop":"supermarket"},"name":"Food Basics","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Food Lion":{"tags":{"name":"Food Lion","shop":"supermarket"},"name":"Food Lion","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Foodland":{"tags":{"name":"Foodland","shop":"supermarket"},"name":"Foodland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Foodworks":{"tags":{"name":"Foodworks","shop":"supermarket"},"name":"Foodworks","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Franprix":{"tags":{"name":"Franprix","shop":"supermarket"},"name":"Franprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Fred Meyer":{"tags":{"name":"Fred Meyer","shop":"supermarket"},"name":"Fred Meyer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Froiz":{"tags":{"name":"Froiz","shop":"supermarket"},"name":"Froiz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Føtex":{"tags":{"name":"Føtex","shop":"supermarket"},"name":"Føtex","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/G20":{"tags":{"name":"G20","shop":"supermarket"},"name":"G20","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Gadis":{"tags":{"name":"Gadis","shop":"supermarket"},"name":"Gadis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Giant":{"tags":{"name":"Giant","shop":"supermarket"},"name":"Giant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Giant Eagle":{"tags":{"name":"Giant Eagle","shop":"supermarket"},"name":"Giant Eagle","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Grand Frais":{"tags":{"name":"Grand Frais","shop":"supermarket"},"name":"Grand Frais","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Grocery Outlet":{"tags":{"name":"Grocery Outlet","shop":"supermarket"},"name":"Grocery Outlet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Géant Casino":{"tags":{"name":"Géant Casino","shop":"supermarket"},"name":"Géant Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/H-E-B":{"tags":{"name":"H-E-B","shop":"supermarket"},"name":"H-E-B","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/HIT":{"tags":{"name":"HIT","shop":"supermarket"},"name":"HIT","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hannaford":{"tags":{"name":"Hannaford","shop":"supermarket"},"name":"Hannaford","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Harris Teeter":{"tags":{"name":"Harris Teeter","shop":"supermarket"},"name":"Harris Teeter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hemköp":{"tags":{"name":"Hemköp","shop":"supermarket"},"name":"Hemköp","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Heron Foods":{"tags":{"name":"Heron Foods","shop":"supermarket"},"name":"Heron Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hofer":{"tags":{"name":"Hofer","shop":"supermarket"},"name":"Hofer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hoogvliet":{"tags":{"name":"Hoogvliet","shop":"supermarket"},"name":"Hoogvliet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hy-Vee":{"tags":{"name":"Hy-Vee","shop":"supermarket"},"name":"Hy-Vee","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ICA":{"tags":{"name":"ICA","shop":"supermarket"},"name":"ICA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ICA Kvantum":{"tags":{"name":"ICA Kvantum","shop":"supermarket"},"name":"ICA Kvantum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/IDEA":{"tags":{"name":"IDEA","shop":"supermarket"},"name":"IDEA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/IGA":{"tags":{"name":"IGA","shop":"supermarket"},"name":"IGA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Iceland":{"tags":{"name":"Iceland","shop":"supermarket"},"name":"Iceland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché":{"tags":{"name":"Intermarché","shop":"supermarket"},"name":"Intermarché","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché Contact":{"tags":{"name":"Intermarché Contact","shop":"supermarket"},"name":"Intermarché Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché Super":{"tags":{"name":"Intermarché Super","shop":"supermarket"},"name":"Intermarché Super","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Interspar":{"tags":{"name":"Interspar","shop":"supermarket"},"name":"Interspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Irma":{"tags":{"name":"Irma","shop":"supermarket"},"name":"Irma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Jewel-Osco":{"tags":{"name":"Jewel-Osco","shop":"supermarket"},"name":"Jewel-Osco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Jumbo":{"tags":{"name":"Jumbo","shop":"supermarket"},"name":"Jumbo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/K+K":{"tags":{"name":"K+K","shop":"supermarket"},"name":"K+K","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kaufland":{"tags":{"name":"Kaufland","shop":"supermarket"},"name":"Kaufland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/King Soopers":{"tags":{"name":"King Soopers","shop":"supermarket"},"name":"King Soopers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kiwi":{"tags":{"name":"Kiwi","shop":"supermarket"},"name":"Kiwi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Konsum":{"tags":{"name":"Konsum","shop":"supermarket"},"name":"Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Konzum":{"tags":{"name":"Konzum","shop":"supermarket"},"name":"Konzum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kroger":{"tags":{"name":"Kroger","shop":"supermarket"},"name":"Kroger","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kvickly":{"tags":{"name":"Kvickly","shop":"supermarket"},"name":"Kvickly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/La Vie Claire":{"tags":{"name":"La Vie Claire","shop":"supermarket"},"name":"La Vie Claire","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Landi":{"tags":{"name":"Landi","shop":"supermarket"},"name":"Landi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Leader Price":{"tags":{"name":"Leader Price","shop":"supermarket"},"name":"Leader Price","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Leclerc Drive":{"tags":{"name":"Leclerc Drive","shop":"supermarket"},"name":"Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lider":{"tags":{"name":"Lider","shop":"supermarket"},"name":"Lider","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lidl":{"tags":{"name":"Lidl","shop":"supermarket"},"name":"Lidl","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lupa":{"tags":{"name":"Lupa","shop":"supermarket"},"name":"Lupa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/MPREIS":{"tags":{"name":"MPREIS","shop":"supermarket"},"name":"MPREIS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Makro":{"tags":{"name":"Makro","shop":"supermarket"},"name":"Makro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Markant":{"tags":{"name":"Markant","shop":"supermarket"},"name":"Markant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Market Basket":{"tags":{"name":"Market Basket","shop":"supermarket"},"name":"Market Basket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Marktkauf":{"tags":{"name":"Marktkauf","shop":"supermarket"},"name":"Marktkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Match":{"tags":{"name":"Match","shop":"supermarket"},"name":"Match","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxi":{"tags":{"name":"Maxi","shop":"supermarket"},"name":"Maxi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxi Dia":{"tags":{"name":"Maxi Dia","shop":"supermarket"},"name":"Maxi Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima":{"tags":{"name":"Maxima","shop":"supermarket"},"name":"Maxima","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima X":{"tags":{"name":"Maxima X","shop":"supermarket"},"name":"Maxima X","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima XX":{"tags":{"name":"Maxima XX","shop":"supermarket"},"name":"Maxima XX","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mega Image":{"tags":{"name":"Mega Image","shop":"supermarket"},"name":"Mega Image","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mego":{"tags":{"name":"Mego","shop":"supermarket"},"name":"Mego","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Meijer":{"tags":{"name":"Meijer","shop":"supermarket"},"name":"Meijer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Meny":{"tags":{"name":"Meny","shop":"supermarket"},"name":"Meny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercado Municipal":{"tags":{"name":"Mercado Municipal","shop":"supermarket"},"name":"Mercado Municipal","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercado de Abastos":{"tags":{"name":"Mercado de Abastos","shop":"supermarket"},"name":"Mercado de Abastos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercadona":{"tags":{"name":"Mercadona","shop":"supermarket"},"name":"Mercadona","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercator":{"tags":{"name":"Mercator","shop":"supermarket"},"name":"Mercator","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Merkur":{"tags":{"name":"Merkur","shop":"supermarket"},"name":"Merkur","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Metro":{"tags":{"name":"Metro","shop":"supermarket"},"name":"Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Migros":{"tags":{"name":"Migros","shop":"supermarket"},"name":"Migros","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mila":{"tags":{"name":"Mila","shop":"supermarket"},"name":"Mila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Minipreço":{"tags":{"name":"Minipreço","shop":"supermarket"},"name":"Minipreço","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mix Markt":{"tags":{"name":"Mix Markt","shop":"supermarket"},"name":"Mix Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Monoprix":{"tags":{"name":"Monoprix","shop":"supermarket"},"name":"Monoprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/More":{"tags":{"name":"More","shop":"supermarket"},"name":"More","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Morrisons":{"tags":{"name":"Morrisons","shop":"supermarket"},"name":"Morrisons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/NORMA":{"tags":{"name":"NORMA","shop":"supermarket"},"name":"NORMA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/NP":{"tags":{"name":"NP","shop":"supermarket"},"name":"NP","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Nah & Frisch":{"tags":{"name":"Nah & Frisch","shop":"supermarket"},"name":"Nah & Frisch","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Nahkauf":{"tags":{"name":"Nahkauf","shop":"supermarket"},"name":"Nahkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Netto":{"tags":{"name":"Netto","shop":"supermarket"},"name":"Netto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Netto Marken-Discount":{"tags":{"name":"Netto Marken-Discount","shop":"supermarket"},"name":"Netto Marken-Discount","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/New World":{"tags":{"name":"New World","shop":"supermarket"},"name":"New World","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/No Frills":{"tags":{"name":"No Frills","shop":"supermarket"},"name":"No Frills","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Norfa XL":{"tags":{"name":"Norfa XL","shop":"supermarket"},"name":"Norfa XL","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Norma":{"tags":{"name":"Norma","shop":"supermarket"},"name":"Norma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/PENNY":{"tags":{"name":"PENNY","shop":"supermarket"},"name":"PENNY","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/PLUS":{"tags":{"name":"PLUS","shop":"supermarket"},"name":"PLUS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/POLOmarket":{"tags":{"name":"POLOmarket","shop":"supermarket"},"name":"POLOmarket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Palí":{"tags":{"name":"Palí","shop":"supermarket"},"name":"Palí","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pam":{"tags":{"name":"Pam","shop":"supermarket"},"name":"Pam","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Penny":{"tags":{"name":"Penny","shop":"supermarket"},"name":"Penny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Penny Markt":{"tags":{"name":"Penny Markt","shop":"supermarket"},"name":"Penny Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pick n Pay":{"tags":{"name":"Pick n Pay","shop":"supermarket"},"name":"Pick n Pay","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Piggly Wiggly":{"tags":{"name":"Piggly Wiggly","shop":"supermarket"},"name":"Piggly Wiggly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pingo Doce":{"tags":{"name":"Pingo Doce","shop":"supermarket"},"name":"Pingo Doce","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Piotr i Paweł":{"tags":{"name":"Piotr i Paweł","shop":"supermarket"},"name":"Piotr i Paweł","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Plaza Vea":{"tags":{"name":"Plaza Vea","shop":"supermarket"},"name":"Plaza Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Plodine":{"tags":{"name":"Plodine","shop":"supermarket"},"name":"Plodine","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Poiesz":{"tags":{"name":"Poiesz","shop":"supermarket"},"name":"Poiesz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Price Chopper":{"tags":{"name":"Price Chopper","shop":"supermarket"},"name":"Price Chopper","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Prix":{"tags":{"name":"Prix","shop":"supermarket"},"name":"Prix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Profi":{"tags":{"name":"Profi","shop":"supermarket"},"name":"Profi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Proxy Delhaize":{"tags":{"name":"Proxy Delhaize","shop":"supermarket"},"name":"Proxy Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Publix":{"tags":{"name":"Publix","shop":"supermarket"},"name":"Publix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Punto Simply":{"tags":{"name":"Punto Simply","shop":"supermarket"},"name":"Punto Simply","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Puregold":{"tags":{"name":"Puregold","shop":"supermarket"},"name":"Puregold","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pão de Açúcar":{"tags":{"name":"Pão de Açúcar","shop":"supermarket"},"name":"Pão de Açúcar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/QFC":{"tags":{"name":"QFC","shop":"supermarket"},"name":"QFC","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/REMA 1000":{"tags":{"name":"REMA 1000","shop":"supermarket"},"name":"REMA 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ralphs":{"tags":{"name":"Ralphs","shop":"supermarket"},"name":"Ralphs","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Real":{"tags":{"name":"Real","shop":"supermarket"},"name":"Real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Real Canadian Superstore":{"tags":{"name":"Real Canadian Superstore","shop":"supermarket"},"name":"Real Canadian Superstore","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Reliance Fresh":{"tags":{"name":"Reliance Fresh","shop":"supermarket"},"name":"Reliance Fresh","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rema 1000":{"tags":{"name":"Rema 1000","shop":"supermarket"},"name":"Rema 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rewe":{"tags":{"name":"Rewe","shop":"supermarket"},"name":"Rewe","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rewe City":{"tags":{"name":"Rewe City","shop":"supermarket"},"name":"Rewe City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rimi":{"tags":{"name":"Rimi","shop":"supermarket"},"name":"Rimi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/S-Market":{"tags":{"name":"S-Market","shop":"supermarket"},"name":"S-Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Safeway":{"tags":{"name":"Safeway","shop":"supermarket"},"name":"Safeway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sainsbury's":{"tags":{"name":"Sainsbury's","shop":"supermarket"},"name":"Sainsbury's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sainsbury's Local":{"tags":{"name":"Sainsbury's Local","shop":"supermarket"},"name":"Sainsbury's Local","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sam's Club":{"tags":{"name":"Sam's Club","shop":"supermarket"},"name":"Sam's Club","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Santa Isabel":{"tags":{"name":"Santa Isabel","shop":"supermarket"},"name":"Santa Isabel","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Save-A-Lot":{"tags":{"name":"Save-A-Lot","shop":"supermarket"},"name":"Save-A-Lot","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ShopRite":{"tags":{"name":"ShopRite","shop":"supermarket"},"name":"ShopRite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Shoprite":{"tags":{"name":"Shoprite","shop":"supermarket"},"name":"Shoprite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sigma":{"tags":{"name":"Sigma","shop":"supermarket"},"name":"Sigma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Simply Market":{"tags":{"name":"Simply Market","shop":"supermarket"},"name":"Simply Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sky":{"tags":{"name":"Sky","shop":"supermarket"},"name":"Sky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Smith's":{"tags":{"name":"Smith's","shop":"supermarket"},"name":"Smith's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sobeys":{"tags":{"name":"Sobeys","shop":"supermarket"},"name":"Sobeys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Soriana":{"tags":{"name":"Soriana","shop":"supermarket"},"name":"Soriana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Spar":{"tags":{"name":"Spar","shop":"supermarket"},"name":"Spar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sprouts Farmers Market":{"tags":{"name":"Sprouts Farmers Market","shop":"supermarket"},"name":"Sprouts Farmers Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Stokrotka":{"tags":{"name":"Stokrotka","shop":"supermarket"},"name":"Stokrotka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Stop & Shop":{"tags":{"name":"Stop & Shop","shop":"supermarket"},"name":"Stop & Shop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Super C":{"tags":{"name":"Super C","shop":"supermarket"},"name":"Super C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Super U":{"tags":{"name":"Super U","shop":"supermarket"},"name":"Super U","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/SuperBrugsen":{"tags":{"name":"SuperBrugsen","shop":"supermarket"},"name":"SuperBrugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/SuperValu":{"tags":{"name":"SuperValu","shop":"supermarket"},"name":"SuperValu","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Superama":{"tags":{"name":"Superama","shop":"supermarket"},"name":"Superama","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Supersol":{"tags":{"name":"Supersol","shop":"supermarket"},"name":"Supersol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Superspar":{"tags":{"name":"Superspar","shop":"supermarket"},"name":"Superspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tegut":{"tags":{"name":"Tegut","shop":"supermarket"},"name":"Tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tengelmann":{"tags":{"name":"Tengelmann","shop":"supermarket"},"name":"Tengelmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco":{"tags":{"name":"Tesco","shop":"supermarket"},"name":"Tesco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Extra":{"tags":{"name":"Tesco Extra","shop":"supermarket"},"name":"Tesco Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Lotus":{"tags":{"name":"Tesco Lotus","shop":"supermarket"},"name":"Tesco Lotus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Metro":{"tags":{"name":"Tesco Metro","shop":"supermarket"},"name":"Tesco Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/The Co-operative":{"tags":{"name":"The Co-operative","shop":"supermarket"},"name":"The Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/The Co-operative Food":{"tags":{"name":"The Co-operative Food","shop":"supermarket"},"name":"The Co-operative Food","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tommy":{"tags":{"name":"Tommy","shop":"supermarket"},"name":"Tommy","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tottus":{"tags":{"name":"Tottus","shop":"supermarket"},"name":"Tottus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Trader Joe's":{"tags":{"name":"Trader Joe's","shop":"supermarket"},"name":"Trader Joe's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Treff 3000":{"tags":{"name":"Treff 3000","shop":"supermarket"},"name":"Treff 3000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/U Express":{"tags":{"name":"U Express","shop":"supermarket"},"name":"U Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Unimarc":{"tags":{"name":"Unimarc","shop":"supermarket"},"name":"Unimarc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Unimarkt":{"tags":{"name":"Unimarkt","shop":"supermarket"},"name":"Unimarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Utile":{"tags":{"name":"Utile","shop":"supermarket"},"name":"Utile","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Vea":{"tags":{"name":"Vea","shop":"supermarket"},"name":"Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Volg":{"tags":{"name":"Volg","shop":"supermarket"},"name":"Volg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Waitrose":{"tags":{"name":"Waitrose","shop":"supermarket"},"name":"Waitrose","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart":{"tags":{"name":"Walmart","shop":"supermarket"},"name":"Walmart","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart Neighborhood Market":{"tags":{"name":"Walmart Neighborhood Market","shop":"supermarket"},"name":"Walmart Neighborhood Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart Supercenter":{"tags":{"name":"Walmart Supercenter","shop":"supermarket"},"name":"Walmart Supercenter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wasgau":{"tags":{"name":"Wasgau","shop":"supermarket"},"name":"Wasgau","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wegmans":{"tags":{"name":"Wegmans","shop":"supermarket"},"name":"Wegmans","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wellcome":{"tags":{"name":"Wellcome","shop":"supermarket"},"name":"Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Whole Foods Market":{"tags":{"name":"Whole Foods Market","shop":"supermarket"},"name":"Whole Foods Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Willys":{"tags":{"name":"Willys","shop":"supermarket"},"name":"Willys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/WinCo Foods":{"tags":{"name":"WinCo Foods","shop":"supermarket"},"name":"WinCo Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Winn Dixie":{"tags":{"name":"Winn Dixie","shop":"supermarket"},"name":"Winn Dixie","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Woolworths":{"tags":{"name":"Woolworths","shop":"supermarket"},"name":"Woolworths","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/denn's Biomarkt":{"tags":{"name":"denn's Biomarkt","shop":"supermarket"},"name":"denn's Biomarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/fakta":{"tags":{"name":"fakta","shop":"supermarket"},"name":"fakta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/real":{"tags":{"name":"real","shop":"supermarket"},"name":"real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/tegut":{"tags":{"name":"tegut","shop":"supermarket"},"name":"tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Şok":{"tags":{"name":"Şok","shop":"supermarket"},"name":"Şok","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ΑΒ Βασιλόπουλος":{"tags":{"name":"ΑΒ Βασιλόπουλος","shop":"supermarket"},"name":"ΑΒ Βασιλόπουλος","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Γαλαξίας":{"tags":{"name":"Γαλαξίας","shop":"supermarket"},"name":"Γαλαξίας","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Μασούτης":{"tags":{"name":"Μασούτης","shop":"supermarket"},"name":"Μασούτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Σκλαβενίτης":{"tags":{"name":"Σκλαβενίτης","shop":"supermarket"},"name":"Σκλαβενίτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/АТБ":{"tags":{"name":"АТБ","shop":"supermarket"},"name":"АТБ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Абсолют":{"tags":{"name":"Абсолют","shop":"supermarket"},"name":"Абсолют","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Азбука Вкуса":{"tags":{"name":"Азбука Вкуса","shop":"supermarket"},"name":"Азбука Вкуса","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Атак":{"tags":{"name":"Атак","shop":"supermarket"},"name":"Атак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ашан":{"tags":{"name":"Ашан","shop":"supermarket"},"name":"Ашан","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Верный":{"tags":{"name":"Верный","shop":"supermarket"},"name":"Верный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Вопак":{"tags":{"name":"Вопак","shop":"supermarket"},"name":"Вопак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Гроздь":{"tags":{"name":"Гроздь","shop":"supermarket"},"name":"Гроздь","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Десяточка":{"tags":{"name":"Десяточка","shop":"supermarket"},"name":"Десяточка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Дикси":{"tags":{"name":"Дикси","shop":"supermarket"},"name":"Дикси","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Евроопт":{"tags":{"name":"Евроопт","shop":"supermarket"},"name":"Евроопт","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Карусель":{"tags":{"name":"Карусель","shop":"supermarket"},"name":"Карусель","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Квартал":{"tags":{"name":"Квартал","shop":"supermarket"},"name":"Квартал","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Командор":{"tags":{"name":"Командор","shop":"supermarket"},"name":"Командор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Красный Яр":{"tags":{"name":"Красный Яр","shop":"supermarket"},"name":"Красный Яр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Лента":{"tags":{"name":"Лента","shop":"supermarket"},"name":"Лента","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Магнит":{"tags":{"name":"Магнит","shop":"supermarket"},"name":"Магнит","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Магнолия":{"tags":{"name":"Магнолия","shop":"supermarket"},"name":"Магнолия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Монетка":{"tags":{"name":"Монетка","shop":"supermarket"},"name":"Монетка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Народная 7Я семьЯ":{"tags":{"name":"Народная 7Я семьЯ","shop":"supermarket"},"name":"Народная 7Я семьЯ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Перекресток":{"tags":{"name":"Перекресток","shop":"supermarket"},"name":"Перекресток","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Покупочка":{"tags":{"name":"Покупочка","shop":"supermarket"},"name":"Покупочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Полушка":{"tags":{"name":"Полушка","shop":"supermarket"},"name":"Полушка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Пятёрочка":{"tags":{"name":"Пятёрочка","shop":"supermarket"},"name":"Пятёрочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Радеж":{"tags":{"name":"Радеж","shop":"supermarket"},"name":"Радеж","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Рукавичка":{"tags":{"name":"Рукавичка","shop":"supermarket"},"name":"Рукавичка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Светофор":{"tags":{"name":"Светофор","shop":"supermarket"},"name":"Светофор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Седьмой континент":{"tags":{"name":"Седьмой континент","shop":"supermarket"},"name":"Седьмой континент","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Семейный":{"tags":{"name":"Семейный","shop":"supermarket"},"name":"Семейный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Семья":{"tags":{"name":"Семья","shop":"supermarket"},"name":"Семья","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Супермаркет":{"tags":{"name":"Супермаркет","shop":"supermarket"},"name":"Супермаркет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Сільпо":{"tags":{"name":"Сільпо","shop":"supermarket"},"name":"Сільпо","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Таврія‑В":{"tags":{"name":"Таврія‑В","shop":"supermarket"},"name":"Таврія‑В","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Фора":{"tags":{"name":"Фора","shop":"supermarket"},"name":"Фора","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Фуршет":{"tags":{"name":"Фуршет","shop":"supermarket"},"name":"Фуршет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Хүнсний дэлгүүр":{"tags":{"name":"Хүнсний дэлгүүр","shop":"supermarket"},"name":"Хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Эдельвейс":{"tags":{"name":"Эдельвейс","shop":"supermarket"},"name":"Эдельвейс","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/хүнсний дэлгүүр":{"tags":{"name":"хүнсний дэлгүүр","shop":"supermarket"},"name":"хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/بقالة":{"tags":{"name":"بقالة","shop":"supermarket"},"name":"بقالة","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/سوپر مارکت":{"tags":{"name":"سوپر مارکت","shop":"supermarket"},"name":"سوپر مارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/سوپرمارکت":{"tags":{"name":"سوپرمارکت","shop":"supermarket"},"name":"سوپرمارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/いなげや":{"tags":{"name":"いなげや","shop":"supermarket"},"name":"いなげや","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/まいばすけっと":{"tags":{"name":"まいばすけっと","shop":"supermarket"},"name":"まいばすけっと","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/イオン":{"tags":{"name":"イオン","shop":"supermarket"},"name":"イオン","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/イトーヨーカドー":{"tags":{"name":"イトーヨーカドー","shop":"supermarket"},"name":"イトーヨーカドー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/カスミ":{"tags":{"name":"カスミ","shop":"supermarket"},"name":"カスミ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/マックスバリュ":{"tags":{"name":"マックスバリュ","shop":"supermarket"},"name":"マックスバリュ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/マルエツ":{"tags":{"name":"マルエツ","shop":"supermarket"},"name":"マルエツ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ライフ":{"tags":{"name":"ライフ","shop":"supermarket"},"name":"ライフ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/全聯":{"tags":{"name":"全聯","shop":"supermarket"},"name":"全聯","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/全聯福利中心":{"tags":{"name":"全聯福利中心","shop":"supermarket"},"name":"全聯福利中心","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/惠康 Wellcome":{"tags":{"name":"惠康 Wellcome","shop":"supermarket"},"name":"惠康 Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/業務スーパー":{"tags":{"name":"業務スーパー","shop":"supermarket"},"name":"業務スーパー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/美廉社":{"tags":{"name":"美廉社","shop":"supermarket"},"name":"美廉社","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/西友":{"tags":{"name":"西友","shop":"supermarket"},"name":"西友","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tailor/Atelier de couture":{"tags":{"name":"Atelier de couture","shop":"tailor"},"name":"Atelier de couture","icon":"clothing-store","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Boutique Grandes Lignes":{"tags":{"name":"Boutique Grandes Lignes","shop":"ticket"},"name":"Boutique Grandes Lignes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Guichet Transilien":{"tags":{"name":"Guichet Transilien","shop":"ticket"},"name":"Guichet Transilien","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Касса":{"tags":{"name":"Касса","shop":"ticket"},"name":"Касса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Проездные билеты":{"tags":{"name":"Проездные билеты","shop":"ticket"},"name":"Проездные билеты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Dohánybolt":{"tags":{"name":"Dohánybolt","shop":"tobacco"},"name":"Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Estanco":{"tags":{"name":"Estanco","shop":"tobacco"},"name":"Estanco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Nemzeti Dohánybolt":{"tags":{"name":"Nemzeti Dohánybolt","shop":"tobacco"},"name":"Nemzeti Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Tabacos":{"tags":{"name":"Tabacos","shop":"tobacco"},"name":"Tabacos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Табакерка":{"tags":{"name":"Табакерка","shop":"tobacco"},"name":"Табакерка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Dráčik":{"tags":{"name":"Dráčik","shop":"toys"},"name":"Dráčik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Intertoys":{"tags":{"name":"Intertoys","shop":"toys"},"name":"Intertoys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/King Jouet":{"tags":{"name":"King Jouet","shop":"toys"},"name":"King Jouet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/La Grande Récré":{"tags":{"name":"La Grande Récré","shop":"toys"},"name":"La Grande Récré","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Maxi Toys":{"tags":{"name":"Maxi Toys","shop":"toys"},"name":"Maxi Toys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Toys R Us":{"tags":{"name":"Toys R Us","shop":"toys"},"name":"Toys R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Детский мир":{"tags":{"name":"Детский мир","shop":"toys"},"name":"Детский мир","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Игрушки":{"tags":{"name":"Игрушки","shop":"toys"},"name":"Игрушки","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/D-reizen":{"tags":{"name":"D-reizen","shop":"travel_agency"},"name":"D-reizen","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/DER Reisebüro":{"tags":{"name":"DER Reisebüro","shop":"travel_agency"},"name":"DER Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/First Reisebüro":{"tags":{"name":"First Reisebüro","shop":"travel_agency"},"name":"First Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Flight Centre":{"tags":{"name":"Flight Centre","shop":"travel_agency"},"name":"Flight Centre","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Reiseland":{"tags":{"name":"Reiseland","shop":"travel_agency"},"name":"Reiseland","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/TUI":{"tags":{"name":"TUI","shop":"travel_agency"},"name":"TUI","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/The Co-operative Travel":{"tags":{"name":"The Co-operative Travel","shop":"travel_agency"},"name":"The Co-operative Travel","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Thomas Cook":{"tags":{"name":"Thomas Cook","shop":"travel_agency"},"name":"Thomas Cook","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Thomson":{"tags":{"name":"Thomson","shop":"travel_agency"},"name":"Thomson","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Borracharia":{"tags":{"name":"Borracharia","shop":"tyres"},"name":"Borracharia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Bridgestone":{"tags":{"name":"Bridgestone","shop":"tyres"},"name":"Bridgestone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Discount Tire":{"tags":{"name":"Discount Tire","shop":"tyres"},"name":"Discount Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Les Schwab Tire Center":{"tags":{"name":"Les Schwab Tire Center","shop":"tyres"},"name":"Les Schwab Tire Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Vianor":{"tags":{"name":"Vianor","shop":"tyres"},"name":"Vianor","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Вулканизация":{"tags":{"name":"Вулканизация","shop":"tyres"},"name":"Вулканизация","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Action":{"tags":{"name":"Action","shop":"variety_store"},"name":"Action","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Bazar":{"tags":{"name":"Bazar","shop":"variety_store"},"name":"Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Big Bazar":{"tags":{"name":"Big Bazar","shop":"variety_store"},"name":"Big Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Dollar Tree":{"tags":{"name":"Dollar Tree","shop":"variety_store"},"name":"Dollar Tree","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Dollarama":{"tags":{"name":"Dollarama","shop":"variety_store"},"name":"Dollarama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/EuroShop":{"tags":{"name":"EuroShop","shop":"variety_store"},"name":"EuroShop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Family Dollar":{"tags":{"name":"Family Dollar","shop":"variety_store"},"name":"Family Dollar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Fix Price":{"tags":{"name":"Fix Price","shop":"variety_store"},"name":"Fix Price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Fix price":{"tags":{"name":"Fix price","shop":"variety_store"},"name":"Fix price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/FixPrice":{"tags":{"name":"FixPrice","shop":"variety_store"},"name":"FixPrice","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/GiFi":{"tags":{"name":"GiFi","shop":"variety_store"},"name":"GiFi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Home Bargains":{"tags":{"name":"Home Bargains","shop":"variety_store"},"name":"Home Bargains","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Mäc-Geiz":{"tags":{"name":"Mäc-Geiz","shop":"variety_store"},"name":"Mäc-Geiz","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/NOZ":{"tags":{"name":"NOZ","shop":"variety_store"},"name":"NOZ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Poundland":{"tags":{"name":"Poundland","shop":"variety_store"},"name":"Poundland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Poundworld":{"tags":{"name":"Poundworld","shop":"variety_store"},"name":"Poundworld","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Tedi":{"tags":{"name":"Tedi","shop":"variety_store"},"name":"Tedi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/ダイソー":{"tags":{"name":"ダイソー","shop":"variety_store"},"name":"ダイソー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/Blockbuster":{"tags":{"name":"Blockbuster","shop":"video"},"name":"Blockbuster","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/Family Video":{"tags":{"name":"Family Video","shop":"video"},"name":"Family Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/TSUTAYA":{"tags":{"name":"TSUTAYA","shop":"video"},"name":"TSUTAYA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/World of Video":{"tags":{"name":"World of Video","shop":"video"},"name":"World of Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/ゲオ":{"tags":{"name":"ゲオ","shop":"video"},"name":"ゲオ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/EB Games":{"tags":{"name":"EB Games","shop":"video_games"},"name":"EB Games","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/Game":{"tags":{"name":"Game","shop":"video_games"},"name":"Game","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/GameStop":{"tags":{"name":"GameStop","shop":"video_games"},"name":"GameStop","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/Micromania":{"tags":{"name":"Micromania","shop":"video_games"},"name":"Micromania","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"tourism/alpine_hut/КОШ":{"tags":{"name":"КОШ","tourism":"alpine_hut"},"name":"КОШ","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/apartment/Двухкомнатная квартира на сутки":{"tags":{"name":"Двухкомнатная квартира на сутки","tourism":"apartment"},"name":"Двухкомнатная квартира на сутки","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/attraction/Arch":{"tags":{"name":"Arch","tourism":"attraction"},"name":"Arch","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Kursächsische Postmeilensäule":{"tags":{"name":"Kursächsische Postmeilensäule","tourism":"attraction"},"name":"Kursächsische Postmeilensäule","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Maibaum":{"tags":{"name":"Maibaum","tourism":"attraction"},"name":"Maibaum","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moab trail":{"tags":{"name":"Moab trail","tourism":"attraction"},"name":"Moab trail","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moai":{"tags":{"name":"Moai","tourism":"attraction"},"name":"Moai","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/OWŚ":{"tags":{"name":"OWŚ","tourism":"attraction"},"name":"OWŚ","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Sommerrodelbahn":{"tags":{"name":"Sommerrodelbahn","tourism":"attraction"},"name":"Sommerrodelbahn","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path contiunes":{"tags":{"name":"path contiunes","tourism":"attraction"},"name":"path contiunes","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/white blaze":{"tags":{"name":"white blaze","tourism":"attraction"},"name":"white blaze","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Кладбище еврейское":{"tags":{"name":"Кладбище еврейское","tourism":"attraction"},"name":"Кладбище еврейское","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Колесо обозрения":{"tags":{"name":"Колесо обозрения","tourism":"attraction"},"name":"Колесо обозрения","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Приусадебный парк":{"tags":{"name":"Приусадебный парк","tourism":"attraction"},"name":"Приусадебный парк","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Усадьба":{"tags":{"name":"Усадьба","tourism":"attraction"},"name":"Усадьба","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Хозяйственный двор":{"tags":{"name":"Хозяйственный двор","tourism":"attraction"},"name":"Хозяйственный двор","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Часовня":{"tags":{"name":"Часовня","tourism":"attraction"},"name":"Часовня","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/дольмен":{"tags":{"name":"дольмен","tourism":"attraction"},"name":"дольмен","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/camp_site/Camping Municipal":{"tags":{"name":"Camping Municipal","tourism":"camp_site"},"name":"Camping Municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Camping municipal":{"tags":{"name":"Camping municipal","tourism":"camp_site"},"name":"Camping municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Home":{"tags":{"name":"Home","tourism":"guest_house"},"name":"Home","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/OW Bielanka":{"tags":{"name":"OW Bielanka","tourism":"guest_house"},"name":"OW Bielanka","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Albergue de Peregrinos":{"tags":{"name":"Albergue de Peregrinos","tourism":"hostel"},"name":"Albergue de Peregrinos","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hospedaje":{"tags":{"name":"Hospedaje","tourism":"hostel"},"name":"Hospedaje","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hostal":{"tags":{"name":"Hostal","tourism":"hostel"},"name":"Hostal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&B Hôtel":{"tags":{"name":"B&B Hôtel","tourism":"hotel"},"name":"B&B Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&b Hôtel":{"tags":{"name":"B&b Hôtel","tourism":"hotel"},"name":"B&b Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Best Western":{"tags":{"name":"Best Western","tourism":"hotel"},"name":"Best Western","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Campanile":{"tags":{"name":"Campanile","tourism":"hotel"},"name":"Campanile","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Central Hotel":{"tags":{"name":"Central Hotel","tourism":"hotel"},"name":"Central Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/City Hotel":{"tags":{"name":"City Hotel","tourism":"hotel"},"name":"City Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn":{"tags":{"name":"Comfort Inn","tourism":"hotel"},"name":"Comfort Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn & Suites":{"tags":{"name":"Comfort Inn & Suites","tourism":"hotel"},"name":"Comfort Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Suites":{"tags":{"name":"Comfort Suites","tourism":"hotel"},"name":"Comfort Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Country Inn & Suites":{"tags":{"name":"Country Inn & Suites","tourism":"hotel"},"name":"Country Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Courtyard by Marriott":{"tags":{"name":"Courtyard by Marriott","tourism":"hotel"},"name":"Courtyard by Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Crowne Plaza":{"tags":{"name":"Crowne Plaza","tourism":"hotel"},"name":"Crowne Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Days Inn":{"tags":{"name":"Days Inn","tourism":"hotel"},"name":"Days Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Embassy Suites":{"tags":{"name":"Embassy Suites","tourism":"hotel"},"name":"Embassy Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Extended Stay America":{"tags":{"name":"Extended Stay America","tourism":"hotel"},"name":"Extended Stay America","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn":{"tags":{"name":"Fairfield Inn","tourism":"hotel"},"name":"Fairfield Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn & Suites":{"tags":{"name":"Fairfield Inn & Suites","tourism":"hotel"},"name":"Fairfield Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Formule 1":{"tags":{"name":"Formule 1","tourism":"hotel"},"name":"Formule 1","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Grand Hotel":{"tags":{"name":"Grand Hotel","tourism":"hotel"},"name":"Grand Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn":{"tags":{"name":"Hampton Inn","tourism":"hotel"},"name":"Hampton Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn & Suites":{"tags":{"name":"Hampton Inn & Suites","tourism":"hotel"},"name":"Hampton Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hilton Garden Inn":{"tags":{"name":"Hilton Garden Inn","tourism":"hotel"},"name":"Hilton Garden Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn":{"tags":{"name":"Holiday Inn","tourism":"hotel"},"name":"Holiday Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express":{"tags":{"name":"Holiday Inn Express","tourism":"hotel"},"name":"Holiday Inn Express","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express & Suites":{"tags":{"name":"Holiday Inn Express & Suites","tourism":"hotel"},"name":"Holiday Inn Express & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Homewood Suites":{"tags":{"name":"Homewood Suites","tourism":"hotel"},"name":"Homewood Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Central":{"tags":{"name":"Hotel Central","tourism":"hotel"},"name":"Hotel Central","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Europa":{"tags":{"name":"Hotel Europa","tourism":"hotel"},"name":"Hotel Europa","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Ibis":{"tags":{"name":"Hotel Ibis","tourism":"hotel"},"name":"Hotel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Krone":{"tags":{"name":"Hotel Krone","tourism":"hotel"},"name":"Hotel Krone","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Panorama":{"tags":{"name":"Hotel Panorama","tourism":"hotel"},"name":"Hotel Panorama","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Plaza":{"tags":{"name":"Hotel Plaza","tourism":"hotel"},"name":"Hotel Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Post":{"tags":{"name":"Hotel Post","tourism":"hotel"},"name":"Hotel Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Royal":{"tags":{"name":"Hotel Royal","tourism":"hotel"},"name":"Hotel Royal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Victoria":{"tags":{"name":"Hotel Victoria","tourism":"hotel"},"name":"Hotel Victoria","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel zur Post":{"tags":{"name":"Hotel zur Post","tourism":"hotel"},"name":"Hotel zur Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel Ibis":{"tags":{"name":"Hôtel Ibis","tourism":"hotel"},"name":"Hôtel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel de France":{"tags":{"name":"Hôtel de France","tourism":"hotel"},"name":"Hôtel de France","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis":{"tags":{"name":"Ibis","tourism":"hotel"},"name":"Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Budget":{"tags":{"name":"Ibis Budget","tourism":"hotel"},"name":"Ibis Budget","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Styles":{"tags":{"name":"Ibis Styles","tourism":"hotel"},"name":"Ibis Styles","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Kyriad":{"tags":{"name":"Kyriad","tourism":"hotel"},"name":"Kyriad","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/La Quinta":{"tags":{"name":"La Quinta","tourism":"hotel"},"name":"La Quinta","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Marriott":{"tags":{"name":"Marriott","tourism":"hotel"},"name":"Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Mercure":{"tags":{"name":"Mercure","tourism":"hotel"},"name":"Mercure","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Novotel":{"tags":{"name":"Novotel","tourism":"hotel"},"name":"Novotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Palace Hotel":{"tags":{"name":"Palace Hotel","tourism":"hotel"},"name":"Palace Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Park Hotel":{"tags":{"name":"Park Hotel","tourism":"hotel"},"name":"Park Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Parkhotel":{"tags":{"name":"Parkhotel","tourism":"hotel"},"name":"Parkhotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Premier Inn":{"tags":{"name":"Premier Inn","tourism":"hotel"},"name":"Premier Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Première Classe":{"tags":{"name":"Première Classe","tourism":"hotel"},"name":"Première Classe","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn":{"tags":{"name":"Quality Inn","tourism":"hotel"},"name":"Quality Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn & Suites":{"tags":{"name":"Quality Inn & Suites","tourism":"hotel"},"name":"Quality Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ramada":{"tags":{"name":"Ramada","tourism":"hotel"},"name":"Ramada","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Residence Inn":{"tags":{"name":"Residence Inn","tourism":"hotel"},"name":"Residence Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Royal Hotel":{"tags":{"name":"Royal Hotel","tourism":"hotel"},"name":"Royal Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sheraton":{"tags":{"name":"Sheraton","tourism":"hotel"},"name":"Sheraton","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sleep Inn":{"tags":{"name":"Sleep Inn","tourism":"hotel"},"name":"Sleep Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Staybridge Suites":{"tags":{"name":"Staybridge Suites","tourism":"hotel"},"name":"Staybridge Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Super 8":{"tags":{"name":"Super 8","tourism":"hotel"},"name":"Super 8","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Travelodge":{"tags":{"name":"Travelodge","tourism":"hotel"},"name":"Travelodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Гостиница":{"tags":{"name":"Гостиница","tourism":"hotel"},"name":"Гостиница","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/東横イン":{"tags":{"name":"東横イン","tourism":"hotel"},"name":"東横イン","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Budget Inn":{"tags":{"name":"Budget Inn","tourism":"motel"},"name":"Budget Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Econo Lodge":{"tags":{"name":"Econo Lodge","tourism":"motel"},"name":"Econo Lodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel 6":{"tags":{"name":"Motel 6","tourism":"motel"},"name":"Motel 6","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Rodeway Inn":{"tags":{"name":"Rodeway Inn","tourism":"motel"},"name":"Rodeway Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/museum/Heimatmuseum":{"tags":{"name":"Heimatmuseum","tourism":"museum"},"name":"Heimatmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Stadtmuseum":{"tags":{"name":"Stadtmuseum","tourism":"museum"},"name":"Stadtmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Tájház":{"tags":{"name":"Tájház","tourism":"museum"},"name":"Tájház","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Краеведческий музей":{"tags":{"name":"Краеведческий музей","tourism":"museum"},"name":"Краеведческий музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Музей":{"tags":{"name":"Музей","tourism":"museum"},"name":"Музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true}};
23647
23648 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","power/line","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/crosswalk","highway/crossing","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"]};
23649
23650 var categories = {"category-barrier":{"icon":"roadblock","geometry":"line","name":"Barrier Features","members":["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{"icon":"building","geometry":"area","name":"Building Features","members":["building","building/house","building/apartments","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{"icon":"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":"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":"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":"natural","geometry":"line","name":"Natural Features","members":["natural/coastline","natural/tree_row"]},"category-natural-point":{"icon":"natural","geometry":"point","name":"Natural Features","members":["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{"icon":"category-path","geometry":"line","name":"Path Features","members":["footway/crosswalk","footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{"icon":"category-rail","geometry":"line","name":"Rail Features","members":["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{"icon":"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"]},"category-road":{"icon":"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":"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-water-area":{"icon":"water","geometry":"area","name":"Water Features","members":["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{"icon":"category-water","geometry":"line","name":"Water Features","members":["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23651
23652 var fields = {"access_simple":{"key":"access","type":"combo","label":"Allowed Access","options":["yes","permissive","private","customers","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 permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}}},"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","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","label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"key":"aerialway:duration","type":"number","label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"key":"aerialway:heating","type":"check","label":"Heated"},"aerialway/occupancy":{"key":"aerialway:occupancy","type":"number","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"},"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"},"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","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","label":"Capacity","placeholder":"50, 100, 200..."},"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"},"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"},"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"}}}},"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},"devices":{"key":"devices","type":"number","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"]},"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"},"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"}}},"fitness_station":{"key":"fitness_station","type":"typeCombo","label":"Equipment Type"},"fixme":{"key":"fixme","type":"textarea","label":"Fix Me","universal":true},"ford":{"key":"ford","type":"typeCombo","label":"Type","placeholder":"Default"},"frequency":{"key":"frequency","type":"combo","label":"Operating Frequency"},"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":"text","label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"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","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"},"hoops":{"key":"hoops","type":"number","label":"Hoops","placeholder":"1, 2, 4..."},"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"},"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","label":"Lanes","placeholder":"1, 2, 3..."},"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","label":"Length (Meters)"},"level":{"key":"level","type":"combo","label":"Level","universal":true},"levels":{"key":"building:levels","type":"number","label":"Levels","placeholder":"2, 4, 6..."},"lit":{"key":"lit","type":"check","label":"Lit"},"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"},"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..."},"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","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"}}},"payment_multi":{"key":"payment:","type":"multiCombo","label":"Payment Types","universal":true},"phases":{"key":"phases","type":"number","label":"Phases","placeholder":"1, 2, 3..."},"phone":{"key":"phone","type":"tel","icon":"telephone","universal":true,"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"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/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"}}},"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","label":"Maximum Age"},"playground/min_age":{"key":"min_age","type":"number","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"},"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":"restrictions","reference":{"rtype":"restriction"},"label":"Turn Restrictions"},"rooms":{"key":"rooms","type":"number","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"},"seasonal":{"key":"seasonal","type":"check","label":"Seasonal"},"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"},"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":"number","label":"Stars"},"start_date":{"key":"start_date","type":"text","universal":true,"label":"Start Date"},"step_count":{"key":"step_count","type":"number","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"},"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"}}},"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_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"},"vending":{"key":"vending","type":"combo","label":"Type 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":"wheelchair","universal":true,"label":"Wheelchair Access"},"wholesale":{"key":"wholesale","type":"typeCombo","label":"Wholesale"},"width":{"key":"width","type":"number","label":"Width (Meters)"},"wikipedia":{"key":"wikipedia","keys":["wikipedia","wikidata"],"type":"wikipedia","icon":"wikipedia","universal":true,"label":"Wikipedia"},"windings":{"key":"windings","type":"number","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"}}}};
23653
23654 var all = ["aerialway","airfield","airport","alcohol-shop","america-football","amusement-park","aquarium","art-gallery","attraction","bakery","bank","bar","barrier","baseball","basketball","bbq","beer","bicycle","bicycle-share","blood-bank","buddhism","building","building-alt1","bus","cafe","campsite","car","castle","cemetery","cinema","circle","circle-stroked","city","clothing-store","college","commercial","cricket","cross","dam","danger","defibrillator","dentist","doctor","dog-park","drinking-water","embassy","emergency-phone","entrance","entrance-alt1","farm","fast-food","fence","ferry","fire-station","florist","fuel","gaming","garden","garden-center","gift","golf","grocery","hairdresser","harbor","heart","heliport","home","horse-riding","hospital","ice-cream","industry","information","karaoke","landmark","landuse","laundry","library","lighthouse","lodging","logging","marker","marker-stroked","mobile-phone","monument","mountain","museum","music","natural","park","park-alt1","parking","parking-garage","pharmacy","picnic-site","pitch","place-of-worship","playground","police","post","prison","rail","rail-light","rail-metro","ranger-station","recycling","religious-christian","religious-jewish","religious-muslim","residential-community","restaurant","roadblock","rocket","school","scooter","shelter","shop","skiing","slaughterhouse","snowmobile","soccer","square","square-stroked","stadium","star","star-stroked","suitcase","sushi","swimming","teahouse","telephone","tennis","theatre","toilet","town","town-hall","triangle","triangle-stroked","veterinary","village","volcano","warehouse","waste-basket","water","wetland","wheelchair","zoo"];
23655 var all$1 = {
23656         all: all
23657 };
23658
23659 var all$2 = Object.freeze({
23660         all: all,
23661         default: all$1
23662 });
23663
23664 var Airport = ["airfield","airport","heliport","rocket"];
23665 var Dining = ["bakery","bar","beer","cafe","fast-food","ice-cream","restaurant"];
23666 var Education = ["college","school"];
23667 var General = ["alcohol-shop","amusement-park","aquarium","art-gallery","attraction","bank","bicycle","bicycle-share","car","castle","cinema","circle","circle-stroked","clothing-store","drinking-water","embassy","fire-station","fuel","grocery","harbor","information","laundry","library","lodging","marker","monument","museum","music","place-of-worship","police","post","prison","religious-christian","religious-jewish","religious-muslim","shop","stadium","star","suitcase","swimming","theatre","toilet","town-hall","triangle","triangle-stroked","veterinary"];
23668 var Health = ["dentist","doctor","hospital","pharmacy"];
23669 var Outdoors = ["campsite","cemetery","dog-park","garden","golf","park","picnic-site","playground","zoo"];
23670 var Transit = ["bus","ferry"];
23671 var streets = {
23672         Airport: Airport,
23673         Dining: Dining,
23674         Education: Education,
23675         General: General,
23676         Health: Health,
23677         Outdoors: Outdoors,
23678         Transit: Transit,
23679         "Mountain peak": ["mountain","volcano"],
23680         "Rail station": ["entrance","rail","rail-light","rail-metro"]
23681 };
23682
23683 var streets$1 = Object.freeze({
23684         Airport: Airport,
23685         Dining: Dining,
23686         Education: Education,
23687         General: General,
23688         Health: Health,
23689         Outdoors: Outdoors,
23690         Transit: Transit,
23691         default: streets
23692 });
23693
23694 var require$$0$1 = ( all$2 && all$1 ) || all$2;
23695
23696 var require$$1$1 = ( streets$1 && streets ) || streets$1;
23697
23698 var maki = {
23699   layouts: {
23700     all: require$$0$1,
23701     streets: require$$1$1
23702   }
23703 };
23704
23705 var dataFeatureIcons = maki.layouts.all.all;
23706
23707 var data = {
23708     imagery: dataImagery,
23709     presets: {
23710         presets: presets,
23711         defaults: defaults,
23712         categories: categories,
23713         fields: fields
23714     }
23715 };
23716
23717 function osmEntity$$1(attrs) {
23718     // For prototypal inheritance.
23719     if (this instanceof osmEntity$$1) return;
23720
23721     // Create the appropriate subtype.
23722     if (attrs && attrs.type) {
23723         return osmEntity$$1[attrs.type].apply(this, arguments);
23724     } else if (attrs && attrs.id) {
23725         return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
23726     }
23727
23728     // Initialize a generic Entity (used only in tests).
23729     return (new osmEntity$$1()).initialize(arguments);
23730 }
23731
23732
23733 osmEntity$$1.id = function(type) {
23734     return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
23735 };
23736
23737
23738 osmEntity$$1.id.next = {
23739     changeset: -1, node: -1, way: -1, relation: -1
23740 };
23741
23742
23743 osmEntity$$1.id.fromOSM = function(type, id) {
23744     return type[0] + id;
23745 };
23746
23747
23748 osmEntity$$1.id.toOSM = function(id) {
23749     return id.slice(1);
23750 };
23751
23752
23753 osmEntity$$1.id.type = function(id) {
23754     return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
23755 };
23756
23757
23758 // A function suitable for use as the second argument to d3.selection#data().
23759 osmEntity$$1.key = function(entity) {
23760     return entity.id + 'v' + (entity.v || 0);
23761 };
23762
23763
23764 osmEntity$$1.prototype = {
23765
23766     tags: {},
23767
23768
23769     initialize: function(sources) {
23770         for (var i = 0; i < sources.length; ++i) {
23771             var source = sources[i];
23772             for (var prop in source) {
23773                 if (Object.prototype.hasOwnProperty.call(source, prop)) {
23774                     if (source[prop] === undefined) {
23775                         delete this[prop];
23776                     } else {
23777                         this[prop] = source[prop];
23778                     }
23779                 }
23780             }
23781         }
23782
23783         if (!this.id && this.type) {
23784             this.id = osmEntity$$1.id(this.type);
23785         }
23786         if (!this.hasOwnProperty('visible')) {
23787             this.visible = true;
23788         }
23789
23790         if (debug) {
23791             Object.freeze(this);
23792             Object.freeze(this.tags);
23793
23794             if (this.loc) Object.freeze(this.loc);
23795             if (this.nodes) Object.freeze(this.nodes);
23796             if (this.members) Object.freeze(this.members);
23797         }
23798
23799         return this;
23800     },
23801
23802
23803     copy: function(resolver, copies) {
23804         if (copies[this.id])
23805             return copies[this.id];
23806
23807         var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
23808         copies[this.id] = copy;
23809
23810         return copy;
23811     },
23812
23813
23814     osmId: function() {
23815         return osmEntity$$1.id.toOSM(this.id);
23816     },
23817
23818
23819     isNew: function() {
23820         return this.osmId() < 0;
23821     },
23822
23823
23824     update: function(attrs) {
23825         return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
23826     },
23827
23828
23829     mergeTags: function(tags) {
23830         var merged = clone(this.tags), changed = false;
23831         for (var k in tags) {
23832             var t1 = merged[k],
23833                 t2 = tags[k];
23834             if (!t1) {
23835                 changed = true;
23836                 merged[k] = t2;
23837             } else if (t1 !== t2) {
23838                 changed = true;
23839                 merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
23840             }
23841         }
23842         return changed ? this.update({tags: merged}) : this;
23843     },
23844
23845
23846     intersects: function(extent, resolver) {
23847         return this.extent(resolver).intersects(extent);
23848     },
23849
23850
23851     isUsed: function(resolver) {
23852         return without(Object.keys(this.tags), 'area').length > 0 ||
23853             resolver.parentRelations(this).length > 0;
23854     },
23855
23856
23857     hasInterestingTags: function() {
23858         return keys$1(this.tags).some(osmIsInterestingTag);
23859     },
23860
23861
23862     isHighwayIntersection: function() {
23863         return false;
23864     },
23865
23866     isDegenerate: function() {
23867         return true;
23868     },
23869
23870     deprecatedTags: function() {
23871         var tags = toPairs(this.tags);
23872         var deprecated = {};
23873
23874         dataDeprecated.forEach(function(d) {
23875             var match = toPairs(d.old)[0];
23876             tags.forEach(function(t) {
23877                 if (t[0] === match[0] &&
23878                     (t[1] === match[1] || match[1] === '*')) {
23879                     deprecated[t[0]] = t[1];
23880                 }
23881             });
23882         });
23883
23884         return deprecated;
23885     }
23886 };
23887
23888 function geoExtent$$1(min, max) {
23889     if (!(this instanceof geoExtent$$1)) return new geoExtent$$1(min, max);
23890     if (min instanceof geoExtent$$1) {
23891         return min;
23892     } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23893         this[0] = min[0];
23894         this[1] = min[1];
23895     } else {
23896         this[0] = min        || [ Infinity,  Infinity];
23897         this[1] = max || min || [-Infinity, -Infinity];
23898     }
23899 }
23900
23901 geoExtent$$1.prototype = new Array(2);
23902
23903 assignIn(geoExtent$$1.prototype, {
23904
23905     equals: function (obj) {
23906         return this[0][0] === obj[0][0] &&
23907             this[0][1] === obj[0][1] &&
23908             this[1][0] === obj[1][0] &&
23909             this[1][1] === obj[1][1];
23910     },
23911
23912
23913     extend: function(obj) {
23914         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23915         return geoExtent$$1(
23916             [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23917             [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23918         );
23919     },
23920
23921
23922     _extend: function(extent) {
23923         this[0][0] = Math.min(extent[0][0], this[0][0]);
23924         this[0][1] = Math.min(extent[0][1], this[0][1]);
23925         this[1][0] = Math.max(extent[1][0], this[1][0]);
23926         this[1][1] = Math.max(extent[1][1], this[1][1]);
23927     },
23928
23929
23930     area: function() {
23931         return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23932     },
23933
23934
23935     center: function() {
23936         return [(this[0][0] + this[1][0]) / 2,
23937                 (this[0][1] + this[1][1]) / 2];
23938     },
23939
23940
23941     rectangle: function() {
23942         return [this[0][0], this[0][1], this[1][0], this[1][1]];
23943     },
23944
23945
23946     bbox: function() {
23947         return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23948     },
23949
23950
23951     polygon: function() {
23952         return [
23953             [this[0][0], this[0][1]],
23954             [this[0][0], this[1][1]],
23955             [this[1][0], this[1][1]],
23956             [this[1][0], this[0][1]],
23957             [this[0][0], this[0][1]]
23958         ];
23959     },
23960
23961
23962     contains: function(obj) {
23963         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23964         return obj[0][0] >= this[0][0] &&
23965                obj[0][1] >= this[0][1] &&
23966                obj[1][0] <= this[1][0] &&
23967                obj[1][1] <= this[1][1];
23968     },
23969
23970
23971     intersects: function(obj) {
23972         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23973         return obj[0][0] <= this[1][0] &&
23974                obj[0][1] <= this[1][1] &&
23975                obj[1][0] >= this[0][0] &&
23976                obj[1][1] >= this[0][1];
23977     },
23978
23979
23980     intersection: function(obj) {
23981         if (!this.intersects(obj)) return new geoExtent$$1();
23982         return new geoExtent$$1(
23983             [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23984             [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23985         );
23986     },
23987
23988
23989     percentContainedIn: function(obj) {
23990         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23991         var a1 = this.intersection(obj).area(),
23992             a2 = this.area();
23993
23994         if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23995             return 0;
23996         } else {
23997             return a1 / a2;
23998         }
23999     },
24000
24001
24002     padByMeters: function(meters) {
24003         var dLat = geoMetersToLat(meters),
24004             dLon = geoMetersToLon(meters, this.center()[1]);
24005         return geoExtent$$1(
24006             [this[0][0] - dLon, this[0][1] - dLat],
24007             [this[1][0] + dLon, this[1][1] + dLat]
24008         );
24009     },
24010
24011
24012     toParam: function() {
24013         return this.rectangle().join(',');
24014     }
24015
24016 });
24017
24018 // constants
24019 var TAU = 2 * Math.PI;
24020 var EQUATORIAL_RADIUS = 6356752.314245179;
24021 var POLAR_RADIUS = 6378137.0;
24022
24023
24024 function geoLatToMeters(dLat) {
24025     return dLat * (TAU * POLAR_RADIUS / 360);
24026 }
24027
24028
24029 function geoLonToMeters(dLon, atLat) {
24030     return Math.abs(atLat) >= 90 ? 0 :
24031         dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24032 }
24033
24034
24035 function geoMetersToLat(m) {
24036     return m / (TAU * POLAR_RADIUS / 360);
24037 }
24038
24039
24040 function geoMetersToLon(m, atLat) {
24041     return Math.abs(atLat) >= 90 ? 0 :
24042         m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24043 }
24044
24045
24046 function geoMetersToOffset(meters, tileSize) {
24047     tileSize = tileSize || 256;
24048     return [
24049         meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24050         -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24051     ];
24052 }
24053
24054
24055 function geoOffsetToMeters(offset, tileSize) {
24056     tileSize = tileSize || 256;
24057     return [
24058         offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24059         -offset[1] * TAU * POLAR_RADIUS / tileSize
24060     ];
24061 }
24062
24063
24064 // Equirectangular approximation of spherical distances on Earth
24065 function geoSphericalDistance(a, b) {
24066     var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24067     var y = geoLatToMeters(a[1] - b[1]);
24068     return Math.sqrt((x * x) + (y * y));
24069 }
24070
24071
24072 // scale to zoom
24073 function geoScaleToZoom(k, tileSize) {
24074     tileSize = tileSize || 256;
24075     var log2ts = Math.log(tileSize) * Math.LOG2E;
24076     return Math.log(k * TAU) / Math.LN2 - log2ts;
24077 }
24078
24079
24080 // zoom to scale
24081 function geoZoomToScale(z, tileSize) {
24082     tileSize = tileSize || 256;
24083     return tileSize * Math.pow(2, z) / TAU;
24084 }
24085
24086 /**
24087  * A specialized version of `_.every` for arrays without support for
24088  * iteratee shorthands.
24089  *
24090  * @private
24091  * @param {Array} [array] The array to iterate over.
24092  * @param {Function} predicate The function invoked per iteration.
24093  * @returns {boolean} Returns `true` if all elements pass the predicate check,
24094  *  else `false`.
24095  */
24096 function arrayEvery(array, predicate) {
24097   var index = -1,
24098       length = array == null ? 0 : array.length;
24099
24100   while (++index < length) {
24101     if (!predicate(array[index], index, array)) {
24102       return false;
24103     }
24104   }
24105   return true;
24106 }
24107
24108 /**
24109  * The base implementation of `_.every` without support for iteratee shorthands.
24110  *
24111  * @private
24112  * @param {Array|Object} collection The collection to iterate over.
24113  * @param {Function} predicate The function invoked per iteration.
24114  * @returns {boolean} Returns `true` if all elements pass the predicate check,
24115  *  else `false`
24116  */
24117 function baseEvery(collection, predicate) {
24118   var result = true;
24119   baseEach(collection, function(value, index, collection) {
24120     result = !!predicate(value, index, collection);
24121     return result;
24122   });
24123   return result;
24124 }
24125
24126 /**
24127  * Checks if `predicate` returns truthy for **all** elements of `collection`.
24128  * Iteration is stopped once `predicate` returns falsey. The predicate is
24129  * invoked with three arguments: (value, index|key, collection).
24130  *
24131  * **Note:** This method returns `true` for
24132  * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
24133  * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
24134  * elements of empty collections.
24135  *
24136  * @static
24137  * @memberOf _
24138  * @since 0.1.0
24139  * @category Collection
24140  * @param {Array|Object} collection The collection to iterate over.
24141  * @param {Function} [predicate=_.identity] The function invoked per iteration.
24142  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24143  * @returns {boolean} Returns `true` if all elements pass the predicate check,
24144  *  else `false`.
24145  * @example
24146  *
24147  * _.every([true, 1, null, 'yes'], Boolean);
24148  * // => false
24149  *
24150  * var users = [
24151  *   { 'user': 'barney', 'age': 36, 'active': false },
24152  *   { 'user': 'fred',   'age': 40, 'active': false }
24153  * ];
24154  *
24155  * // The `_.matches` iteratee shorthand.
24156  * _.every(users, { 'user': 'barney', 'active': false });
24157  * // => false
24158  *
24159  * // The `_.matchesProperty` iteratee shorthand.
24160  * _.every(users, ['active', false]);
24161  * // => true
24162  *
24163  * // The `_.property` iteratee shorthand.
24164  * _.every(users, 'active');
24165  * // => false
24166  */
24167 function every(collection, predicate, guard) {
24168   var func = isArray(collection) ? arrayEvery : baseEvery;
24169   if (guard && isIterateeCall(collection, predicate, guard)) {
24170     predicate = undefined;
24171   }
24172   return func(collection, baseIteratee(predicate, 3));
24173 }
24174
24175 /**
24176  * The base implementation of `_.some` without support for iteratee shorthands.
24177  *
24178  * @private
24179  * @param {Array|Object} collection The collection to iterate over.
24180  * @param {Function} predicate The function invoked per iteration.
24181  * @returns {boolean} Returns `true` if any element passes the predicate check,
24182  *  else `false`.
24183  */
24184 function baseSome(collection, predicate) {
24185   var result;
24186
24187   baseEach(collection, function(value, index, collection) {
24188     result = predicate(value, index, collection);
24189     return !result;
24190   });
24191   return !!result;
24192 }
24193
24194 /**
24195  * Checks if `predicate` returns truthy for **any** element of `collection`.
24196  * Iteration is stopped once `predicate` returns truthy. The predicate is
24197  * invoked with three arguments: (value, index|key, collection).
24198  *
24199  * @static
24200  * @memberOf _
24201  * @since 0.1.0
24202  * @category Collection
24203  * @param {Array|Object} collection The collection to iterate over.
24204  * @param {Function} [predicate=_.identity] The function invoked per iteration.
24205  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24206  * @returns {boolean} Returns `true` if any element passes the predicate check,
24207  *  else `false`.
24208  * @example
24209  *
24210  * _.some([null, 0, 'yes', false], Boolean);
24211  * // => true
24212  *
24213  * var users = [
24214  *   { 'user': 'barney', 'active': true },
24215  *   { 'user': 'fred',   'active': false }
24216  * ];
24217  *
24218  * // The `_.matches` iteratee shorthand.
24219  * _.some(users, { 'user': 'barney', 'active': false });
24220  * // => false
24221  *
24222  * // The `_.matchesProperty` iteratee shorthand.
24223  * _.some(users, ['active', false]);
24224  * // => true
24225  *
24226  * // The `_.property` iteratee shorthand.
24227  * _.some(users, 'active');
24228  * // => true
24229  */
24230 function some(collection, predicate, guard) {
24231   var func = isArray(collection) ? arraySome : baseSome;
24232   if (guard && isIterateeCall(collection, predicate, guard)) {
24233     predicate = undefined;
24234   }
24235   return func(collection, baseIteratee(predicate, 3));
24236 }
24237
24238 // vector equals
24239 function geoVecEqual(a, b, epsilon) {
24240     if (epsilon) {
24241         return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
24242     } else {
24243         return (a[0] === b[0]) && (a[1] === b[1]);
24244     }
24245 }
24246
24247 // vector addition
24248 function geoVecAdd(a, b) {
24249     return [ a[0] + b[0], a[1] + b[1] ];
24250 }
24251
24252 // vector subtraction
24253 function geoVecSubtract(a, b) {
24254     return [ a[0] - b[0], a[1] - b[1] ];
24255 }
24256
24257 // vector scaling
24258 function geoVecScale(a, mag) {
24259     return [ a[0] * mag, a[1] * mag ];
24260 }
24261
24262 // vector rounding (was: geoRoundCoordinates)
24263 function geoVecFloor(a) {
24264     return [ Math.floor(a[0]), Math.floor(a[1]) ];
24265 }
24266
24267 // linear interpolation
24268 function geoVecInterp(a, b, t) {
24269     return [
24270         a[0] + (b[0] - a[0]) * t,
24271         a[1] + (b[1] - a[1]) * t
24272     ];
24273 }
24274
24275 // http://jsperf.com/id-dist-optimization
24276 function geoVecLength(a, b) {
24277     var x = a[0] - b[0];
24278     var y = a[1] - b[1];
24279     return Math.sqrt((x * x) + (y * y));
24280 }
24281
24282 // Return the counterclockwise angle in the range (-pi, pi)
24283 // between the positive X axis and the line intersecting a and b.
24284 function geoVecAngle(a, b) {
24285     return Math.atan2(b[1] - a[1], b[0] - a[0]);
24286 }
24287
24288 // dot product
24289 function geoVecDot(a, b, origin) {
24290     origin = origin || [0, 0];
24291     return (a[0] - origin[0]) * (b[0] - origin[0]) +
24292         (a[1] - origin[1]) * (b[1] - origin[1]);
24293 }
24294
24295 // 2D cross product of OA and OB vectors, returns magnitude of Z vector
24296 // Returns a positive value, if OAB makes a counter-clockwise turn,
24297 // negative for clockwise turn, and zero if the points are collinear.
24298 function geoVecCross(a, b, origin) {
24299     origin = origin || [0, 0];
24300     return (a[0] - origin[0]) * (b[1] - origin[1]) -
24301         (a[1] - origin[1]) * (b[0] - origin[0]);
24302 }
24303
24304 // Return the counterclockwise angle in the range (-pi, pi)
24305 // between the positive X axis and the line intersecting a and b.
24306 function geoAngle(a, b, projection) {
24307     return geoVecAngle(projection(a.loc), projection(b.loc));
24308 }
24309
24310 function geoEdgeEqual(a, b) {
24311     return (a[0] === b[0] && a[1] === b[1]) ||
24312         (a[0] === b[1] && a[1] === b[0]);
24313 }
24314
24315 // Rotate all points counterclockwise around a pivot point by given angle
24316 function geoRotate(points, angle, around) {
24317     return points.map(function(point) {
24318         var radial = geoVecSubtract(point, around);
24319         return [
24320             radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
24321             radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
24322         ];
24323     });
24324 }
24325
24326
24327 // Choose the edge with the minimal distance from `point` to its orthogonal
24328 // projection onto that edge, if such a projection exists, or the distance to
24329 // the closest vertex on that edge. Returns an object with the `index` of the
24330 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
24331 function geoChooseEdge(nodes, point, projection, activeID) {
24332     var dist = geoVecLength;
24333     var points = nodes.map(function(n) { return projection(n.loc); });
24334     var ids = nodes.map(function(n) { return n.id; });
24335     var min = Infinity;
24336     var idx;
24337     var loc;
24338
24339     for (var i = 0; i < points.length - 1; i++) {
24340         if (ids[i] === activeID || ids[i + 1] === activeID) continue;
24341
24342         var o = points[i];
24343         var s = geoVecSubtract(points[i + 1], o);
24344         var v = geoVecSubtract(point, o);
24345         var proj = geoVecDot(v, s) / geoVecDot(s, s);
24346         var p;
24347
24348         if (proj < 0) {
24349             p = o;
24350         } else if (proj > 1) {
24351             p = points[i + 1];
24352         } else {
24353             p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24354         }
24355
24356         var d = dist(p, point);
24357         if (d < min) {
24358             min = d;
24359             idx = i + 1;
24360             loc = projection.invert(p);
24361         }
24362     }
24363
24364     if (idx !== undefined) {
24365         return { index: idx, distance: min, loc: loc };
24366     } else {
24367         return null;
24368     }
24369 }
24370
24371
24372 // Test active (dragged or drawing) segments against inactive segments
24373 // This is used to test e.g. multipolygon rings that cross
24374 // `activeNodes` is the ring containing the activeID being dragged.
24375 // `inactiveNodes` is the other ring to test against
24376 function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
24377     var actives = [];
24378     var inactives = [];
24379     var j, k, n1, n2, segment;
24380
24381     // gather active segments (only segments in activeNodes that contain the activeID)
24382     for (j = 0; j < activeNodes.length - 1; j++) {
24383         n1 = activeNodes[j];
24384         n2 = activeNodes[j+1];
24385         segment = [n1.loc, n2.loc];
24386         if (n1.id === activeID || n2.id === activeID) {
24387             actives.push(segment);
24388         }
24389     }
24390
24391     // gather inactive segments
24392     for (j = 0; j < inactiveNodes.length - 1; j++) {
24393         n1 = inactiveNodes[j];
24394         n2 = inactiveNodes[j+1];
24395         segment = [n1.loc, n2.loc];
24396         inactives.push(segment);
24397     }
24398
24399     // test
24400     for (j = 0; j < actives.length; j++) {
24401         for (k = 0; k < inactives.length; k++) {
24402             var p = actives[j];
24403             var q = inactives[k];
24404             var hit = geoLineIntersection(p, q);
24405             if (hit) {
24406                 return true;
24407             }
24408         }
24409     }
24410
24411     return false;
24412 }
24413
24414
24415 // Test active (dragged or drawing) segments against inactive segments
24416 // This is used to test whether a way intersects with itself.
24417 function geoHasSelfIntersections(nodes, activeID) {
24418     var actives = [];
24419     var inactives = [];
24420     var j, k;
24421
24422     // group active and passive segments along the nodes
24423     for (j = 0; j < nodes.length - 1; j++) {
24424         var n1 = nodes[j];
24425         var n2 = nodes[j+1];
24426         var segment = [n1.loc, n2.loc];
24427         if (n1.id === activeID || n2.id === activeID) {
24428             actives.push(segment);
24429         } else {
24430             inactives.push(segment);
24431         }
24432     }
24433
24434     // test
24435     for (j = 0; j < actives.length; j++) {
24436         for (k = 0; k < inactives.length; k++) {
24437             var p = actives[j];
24438             var q = inactives[k];
24439             // skip if segments share an endpoint
24440             if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
24441                 geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
24442                 continue;
24443             }
24444
24445             var hit = geoLineIntersection(p, q);
24446             if (hit) {
24447                 var epsilon = 1e-8;
24448                 // skip if the hit is at the segment's endpoint
24449                 if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
24450                     geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
24451                     continue;
24452                 } else {
24453                     return true;
24454                 }
24455             }
24456         }
24457     }
24458
24459     return false;
24460 }
24461
24462
24463 // Return the intersection point of 2 line segments.
24464 // From https://github.com/pgkelley4/line-segments-intersect
24465 // This uses the vector cross product approach described below:
24466 //  http://stackoverflow.com/a/565282/786339
24467 function geoLineIntersection(a, b) {
24468     var p = [a[0][0], a[0][1]];
24469     var p2 = [a[1][0], a[1][1]];
24470     var q = [b[0][0], b[0][1]];
24471     var q2 = [b[1][0], b[1][1]];
24472     var r = geoVecSubtract(p2, p);
24473     var s = geoVecSubtract(q2, q);
24474     var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
24475     var denominator = geoVecCross(r, s);
24476
24477     if (uNumerator && denominator) {
24478         var u = uNumerator / denominator;
24479         var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
24480
24481         if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
24482             return geoVecInterp(p, p2, t);
24483         }
24484     }
24485
24486     return null;
24487 }
24488
24489
24490 function geoPathIntersections(path1, path2) {
24491     var intersections = [];
24492     for (var i = 0; i < path1.length - 1; i++) {
24493         for (var j = 0; j < path2.length - 1; j++) {
24494             var a = [ path1[i], path1[i+1] ];
24495             var b = [ path2[j], path2[j+1] ];
24496             var hit = geoLineIntersection(a, b);
24497             if (hit) {
24498                 intersections.push(hit);
24499             }
24500         }
24501     }
24502     return intersections;
24503 }
24504
24505 function geoPathHasIntersections(path1, path2) {
24506     for (var i = 0; i < path1.length - 1; i++) {
24507         for (var j = 0; j < path2.length - 1; j++) {
24508             var a = [ path1[i], path1[i+1] ];
24509             var b = [ path2[j], path2[j+1] ];
24510             var hit = geoLineIntersection(a, b);
24511             if (hit) {
24512                 return true;
24513             }
24514         }
24515     }
24516     return false;
24517 }
24518
24519
24520 // Return whether point is contained in polygon.
24521 //
24522 // `point` should be a 2-item array of coordinates.
24523 // `polygon` should be an array of 2-item arrays of coordinates.
24524 //
24525 // From https://github.com/substack/point-in-polygon.
24526 // ray-casting algorithm based on
24527 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
24528 //
24529 function geoPointInPolygon(point, polygon) {
24530     var x = point[0];
24531     var y = point[1];
24532     var inside = false;
24533
24534     for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
24535         var xi = polygon[i][0];
24536         var yi = polygon[i][1];
24537         var xj = polygon[j][0];
24538         var yj = polygon[j][1];
24539
24540         var intersect = ((yi > y) !== (yj > y)) &&
24541             (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
24542         if (intersect) inside = !inside;
24543     }
24544
24545     return inside;
24546 }
24547
24548
24549 function geoPolygonContainsPolygon(outer, inner) {
24550     return every(inner, function(point) {
24551         return geoPointInPolygon(point, outer);
24552     });
24553 }
24554
24555
24556 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
24557     function testPoints(outer, inner) {
24558         return some(inner, function(point) {
24559             return geoPointInPolygon(point, outer);
24560         });
24561     }
24562
24563    return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
24564 }
24565
24566
24567 function geoPathLength(path) {
24568     var length = 0;
24569     for (var i = 0; i < path.length - 1; i++) {
24570         length += geoVecLength(path[i], path[i + 1]);
24571     }
24572     return length;
24573 }
24574
24575
24576 // If the given point is at the edge of the padded viewport,
24577 // return a vector that will nudge the viewport in that direction
24578 function geoViewportEdge(point, dimensions) {
24579     var pad = [80, 20, 50, 20];   // top, right, bottom, left
24580     var x = 0;
24581     var y = 0;
24582
24583     if (point[0] > dimensions[0] - pad[1])
24584         x = -10;
24585     if (point[0] < pad[3])
24586         x = 10;
24587     if (point[1] > dimensions[1] - pad[2])
24588         y = -10;
24589     if (point[1] < pad[0])
24590         y = 10;
24591
24592     if (x || y) {
24593         return [x, y];
24594     } else {
24595         return null;
24596     }
24597 }
24598
24599 /*
24600     Bypasses features of D3's default projection stream pipeline that are unnecessary:
24601     * Antimeridian clipping
24602     * Spherical rotation
24603     * Resampling
24604 */
24605 function geoRawMercator() {
24606     var project = mercatorRaw,
24607         k = 512 / Math.PI, // scale
24608         x = 0, y = 0, // translate
24609         clipExtent = [[0, 0], [0, 0]];
24610
24611
24612     function projection$$1(point) {
24613         point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24614         return [point[0] * k + x, y - point[1] * k];
24615     }
24616
24617
24618     projection$$1.invert = function(point) {
24619         point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24620         return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24621     };
24622
24623
24624     projection$$1.scale = function(_) {
24625         if (!arguments.length) return k;
24626         k = +_;
24627         return projection$$1;
24628     };
24629
24630
24631     projection$$1.translate = function(_) {
24632         if (!arguments.length) return [x, y];
24633         x = +_[0];
24634         y = +_[1];
24635         return projection$$1;
24636     };
24637
24638
24639     projection$$1.clipExtent = function(_) {
24640         if (!arguments.length) return clipExtent;
24641         clipExtent = _;
24642         return projection$$1;
24643     };
24644
24645
24646     projection$$1.transform = function(_) {
24647         if (!arguments.length) return identity$7.translate(x, y).scale(k);
24648         x = +_.x;
24649         y = +_.y;
24650         k = +_.k;
24651         return projection$$1;
24652     };
24653
24654
24655     projection$$1.stream = d3_geoTransform({
24656         point: function(x, y) {
24657             x = projection$$1([x, y]);
24658             this.stream.point(x[0], x[1]);
24659         }
24660     }).stream;
24661
24662
24663     return projection$$1;
24664 }
24665
24666 function osmChangeset() {
24667     if (!(this instanceof osmChangeset)) {
24668         return (new osmChangeset()).initialize(arguments);
24669     } else if (arguments.length) {
24670         this.initialize(arguments);
24671     }
24672 }
24673
24674
24675 osmEntity$$1.changeset = osmChangeset;
24676
24677 osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
24678
24679 assignIn(osmChangeset.prototype, {
24680
24681     type: 'changeset',
24682
24683
24684     extent: function() {
24685         return new geoExtent$$1();
24686     },
24687
24688
24689     geometry: function() {
24690         return 'changeset';
24691     },
24692
24693
24694     asJXON: function() {
24695         return {
24696             osm: {
24697                 changeset: {
24698                     tag: map$3(this.tags, function(value, key) {
24699                         return { '@k': key, '@v': value };
24700                     }),
24701                     '@version': 0.6,
24702                     '@generator': 'iD'
24703                 }
24704             }
24705         };
24706     },
24707
24708
24709     // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
24710     // XML. Returns a string.
24711     osmChangeJXON: function(changes) {
24712         var changeset_id = this.id;
24713
24714         function nest(x, order) {
24715             var groups = {};
24716             for (var i = 0; i < x.length; i++) {
24717                 var tagName = Object.keys(x[i])[0];
24718                 if (!groups[tagName]) groups[tagName] = [];
24719                 groups[tagName].push(x[i][tagName]);
24720             }
24721             var ordered = {};
24722             order.forEach(function(o) {
24723                 if (groups[o]) ordered[o] = groups[o];
24724             });
24725             return ordered;
24726         }
24727
24728
24729         // sort relations in a changeset by dependencies
24730         function sort(changes) {
24731
24732             // find a referenced relation in the current changeset
24733             function resolve(item) {
24734                 return find$1(relations, function(relation) {
24735                     return item.keyAttributes.type === 'relation'
24736                         && item.keyAttributes.ref === relation['@id'];
24737                 });
24738             }
24739
24740             // a new item is an item that has not been already processed
24741             function isNew(item) {
24742                 return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
24743                     return proc['@id'] === item['@id'];
24744                 });
24745             }
24746
24747             var processing = [],
24748                 sorted = {},
24749                 relations = changes.relation;
24750
24751             if (!relations) return changes;
24752
24753             for (var i = 0; i < relations.length; i++) {
24754                 var relation = relations[i];
24755
24756                 // skip relation if already sorted
24757                 if (!sorted[relation['@id']]) {
24758                     processing.push(relation);
24759                 }
24760
24761                 while (processing.length > 0) {
24762                     var next = processing[0],
24763                     deps = filter(compact(next.member.map(resolve)), isNew);
24764                     if (deps.length === 0) {
24765                         sorted[next['@id']] = next;
24766                         processing.shift();
24767                     } else {
24768                         processing = deps.concat(processing);
24769                     }
24770                 }
24771             }
24772
24773             changes.relation = values$1(sorted);
24774             return changes;
24775         }
24776
24777         function rep(entity) {
24778             return entity.asJXON(changeset_id);
24779         }
24780
24781         return {
24782             osmChange: {
24783                 '@version': 0.6,
24784                 '@generator': 'iD',
24785                 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
24786                 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
24787                 'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
24788             }
24789         };
24790     },
24791
24792
24793     asGeoJSON: function() {
24794         return {};
24795     }
24796
24797 });
24798
24799 /**
24800  * Creates a duplicate-free version of an array, using
24801  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
24802  * for equality comparisons, in which only the first occurrence of each element
24803  * is kept. The order of result values is determined by the order they occur
24804  * in the array.
24805  *
24806  * @static
24807  * @memberOf _
24808  * @since 0.1.0
24809  * @category Array
24810  * @param {Array} array The array to inspect.
24811  * @returns {Array} Returns the new duplicate free array.
24812  * @example
24813  *
24814  * _.uniq([2, 1, 2]);
24815  * // => [2, 1]
24816  */
24817 function uniq(array) {
24818   return (array && array.length) ? baseUniq(array) : [];
24819 }
24820
24821 function osmNode() {
24822     if (!(this instanceof osmNode)) {
24823         return (new osmNode()).initialize(arguments);
24824     } else if (arguments.length) {
24825         this.initialize(arguments);
24826     }
24827 }
24828
24829 osmEntity$$1.node = osmNode;
24830
24831 osmNode.prototype = Object.create(osmEntity$$1.prototype);
24832
24833 assignIn(osmNode.prototype, {
24834
24835     type: 'node',
24836
24837
24838     extent: function() {
24839         return new geoExtent$$1(this.loc);
24840     },
24841
24842
24843     geometry: function(graph) {
24844         return graph.transient(this, 'geometry', function() {
24845             return graph.isPoi(this) ? 'point' : 'vertex';
24846         });
24847     },
24848
24849
24850     move: function(loc) {
24851         return this.update({loc: loc});
24852     },
24853
24854
24855     isDegenerate: function() {
24856         return !(
24857             Array.isArray(this.loc) && this.loc.length === 2 &&
24858             this.loc[0] >= -180 && this.loc[0] <= 180 &&
24859             this.loc[1] >= -90 && this.loc[1] <= 90
24860         );
24861     },
24862
24863
24864     // Inspect tags and geometry to determine which direction(s) this node/vertex points
24865     directions: function(resolver, projection) {
24866         var val;
24867         var i;
24868
24869         // which tag to use?
24870         if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
24871             // all-way stop tag on a highway intersection
24872             val = 'all';
24873         } else {
24874             // generic direction tag
24875             val = (this.tags.direction || '').toLowerCase();
24876
24877             // better suffix-style direction tag
24878             var re = /:direction$/i;
24879             var keys = Object.keys(this.tags);
24880             for (i = 0; i < keys.length; i++) {
24881                 if (re.test(keys[i])) {
24882                     val = this.tags[keys[i]].toLowerCase();
24883                     break;
24884                 }
24885             }
24886         }
24887
24888         if (val === '') return [];
24889
24890         var cardinal = {
24891             north: 0,               n: 0,
24892             northnortheast: 22,     nne: 22,
24893             northeast: 45,          ne: 45,
24894             eastnortheast: 67,      ene: 67,
24895             east: 90,               e: 90,
24896             eastsoutheast: 112,     ese: 112,
24897             southeast: 135,         se: 135,
24898             southsoutheast: 157,    sse: 157,
24899             south: 180,             s: 180,
24900             southsouthwest: 202,    ssw: 202,
24901             southwest: 225,         sw: 225,
24902             westsouthwest: 247,     wsw: 247,
24903             west: 270,              w: 270,
24904             westnorthwest: 292,     wnw: 292,
24905             northwest: 315,         nw: 315,
24906             northnorthwest: 337,    nnw: 337
24907         };
24908
24909
24910         var values = val.split(';');
24911         var results = [];
24912
24913         values.forEach(function(v) {
24914             // swap cardinal for numeric directions
24915             if (cardinal[v] !== undefined) {
24916                 v = cardinal[v];
24917             }
24918
24919             // numeric direction - just add to results
24920             if (v !== '' && !isNaN(+v)) {
24921                 results.push(+v);
24922                 return;
24923             }
24924
24925             // string direction - inspect parent ways
24926             var lookBackward =
24927                 (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
24928             var lookForward =
24929                 (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
24930
24931             if (!lookForward && !lookBackward) return;
24932
24933             var nodeIds = {};
24934             resolver.parentWays(this).forEach(function(parent) {
24935                 var nodes = parent.nodes;
24936                 for (i = 0; i < nodes.length; i++) {
24937                     if (nodes[i] === this.id) {  // match current entity
24938                         if (lookForward && i > 0) {
24939                             nodeIds[nodes[i - 1]] = true;  // look back to prev node
24940                         }
24941                         if (lookBackward && i < nodes.length - 1) {
24942                             nodeIds[nodes[i + 1]] = true;  // look ahead to next node
24943                         }
24944                     }
24945                 }
24946             }, this);
24947
24948             Object.keys(nodeIds).forEach(function(nodeId) {
24949                 // +90 because geoAngle returns angle from X axis, not Y (north)
24950                 results.push(
24951                     (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
24952                 );
24953             }, this);
24954
24955         }, this);
24956
24957         return uniq(results);
24958     },
24959
24960
24961     isEndpoint: function(resolver) {
24962         return resolver.transient(this, 'isEndpoint', function() {
24963             var id = this.id;
24964             return resolver.parentWays(this).filter(function(parent) {
24965                 return !parent.isClosed() && !!parent.affix(id);
24966             }).length > 0;
24967         });
24968     },
24969
24970
24971     isConnected: function(resolver) {
24972         return resolver.transient(this, 'isConnected', function() {
24973             var parents = resolver.parentWays(this);
24974
24975             function isLine(entity) {
24976                 return entity.geometry(resolver) === 'line' &&
24977                     entity.hasInterestingTags();
24978             }
24979
24980             // vertex is connected to multiple parent lines
24981             if (parents.length > 1 && some(parents, isLine)) {
24982                 return true;
24983
24984             } else if (parents.length === 1) {
24985                 var way = parents[0],
24986                     nodes = way.nodes.slice();
24987                 if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
24988
24989                 // return true if vertex appears multiple times (way is self intersecting)
24990                 return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
24991             }
24992
24993             return false;
24994         });
24995     },
24996
24997
24998     isIntersection: function(resolver) {
24999         return resolver.transient(this, 'isIntersection', function() {
25000             return resolver.parentWays(this).filter(function(parent) {
25001                 return (parent.tags.highway ||
25002                     parent.tags.waterway ||
25003                     parent.tags.railway ||
25004                     parent.tags.aeroway) &&
25005                     parent.geometry(resolver) === 'line';
25006             }).length > 1;
25007         });
25008     },
25009
25010
25011     isHighwayIntersection: function(resolver) {
25012         return resolver.transient(this, 'isHighwayIntersection', function() {
25013             return resolver.parentWays(this).filter(function(parent) {
25014                 return parent.tags.highway && parent.geometry(resolver) === 'line';
25015             }).length > 1;
25016         });
25017     },
25018
25019
25020     isOnAddressLine: function(resolver) {
25021         return resolver.transient(this, 'isOnAddressLine', function() {
25022             return resolver.parentWays(this).filter(function(parent) {
25023                 return parent.tags.hasOwnProperty('addr:interpolation') &&
25024                     parent.geometry(resolver) === 'line';
25025             }).length > 0;
25026         });
25027     },
25028
25029
25030     asJXON: function(changeset_id) {
25031         var r = {
25032             node: {
25033                 '@id': this.osmId(),
25034                 '@lon': this.loc[0],
25035                 '@lat': this.loc[1],
25036                 '@version': (this.version || 0),
25037                 tag: map$3(this.tags, function(v, k) {
25038                     return { keyAttributes: { k: k, v: v } };
25039                 })
25040             }
25041         };
25042         if (changeset_id) r.node['@changeset'] = changeset_id;
25043         return r;
25044     },
25045
25046
25047     asGeoJSON: function() {
25048         return {
25049             type: 'Point',
25050             coordinates: this.loc
25051         };
25052     }
25053 });
25054
25055 /** Error message constants. */
25056 var FUNC_ERROR_TEXT$1 = 'Expected a function';
25057
25058 /**
25059  * Creates a function that negates the result of the predicate `func`. The
25060  * `func` predicate is invoked with the `this` binding and arguments of the
25061  * created function.
25062  *
25063  * @static
25064  * @memberOf _
25065  * @since 3.0.0
25066  * @category Function
25067  * @param {Function} predicate The predicate to negate.
25068  * @returns {Function} Returns the new negated function.
25069  * @example
25070  *
25071  * function isEven(n) {
25072  *   return n % 2 == 0;
25073  * }
25074  *
25075  * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25076  * // => [1, 3, 5]
25077  */
25078 function negate(predicate) {
25079   if (typeof predicate != 'function') {
25080     throw new TypeError(FUNC_ERROR_TEXT$1);
25081   }
25082   return function() {
25083     var args = arguments;
25084     switch (args.length) {
25085       case 0: return !predicate.call(this);
25086       case 1: return !predicate.call(this, args[0]);
25087       case 2: return !predicate.call(this, args[0], args[1]);
25088       case 3: return !predicate.call(this, args[0], args[1], args[2]);
25089     }
25090     return !predicate.apply(this, args);
25091   };
25092 }
25093
25094 /**
25095  * The opposite of `_.filter`; this method returns the elements of `collection`
25096  * that `predicate` does **not** return truthy for.
25097  *
25098  * @static
25099  * @memberOf _
25100  * @since 0.1.0
25101  * @category Collection
25102  * @param {Array|Object} collection The collection to iterate over.
25103  * @param {Function} [predicate=_.identity] The function invoked per iteration.
25104  * @returns {Array} Returns the new filtered array.
25105  * @see _.filter
25106  * @example
25107  *
25108  * var users = [
25109  *   { 'user': 'barney', 'age': 36, 'active': false },
25110  *   { 'user': 'fred',   'age': 40, 'active': true }
25111  * ];
25112  *
25113  * _.reject(users, function(o) { return !o.active; });
25114  * // => objects for ['fred']
25115  *
25116  * // The `_.matches` iteratee shorthand.
25117  * _.reject(users, { 'age': 40, 'active': true });
25118  * // => objects for ['barney']
25119  *
25120  * // The `_.matchesProperty` iteratee shorthand.
25121  * _.reject(users, ['active', false]);
25122  * // => objects for ['fred']
25123  *
25124  * // The `_.property` iteratee shorthand.
25125  * _.reject(users, 'active');
25126  * // => objects for ['barney']
25127  */
25128 function reject(collection, predicate) {
25129   var func = isArray(collection) ? arrayFilter : baseFilter;
25130   return func(collection, negate(baseIteratee(predicate, 3)));
25131 }
25132
25133 /**
25134  * An alternative to `_.reduce`; this method transforms `object` to a new
25135  * `accumulator` object which is the result of running each of its own
25136  * enumerable string keyed properties thru `iteratee`, with each invocation
25137  * potentially mutating the `accumulator` object. If `accumulator` is not
25138  * provided, a new object with the same `[[Prototype]]` will be used. The
25139  * iteratee is invoked with four arguments: (accumulator, value, key, object).
25140  * Iteratee functions may exit iteration early by explicitly returning `false`.
25141  *
25142  * @static
25143  * @memberOf _
25144  * @since 1.3.0
25145  * @category Object
25146  * @param {Object} object The object to iterate over.
25147  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25148  * @param {*} [accumulator] The custom accumulator value.
25149  * @returns {*} Returns the accumulated value.
25150  * @example
25151  *
25152  * _.transform([2, 3, 4], function(result, n) {
25153  *   result.push(n *= n);
25154  *   return n % 2 == 0;
25155  * }, []);
25156  * // => [4, 9]
25157  *
25158  * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
25159  *   (result[value] || (result[value] = [])).push(key);
25160  * }, {});
25161  * // => { '1': ['a', 'c'], '2': ['b'] }
25162  */
25163 function transform$1(object, iteratee, accumulator) {
25164   var isArr = isArray(object),
25165       isArrLike = isArr || isBuffer(object) || isTypedArray(object);
25166
25167   iteratee = baseIteratee(iteratee, 4);
25168   if (accumulator == null) {
25169     var Ctor = object && object.constructor;
25170     if (isArrLike) {
25171       accumulator = isArr ? new Ctor : [];
25172     }
25173     else if (isObject(object)) {
25174       accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
25175     }
25176     else {
25177       accumulator = {};
25178     }
25179   }
25180   (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
25181     return iteratee(accumulator, value, index, object);
25182   });
25183   return accumulator;
25184 }
25185
25186 /*
25187   Order the nodes of a way in reverse order and reverse any direction dependent tags
25188   other than `oneway`. (We assume that correcting a backwards oneway is the primary
25189   reason for reversing a way.)
25190
25191   The following transforms are performed:
25192
25193     Keys:
25194           *:right=* ⟺ *:left=*
25195         *:forward=* ⟺ *:backward=*
25196        direction=up ⟺ direction=down
25197          incline=up ⟺ incline=down
25198             *=right ⟺ *=left
25199
25200     Relation members:
25201        role=forward ⟺ role=backward
25202          role=north ⟺ role=south
25203           role=east ⟺ role=west
25204
25205    In addition, numeric-valued `incline` tags are negated.
25206
25207    The JOSM implementation was used as a guide, but transformations that were of unclear benefit
25208    or adjusted tags that don't seem to be used in practice were omitted.
25209
25210    Also, each node on the way is examined for its own tags and the following transformations are performed
25211    in order to ensure associated nodes (eg a Stop Sign) is also reversed
25212
25213     Node Keys:
25214         *direction=forward ⟺ *direction=backward
25215         *direction=left ⟺ *direction=right
25216         *:forward=* ⟺ *:backward=*
25217         *:left=* ⟺ *:right=*
25218
25219    References:
25220       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
25221       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
25222       http://wiki.openstreetmap.org/wiki/Key:incline
25223       http://wiki.openstreetmap.org/wiki/Route#Members
25224       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
25225       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
25226       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
25227  */
25228 function actionReverse(wayId, options) {
25229     var replacements = [
25230             [/:right$/, ':left'], [/:left$/, ':right'],
25231             [/:forward$/, ':backward'], [/:backward$/, ':forward']
25232         ],
25233         numeric = /^([+\-]?)(?=[\d.])/,
25234         roleReversals = {
25235             forward: 'backward',
25236             backward: 'forward',
25237             north: 'south',
25238             south: 'north',
25239             east: 'west',
25240             west: 'east'
25241         };
25242
25243
25244     function reverseKey(key) {
25245         for (var i = 0; i < replacements.length; ++i) {
25246             var replacement = replacements[i];
25247             if (replacement[0].test(key)) {
25248                 return key.replace(replacement[0], replacement[1]);
25249             }
25250         }
25251         return key;
25252     }
25253
25254
25255     function reverseValue(key, value) {
25256         if (key === 'incline' && numeric.test(value)) {
25257             return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
25258         } else if (key === 'incline' || key === 'direction') {
25259             return {up: 'down', down: 'up'}[value] || value;
25260         } else if (options && options.reverseOneway && key === 'oneway') {
25261             return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
25262         } else {
25263             return {left: 'right', right: 'left'}[value] || value;
25264         }
25265     }
25266
25267
25268     function reverseDirectionTags(node) {
25269         // Update the direction based tags as appropriate then return an updated node
25270         return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
25271             // See if this is a direction tag and reverse (or use existing value if not recognised)
25272             var re = /direction$/;
25273             if (re.test(tagKey)) {
25274                 acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
25275             } else {
25276                 // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
25277                 // This will pass through other tags unchanged
25278                 acc[reverseKey(tagKey)] = tagValue;
25279             }
25280             return acc;
25281         }, {})});
25282     }
25283
25284
25285     function reverseTagsOnNodes(graph, nodeIds) {
25286         // Reverse the direction of appropriate tags attached to the nodes (#3076)
25287         return nodeIds
25288             // Get each node from the graph
25289             .map(function(nodeId) { return graph.entity(nodeId);})
25290             // Check tags on the node, if there aren't any, we can skip
25291             .filter(function(existingNode) { return existingNode.tags !== undefined;})
25292             // Get a new version of each node with the appropriate tags reversed
25293             .map(function(existingNode) { return reverseDirectionTags(existingNode);})
25294             // Chain together consecutive updates to the graph for each updated node and return
25295             .reduce(function (accGraph, value) { return accGraph.replace(value); }, graph);
25296     }
25297
25298
25299     return function(graph) {
25300         var way = graph.entity(wayId),
25301             nodes = way.nodes.slice().reverse(),
25302             tags = {}, key, role;
25303
25304         for (key in way.tags) {
25305             tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
25306         }
25307
25308         graph.parentRelations(way).forEach(function(relation) {
25309             relation.members.forEach(function(member, index) {
25310                 if (member.id === way.id && (role = roleReversals[member.role])) {
25311                     relation = relation.updateMember({role: role}, index);
25312                     graph = graph.replace(relation);
25313                 }
25314             });
25315         });
25316
25317         // Reverse any associated directions on nodes on the way and then replace
25318         // the way itself with the reversed node ids and updated way tags
25319         return reverseTagsOnNodes(graph, nodes).replace(way.update({nodes: nodes, tags: tags}));
25320     };
25321 }
25322
25323 /** `Object#toString` result references. */
25324 var numberTag$4 = '[object Number]';
25325
25326 /**
25327  * Checks if `value` is classified as a `Number` primitive or object.
25328  *
25329  * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
25330  * classified as numbers, use the `_.isFinite` method.
25331  *
25332  * @static
25333  * @memberOf _
25334  * @since 0.1.0
25335  * @category Lang
25336  * @param {*} value The value to check.
25337  * @returns {boolean} Returns `true` if `value` is a number, else `false`.
25338  * @example
25339  *
25340  * _.isNumber(3);
25341  * // => true
25342  *
25343  * _.isNumber(Number.MIN_VALUE);
25344  * // => true
25345  *
25346  * _.isNumber(Infinity);
25347  * // => true
25348  *
25349  * _.isNumber('3');
25350  * // => false
25351  */
25352 function isNumber(value) {
25353   return typeof value == 'number' ||
25354     (isObjectLike(value) && baseGetTag(value) == numberTag$4);
25355 }
25356
25357 /** `Object#toString` result references. */
25358 var stringTag$4 = '[object String]';
25359
25360 /**
25361  * Checks if `value` is classified as a `String` primitive or object.
25362  *
25363  * @static
25364  * @since 0.1.0
25365  * @memberOf _
25366  * @category Lang
25367  * @param {*} value The value to check.
25368  * @returns {boolean} Returns `true` if `value` is a string, else `false`.
25369  * @example
25370  *
25371  * _.isString('abc');
25372  * // => true
25373  *
25374  * _.isString(1);
25375  * // => false
25376  */
25377 function isString(value) {
25378   return typeof value == 'string' ||
25379     (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
25380 }
25381
25382 /**
25383  * Checks if `value` is `NaN`.
25384  *
25385  * **Note:** This method is based on
25386  * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
25387  * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
25388  * `undefined` and other non-number values.
25389  *
25390  * @static
25391  * @memberOf _
25392  * @since 0.1.0
25393  * @category Lang
25394  * @param {*} value The value to check.
25395  * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
25396  * @example
25397  *
25398  * _.isNaN(NaN);
25399  * // => true
25400  *
25401  * _.isNaN(new Number(NaN));
25402  * // => true
25403  *
25404  * isNaN(undefined);
25405  * // => true
25406  *
25407  * _.isNaN(undefined);
25408  * // => false
25409  */
25410 function isNaN$1(value) {
25411   // An `NaN` primitive is the only value that is not equal to itself.
25412   // Perform the `toStringTag` check first to avoid errors with some
25413   // ActiveX objects in IE.
25414   return isNumber(value) && value != +value;
25415 }
25416
25417 function osmLanes(entity) {
25418     if (entity.type !== 'way') return null;
25419     if (!entity.tags.highway) return null;
25420
25421     var tags = entity.tags;
25422     var isOneWay = entity.isOneWay();
25423     var laneCount = getLaneCount(tags, isOneWay);
25424     var maxspeed = parseMaxspeed(tags);
25425
25426     var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
25427     var forward = laneDirections.forward;
25428     var backward = laneDirections.backward;
25429     var bothways = laneDirections.bothways;
25430
25431     // parse the piped string 'x|y|z' format
25432     var turnLanes = {};
25433     turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
25434     turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
25435     turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
25436
25437     var maxspeedLanes = {};
25438     maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
25439     maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
25440     maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
25441
25442     var psvLanes = {};
25443     psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
25444     psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
25445     psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
25446
25447     var busLanes = {};
25448     busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
25449     busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
25450     busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
25451
25452     var taxiLanes = {};
25453     taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
25454     taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
25455     taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
25456
25457     var hovLanes = {};
25458     hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
25459     hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
25460     hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
25461
25462     var hgvLanes = {};
25463     hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
25464     hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
25465     hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
25466
25467     var bicyclewayLanes = {};
25468     bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
25469     bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
25470     bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
25471
25472     var lanesObj = {
25473         forward: [],
25474         backward: [],
25475         unspecified: []
25476     };
25477
25478     // map forward/backward/unspecified of each lane type to lanesObj
25479     mapToLanesObj(lanesObj, turnLanes, 'turnLane');
25480     mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
25481     mapToLanesObj(lanesObj, psvLanes, 'psv');
25482     mapToLanesObj(lanesObj, busLanes, 'bus');
25483     mapToLanesObj(lanesObj, taxiLanes, 'taxi');
25484     mapToLanesObj(lanesObj, hovLanes, 'hov');
25485     mapToLanesObj(lanesObj, hgvLanes, 'hgv');
25486     mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
25487
25488     return {
25489         metadata: {
25490             count: laneCount,
25491             oneway: isOneWay,
25492             forward: forward,
25493             backward: backward,
25494             bothways: bothways,
25495             turnLanes: turnLanes,
25496             maxspeed: maxspeed,
25497             maxspeedLanes: maxspeedLanes,
25498             psvLanes: psvLanes,
25499             busLanes: busLanes,
25500             taxiLanes: taxiLanes,
25501             hovLanes: hovLanes,
25502             hgvLanes: hgvLanes,
25503             bicyclewayLanes: bicyclewayLanes
25504         },
25505         lanes: lanesObj
25506     };
25507 }
25508
25509
25510 function getLaneCount(tags, isOneWay) {
25511     var count;
25512     if (tags.lanes) {
25513         count = parseInt(tags.lanes, 10);
25514         if (count > 0) {
25515             return count;
25516         }
25517     }
25518
25519
25520     switch (tags.highway) {
25521         case 'trunk':
25522         case 'motorway':
25523             count = isOneWay ? 2 : 4;
25524             break;
25525         default:
25526             count = isOneWay ? 1 : 2;
25527             break;
25528     }
25529
25530     return count;
25531 }
25532
25533
25534 function parseMaxspeed(tags) {
25535     var maxspeed = tags.maxspeed;
25536     if (isNumber(maxspeed)) return maxspeed;
25537     if (isString(maxspeed)) {
25538         maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
25539         if (!maxspeed) return;
25540         return parseInt(maxspeed, 10);
25541     }
25542 }
25543
25544
25545 function parseLaneDirections(tags, isOneWay, laneCount) {
25546     var forward = parseInt(tags['lanes:forward'], 10);
25547     var backward = parseInt(tags['lanes:backward'], 10);
25548     var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
25549
25550     if (parseInt(tags.oneway, 10) === -1) {
25551         forward = 0;
25552         bothways = 0;
25553         backward = laneCount;
25554     }
25555     else if (isOneWay) {
25556         forward = laneCount;
25557         bothways = 0;
25558         backward = 0;
25559     }
25560     else if (isNaN$1(forward) && isNaN$1(backward)) {
25561         backward = Math.floor((laneCount - bothways) / 2);
25562         forward = laneCount - bothways - backward;
25563     }
25564     else if (isNaN$1(forward)) {
25565         if (backward > laneCount - bothways) {
25566             backward = laneCount - bothways;
25567         }
25568         forward = laneCount - bothways - backward;
25569     }
25570     else if (isNaN$1(backward)) {
25571         if (forward > laneCount - bothways) {
25572             forward = laneCount - bothways;
25573         }
25574         backward = laneCount - bothways - forward;
25575     }
25576     return {
25577         forward: forward,
25578         backward: backward,
25579         bothways: bothways
25580     };
25581 }
25582
25583
25584 function parseTurnLanes(tag){
25585     if (!tag) return;
25586
25587     var validValues = [
25588         'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
25589         'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
25590     ];
25591
25592     return tag.split('|')
25593         .map(function (s) {
25594             if (s === '') s = 'none';
25595             return s.split(';')
25596                 .map(function (d) {
25597                     return validValues.indexOf(d) === -1 ? 'unknown': d;
25598                 });
25599         });
25600 }
25601
25602
25603 function parseMaxspeedLanes(tag, maxspeed) {
25604     if (!tag) return;
25605
25606     return tag.split('|')
25607         .map(function (s) {
25608             if (s === 'none') return s;
25609             var m = parseInt(s, 10);
25610             if (s === '' || m === maxspeed) return null;
25611             return isNaN$1(m) ? 'unknown': m;
25612         });
25613 }
25614
25615
25616 function parseMiscLanes(tag) {
25617     if (!tag) return;
25618
25619     var validValues = [
25620         'yes', 'no', 'designated'
25621     ];
25622
25623     return tag.split('|')
25624         .map(function (s) {
25625             if (s === '') s = 'no';
25626             return validValues.indexOf(s) === -1 ? 'unknown': s;
25627         });
25628 }
25629
25630
25631 function parseBicycleWay(tag) {
25632     if (!tag) return;
25633
25634     var validValues = [
25635         'yes', 'no', 'designated', 'lane'
25636     ];
25637
25638     return tag.split('|')
25639         .map(function (s) {
25640             if (s === '') s = 'no';
25641             return validValues.indexOf(s) === -1 ? 'unknown': s;
25642         });
25643 }
25644
25645
25646 function mapToLanesObj(lanesObj, data, key) {
25647     if (data.forward) data.forward.forEach(function(l, i) {
25648         if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
25649         lanesObj.forward[i][key] = l;
25650     });
25651     if (data.backward) data.backward.forEach(function(l, i) {
25652         if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
25653         lanesObj.backward[i][key] = l;
25654     });
25655     if (data.unspecified) data.unspecified.forEach(function(l, i) {
25656         if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
25657         lanesObj.unspecified[i][key] = l;
25658     });
25659 }
25660
25661 /** Used to compose bitmasks for cloning. */
25662 var CLONE_DEEP_FLAG$2 = 1,
25663     CLONE_SYMBOLS_FLAG$3 = 4;
25664
25665 /**
25666  * This method is like `_.clone` except that it recursively clones `value`.
25667  *
25668  * @static
25669  * @memberOf _
25670  * @since 1.0.0
25671  * @category Lang
25672  * @param {*} value The value to recursively clone.
25673  * @returns {*} Returns the deep cloned value.
25674  * @see _.clone
25675  * @example
25676  *
25677  * var objects = [{ 'a': 1 }, { 'b': 2 }];
25678  *
25679  * var deep = _.cloneDeep(objects);
25680  * console.log(deep[0] === objects[0]);
25681  * // => false
25682  */
25683 function cloneDeep(value) {
25684   return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
25685 }
25686
25687 /**
25688  * Gets the timestamp of the number of milliseconds that have elapsed since
25689  * the Unix epoch (1 January 1970 00:00:00 UTC).
25690  *
25691  * @static
25692  * @memberOf _
25693  * @since 2.4.0
25694  * @category Date
25695  * @returns {number} Returns the timestamp.
25696  * @example
25697  *
25698  * _.defer(function(stamp) {
25699  *   console.log(_.now() - stamp);
25700  * }, _.now());
25701  * // => Logs the number of milliseconds it took for the deferred invocation.
25702  */
25703 var now$1 = function() {
25704   return root$2.Date.now();
25705 };
25706
25707 /** Error message constants. */
25708 var FUNC_ERROR_TEXT$2 = 'Expected a function';
25709
25710 /* Built-in method references for those with the same name as other `lodash` methods. */
25711 var nativeMax$2 = Math.max,
25712     nativeMin = Math.min;
25713
25714 /**
25715  * Creates a debounced function that delays invoking `func` until after `wait`
25716  * milliseconds have elapsed since the last time the debounced function was
25717  * invoked. The debounced function comes with a `cancel` method to cancel
25718  * delayed `func` invocations and a `flush` method to immediately invoke them.
25719  * Provide `options` to indicate whether `func` should be invoked on the
25720  * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
25721  * with the last arguments provided to the debounced function. Subsequent
25722  * calls to the debounced function return the result of the last `func`
25723  * invocation.
25724  *
25725  * **Note:** If `leading` and `trailing` options are `true`, `func` is
25726  * invoked on the trailing edge of the timeout only if the debounced function
25727  * is invoked more than once during the `wait` timeout.
25728  *
25729  * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
25730  * until to the next tick, similar to `setTimeout` with a timeout of `0`.
25731  *
25732  * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
25733  * for details over the differences between `_.debounce` and `_.throttle`.
25734  *
25735  * @static
25736  * @memberOf _
25737  * @since 0.1.0
25738  * @category Function
25739  * @param {Function} func The function to debounce.
25740  * @param {number} [wait=0] The number of milliseconds to delay.
25741  * @param {Object} [options={}] The options object.
25742  * @param {boolean} [options.leading=false]
25743  *  Specify invoking on the leading edge of the timeout.
25744  * @param {number} [options.maxWait]
25745  *  The maximum time `func` is allowed to be delayed before it's invoked.
25746  * @param {boolean} [options.trailing=true]
25747  *  Specify invoking on the trailing edge of the timeout.
25748  * @returns {Function} Returns the new debounced function.
25749  * @example
25750  *
25751  * // Avoid costly calculations while the window size is in flux.
25752  * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
25753  *
25754  * // Invoke `sendMail` when clicked, debouncing subsequent calls.
25755  * jQuery(element).on('click', _.debounce(sendMail, 300, {
25756  *   'leading': true,
25757  *   'trailing': false
25758  * }));
25759  *
25760  * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
25761  * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
25762  * var source = new EventSource('/stream');
25763  * jQuery(source).on('message', debounced);
25764  *
25765  * // Cancel the trailing debounced invocation.
25766  * jQuery(window).on('popstate', debounced.cancel);
25767  */
25768 function debounce(func, wait, options) {
25769   var lastArgs,
25770       lastThis,
25771       maxWait,
25772       result,
25773       timerId,
25774       lastCallTime,
25775       lastInvokeTime = 0,
25776       leading = false,
25777       maxing = false,
25778       trailing = true;
25779
25780   if (typeof func != 'function') {
25781     throw new TypeError(FUNC_ERROR_TEXT$2);
25782   }
25783   wait = toNumber(wait) || 0;
25784   if (isObject(options)) {
25785     leading = !!options.leading;
25786     maxing = 'maxWait' in options;
25787     maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
25788     trailing = 'trailing' in options ? !!options.trailing : trailing;
25789   }
25790
25791   function invokeFunc(time) {
25792     var args = lastArgs,
25793         thisArg = lastThis;
25794
25795     lastArgs = lastThis = undefined;
25796     lastInvokeTime = time;
25797     result = func.apply(thisArg, args);
25798     return result;
25799   }
25800
25801   function leadingEdge(time) {
25802     // Reset any `maxWait` timer.
25803     lastInvokeTime = time;
25804     // Start the timer for the trailing edge.
25805     timerId = setTimeout(timerExpired, wait);
25806     // Invoke the leading edge.
25807     return leading ? invokeFunc(time) : result;
25808   }
25809
25810   function remainingWait(time) {
25811     var timeSinceLastCall = time - lastCallTime,
25812         timeSinceLastInvoke = time - lastInvokeTime,
25813         timeWaiting = wait - timeSinceLastCall;
25814
25815     return maxing
25816       ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
25817       : timeWaiting;
25818   }
25819
25820   function shouldInvoke(time) {
25821     var timeSinceLastCall = time - lastCallTime,
25822         timeSinceLastInvoke = time - lastInvokeTime;
25823
25824     // Either this is the first call, activity has stopped and we're at the
25825     // trailing edge, the system time has gone backwards and we're treating
25826     // it as the trailing edge, or we've hit the `maxWait` limit.
25827     return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
25828       (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
25829   }
25830
25831   function timerExpired() {
25832     var time = now$1();
25833     if (shouldInvoke(time)) {
25834       return trailingEdge(time);
25835     }
25836     // Restart the timer.
25837     timerId = setTimeout(timerExpired, remainingWait(time));
25838   }
25839
25840   function trailingEdge(time) {
25841     timerId = undefined;
25842
25843     // Only invoke if we have `lastArgs` which means `func` has been
25844     // debounced at least once.
25845     if (trailing && lastArgs) {
25846       return invokeFunc(time);
25847     }
25848     lastArgs = lastThis = undefined;
25849     return result;
25850   }
25851
25852   function cancel() {
25853     if (timerId !== undefined) {
25854       clearTimeout(timerId);
25855     }
25856     lastInvokeTime = 0;
25857     lastArgs = lastCallTime = lastThis = timerId = undefined;
25858   }
25859
25860   function flush() {
25861     return timerId === undefined ? result : trailingEdge(now$1());
25862   }
25863
25864   function debounced() {
25865     var time = now$1(),
25866         isInvoking = shouldInvoke(time);
25867
25868     lastArgs = arguments;
25869     lastThis = this;
25870     lastCallTime = time;
25871
25872     if (isInvoking) {
25873       if (timerId === undefined) {
25874         return leadingEdge(lastCallTime);
25875       }
25876       if (maxing) {
25877         // Handle invocations in a tight loop.
25878         timerId = setTimeout(timerExpired, wait);
25879         return invokeFunc(lastCallTime);
25880       }
25881     }
25882     if (timerId === undefined) {
25883       timerId = setTimeout(timerExpired, wait);
25884     }
25885     return result;
25886   }
25887   debounced.cancel = cancel;
25888   debounced.flush = flush;
25889   return debounced;
25890 }
25891
25892 /**
25893  * Casts `value` to `identity` if it's not a function.
25894  *
25895  * @private
25896  * @param {*} value The value to inspect.
25897  * @returns {Function} Returns cast function.
25898  */
25899 function castFunction(value) {
25900   return typeof value == 'function' ? value : identity$8;
25901 }
25902
25903 /**
25904  * Iterates over elements of `collection` and invokes `iteratee` for each element.
25905  * The iteratee is invoked with three arguments: (value, index|key, collection).
25906  * Iteratee functions may exit iteration early by explicitly returning `false`.
25907  *
25908  * **Note:** As with other "Collections" methods, objects with a "length"
25909  * property are iterated like arrays. To avoid this behavior use `_.forIn`
25910  * or `_.forOwn` for object iteration.
25911  *
25912  * @static
25913  * @memberOf _
25914  * @since 0.1.0
25915  * @alias each
25916  * @category Collection
25917  * @param {Array|Object} collection The collection to iterate over.
25918  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25919  * @returns {Array|Object} Returns `collection`.
25920  * @see _.forEachRight
25921  * @example
25922  *
25923  * _.forEach([1, 2], function(value) {
25924  *   console.log(value);
25925  * });
25926  * // => Logs `1` then `2`.
25927  *
25928  * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
25929  *   console.log(key);
25930  * });
25931  * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25932  */
25933 function forEach(collection, iteratee) {
25934   var func = isArray(collection) ? arrayEach : baseEach;
25935   return func(collection, castFunction(iteratee));
25936 }
25937
25938 /**
25939  * Iterates over own enumerable string keyed properties of an object and
25940  * invokes `iteratee` for each property. The iteratee is invoked with three
25941  * arguments: (value, key, object). Iteratee functions may exit iteration
25942  * early by explicitly returning `false`.
25943  *
25944  * @static
25945  * @memberOf _
25946  * @since 0.3.0
25947  * @category Object
25948  * @param {Object} object The object to iterate over.
25949  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25950  * @returns {Object} Returns `object`.
25951  * @see _.forOwnRight
25952  * @example
25953  *
25954  * function Foo() {
25955  *   this.a = 1;
25956  *   this.b = 2;
25957  * }
25958  *
25959  * Foo.prototype.c = 3;
25960  *
25961  * _.forOwn(new Foo, function(value, key) {
25962  *   console.log(key);
25963  * });
25964  * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25965  */
25966 function forOwn(object, iteratee) {
25967   return object && baseForOwn(object, castFunction(iteratee));
25968 }
25969
25970 var translations = Object.create(null);
25971
25972 var currentLocale = 'en';
25973 var textDirection = 'ltr';
25974
25975 function setLocale(_) {
25976     if (translations[_] !== undefined) {
25977         currentLocale = _;
25978     } else if (translations[_.split('-')[0]]) {
25979         currentLocale = _.split('-')[0];
25980     }
25981 }
25982
25983 function addTranslation(id, value) {
25984     translations[id] = value;
25985 }
25986
25987 /**
25988  * Given a string identifier, try to find that string in the current
25989  * language, and return it.
25990  *
25991  * @param {string} s string identifier
25992  * @returns {string?} locale string
25993  */
25994 function t(s, o, loc) {
25995     loc = loc || currentLocale;
25996
25997     var path = s
25998         .split('.')
25999         .map(function(s) { return s.replace('<TX_DOT>', '.'); })
26000         .reverse();
26001
26002     var rep = translations[loc];
26003
26004     while (rep !== undefined && path.length) rep = rep[path.pop()];
26005
26006     if (rep !== undefined) {
26007         if (o) for (var k in o) rep = rep.replace('{' + k + '}', o[k]);
26008         return rep;
26009     }
26010
26011     if (loc !== 'en') {
26012         return t(s, o, 'en');
26013     }
26014
26015     if (o && 'default' in o) {
26016         return o.default;
26017     }
26018
26019     var missing = 'Missing ' + loc + ' translation: ' + s;
26020     if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26021
26022     return missing;
26023 }
26024
26025 /**
26026  * Given string 'ltr' or 'rtl', save that setting
26027  *
26028  * @param {string} s ltr or rtl
26029  */
26030
26031 function setTextDirection(dir) {
26032     textDirection = dir;
26033 }
26034
26035 /** Used to compose bitmasks for cloning. */
26036 var CLONE_DEEP_FLAG$3 = 1,
26037     CLONE_SYMBOLS_FLAG$4 = 4;
26038
26039 /**
26040  * This method is like `_.cloneWith` except that it recursively clones `value`.
26041  *
26042  * @static
26043  * @memberOf _
26044  * @since 4.0.0
26045  * @category Lang
26046  * @param {*} value The value to recursively clone.
26047  * @param {Function} [customizer] The function to customize cloning.
26048  * @returns {*} Returns the deep cloned value.
26049  * @see _.cloneWith
26050  * @example
26051  *
26052  * function customizer(value) {
26053  *   if (_.isElement(value)) {
26054  *     return value.cloneNode(true);
26055  *   }
26056  * }
26057  *
26058  * var el = _.cloneDeepWith(document.body, customizer);
26059  *
26060  * console.log(el === document.body);
26061  * // => false
26062  * console.log(el.nodeName);
26063  * // => 'BODY'
26064  * console.log(el.childNodes.length);
26065  * // => 20
26066  */
26067 function cloneDeepWith(value, customizer) {
26068   customizer = typeof customizer == 'function' ? customizer : undefined;
26069   return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26070 }
26071
26072 /**
26073  * Creates an array of `array` values not included in the other given arrays
26074  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26075  * for equality comparisons. The order and references of result values are
26076  * determined by the first array.
26077  *
26078  * **Note:** Unlike `_.pullAll`, this method returns a new array.
26079  *
26080  * @static
26081  * @memberOf _
26082  * @since 0.1.0
26083  * @category Array
26084  * @param {Array} array The array to inspect.
26085  * @param {...Array} [values] The values to exclude.
26086  * @returns {Array} Returns the new array of filtered values.
26087  * @see _.without, _.xor
26088  * @example
26089  *
26090  * _.difference([2, 1], [2, 3]);
26091  * // => [1]
26092  */
26093 var difference = baseRest(function(array, values) {
26094   return isArrayLikeObject(array)
26095     ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26096     : [];
26097 });
26098
26099 /** `Object#toString` result references. */
26100 var mapTag$7 = '[object Map]',
26101     setTag$7 = '[object Set]';
26102
26103 /** Used for built-in method references. */
26104 var objectProto$17 = Object.prototype;
26105
26106 /** Used to check objects for own properties. */
26107 var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
26108
26109 /**
26110  * Checks if `value` is an empty object, collection, map, or set.
26111  *
26112  * Objects are considered empty if they have no own enumerable string keyed
26113  * properties.
26114  *
26115  * Array-like values such as `arguments` objects, arrays, buffers, strings, or
26116  * jQuery-like collections are considered empty if they have a `length` of `0`.
26117  * Similarly, maps and sets are considered empty if they have a `size` of `0`.
26118  *
26119  * @static
26120  * @memberOf _
26121  * @since 0.1.0
26122  * @category Lang
26123  * @param {*} value The value to check.
26124  * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26125  * @example
26126  *
26127  * _.isEmpty(null);
26128  * // => true
26129  *
26130  * _.isEmpty(true);
26131  * // => true
26132  *
26133  * _.isEmpty(1);
26134  * // => true
26135  *
26136  * _.isEmpty([1, 2, 3]);
26137  * // => false
26138  *
26139  * _.isEmpty({ 'a': 1 });
26140  * // => false
26141  */
26142 function isEmpty(value) {
26143   if (value == null) {
26144     return true;
26145   }
26146   if (isArrayLike(value) &&
26147       (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
26148         isBuffer(value) || isTypedArray(value) || isArguments(value))) {
26149     return !value.length;
26150   }
26151   var tag = getTag$1(value);
26152   if (tag == mapTag$7 || tag == setTag$7) {
26153     return !value.size;
26154   }
26155   if (isPrototype(value)) {
26156     return !baseKeys(value).length;
26157   }
26158   for (var key in value) {
26159     if (hasOwnProperty$14.call(value, key)) {
26160       return false;
26161     }
26162   }
26163   return true;
26164 }
26165
26166 var detected;
26167
26168 function utilDetect(force) {
26169     if (detected && !force) return detected;
26170     detected = {};
26171
26172     var ua = navigator.userAgent,
26173         m = null;
26174
26175     m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
26176     if (m !== null) {
26177         detected.browser = m[1];
26178         detected.version = m[2];
26179     }
26180     if (!detected.browser) {
26181         m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
26182         if (m !== null) {
26183             detected.browser = 'msie';
26184             detected.version = m[1];
26185         }
26186     }
26187     if (!detected.browser) {
26188         m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
26189         if (m !== null) {
26190             detected.browser = 'Opera';
26191             detected.version = m[2];
26192         }
26193     }
26194     if (!detected.browser) {
26195         m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
26196         if (m !== null) {
26197             detected.browser = m[1];
26198             detected.version = m[2];
26199             m = ua.match(/version\/([\.\d]+)/i);
26200             if (m !== null) detected.version = m[1];
26201         }
26202     }
26203     if (!detected.browser) {
26204         detected.browser = navigator.appName;
26205         detected.version = navigator.appVersion;
26206     }
26207
26208     // keep major.minor version only..
26209     detected.version = detected.version.split(/\W/).slice(0,2).join('.');
26210
26211     if (detected.browser.toLowerCase() === 'msie') {
26212         detected.ie = true;
26213         detected.browser = 'Internet Explorer';
26214         detected.support = parseFloat(detected.version) >= 11;
26215     } else {
26216         detected.ie = false;
26217         detected.support = true;
26218     }
26219
26220     // Added due to incomplete svg style support. See #715
26221     detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
26222
26223     detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
26224     detected.language = detected.locale.split('-')[0];
26225
26226     // Search `navigator.languages` for a better locale.. Prefer the first language,
26227     // unless the second language is a culture-specific version of the first one, see #3842
26228     if (navigator.languages && navigator.languages.length > 0) {
26229         var code0 = navigator.languages[0],
26230             parts0 = code0.split('-');
26231
26232         detected.locale = code0;
26233         detected.language = parts0[0];
26234
26235         if (navigator.languages.length > 1 && parts0.length === 1) {
26236             var code1 = navigator.languages[1],
26237                 parts1 = code1.split('-');
26238
26239             if (parts1[0] === parts0[0]) {
26240                 detected.locale = code1;
26241             }
26242         }
26243     }
26244
26245     // Loaded locale is stored in currentLocale
26246     // return that instead (except in the situation where 'en' might override 'en-US')
26247     var loadedLocale = currentLocale || 'en';
26248     if (loadedLocale !== 'en') {
26249         detected.locale = loadedLocale;
26250         detected.language = detected.locale.split('-')[0];
26251     }
26252
26253     // detect text direction
26254     var q = utilStringQs(window.location.hash.substring(1));
26255     var lang = dataLocales[detected.locale];
26256     if ((lang && lang.rtl) || (q.rtl === 'true')) {
26257         detected.textDirection = 'rtl';
26258     } else {
26259         detected.textDirection = 'ltr';
26260     }
26261     setTextDirection(detected.textDirection);
26262
26263     // detect host
26264     var loc = window.top.location;
26265     var origin = loc.origin;
26266     if (!origin) {  // for unpatched IE11
26267         origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
26268     }
26269
26270     detected.host = origin + loc.pathname;
26271
26272     detected.filedrop = (window.FileReader && 'ondrop' in window);
26273
26274     detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26275
26276     detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26277
26278     function nav(x) {
26279         return navigator.userAgent.indexOf(x) !== -1;
26280     }
26281
26282     if (nav('Win')) {
26283         detected.os = 'win';
26284         detected.platform = 'Windows';
26285     }
26286     else if (nav('Mac')) {
26287         detected.os = 'mac';
26288         detected.platform = 'Macintosh';
26289     }
26290     else if (nav('X11') || nav('Linux')) {
26291         detected.os = 'linux';
26292         detected.platform = 'Linux';
26293     }
26294     else {
26295         detected.os = 'win';
26296         detected.platform = 'Unknown';
26297     }
26298
26299     return detected;
26300 }
26301
26302 var remove$1 = removeDiacritics;
26303
26304 var replacementList = [
26305   {
26306     base: ' ',
26307     chars: "\u00A0",
26308   }, {
26309     base: '0',
26310     chars: "\u07C0",
26311   }, {
26312     base: 'A',
26313     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",
26314   }, {
26315     base: 'AA',
26316     chars: "\uA732",
26317   }, {
26318     base: 'AE',
26319     chars: "\u00C6\u01FC\u01E2",
26320   }, {
26321     base: 'AO',
26322     chars: "\uA734",
26323   }, {
26324     base: 'AU',
26325     chars: "\uA736",
26326   }, {
26327     base: 'AV',
26328     chars: "\uA738\uA73A",
26329   }, {
26330     base: 'AY',
26331     chars: "\uA73C",
26332   }, {
26333     base: 'B',
26334     chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
26335   }, {
26336     base: 'C',
26337     chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
26338   }, {
26339     base: 'D',
26340     chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
26341   }, {
26342     base: 'Dh',
26343     chars: "\u00D0",
26344   }, {
26345     base: 'DZ',
26346     chars: "\u01F1\u01C4",
26347   }, {
26348     base: 'Dz',
26349     chars: "\u01F2\u01C5",
26350   }, {
26351     base: 'E',
26352     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",
26353   }, {
26354     base: 'F',
26355     chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
26356   }, {
26357     base: 'G',
26358     chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
26359   }, {
26360     base: 'H',
26361     chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
26362   }, {
26363     base: 'I',
26364     chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
26365   }, {
26366     base: 'J',
26367     chars: "\u24BF\uFF2A\u0134\u0248\u0237",
26368   }, {
26369     base: 'K',
26370     chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
26371   }, {
26372     base: 'L',
26373     chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
26374   }, {
26375     base: 'LJ',
26376     chars: "\u01C7",
26377   }, {
26378     base: 'Lj',
26379     chars: "\u01C8",
26380   }, {
26381     base: 'M',
26382     chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
26383   }, {
26384     base: 'N',
26385     chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
26386   }, {
26387     base: 'NJ',
26388     chars: "\u01CA",
26389   }, {
26390     base: 'Nj',
26391     chars: "\u01CB",
26392   }, {
26393     base: 'O',
26394     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",
26395   }, {
26396     base: 'OE',
26397     chars: "\u0152",
26398   }, {
26399     base: 'OI',
26400     chars: "\u01A2",
26401   }, {
26402     base: 'OO',
26403     chars: "\uA74E",
26404   }, {
26405     base: 'OU',
26406     chars: "\u0222",
26407   }, {
26408     base: 'P',
26409     chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
26410   }, {
26411     base: 'Q',
26412     chars: "\u24C6\uFF31\uA756\uA758\u024A",
26413   }, {
26414     base: 'R',
26415     chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
26416   }, {
26417     base: 'S',
26418     chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
26419   }, {
26420     base: 'T',
26421     chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
26422   }, {
26423     base: 'Th',
26424     chars: "\u00DE",
26425   }, {
26426     base: 'TZ',
26427     chars: "\uA728",
26428   }, {
26429     base: 'U',
26430     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",
26431   }, {
26432     base: 'V',
26433     chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
26434   }, {
26435     base: 'VY',
26436     chars: "\uA760",
26437   }, {
26438     base: 'W',
26439     chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
26440   }, {
26441     base: 'X',
26442     chars: "\u24CD\uFF38\u1E8A\u1E8C",
26443   }, {
26444     base: 'Y',
26445     chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
26446   }, {
26447     base: 'Z',
26448     chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
26449   }, {
26450     base: 'a',
26451     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",
26452   }, {
26453     base: 'aa',
26454     chars: "\uA733",
26455   }, {
26456     base: 'ae',
26457     chars: "\u00E6\u01FD\u01E3",
26458   }, {
26459     base: 'ao',
26460     chars: "\uA735",
26461   }, {
26462     base: 'au',
26463     chars: "\uA737",
26464   }, {
26465     base: 'av',
26466     chars: "\uA739\uA73B",
26467   }, {
26468     base: 'ay',
26469     chars: "\uA73D",
26470   }, {
26471     base: 'b',
26472     chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
26473   }, {
26474     base: 'c',
26475     chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
26476   }, {
26477     base: 'd',
26478     chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
26479   }, {
26480     base: 'dh',
26481     chars: "\u00F0",
26482   }, {
26483     base: 'dz',
26484     chars: "\u01F3\u01C6",
26485   }, {
26486     base: 'e',
26487     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",
26488   }, {
26489     base: 'f',
26490     chars: "\u24D5\uFF46\u1E1F\u0192",
26491   }, {
26492     base: 'ff',
26493     chars: "\uFB00",
26494   }, {
26495     base: 'fi',
26496     chars: "\uFB01",
26497   }, {
26498     base: 'fl',
26499     chars: "\uFB02",
26500   }, {
26501     base: 'ffi',
26502     chars: "\uFB03",
26503   }, {
26504     base: 'ffl',
26505     chars: "\uFB04",
26506   }, {
26507     base: 'g',
26508     chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
26509   }, {
26510     base: 'h',
26511     chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
26512   }, {
26513     base: 'hv',
26514     chars: "\u0195",
26515   }, {
26516     base: 'i',
26517     chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
26518   }, {
26519     base: 'j',
26520     chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
26521   }, {
26522     base: 'k',
26523     chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
26524   }, {
26525     base: 'l',
26526     chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
26527   }, {
26528     base: 'lj',
26529     chars: "\u01C9",
26530   }, {
26531     base: 'm',
26532     chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
26533   }, {
26534     base: 'n',
26535     chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
26536   }, {
26537     base: 'nj',
26538     chars: "\u01CC",
26539   }, {
26540     base: 'o',
26541     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",
26542   }, {
26543     base: 'oe',
26544     chars: "\u0153",
26545   }, {
26546     base: 'oi',
26547     chars: "\u01A3",
26548   }, {
26549     base: 'oo',
26550     chars: "\uA74F",
26551   }, {
26552     base: 'ou',
26553     chars: "\u0223",
26554   }, {
26555     base: 'p',
26556     chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
26557   }, {
26558     base: 'q',
26559     chars: "\u24E0\uFF51\u024B\uA757\uA759",
26560   }, {
26561     base: 'r',
26562     chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
26563   }, {
26564     base: 's',
26565     chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
26566   }, {
26567     base: 'ss',
26568     chars: "\xDF",
26569   }, {
26570     base: 't',
26571     chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26572   }, {
26573     base: 'th',
26574     chars: "\u00FE",
26575   }, {
26576     base: 'tz',
26577     chars: "\uA729",
26578   }, {
26579     base: 'u',
26580     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",
26581   }, {
26582     base: 'v',
26583     chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26584   }, {
26585     base: 'vy',
26586     chars: "\uA761",
26587   }, {
26588     base: 'w',
26589     chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26590   }, {
26591     base: 'x',
26592     chars: "\u24E7\uFF58\u1E8B\u1E8D",
26593   }, {
26594     base: 'y',
26595     chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26596   }, {
26597     base: 'z',
26598     chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26599   }
26600 ];
26601
26602 var diacriticsMap = {};
26603 for (var i = 0; i < replacementList.length; i += 1) {
26604   var chars = replacementList[i].chars;
26605   for (var j = 0; j < chars.length; j += 1) {
26606     diacriticsMap[chars[j]] = replacementList[i].base;
26607   }
26608 }
26609
26610 function removeDiacritics(str) {
26611   return str.replace(/[^\u0000-\u007e]/g, function(c) {
26612     return diacriticsMap[c] || c;
26613   });
26614 }
26615
26616 // see https://github.com/openstreetmap/iD/pull/3707
26617 // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
26618
26619 var chars$1 = {
26620     // madda above alef
26621     1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
26622
26623     // hamza above and below alef
26624     1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
26625     // 1572 is ؤ
26626     1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
26627     // 1574 is ئ
26628     1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
26629     1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
26630
26631     // 1577 ة
26632     1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
26633
26634     1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
26635     1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
26636     1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
26637     1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
26638     1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
26639     1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
26640     1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
26641     1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
26642     1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
26643     1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
26644     1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
26645     1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
26646     1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
26647     1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
26648     1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
26649     1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
26650     1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
26651     1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
26652
26653     // 1595 ػ - may be very rare
26654
26655     1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
26656     1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
26657     1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
26658     1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
26659     1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
26660     1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
26661     1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
26662
26663     // 1609 ى
26664     1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
26665     // 1610 ي
26666     1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
26667
26668     // short vowel sounds / tashkil markings
26669
26670     1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
26671
26672     1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
26673     1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
26674     1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
26675     1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
26676     1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
26677     5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
26678 };
26679
26680 var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
26681
26682 function fixRTLTextForSvg(inputText) {
26683     var context = true;
26684     var ret = '';
26685     var rtlBuffer = [];
26686     var arabicRegex = /[\u0600-\u06FF]/g;
26687     var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
26688     var thaanaVowel = /[\u07A6-\u07B0]/;
26689     var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
26690
26691     if (!arabicRegex.test(inputText)) {
26692         // Hebrew or Thaana RTL script
26693         for (var n = 0; n < inputText.length; n++) {
26694             var c = inputText[n];
26695             if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
26696                 rtlBuffer[rtlBuffer.length - 1] += c;
26697             } else if (rtlRegex.test(c)) {
26698                 rtlBuffer.push(c);
26699             } else if (c === ' ' && rtlBuffer.length) {
26700                 // whitespace within RTL text
26701                 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26702             } else {
26703                 // non-RTL character
26704                 ret += rtlBuffer.reverse().join('') + c;
26705                 rtlBuffer = [];
26706             }
26707         }
26708     } else {
26709         for (var i = 0, l = inputText.length; i < l; i++) {
26710             var code = inputText[i].charCodeAt(0);
26711             var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
26712
26713             if (!chars$1[code]) {
26714                 if (code === 32 && rtlBuffer.length) {
26715                     // whitespace
26716                     rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26717                 } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
26718                     // tashkil mark
26719                     rtlBuffer[rtlBuffer.length - 1] += inputText[i];
26720                 } else {
26721                     // non-RTL character
26722                     ret += rtlBuffer.reverse().join('') + inputText[i];
26723                     rtlBuffer = [];
26724                 }
26725                 continue;
26726             }
26727             if (context) {
26728                 if (i === l - 1 || nextCode === 32) {
26729                     rtlBuffer.push(chars$1[code].isolated);
26730                 } else {
26731                     // special case for لا
26732                     if (code === 1604 && nextCode === 1575) {
26733                         rtlBuffer.push(chars$1[5000].initial);
26734                         i++;
26735                         context = true;
26736                         continue;
26737                     }
26738                     rtlBuffer.push(chars$1[code].initial);
26739                 }
26740             } else {
26741                 if (i === l - 1 || nextCode === 32){
26742                     rtlBuffer.push(chars$1[code].final);
26743                 } else {
26744                     // special case for ﻼ
26745                     if (code === 1604 && nextCode === 1575){
26746                         rtlBuffer.push(chars$1[5000].final);
26747                         i++;
26748                         context = true;
26749                         continue;
26750                     }
26751                     if (chars$1[code].medial === ''){
26752                         rtlBuffer.push(chars$1[code].final);
26753                     } else {
26754                         rtlBuffer.push(chars$1[code].medial);
26755                     }
26756                 }
26757             }
26758             context = (chars$1[code].medial === '') || nextCode === 32;
26759         }
26760     }
26761     ret += rtlBuffer.reverse().join('');
26762     return ret;
26763 }
26764
26765 function utilTagText(entity) {
26766     return map$3(entity.tags, function(v, k) {
26767         return k + '=' + v;
26768     }).join(', ');
26769 }
26770
26771
26772 function utilEntitySelector(ids) {
26773     return ids.length ? '.' + ids.join(',.') : 'nothing';
26774 }
26775
26776
26777 function utilEntityOrMemberSelector(ids, graph) {
26778     var s = utilEntitySelector(ids);
26779
26780     ids.forEach(function(id) {
26781         var entity = graph.hasEntity(id);
26782         if (entity && entity.type === 'relation') {
26783             entity.members.forEach(function(member) {
26784                 s += ',.' + member.id;
26785             });
26786         }
26787     });
26788
26789     return s;
26790 }
26791
26792
26793 function utilGetAllNodes(ids, graph) {
26794     var seen = {};
26795     var nodes = [];
26796     ids.forEach(getNodes);
26797     return nodes;
26798
26799     function getNodes(id) {
26800         if (seen[id]) return;
26801         seen[id] = true;
26802
26803         var entity = graph.hasEntity(id);
26804         if (!entity) return;
26805
26806         if (entity.type === 'node') {
26807             nodes.push(entity);
26808         } else if (entity.type === 'way') {
26809             entity.nodes.forEach(getNodes);
26810         } else {
26811             entity.members.map(function(member) { return member.id; }).forEach(getNodes);
26812         }
26813     }
26814 }
26815
26816
26817 function utilDisplayName(entity) {
26818     var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
26819         name = entity.tags[localizedNameKey] || entity.tags.name || '',
26820         network = entity.tags.cycle_network || entity.tags.network;
26821
26822     if (!name && entity.tags.ref) {
26823         name = entity.tags.ref;
26824         if (network) {
26825             name = network + ' ' + name;
26826         }
26827     }
26828
26829     return name;
26830 }
26831
26832
26833 function utilDisplayNameForPath(entity) {
26834     var name = utilDisplayName(entity);
26835     var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
26836
26837     if (!isFirefox && name && rtlRegex.test(name)) {
26838         name = fixRTLTextForSvg(name);
26839     }
26840
26841     return name;
26842 }
26843
26844
26845 function utilDisplayType(id) {
26846     return {
26847         n: t('inspector.node'),
26848         w: t('inspector.way'),
26849         r: t('inspector.relation')
26850     }[id.charAt(0)];
26851 }
26852
26853
26854 function utilStringQs(str) {
26855     return str.split('&').reduce(function(obj, pair){
26856         var parts = pair.split('=');
26857         if (parts.length === 2) {
26858             obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
26859         }
26860         return obj;
26861     }, {});
26862 }
26863
26864
26865 function utilQsString(obj, noencode) {
26866     function softEncode(s) {
26867       // encode everything except special characters used in certain hash parameters:
26868       // "/" in map states, ":", ",", {" and "}" in background
26869       return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
26870     }
26871     return Object.keys(obj).sort().map(function(key) {
26872         return encodeURIComponent(key) + '=' + (
26873             noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
26874     }).join('&');
26875 }
26876
26877
26878 function utilPrefixDOMProperty(property) {
26879     var prefixes = ['webkit', 'ms', 'moz', 'o'],
26880         i = -1,
26881         n = prefixes.length,
26882         s = document.body;
26883
26884     if (property in s)
26885         return property;
26886
26887     property = property.substr(0, 1).toUpperCase() + property.substr(1);
26888
26889     while (++i < n)
26890         if (prefixes[i] + property in s)
26891             return prefixes[i] + property;
26892
26893     return false;
26894 }
26895
26896
26897 function utilPrefixCSSProperty(property) {
26898     var prefixes = ['webkit', 'ms', 'Moz', 'O'],
26899         i = -1,
26900         n = prefixes.length,
26901         s = document.body.style;
26902
26903     if (property.toLowerCase() in s)
26904         return property.toLowerCase();
26905
26906     while (++i < n)
26907         if (prefixes[i] + property in s)
26908             return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
26909
26910     return false;
26911 }
26912
26913
26914 var transformProperty;
26915 function utilSetTransform(el, x, y, scale) {
26916     var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
26917         translate = utilDetect().opera ?
26918             'translate('   + x + 'px,' + y + 'px)' :
26919             'translate3d(' + x + 'px,' + y + 'px,0)';
26920     return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
26921 }
26922
26923
26924 // Calculates Levenshtein distance between two strings
26925 // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
26926 // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
26927 function utilEditDistance(a, b) {
26928     a = remove$1(a.toLowerCase());
26929     b = remove$1(b.toLowerCase());
26930     if (a.length === 0) return b.length;
26931     if (b.length === 0) return a.length;
26932     var matrix = [];
26933     for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
26934     for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
26935     for (i = 1; i <= b.length; i++) {
26936         for (j = 1; j <= a.length; j++) {
26937             if (b.charAt(i-1) === a.charAt(j-1)) {
26938                 matrix[i][j] = matrix[i-1][j-1];
26939             } else {
26940                 matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
26941                     Math.min(matrix[i][j-1] + 1, // insertion
26942                     matrix[i-1][j] + 1)); // deletion
26943             }
26944         }
26945     }
26946     return matrix[b.length][a.length];
26947 }
26948
26949
26950 // a d3.mouse-alike which
26951 // 1. Only works on HTML elements, not SVG
26952 // 2. Does not cause style recalculation
26953 function utilFastMouse(container) {
26954     var rect = container.getBoundingClientRect(),
26955         rectLeft = rect.left,
26956         rectTop = rect.top,
26957         clientLeft = +container.clientLeft,
26958         clientTop = +container.clientTop;
26959     if (textDirection === 'rtl') {
26960         rectLeft = 0;
26961     }
26962     return function(e) {
26963         return [
26964             e.clientX - rectLeft - clientLeft,
26965             e.clientY - rectTop - clientTop];
26966     };
26967 }
26968
26969
26970 /* eslint-disable no-proto */
26971 var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
26972 /* eslint-enable no-proto */
26973
26974
26975 function utilAsyncMap(inputs, func, callback) {
26976     var remaining = inputs.length,
26977         results = [],
26978         errors = [];
26979
26980     inputs.forEach(function(d, i) {
26981         func(d, function done(err, data) {
26982             errors[i] = err;
26983             results[i] = data;
26984             remaining--;
26985             if (!remaining) callback(errors, results);
26986         });
26987     });
26988 }
26989
26990
26991 // wraps an index to an interval [0..length-1]
26992 function utilWrap(index, length) {
26993     if (index < 0)
26994         index += Math.ceil(-index/length)*length;
26995     return index % length;
26996 }
26997
26998
26999 /**
27000  * a replacement for functor
27001  *
27002  * @param {*} value any value
27003  * @returns {Function} a function that returns that value or the value if it's a function
27004  */
27005 function utilFunctor(value) {
27006     if (typeof value === 'function') return value;
27007     return function() {
27008         return value;
27009     };
27010 }
27011
27012
27013 function utilNoAuto(selection) {
27014     var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27015
27016     return selection
27017         .attr('autocomplete', 'off')
27018         .attr('autocorrect', 'off')
27019         .attr('autocapitalize', 'off')
27020         .attr('spellcheck', isText ? 'true' : 'false');
27021 }
27022
27023 // note the function should be of low priority
27024 // and should not be returning a value.
27025 function utilCallWhenIdle(func, timeout) {
27026     return function() {
27027         var args = arguments;
27028         var that = this;
27029         window.requestIdleCallback(function() {
27030             func.apply(that, args);
27031         }, {timeout: timeout});
27032     };
27033 }
27034
27035 // Like selection.property('value', ...), but avoids no-op value sets,
27036 // which can result in layout/repaint thrashing in some situations.
27037 function utilGetSetValue(selection, value) {
27038     function d3_selection_value(value) {
27039         function valueNull() {
27040             delete this.value;
27041         }
27042
27043         function valueConstant() {
27044             if (this.value !== value) {
27045                 this.value = value;
27046             }
27047         }
27048
27049         function valueFunction() {
27050             var x = value.apply(this, arguments);
27051             if (x == null) {
27052                 delete this.value;
27053             } else if (this.value !== x) {
27054                 this.value = x;
27055             }
27056         }
27057
27058         return value == null
27059             ? valueNull : (typeof value === 'function'
27060             ? valueFunction : valueConstant);
27061     }
27062
27063     if (arguments.length === 1) {
27064         return selection.property('value');
27065     }
27066
27067     return selection.each(d3_selection_value(value));
27068 }
27069
27070 function utilIdleWorker(tasks, processor, callback) {
27071     var results = [], result;
27072     for (var i = 0; i < tasks.length; i++) {
27073         result = processor(tasks[i]);
27074         if (result) results.push(result);
27075     }
27076     callback(results);
27077
27078     // var processed = [];
27079     // var currentPos = 0;
27080     // var totalTasks = tasks.length;
27081
27082     // function worker(deadline) {
27083     //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27084     //         var result = processor(tasks[currentPos]);
27085
27086     //         // if falsy dont add to the processed list
27087     //         if (result) processed.push(result);
27088     //         currentPos++;
27089     //     }
27090
27091     //     // more tasks are left, we might need more idleCallbacks
27092     //     if (currentPos < totalTasks) {
27093     //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
27094     //     }
27095
27096     //     // tasks are completed
27097     //     return callback(processed);
27098     // }
27099
27100     // window.requestIdleCallback(function(deadline) {worker(deadline);});
27101 }
27102
27103 // shim
27104 window.requestIdleCallback =
27105     window.requestIdleCallback ||
27106     function(cb) {
27107         var start = Date.now();
27108         return setTimeout(function() {
27109             cb({
27110                 didTimeout: false,
27111                 timeRemaining: function() {
27112                     return Math.max(0, 50 - (Date.now() - start));
27113                 }
27114             });
27115         }, 1);
27116     };
27117
27118 window.cancelIdleCallback =
27119     window.cancelIdleCallback ||
27120     function(id) {
27121         clearTimeout(id);
27122     };
27123
27124 // Copies a variable number of methods from source to target.
27125 function utilRebind(target, source) {
27126     var i = 1, n = arguments.length, method;
27127     while (++i < n) {
27128         target[method = arguments[i]] = d3_rebind(target, source, source[method]);
27129     }
27130     return target;
27131 }
27132
27133 // Method is assumed to be a standard D3 getter-setter:
27134 // If passed with no arguments, gets the value.
27135 // If passed with arguments, sets the value and returns the target.
27136 function d3_rebind(target, source, method) {
27137     return function() {
27138         var value = method.apply(source, arguments);
27139         return value === source ? target : value;
27140     };
27141 }
27142
27143 // A per-domain session mutex backed by a cookie and dead man's
27144 // switch. If the session crashes, the mutex will auto-release
27145 // after 5 seconds.
27146
27147 function utilSessionMutex(name) {
27148     var mutex = {},
27149         intervalID;
27150
27151     function renew() {
27152         var expires = new Date();
27153         expires.setSeconds(expires.getSeconds() + 5);
27154         document.cookie = name + '=1; expires=' + expires.toUTCString();
27155     }
27156
27157     mutex.lock = function() {
27158         if (intervalID) return true;
27159         var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
27160         if (cookie) return false;
27161         renew();
27162         intervalID = window.setInterval(renew, 4000);
27163         return true;
27164     };
27165
27166     mutex.unlock = function() {
27167         if (!intervalID) return;
27168         document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
27169         clearInterval(intervalID);
27170         intervalID = null;
27171     };
27172
27173     mutex.locked = function() {
27174         return !!intervalID;
27175     };
27176
27177     return mutex;
27178 }
27179
27180 function utilSuggestNames(preset, suggestions) {
27181     preset = preset.id.split('/', 2);
27182     var k = preset[0],
27183         v = preset[1];
27184
27185     return function(value, callback) {
27186         var result = [];
27187         if (value && value.length > 2) {
27188             if (suggestions[k] && suggestions[k][v]) {
27189                 for (var sugg in suggestions[k][v]) {
27190                     var dist = utilEditDistance(value, sugg.substring(0, value.length));
27191                     if (dist < 3) {
27192                         result.push({
27193                             title: sugg,
27194                             value: sugg,
27195                             dist: dist
27196                         });
27197                     }
27198                 }
27199             }
27200             result.sort(function(a, b) {
27201                 return a.dist - b.dist;
27202             });
27203         }
27204         result = result.slice(0,3);
27205         callback(result);
27206     };
27207 }
27208
27209 function utilTriggerEvent(target, type) {
27210     target.each(function() {
27211         var evt = document.createEvent('HTMLEvents');
27212         evt.initEvent(type, true, true);
27213         this.dispatchEvent(evt);
27214     });
27215 }
27216
27217 function validationDeprecatedTag() {
27218
27219     var validation = function(changes) {
27220         var warnings = [];
27221         for (var i = 0; i < changes.created.length; i++) {
27222             var change = changes.created[i],
27223                 deprecatedTags = change.deprecatedTags();
27224
27225             if (!isEmpty(deprecatedTags)) {
27226                 var tags = utilTagText({ tags: deprecatedTags });
27227                 warnings.push({
27228                     id: 'deprecated_tags',
27229                     message: t('validations.deprecated_tags', { tags: tags }),
27230                     entity: change
27231                 });
27232             }
27233         }
27234
27235         return warnings;
27236     };
27237
27238
27239     return validation;
27240 }
27241
27242 function validationDisconnectedHighway() {
27243
27244     function isDisconnectedHighway(entity, graph) {
27245         if (!entity.tags.highway) return false;
27246         if (entity.geometry(graph) !== 'line') return false;
27247
27248         return graph.childNodes(entity)
27249             .every(function(vertex) {
27250                 var parents = graph.parentWays(vertex);
27251                 if (parents.length === 1) {  // standalone vertex
27252                     return true;
27253                 } else {                     // shared vertex
27254                     return !vertex.tags.entrance &&
27255                         parents.filter(function(parent) {
27256                             return parent.tags.highway && parent !== entity;
27257                         }).length === 0;
27258                 }
27259             });
27260     }
27261
27262
27263     var validation = function(changes, graph) {
27264         var warnings = [];
27265         for (var i = 0; i < changes.created.length; i++) {
27266             var entity = changes.created[i];
27267
27268             if (isDisconnectedHighway(entity, graph)) {
27269                 warnings.push({
27270                     id: 'disconnected_highway',
27271                     message: t('validations.disconnected_highway'),
27272                     tooltip: t('validations.disconnected_highway_tooltip'),
27273                     entity: entity
27274                 });
27275             }
27276         }
27277
27278         return warnings;
27279     };
27280
27281
27282     return validation;
27283 }
27284
27285 function validationManyDeletions() {
27286     var threshold = 100;
27287
27288     var validation = function(changes, graph) {
27289         var warnings = [];
27290         var nodes=0, ways=0, areas=0, relations=0;
27291
27292         changes.deleted.forEach(function(c) {
27293             if (c.type === 'node') {nodes++;}
27294             else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
27295             else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
27296             else if (c.type === 'relation') {relations++;}
27297         });
27298         if (changes.deleted.length > threshold) {
27299             warnings.push({
27300                 id: 'many_deletions',
27301                 message: t('validations.many_deletions',
27302                     { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
27303             });
27304         }
27305
27306         return warnings;
27307     };
27308
27309
27310     return validation;
27311 }
27312
27313 function validationMissingTag() {
27314
27315     // Slightly stricter check than Entity#isUsed (#3091)
27316     function hasTags(entity, graph) {
27317         return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
27318             graph.parentRelations(entity).length > 0;
27319     }
27320
27321     var validation = function(changes, graph) {
27322         var types = ['point', 'line', 'area', 'relation'],
27323             warnings = [];
27324
27325         for (var i = 0; i < changes.created.length; i++) {
27326             var change = changes.created[i],
27327                 geometry = change.geometry(graph);
27328
27329             if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
27330                 warnings.push({
27331                     id: 'missing_tag',
27332                     message: t('validations.untagged_' + geometry),
27333                     tooltip: t('validations.untagged_' + geometry + '_tooltip'),
27334                     entity: change
27335                 });
27336             }
27337         }
27338
27339         return warnings;
27340     };
27341
27342
27343     return validation;
27344 }
27345
27346 function validationOldMultipolygon() {
27347
27348     return function validation(changes, graph) {
27349         var warnings = [];
27350         for (var i = 0; i < changes.created.length; i++) {
27351             var entity = changes.created[i];
27352             var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
27353             if (parent) {
27354                 warnings.push({
27355                     id: 'old_multipolygon',
27356                     message: t('validations.old_multipolygon'),
27357                     tooltip: t('validations.old_multipolygon_tooltip'),
27358                     entity: parent
27359                 });
27360             }
27361         }
27362         return warnings;
27363     };
27364 }
27365
27366 // https://github.com/openstreetmap/josm/blob/mirror/src/org/
27367 // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
27368 function validationTagSuggestsArea() {
27369
27370     function tagSuggestsArea(tags) {
27371         if (isEmpty(tags)) return false;
27372
27373         var presence = ['landuse', 'amenities', 'tourism', 'shop'];
27374         for (var i = 0; i < presence.length; i++) {
27375             if (tags[presence[i]] !== undefined) {
27376                 return presence[i] + '=' + tags[presence[i]];
27377             }
27378         }
27379
27380         if (tags.building && tags.building === 'yes') return 'building=yes';
27381     }
27382
27383
27384     var validation = function(changes, graph) {
27385         var warnings = [];
27386         for (var i = 0; i < changes.created.length; i++) {
27387             var change = changes.created[i],
27388                 geometry = change.geometry(graph),
27389                 suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
27390
27391             if (suggestion) {
27392                 warnings.push({
27393                     id: 'tag_suggests_area',
27394                     message: t('validations.tag_suggests_area', { tag: suggestion }),
27395                     entity: change
27396                 });
27397             }
27398         }
27399
27400         return warnings;
27401     };
27402
27403
27404     return validation;
27405 }
27406
27407
27408
27409 var Validations = Object.freeze({
27410         validationDeprecatedTag: validationDeprecatedTag,
27411         validationDisconnectedHighway: validationDisconnectedHighway,
27412         validationManyDeletions: validationManyDeletions,
27413         validationMissingTag: validationMissingTag,
27414         validationOldMultipolygon: validationOldMultipolygon,
27415         validationTagSuggestsArea: validationTagSuggestsArea
27416 });
27417
27418 /**
27419  * Performs a deep comparison between two values to determine if they are
27420  * equivalent.
27421  *
27422  * **Note:** This method supports comparing arrays, array buffers, booleans,
27423  * date objects, error objects, maps, numbers, `Object` objects, regexes,
27424  * sets, strings, symbols, and typed arrays. `Object` objects are compared
27425  * by their own, not inherited, enumerable properties. Functions and DOM
27426  * nodes are compared by strict equality, i.e. `===`.
27427  *
27428  * @static
27429  * @memberOf _
27430  * @since 0.1.0
27431  * @category Lang
27432  * @param {*} value The value to compare.
27433  * @param {*} other The other value to compare.
27434  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
27435  * @example
27436  *
27437  * var object = { 'a': 1 };
27438  * var other = { 'a': 1 };
27439  *
27440  * _.isEqual(object, other);
27441  * // => true
27442  *
27443  * object === other;
27444  * // => false
27445  */
27446 function isEqual(value, other) {
27447   return baseIsEqual(value, other);
27448 }
27449
27450 /*
27451     iD.Difference represents the difference between two graphs.
27452     It knows how to calculate the set of entities that were
27453     created, modified, or deleted, and also contains the logic
27454     for recursively extending a difference to the complete set
27455     of entities that will require a redraw, taking into account
27456     child and parent relationships.
27457  */
27458 function coreDifference(base, head) {
27459     var _changes = {};
27460     var _diff = {};
27461     var _length = 0;
27462     var i, k, h, b, keys;
27463
27464     function changed(h, b) {
27465         if (h === b) return false;
27466         if (!h || !b) return true;
27467
27468         if (h.loc || b.loc) {
27469             if (!h.loc && b.loc || h.loc && !b.loc ||
27470                 h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
27471         }
27472         if (h.nodes || b.nodes) {
27473             if (!isEqual(h.nodes, b.nodes)) return true;
27474         }
27475         if (h.members || b.members) {
27476             if (!isEqual(h.members, b.members)) return true;
27477         }
27478         return !isEqual(h.tags, b.tags);
27479     }
27480
27481
27482     keys = Object.keys(head.entities);
27483     for (i = 0; i < keys.length; i++) {
27484         k = keys[i];
27485         h = head.entities[k];
27486         b = base.entities[k];
27487         if (changed(h, b)) {
27488             _changes[k] = {base: b, head: h};
27489             _length++;
27490         }
27491     }
27492
27493     keys = Object.keys(base.entities);
27494     for (i = 0; i < keys.length; i++) {
27495         k = keys[i];
27496         h = head.entities[k];
27497         b = base.entities[k];
27498         if (!_changes[k] && changed(h, b)) {
27499             _changes[k] = {base: b, head: h};
27500             _length++;
27501         }
27502     }
27503
27504
27505     function addParents(parents, result) {
27506         for (var i = 0; i < parents.length; i++) {
27507             var parent = parents[i];
27508
27509             if (parent.id in result)
27510                 continue;
27511
27512             result[parent.id] = parent;
27513             addParents(head.parentRelations(parent), result);
27514         }
27515     }
27516
27517
27518     _diff.length = function length() {
27519         return _length;
27520     };
27521
27522
27523     _diff.changes = function changes() {
27524         return _changes;
27525     };
27526
27527
27528     _diff.extantIDs = function extantIDs() {
27529         var result = [];
27530         forEach(_changes, function(change, id) {
27531             if (change.head) result.push(id);
27532         });
27533         return result;
27534     };
27535
27536
27537     _diff.modified = function modified() {
27538         var result = [];
27539         forEach(_changes, function(change) {
27540             if (change.base && change.head) result.push(change.head);
27541         });
27542         return result;
27543     };
27544
27545
27546     _diff.created = function created() {
27547         var result = [];
27548         forEach(_changes, function(change) {
27549             if (!change.base && change.head) result.push(change.head);
27550         });
27551         return result;
27552     };
27553
27554
27555     _diff.deleted = function deleted() {
27556         var result = [];
27557         forEach(_changes, function(change) {
27558             if (change.base && !change.head) result.push(change.base);
27559         });
27560         return result;
27561     };
27562
27563
27564     _diff.summary = function summary() {
27565         var relevant = {};
27566
27567         function addEntity(entity, graph, changeType) {
27568             relevant[entity.id] = {
27569                 entity: entity,
27570                 graph: graph,
27571                 changeType: changeType
27572             };
27573         }
27574
27575         function addParents(entity) {
27576             var parents = head.parentWays(entity);
27577             for (var j = parents.length - 1; j >= 0; j--) {
27578                 var parent = parents[j];
27579                 if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
27580             }
27581         }
27582
27583         var keys = Object.keys(_changes);
27584         for (var i = 0; i < keys.length; i++) {
27585             var change = _changes[keys[i]];
27586
27587             if (change.head && change.head.geometry(head) !== 'vertex') {
27588                 addEntity(change.head, head, change.base ? 'modified' : 'created');
27589
27590             } else if (change.base && change.base.geometry(base) !== 'vertex') {
27591                 addEntity(change.base, base, 'deleted');
27592
27593             } else if (change.base && change.head) { // modified vertex
27594                 var moved    = !isEqual(change.base.loc,  change.head.loc);
27595                 var retagged = !isEqual(change.base.tags, change.head.tags);
27596
27597                 if (moved) {
27598                     addParents(change.head);
27599                 }
27600
27601                 if (retagged || (moved && change.head.hasInterestingTags())) {
27602                     addEntity(change.head, head, 'modified');
27603                 }
27604
27605             } else if (change.head && change.head.hasInterestingTags()) { // created vertex
27606                 addEntity(change.head, head, 'created');
27607
27608             } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
27609                 addEntity(change.base, base, 'deleted');
27610             }
27611         }
27612
27613         return values$1(relevant);
27614     };
27615
27616
27617     _diff.complete = function complete(extent) {
27618         var result = {};
27619         var id, change;
27620
27621         for (id in _changes) {
27622             change = _changes[id];
27623
27624             var h = change.head;
27625             var b = change.base;
27626             var entity = h || b;
27627
27628             if (extent &&
27629                 (!h || !h.intersects(extent, head)) &&
27630                 (!b || !b.intersects(extent, base)))
27631                 continue;
27632
27633             result[id] = h;
27634
27635             if (entity.type === 'way') {
27636                 var nh = h ? h.nodes : [];
27637                 var nb = b ? b.nodes : [];
27638                 var diff, i;
27639
27640                 diff = difference(nh, nb);
27641                 for (i = 0; i < diff.length; i++) {
27642                     result[diff[i]] = head.hasEntity(diff[i]);
27643                 }
27644
27645                 diff = difference(nb, nh);
27646                 for (i = 0; i < diff.length; i++) {
27647                     result[diff[i]] = head.hasEntity(diff[i]);
27648                 }
27649             }
27650
27651             addParents(head.parentWays(entity), result);
27652             addParents(head.parentRelations(entity), result);
27653         }
27654
27655         return result;
27656     };
27657
27658
27659     return _diff;
27660 }
27661
27662 /** Used for built-in method references. */
27663 var objectProto$18 = Object.prototype;
27664
27665 /** Used to check objects for own properties. */
27666 var hasOwnProperty$15 = objectProto$18.hasOwnProperty;
27667
27668 /**
27669  * Assigns own enumerable string keyed properties of source objects to the
27670  * destination object. Source objects are applied from left to right.
27671  * Subsequent sources overwrite property assignments of previous sources.
27672  *
27673  * **Note:** This method mutates `object` and is loosely based on
27674  * [`Object.assign`](https://mdn.io/Object/assign).
27675  *
27676  * @static
27677  * @memberOf _
27678  * @since 0.10.0
27679  * @category Object
27680  * @param {Object} object The destination object.
27681  * @param {...Object} [sources] The source objects.
27682  * @returns {Object} Returns `object`.
27683  * @see _.assignIn
27684  * @example
27685  *
27686  * function Foo() {
27687  *   this.a = 1;
27688  * }
27689  *
27690  * function Bar() {
27691  *   this.c = 3;
27692  * }
27693  *
27694  * Foo.prototype.b = 2;
27695  * Bar.prototype.d = 4;
27696  *
27697  * _.assign({ 'a': 0 }, new Foo, new Bar);
27698  * // => { 'a': 1, 'c': 3 }
27699  */
27700 var assign = createAssigner(function(object, source) {
27701   if (isPrototype(source) || isArrayLike(source)) {
27702     copyObject(source, keys$1(source), object);
27703     return;
27704   }
27705   for (var key in source) {
27706     if (hasOwnProperty$15.call(source, key)) {
27707       assignValue(object, key, source[key]);
27708     }
27709   }
27710 });
27711
27712 /* Built-in method references for those with the same name as other `lodash` methods. */
27713 var nativeMax$3 = Math.max;
27714
27715 /**
27716  * Checks if `value` is in `collection`. If `collection` is a string, it's
27717  * checked for a substring of `value`, otherwise
27718  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27719  * is used for equality comparisons. If `fromIndex` is negative, it's used as
27720  * the offset from the end of `collection`.
27721  *
27722  * @static
27723  * @memberOf _
27724  * @since 0.1.0
27725  * @category Collection
27726  * @param {Array|Object|string} collection The collection to inspect.
27727  * @param {*} value The value to search for.
27728  * @param {number} [fromIndex=0] The index to search from.
27729  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
27730  * @returns {boolean} Returns `true` if `value` is found, else `false`.
27731  * @example
27732  *
27733  * _.includes([1, 2, 3], 1);
27734  * // => true
27735  *
27736  * _.includes([1, 2, 3], 1, 2);
27737  * // => false
27738  *
27739  * _.includes({ 'a': 1, 'b': 2 }, 1);
27740  * // => true
27741  *
27742  * _.includes('abcd', 'bc');
27743  * // => true
27744  */
27745 function includes(collection, value, fromIndex, guard) {
27746   collection = isArrayLike(collection) ? collection : values$1(collection);
27747   fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
27748
27749   var length = collection.length;
27750   if (fromIndex < 0) {
27751     fromIndex = nativeMax$3(length + fromIndex, 0);
27752   }
27753   return isString(collection)
27754     ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
27755     : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
27756 }
27757
27758 function coreGraph$$1(other, mutable) {
27759     if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
27760
27761     if (other instanceof coreGraph$$1) {
27762         var base = other.base();
27763         this.entities = assign(Object.create(base.entities), other.entities);
27764         this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
27765         this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
27766
27767     } else {
27768         this.entities = Object.create({});
27769         this._parentWays = Object.create({});
27770         this._parentRels = Object.create({});
27771         this.rebase(other || [], [this]);
27772     }
27773
27774     this.transients = {};
27775     this._childNodes = {};
27776     this.frozen = !mutable;
27777 }
27778
27779
27780 coreGraph$$1.prototype = {
27781
27782     hasEntity: function(id) {
27783         return this.entities[id];
27784     },
27785
27786
27787     entity: function(id) {
27788         var entity = this.entities[id];
27789
27790         //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
27791         if (!entity) {
27792             entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
27793         }
27794
27795         if (!entity) {
27796             throw new Error('entity ' + id + ' not found');
27797         }
27798         return entity;
27799     },
27800
27801
27802     transient: function(entity, key, fn) {
27803         var id = entity.id,
27804             transients = this.transients[id] ||
27805             (this.transients[id] = {});
27806
27807         if (transients[key] !== undefined) {
27808             return transients[key];
27809         }
27810
27811         transients[key] = fn.call(entity);
27812
27813         return transients[key];
27814     },
27815
27816
27817     parentWays: function(entity) {
27818         var parents = this._parentWays[entity.id],
27819             result = [];
27820
27821         if (parents) {
27822             for (var i = 0; i < parents.length; i++) {
27823                 result.push(this.entity(parents[i]));
27824             }
27825         }
27826         return result;
27827     },
27828
27829
27830     isPoi: function(entity) {
27831         var parentWays = this._parentWays[entity.id];
27832         return !parentWays || parentWays.length === 0;
27833     },
27834
27835
27836     isShared: function(entity) {
27837         var parentWays = this._parentWays[entity.id];
27838         return parentWays && parentWays.length > 1;
27839     },
27840
27841
27842     parentRelations: function(entity) {
27843         var parents = this._parentRels[entity.id],
27844             result = [];
27845
27846         if (parents) {
27847             for (var i = 0; i < parents.length; i++) {
27848                 result.push(this.entity(parents[i]));
27849             }
27850         }
27851         return result;
27852     },
27853
27854
27855     childNodes: function(entity) {
27856         if (this._childNodes[entity.id]) return this._childNodes[entity.id];
27857         if (!entity.nodes) return [];
27858
27859         var nodes = [];
27860         for (var i = 0; i < entity.nodes.length; i++) {
27861             nodes[i] = this.entity(entity.nodes[i]);
27862         }
27863
27864         if (debug) Object.freeze(nodes);
27865
27866         this._childNodes[entity.id] = nodes;
27867         return this._childNodes[entity.id];
27868     },
27869
27870
27871     base: function() {
27872         return {
27873             'entities': utilGetPrototypeOf(this.entities),
27874             'parentWays': utilGetPrototypeOf(this._parentWays),
27875             'parentRels': utilGetPrototypeOf(this._parentRels)
27876         };
27877     },
27878
27879
27880     // Unlike other graph methods, rebase mutates in place. This is because it
27881     // is used only during the history operation that merges newly downloaded
27882     // data into each state. To external consumers, it should appear as if the
27883     // graph always contained the newly downloaded data.
27884     rebase: function(entities, stack, force) {
27885         var base = this.base(),
27886             i, j, k, id;
27887
27888         for (i = 0; i < entities.length; i++) {
27889             var entity = entities[i];
27890
27891             if (!entity.visible || (!force && base.entities[entity.id]))
27892                 continue;
27893
27894             // Merging data into the base graph
27895             base.entities[entity.id] = entity;
27896             this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
27897
27898             // Restore provisionally-deleted nodes that are discovered to have an extant parent
27899             if (entity.type === 'way') {
27900                 for (j = 0; j < entity.nodes.length; j++) {
27901                     id = entity.nodes[j];
27902                     for (k = 1; k < stack.length; k++) {
27903                         var ents = stack[k].entities;
27904                         if (ents.hasOwnProperty(id) && ents[id] === undefined) {
27905                             delete ents[id];
27906                         }
27907                     }
27908                 }
27909             }
27910         }
27911
27912         for (i = 0; i < stack.length; i++) {
27913             stack[i]._updateRebased();
27914         }
27915     },
27916
27917
27918     _updateRebased: function() {
27919         var base = this.base(),
27920             i, k, child, id, keys;
27921
27922         keys = Object.keys(this._parentWays);
27923         for (i = 0; i < keys.length; i++) {
27924             child = keys[i];
27925             if (base.parentWays[child]) {
27926                 for (k = 0; k < base.parentWays[child].length; k++) {
27927                     id = base.parentWays[child][k];
27928                     if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
27929                         this._parentWays[child].push(id);
27930                     }
27931                 }
27932             }
27933         }
27934
27935         keys = Object.keys(this._parentRels);
27936         for (i = 0; i < keys.length; i++) {
27937             child = keys[i];
27938             if (base.parentRels[child]) {
27939                 for (k = 0; k < base.parentRels[child].length; k++) {
27940                     id = base.parentRels[child][k];
27941                     if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
27942                         this._parentRels[child].push(id);
27943                     }
27944                 }
27945             }
27946         }
27947
27948         this.transients = {};
27949
27950         // this._childNodes is not updated, under the assumption that
27951         // ways are always downloaded with their child nodes.
27952     },
27953
27954
27955     // Updates calculated properties (parentWays, parentRels) for the specified change
27956     _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
27957
27958         parentWays = parentWays || this._parentWays;
27959         parentRels = parentRels || this._parentRels;
27960
27961         var type = entity && entity.type || oldentity && oldentity.type,
27962             removed, added, ways, rels, i;
27963
27964
27965         if (type === 'way') {
27966
27967             // Update parentWays
27968             if (oldentity && entity) {
27969                 removed = difference(oldentity.nodes, entity.nodes);
27970                 added = difference(entity.nodes, oldentity.nodes);
27971             } else if (oldentity) {
27972                 removed = oldentity.nodes;
27973                 added = [];
27974             } else if (entity) {
27975                 removed = [];
27976                 added = entity.nodes;
27977             }
27978             for (i = 0; i < removed.length; i++) {
27979                 parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
27980             }
27981             for (i = 0; i < added.length; i++) {
27982                 ways = without(parentWays[added[i]], entity.id);
27983                 ways.push(entity.id);
27984                 parentWays[added[i]] = ways;
27985             }
27986
27987         } else if (type === 'relation') {
27988
27989             // Update parentRels
27990             if (oldentity && entity) {
27991                 removed = difference(oldentity.members, entity.members);
27992                 added = difference(entity.members, oldentity);
27993             } else if (oldentity) {
27994                 removed = oldentity.members;
27995                 added = [];
27996             } else if (entity) {
27997                 removed = [];
27998                 added = entity.members;
27999             }
28000             for (i = 0; i < removed.length; i++) {
28001                 parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28002             }
28003             for (i = 0; i < added.length; i++) {
28004                 rels = without(parentRels[added[i].id], entity.id);
28005                 rels.push(entity.id);
28006                 parentRels[added[i].id] = rels;
28007             }
28008         }
28009     },
28010
28011
28012     replace: function(entity) {
28013         if (this.entities[entity.id] === entity)
28014             return this;
28015
28016         return this.update(function() {
28017             this._updateCalculated(this.entities[entity.id], entity);
28018             this.entities[entity.id] = entity;
28019         });
28020     },
28021
28022
28023     remove: function(entity) {
28024         return this.update(function() {
28025             this._updateCalculated(entity, undefined);
28026             this.entities[entity.id] = undefined;
28027         });
28028     },
28029
28030
28031     revert: function(id) {
28032         var baseEntity = this.base().entities[id],
28033             headEntity = this.entities[id];
28034
28035         if (headEntity === baseEntity)
28036             return this;
28037
28038         return this.update(function() {
28039             this._updateCalculated(headEntity, baseEntity);
28040             delete this.entities[id];
28041         });
28042     },
28043
28044
28045     update: function() {
28046         var graph = this.frozen ? coreGraph$$1(this, true) : this;
28047
28048         for (var i = 0; i < arguments.length; i++) {
28049             arguments[i].call(graph, graph);
28050         }
28051
28052         if (this.frozen) graph.frozen = true;
28053
28054         return graph;
28055     },
28056
28057
28058     // Obliterates any existing entities
28059     load: function(entities) {
28060         var base = this.base();
28061         this.entities = Object.create(base.entities);
28062
28063         for (var i in entities) {
28064             this.entities[i] = entities[i];
28065             this._updateCalculated(base.entities[i], this.entities[i]);
28066         }
28067
28068         return this;
28069     }
28070 };
28071
28072 var quickselect_1 = quickselect;
28073 var default_1 = quickselect;
28074
28075 function quickselect(arr, k, left, right, compare) {
28076     quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
28077 }
28078 function quickselectStep(arr, k, left, right, compare) {
28079
28080     while (right > left) {
28081         if (right - left > 600) {
28082             var n = right - left + 1;
28083             var m = k - left + 1;
28084             var z = Math.log(n);
28085             var s = 0.5 * Math.exp(2 * z / 3);
28086             var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
28087             var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
28088             var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
28089             quickselectStep(arr, k, newLeft, newRight, compare);
28090         }
28091
28092         var t = arr[k];
28093         var i = left;
28094         var j = right;
28095
28096         swap(arr, left, k);
28097         if (compare(arr[right], t) > 0) swap(arr, left, right);
28098
28099         while (i < j) {
28100             swap(arr, i, j);
28101             i++;
28102             j--;
28103             while (compare(arr[i], t) < 0) i++;
28104             while (compare(arr[j], t) > 0) j--;
28105         }
28106
28107         if (compare(arr[left], t) === 0) swap(arr, left, j);
28108         else {
28109             j++;
28110             swap(arr, j, right);
28111         }
28112
28113         if (j <= k) left = j + 1;
28114         if (k <= j) right = j - 1;
28115     }
28116 }
28117
28118 function swap(arr, i, j) {
28119     var tmp = arr[i];
28120     arr[i] = arr[j];
28121     arr[j] = tmp;
28122 }
28123
28124 function defaultCompare(a, b) {
28125     return a < b ? -1 : a > b ? 1 : 0;
28126 }
28127 quickselect_1.default = default_1;
28128
28129 var rbush_1 = rbush;
28130 var default_1$1 = rbush;
28131
28132
28133
28134 function rbush(maxEntries, format) {
28135     if (!(this instanceof rbush)) return new rbush(maxEntries, format);
28136
28137     // max entries in a node is 9 by default; min node fill is 40% for best performance
28138     this._maxEntries = Math.max(4, maxEntries || 9);
28139     this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
28140
28141     if (format) {
28142         this._initFormat(format);
28143     }
28144
28145     this.clear();
28146 }
28147
28148 rbush.prototype = {
28149
28150     all: function () {
28151         return this._all(this.data, []);
28152     },
28153
28154     search: function (bbox) {
28155
28156         var node = this.data,
28157             result = [],
28158             toBBox = this.toBBox;
28159
28160         if (!intersects$1(bbox, node)) return result;
28161
28162         var nodesToSearch = [],
28163             i, len, child, childBBox;
28164
28165         while (node) {
28166             for (i = 0, len = node.children.length; i < len; i++) {
28167
28168                 child = node.children[i];
28169                 childBBox = node.leaf ? toBBox(child) : child;
28170
28171                 if (intersects$1(bbox, childBBox)) {
28172                     if (node.leaf) result.push(child);
28173                     else if (contains$2(bbox, childBBox)) this._all(child, result);
28174                     else nodesToSearch.push(child);
28175                 }
28176             }
28177             node = nodesToSearch.pop();
28178         }
28179
28180         return result;
28181     },
28182
28183     collides: function (bbox) {
28184
28185         var node = this.data,
28186             toBBox = this.toBBox;
28187
28188         if (!intersects$1(bbox, node)) return false;
28189
28190         var nodesToSearch = [],
28191             i, len, child, childBBox;
28192
28193         while (node) {
28194             for (i = 0, len = node.children.length; i < len; i++) {
28195
28196                 child = node.children[i];
28197                 childBBox = node.leaf ? toBBox(child) : child;
28198
28199                 if (intersects$1(bbox, childBBox)) {
28200                     if (node.leaf || contains$2(bbox, childBBox)) return true;
28201                     nodesToSearch.push(child);
28202                 }
28203             }
28204             node = nodesToSearch.pop();
28205         }
28206
28207         return false;
28208     },
28209
28210     load: function (data) {
28211         if (!(data && data.length)) return this;
28212
28213         if (data.length < this._minEntries) {
28214             for (var i = 0, len = data.length; i < len; i++) {
28215                 this.insert(data[i]);
28216             }
28217             return this;
28218         }
28219
28220         // recursively build the tree with the given data from scratch using OMT algorithm
28221         var node = this._build(data.slice(), 0, data.length - 1, 0);
28222
28223         if (!this.data.children.length) {
28224             // save as is if tree is empty
28225             this.data = node;
28226
28227         } else if (this.data.height === node.height) {
28228             // split root if trees have the same height
28229             this._splitRoot(this.data, node);
28230
28231         } else {
28232             if (this.data.height < node.height) {
28233                 // swap trees if inserted one is bigger
28234                 var tmpNode = this.data;
28235                 this.data = node;
28236                 node = tmpNode;
28237             }
28238
28239             // insert the small tree into the large tree at appropriate level
28240             this._insert(node, this.data.height - node.height - 1, true);
28241         }
28242
28243         return this;
28244     },
28245
28246     insert: function (item) {
28247         if (item) this._insert(item, this.data.height - 1);
28248         return this;
28249     },
28250
28251     clear: function () {
28252         this.data = createNode([]);
28253         return this;
28254     },
28255
28256     remove: function (item, equalsFn) {
28257         if (!item) return this;
28258
28259         var node = this.data,
28260             bbox = this.toBBox(item),
28261             path = [],
28262             indexes = [],
28263             i, parent, index, goingUp;
28264
28265         // depth-first iterative tree traversal
28266         while (node || path.length) {
28267
28268             if (!node) { // go up
28269                 node = path.pop();
28270                 parent = path[path.length - 1];
28271                 i = indexes.pop();
28272                 goingUp = true;
28273             }
28274
28275             if (node.leaf) { // check current node
28276                 index = findItem(item, node.children, equalsFn);
28277
28278                 if (index !== -1) {
28279                     // item found, remove the item and condense tree upwards
28280                     node.children.splice(index, 1);
28281                     path.push(node);
28282                     this._condense(path);
28283                     return this;
28284                 }
28285             }
28286
28287             if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
28288                 path.push(node);
28289                 indexes.push(i);
28290                 i = 0;
28291                 parent = node;
28292                 node = node.children[0];
28293
28294             } else if (parent) { // go right
28295                 i++;
28296                 node = parent.children[i];
28297                 goingUp = false;
28298
28299             } else node = null; // nothing found
28300         }
28301
28302         return this;
28303     },
28304
28305     toBBox: function (item) { return item; },
28306
28307     compareMinX: compareNodeMinX,
28308     compareMinY: compareNodeMinY,
28309
28310     toJSON: function () { return this.data; },
28311
28312     fromJSON: function (data) {
28313         this.data = data;
28314         return this;
28315     },
28316
28317     _all: function (node, result) {
28318         var nodesToSearch = [];
28319         while (node) {
28320             if (node.leaf) result.push.apply(result, node.children);
28321             else nodesToSearch.push.apply(nodesToSearch, node.children);
28322
28323             node = nodesToSearch.pop();
28324         }
28325         return result;
28326     },
28327
28328     _build: function (items, left, right, height) {
28329
28330         var N = right - left + 1,
28331             M = this._maxEntries,
28332             node;
28333
28334         if (N <= M) {
28335             // reached leaf level; return leaf
28336             node = createNode(items.slice(left, right + 1));
28337             calcBBox(node, this.toBBox);
28338             return node;
28339         }
28340
28341         if (!height) {
28342             // target height of the bulk-loaded tree
28343             height = Math.ceil(Math.log(N) / Math.log(M));
28344
28345             // target number of root entries to maximize storage utilization
28346             M = Math.ceil(N / Math.pow(M, height - 1));
28347         }
28348
28349         node = createNode([]);
28350         node.leaf = false;
28351         node.height = height;
28352
28353         // split the items into M mostly square tiles
28354
28355         var N2 = Math.ceil(N / M),
28356             N1 = N2 * Math.ceil(Math.sqrt(M)),
28357             i, j, right2, right3;
28358
28359         multiSelect(items, left, right, N1, this.compareMinX);
28360
28361         for (i = left; i <= right; i += N1) {
28362
28363             right2 = Math.min(i + N1 - 1, right);
28364
28365             multiSelect(items, i, right2, N2, this.compareMinY);
28366
28367             for (j = i; j <= right2; j += N2) {
28368
28369                 right3 = Math.min(j + N2 - 1, right2);
28370
28371                 // pack each entry recursively
28372                 node.children.push(this._build(items, j, right3, height - 1));
28373             }
28374         }
28375
28376         calcBBox(node, this.toBBox);
28377
28378         return node;
28379     },
28380
28381     _chooseSubtree: function (bbox, node, level, path) {
28382
28383         var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
28384
28385         while (true) {
28386             path.push(node);
28387
28388             if (node.leaf || path.length - 1 === level) break;
28389
28390             minArea = minEnlargement = Infinity;
28391
28392             for (i = 0, len = node.children.length; i < len; i++) {
28393                 child = node.children[i];
28394                 area = bboxArea(child);
28395                 enlargement = enlargedArea(bbox, child) - area;
28396
28397                 // choose entry with the least area enlargement
28398                 if (enlargement < minEnlargement) {
28399                     minEnlargement = enlargement;
28400                     minArea = area < minArea ? area : minArea;
28401                     targetNode = child;
28402
28403                 } else if (enlargement === minEnlargement) {
28404                     // otherwise choose one with the smallest area
28405                     if (area < minArea) {
28406                         minArea = area;
28407                         targetNode = child;
28408                     }
28409                 }
28410             }
28411
28412             node = targetNode || node.children[0];
28413         }
28414
28415         return node;
28416     },
28417
28418     _insert: function (item, level, isNode) {
28419
28420         var toBBox = this.toBBox,
28421             bbox = isNode ? item : toBBox(item),
28422             insertPath = [];
28423
28424         // find the best node for accommodating the item, saving all nodes along the path too
28425         var node = this._chooseSubtree(bbox, this.data, level, insertPath);
28426
28427         // put the item into the node
28428         node.children.push(item);
28429         extend$1(node, bbox);
28430
28431         // split on node overflow; propagate upwards if necessary
28432         while (level >= 0) {
28433             if (insertPath[level].children.length > this._maxEntries) {
28434                 this._split(insertPath, level);
28435                 level--;
28436             } else break;
28437         }
28438
28439         // adjust bboxes along the insertion path
28440         this._adjustParentBBoxes(bbox, insertPath, level);
28441     },
28442
28443     // split overflowed node into two
28444     _split: function (insertPath, level) {
28445
28446         var node = insertPath[level],
28447             M = node.children.length,
28448             m = this._minEntries;
28449
28450         this._chooseSplitAxis(node, m, M);
28451
28452         var splitIndex = this._chooseSplitIndex(node, m, M);
28453
28454         var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
28455         newNode.height = node.height;
28456         newNode.leaf = node.leaf;
28457
28458         calcBBox(node, this.toBBox);
28459         calcBBox(newNode, this.toBBox);
28460
28461         if (level) insertPath[level - 1].children.push(newNode);
28462         else this._splitRoot(node, newNode);
28463     },
28464
28465     _splitRoot: function (node, newNode) {
28466         // split root node
28467         this.data = createNode([node, newNode]);
28468         this.data.height = node.height + 1;
28469         this.data.leaf = false;
28470         calcBBox(this.data, this.toBBox);
28471     },
28472
28473     _chooseSplitIndex: function (node, m, M) {
28474
28475         var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
28476
28477         minOverlap = minArea = Infinity;
28478
28479         for (i = m; i <= M - m; i++) {
28480             bbox1 = distBBox(node, 0, i, this.toBBox);
28481             bbox2 = distBBox(node, i, M, this.toBBox);
28482
28483             overlap = intersectionArea(bbox1, bbox2);
28484             area = bboxArea(bbox1) + bboxArea(bbox2);
28485
28486             // choose distribution with minimum overlap
28487             if (overlap < minOverlap) {
28488                 minOverlap = overlap;
28489                 index = i;
28490
28491                 minArea = area < minArea ? area : minArea;
28492
28493             } else if (overlap === minOverlap) {
28494                 // otherwise choose distribution with minimum area
28495                 if (area < minArea) {
28496                     minArea = area;
28497                     index = i;
28498                 }
28499             }
28500         }
28501
28502         return index;
28503     },
28504
28505     // sorts node children by the best axis for split
28506     _chooseSplitAxis: function (node, m, M) {
28507
28508         var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
28509             compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
28510             xMargin = this._allDistMargin(node, m, M, compareMinX),
28511             yMargin = this._allDistMargin(node, m, M, compareMinY);
28512
28513         // if total distributions margin value is minimal for x, sort by minX,
28514         // otherwise it's already sorted by minY
28515         if (xMargin < yMargin) node.children.sort(compareMinX);
28516     },
28517
28518     // total margin of all possible split distributions where each node is at least m full
28519     _allDistMargin: function (node, m, M, compare) {
28520
28521         node.children.sort(compare);
28522
28523         var toBBox = this.toBBox,
28524             leftBBox = distBBox(node, 0, m, toBBox),
28525             rightBBox = distBBox(node, M - m, M, toBBox),
28526             margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
28527             i, child;
28528
28529         for (i = m; i < M - m; i++) {
28530             child = node.children[i];
28531             extend$1(leftBBox, node.leaf ? toBBox(child) : child);
28532             margin += bboxMargin(leftBBox);
28533         }
28534
28535         for (i = M - m - 1; i >= m; i--) {
28536             child = node.children[i];
28537             extend$1(rightBBox, node.leaf ? toBBox(child) : child);
28538             margin += bboxMargin(rightBBox);
28539         }
28540
28541         return margin;
28542     },
28543
28544     _adjustParentBBoxes: function (bbox, path, level) {
28545         // adjust bboxes along the given tree path
28546         for (var i = level; i >= 0; i--) {
28547             extend$1(path[i], bbox);
28548         }
28549     },
28550
28551     _condense: function (path) {
28552         // go through the path, removing empty nodes and updating bboxes
28553         for (var i = path.length - 1, siblings; i >= 0; i--) {
28554             if (path[i].children.length === 0) {
28555                 if (i > 0) {
28556                     siblings = path[i - 1].children;
28557                     siblings.splice(siblings.indexOf(path[i]), 1);
28558
28559                 } else this.clear();
28560
28561             } else calcBBox(path[i], this.toBBox);
28562         }
28563     },
28564
28565     _initFormat: function (format) {
28566         // data format (minX, minY, maxX, maxY accessors)
28567
28568         // uses eval-type function compilation instead of just accepting a toBBox function
28569         // because the algorithms are very sensitive to sorting functions performance,
28570         // so they should be dead simple and without inner calls
28571
28572         var compareArr = ['return a', ' - b', ';'];
28573
28574         this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
28575         this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
28576
28577         this.toBBox = new Function('a',
28578             'return {minX: a' + format[0] +
28579             ', minY: a' + format[1] +
28580             ', maxX: a' + format[2] +
28581             ', maxY: a' + format[3] + '};');
28582     }
28583 };
28584
28585 function findItem(item, items, equalsFn) {
28586     if (!equalsFn) return items.indexOf(item);
28587
28588     for (var i = 0; i < items.length; i++) {
28589         if (equalsFn(item, items[i])) return i;
28590     }
28591     return -1;
28592 }
28593
28594 // calculate node's bbox from bboxes of its children
28595 function calcBBox(node, toBBox) {
28596     distBBox(node, 0, node.children.length, toBBox, node);
28597 }
28598
28599 // min bounding rectangle of node children from k to p-1
28600 function distBBox(node, k, p, toBBox, destNode) {
28601     if (!destNode) destNode = createNode(null);
28602     destNode.minX = Infinity;
28603     destNode.minY = Infinity;
28604     destNode.maxX = -Infinity;
28605     destNode.maxY = -Infinity;
28606
28607     for (var i = k, child; i < p; i++) {
28608         child = node.children[i];
28609         extend$1(destNode, node.leaf ? toBBox(child) : child);
28610     }
28611
28612     return destNode;
28613 }
28614
28615 function extend$1(a, b) {
28616     a.minX = Math.min(a.minX, b.minX);
28617     a.minY = Math.min(a.minY, b.minY);
28618     a.maxX = Math.max(a.maxX, b.maxX);
28619     a.maxY = Math.max(a.maxY, b.maxY);
28620     return a;
28621 }
28622
28623 function compareNodeMinX(a, b) { return a.minX - b.minX; }
28624 function compareNodeMinY(a, b) { return a.minY - b.minY; }
28625
28626 function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
28627 function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
28628
28629 function enlargedArea(a, b) {
28630     return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
28631            (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
28632 }
28633
28634 function intersectionArea(a, b) {
28635     var minX = Math.max(a.minX, b.minX),
28636         minY = Math.max(a.minY, b.minY),
28637         maxX = Math.min(a.maxX, b.maxX),
28638         maxY = Math.min(a.maxY, b.maxY);
28639
28640     return Math.max(0, maxX - minX) *
28641            Math.max(0, maxY - minY);
28642 }
28643
28644 function contains$2(a, b) {
28645     return a.minX <= b.minX &&
28646            a.minY <= b.minY &&
28647            b.maxX <= a.maxX &&
28648            b.maxY <= a.maxY;
28649 }
28650
28651 function intersects$1(a, b) {
28652     return b.minX <= a.maxX &&
28653            b.minY <= a.maxY &&
28654            b.maxX >= a.minX &&
28655            b.maxY >= a.minY;
28656 }
28657
28658 function createNode(children) {
28659     return {
28660         children: children,
28661         height: 1,
28662         leaf: true,
28663         minX: Infinity,
28664         minY: Infinity,
28665         maxX: -Infinity,
28666         maxY: -Infinity
28667     };
28668 }
28669
28670 // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
28671 // combines selection algorithm with binary divide & conquer approach
28672
28673 function multiSelect(arr, left, right, n, compare) {
28674     var stack = [left, right],
28675         mid;
28676
28677     while (stack.length) {
28678         right = stack.pop();
28679         left = stack.pop();
28680
28681         if (right - left <= n) continue;
28682
28683         mid = left + Math.ceil((right - left) / n / 2) * n;
28684         quickselect_1(arr, mid, left, right, compare);
28685
28686         stack.push(left, mid, mid, right);
28687     }
28688 }
28689 rbush_1.default = default_1$1;
28690
28691 function coreTree(head) {
28692     var rtree = rbush_1(),
28693         bboxes = {},
28694         tree = {};
28695
28696
28697     function entityBBox(entity) {
28698         var bbox = entity.extent(head).bbox();
28699         bbox.id = entity.id;
28700         bboxes[entity.id] = bbox;
28701         return bbox;
28702     }
28703
28704
28705     function updateParents(entity, insertions, memo) {
28706         head.parentWays(entity).forEach(function(way) {
28707             if (bboxes[way.id]) {
28708                 rtree.remove(bboxes[way.id]);
28709                 insertions[way.id] = way;
28710             }
28711             updateParents(way, insertions, memo);
28712         });
28713
28714         head.parentRelations(entity).forEach(function(relation) {
28715             if (memo[entity.id]) return;
28716             memo[entity.id] = true;
28717             if (bboxes[relation.id]) {
28718                 rtree.remove(bboxes[relation.id]);
28719                 insertions[relation.id] = relation;
28720             }
28721             updateParents(relation, insertions, memo);
28722         });
28723     }
28724
28725
28726     tree.rebase = function(entities, force) {
28727         var insertions = {};
28728
28729         for (var i = 0; i < entities.length; i++) {
28730             var entity = entities[i];
28731
28732             if (!entity.visible)
28733                 continue;
28734
28735             if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
28736                 if (!force) {
28737                     continue;
28738                 } else if (bboxes[entity.id]) {
28739                     rtree.remove(bboxes[entity.id]);
28740                 }
28741             }
28742
28743             insertions[entity.id] = entity;
28744             updateParents(entity, insertions, {});
28745         }
28746
28747         rtree.load(map$3(insertions, entityBBox));
28748
28749         return tree;
28750     };
28751
28752
28753     tree.intersects = function(extent, graph) {
28754         if (graph !== head) {
28755             var diff = coreDifference(head, graph),
28756                 insertions = {};
28757
28758             head = graph;
28759
28760             diff.deleted().forEach(function(entity) {
28761                 rtree.remove(bboxes[entity.id]);
28762                 delete bboxes[entity.id];
28763             });
28764
28765             diff.modified().forEach(function(entity) {
28766                 rtree.remove(bboxes[entity.id]);
28767                 insertions[entity.id] = entity;
28768                 updateParents(entity, insertions, {});
28769             });
28770
28771             diff.created().forEach(function(entity) {
28772                 insertions[entity.id] = entity;
28773             });
28774
28775             rtree.load(map$3(insertions, entityBBox));
28776         }
28777
28778         return rtree.search(extent.bbox()).map(function(bbox) {
28779             return head.entity(bbox.id);
28780         });
28781     };
28782
28783
28784     return tree;
28785 }
28786
28787 /*
28788  * This code is licensed under the MIT license.
28789  *
28790  * Copyright © 2013, iD authors.
28791  *
28792  * Portions copyright © 2011, Keith Cirkel
28793  * See https://github.com/keithamus/jwerty
28794  *
28795  */
28796 function d3keybinding(namespace$$1) {
28797     var bindings = [];
28798
28799
28800     function testBindings(isCapturing) {
28801         var didMatch = false,
28802             i, binding;
28803
28804         // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
28805         // so we don't strictly match on the shift key, but we prioritize
28806         // shifted bindings first, and fallback to unshifted only if no match.
28807         // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
28808
28809         // priority match shifted bindings first
28810         for (i = 0; i < bindings.length; i++) {
28811             binding = bindings[i];
28812             if (!binding.event.modifiers.shiftKey) continue;  // no shift
28813             if (!!binding.capture !== isCapturing) continue;
28814             if (matches(binding, true)) {
28815                 binding.callback();
28816                 didMatch = true;
28817             }
28818         }
28819
28820         // then unshifted bindings
28821         if (didMatch) return;
28822         for (i = 0; i < bindings.length; i++) {
28823             binding = bindings[i];
28824             if (binding.event.modifiers.shiftKey) continue;   // shift
28825             if (!!binding.capture !== isCapturing) continue;
28826             if (matches(binding, false)) {
28827                 binding.callback();
28828             }
28829         }
28830
28831
28832         function matches(binding, testShift) {
28833             var event$$1 = event;
28834             var isMatch = false;
28835             var tryKeyCode = true;
28836
28837             // Prefer a match on `KeyboardEvent.key`
28838             if (event$$1.key !== undefined) {
28839                 tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
28840                 isMatch = true;
28841
28842                 if (binding.event.key === undefined) {
28843                     isMatch = false;
28844                 } else if (Array.isArray(binding.event.key)) {
28845                     if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
28846                         isMatch = false;
28847                 } else {
28848                     if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
28849                         isMatch = false;
28850                 }
28851             }
28852
28853             // Fallback match on `KeyboardEvent.keyCode`, can happen if:
28854             // - browser doesn't support `KeyboardEvent.key`
28855             // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
28856             if (!isMatch && tryKeyCode) {
28857                 isMatch = (event$$1.keyCode === binding.event.keyCode);
28858             }
28859
28860             if (!isMatch) return false;
28861
28862             // test modifier keys
28863             if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
28864                 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
28865                 if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
28866             }
28867             if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
28868             if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
28869
28870             return true;
28871         }
28872     }
28873
28874
28875     function capture() {
28876         testBindings(true);
28877     }
28878
28879
28880     function bubble() {
28881         var tagName = d3_select(event.target).node().tagName;
28882         if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
28883             return;
28884         }
28885         testBindings(false);
28886     }
28887
28888
28889     function keybinding(selection$$1) {
28890         selection$$1 = selection$$1 || d3_select(document);
28891         selection$$1.on('keydown.capture' + namespace$$1, capture, true);
28892         selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
28893         return keybinding;
28894     }
28895
28896
28897     keybinding.off = function(selection$$1) {
28898         bindings = [];
28899         selection$$1 = selection$$1 || d3_select(document);
28900         selection$$1.on('keydown.capture' + namespace$$1, null);
28901         selection$$1.on('keydown.bubble' + namespace$$1, null);
28902         return keybinding;
28903     };
28904
28905
28906     keybinding.on = function(codes, callback, capture) {
28907         var arr = [].concat(codes);
28908         for (var i = 0; i < arr.length; i++) {
28909             var code = arr[i];
28910             var binding = {
28911                 event: {
28912                     key: undefined,  // preferred
28913                     keyCode: 0,      // fallback
28914                     modifiers: {
28915                         shiftKey: false,
28916                         ctrlKey: false,
28917                         altKey: false,
28918                         metaKey: false
28919                     }
28920                 },
28921                 capture: capture,
28922                 callback: callback
28923             };
28924
28925             code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
28926
28927             for (var j = 0; j < code.length; j++) {
28928                 // Normalise matching errors
28929                 if (code[j] === '++') code[j] = '+';
28930
28931                 if (code[j] in d3keybinding.modifierCodes) {
28932                     binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
28933                 } else {
28934                     binding.event.key = d3keybinding.keys[code[j]] || code[j];
28935                     if (code[j] in d3keybinding.keyCodes) {
28936                         binding.event.keyCode = d3keybinding.keyCodes[code[j]];
28937                     }
28938                 }
28939             }
28940
28941             bindings.push(binding);
28942         }
28943
28944         return keybinding;
28945     };
28946
28947     return keybinding;
28948 }
28949
28950
28951 d3keybinding.modifierCodes = {
28952     // Shift key, ⇧
28953     '⇧': 16, shift: 16,
28954     // CTRL key, on Mac: ⌃
28955     '⌃': 17, ctrl: 17,
28956     // ALT key, on Mac: ⌥ (Alt)
28957     '⌥': 18, alt: 18, option: 18,
28958     // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
28959     '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
28960 };
28961
28962 d3keybinding.modifierProperties = {
28963     16: 'shiftKey',
28964     17: 'ctrlKey',
28965     18: 'altKey',
28966     91: 'metaKey'
28967 };
28968
28969 d3keybinding.keys = {
28970     // Backspace key, on Mac: ⌫ (Backspace)
28971     '⌫': 'Backspace', backspace: 'Backspace',
28972     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28973     '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
28974     // Return key, ↩
28975     '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
28976     // Pause/Break key
28977     'pause': 'Pause', 'pause-break': 'Pause',
28978     // Caps Lock key, ⇪
28979     '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
28980     // Escape key, on Mac: ⎋, on Windows: Esc
28981     '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
28982     // Space key
28983     space: [' ', 'Spacebar'],
28984     // Page-Up key, or pgup, on Mac: ↖
28985     '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
28986     // Page-Down key, or pgdown, on Mac: ↘
28987     '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
28988     // END key, on Mac: ⇟
28989     '⇟': 'End', end: 'End',
28990     // HOME key, on Mac: ⇞
28991     '⇞': 'Home', home: 'Home',
28992     // Insert key, or ins
28993     ins: 'Insert', insert: 'Insert',
28994     // Delete key, on Mac: ⌦ (Delete)
28995     '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
28996     // Left Arrow Key, or ←
28997     '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
28998     // Up Arrow Key, or ↑
28999     '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29000     // Right Arrow Key, or →
29001     '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29002     // Up Arrow Key, or ↓
29003     '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29004     // odities, stuff for backward compatibility (browsers and code):
29005     // Num-Multiply, or *
29006     '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29007     // Num-Plus or +
29008     '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29009     // Num-Subtract, or -
29010     '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29011     // Semicolon
29012     semicolon: ';',
29013     // = or equals
29014     equals: '=',
29015     // Comma, or ,
29016     comma: ',',
29017     // Period, or ., or full-stop
29018     period: '.', 'full-stop': '.',
29019     // Slash, or /, or forward-slash
29020     slash: '/', 'forward-slash': '/',
29021     // Tick, or `, or back-quote
29022     tick: '`', 'back-quote': '`',
29023     // Open bracket, or [
29024     'open-bracket': '[',
29025     // Back slash, or \
29026     'back-slash': '\\',
29027     // Close backet, or ]
29028     'close-bracket': ']',
29029     // Apostrophe, or Quote, or '
29030     quote: '\'', apostrophe: '\'',
29031     // NUMPAD 0-9
29032     'num-0': '0',
29033     'num-1': '1',
29034     'num-2': '2',
29035     'num-3': '3',
29036     'num-4': '4',
29037     'num-5': '5',
29038     'num-6': '6',
29039     'num-7': '7',
29040     'num-8': '8',
29041     'num-9': '9',
29042     // F1-F25
29043     f1: 'F1',
29044     f2: 'F2',
29045     f3: 'F3',
29046     f4: 'F4',
29047     f5: 'F5',
29048     f6: 'F6',
29049     f7: 'F7',
29050     f8: 'F8',
29051     f9: 'F9',
29052     f10: 'F10',
29053     f11: 'F11',
29054     f12: 'F12',
29055     f13: 'F13',
29056     f14: 'F14',
29057     f15: 'F15',
29058     f16: 'F16',
29059     f17: 'F17',
29060     f18: 'F18',
29061     f19: 'F19',
29062     f20: 'F20',
29063     f21: 'F21',
29064     f22: 'F22',
29065     f23: 'F23',
29066     f24: 'F24',
29067     f25: 'F25'
29068 };
29069
29070 d3keybinding.keyCodes = {
29071     // Backspace key, on Mac: ⌫ (Backspace)
29072     '⌫': 8, backspace: 8,
29073     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29074     '⇥': 9, '⇆': 9, tab: 9,
29075     // Return key, ↩
29076     '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29077     // Pause/Break key
29078     'pause': 19, 'pause-break': 19,
29079     // Caps Lock key, ⇪
29080     '⇪': 20, caps: 20, 'caps-lock': 20,
29081     // Escape key, on Mac: ⎋, on Windows: Esc
29082     '⎋': 27, escape: 27, esc: 27,
29083     // Space key
29084     space: 32,
29085     // Page-Up key, or pgup, on Mac: ↖
29086     '↖': 33, pgup: 33, 'page-up': 33,
29087     // Page-Down key, or pgdown, on Mac: ↘
29088     '↘': 34, pgdown: 34, 'page-down': 34,
29089     // END key, on Mac: ⇟
29090     '⇟': 35, end: 35,
29091     // HOME key, on Mac: ⇞
29092     '⇞': 36, home: 36,
29093     // Insert key, or ins
29094     ins: 45, insert: 45,
29095     // Delete key, on Mac: ⌦ (Delete)
29096     '⌦': 46, del: 46, 'delete': 46,
29097     // Left Arrow Key, or ←
29098     '←': 37, left: 37, 'arrow-left': 37,
29099     // Up Arrow Key, or ↑
29100     '↑': 38, up: 38, 'arrow-up': 38,
29101     // Right Arrow Key, or →
29102     '→': 39, right: 39, 'arrow-right': 39,
29103     // Up Arrow Key, or ↓
29104     '↓': 40, down: 40, 'arrow-down': 40,
29105     // odities, printing characters that come out wrong:
29106     // Firefox Equals
29107     'ffequals': 61,
29108     // Num-Multiply, or *
29109     '*': 106, star: 106, asterisk: 106, multiply: 106,
29110     // Num-Plus or +
29111     '+': 107, 'plus': 107,
29112     // Num-Subtract, or -
29113     '-': 109, subtract: 109,
29114     // Firefox Plus
29115     'ffplus': 171,
29116     // Firefox Minus
29117     'ffminus': 173,
29118     // Semicolon
29119     ';': 186, semicolon: 186,
29120     // = or equals
29121     '=': 187, 'equals': 187,
29122     // Comma, or ,
29123     ',': 188, comma: 188,
29124     // Dash / Underscore key
29125     'dash': 189,
29126     // Period, or ., or full-stop
29127     '.': 190, period: 190, 'full-stop': 190,
29128     // Slash, or /, or forward-slash
29129     '/': 191, slash: 191, 'forward-slash': 191,
29130     // Tick, or `, or back-quote
29131     '`': 192, tick: 192, 'back-quote': 192,
29132     // Open bracket, or [
29133     '[': 219, 'open-bracket': 219,
29134     // Back slash, or \
29135     '\\': 220, 'back-slash': 220,
29136     // Close backet, or ]
29137     ']': 221, 'close-bracket': 221,
29138     // Apostrophe, or Quote, or '
29139     '\'': 222, quote: 222, apostrophe: 222
29140 };
29141
29142 // NUMPAD 0-9
29143 var i$1 = 95, n = 0;
29144 while (++i$1 < 106) {
29145     d3keybinding.keyCodes['num-' + n] = i$1;
29146     ++n;
29147 }
29148
29149 // 0-9
29150 i$1 = 47; n = 0;
29151 while (++i$1 < 58) {
29152     d3keybinding.keyCodes[n] = i$1;
29153     ++n;
29154 }
29155
29156 // F1-F25
29157 i$1 = 111; n = 1;
29158 while (++i$1 < 136) {
29159     d3keybinding.keyCodes['f' + n] = i$1;
29160     ++n;
29161 }
29162
29163 // a-z
29164 i$1 = 64;
29165 while (++i$1 < 91) {
29166     d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29167 }
29168
29169 function tooltip() {
29170   var tooltip = function(selection$$1) {
29171       selection$$1.each(setup);
29172     },
29173     animation = utilFunctor(false),
29174     html = utilFunctor(false),
29175     title = function() {
29176       var title = this.getAttribute('data-original-title');
29177       if (title) {
29178         return title;
29179       } else {
29180         title = this.getAttribute('title');
29181         this.removeAttribute('title');
29182         this.setAttribute('data-original-title', title);
29183       }
29184       return title;
29185     },
29186     over = 'mouseenter.tooltip',
29187     out = 'mouseleave.tooltip',
29188     placement = utilFunctor('top');
29189
29190
29191   tooltip.title = function(_) {
29192     if (arguments.length) {
29193       title = utilFunctor(_);
29194       return tooltip;
29195     } else {
29196       return title;
29197     }
29198   };
29199
29200
29201   tooltip.html = function(_) {
29202     if (arguments.length) {
29203       html = utilFunctor(_);
29204       return tooltip;
29205     } else {
29206       return html;
29207     }
29208   };
29209
29210
29211   tooltip.placement = function(_) {
29212     if (arguments.length) {
29213       placement = utilFunctor(_);
29214       return tooltip;
29215     } else {
29216       return placement;
29217     }
29218   };
29219
29220
29221   tooltip.show = function(selection$$1) {
29222     selection$$1.each(show);
29223   };
29224
29225
29226   tooltip.hide = function(selection$$1) {
29227     selection$$1.each(hide);
29228   };
29229
29230
29231   tooltip.toggle = function(selection$$1) {
29232     selection$$1.each(toggle);
29233   };
29234
29235
29236   tooltip.destroy = function(selection$$1) {
29237     selection$$1
29238       .on(over, null)
29239       .on(out, null)
29240       .attr('title', function() {
29241         return this.getAttribute('data-original-title') || this.getAttribute('title');
29242       })
29243       .attr('data-original-title', null)
29244       .selectAll('.tooltip')
29245       .remove();
29246   };
29247
29248
29249   function setup() {
29250     var root = d3_select(this),
29251         animate = animation.apply(this, arguments),
29252         tip = root.selectAll('.tooltip').data([0]);
29253
29254     var enter = tip.enter()
29255       .append('div')
29256       .attr('class', 'tooltip');
29257
29258     enter
29259       .append('div')
29260       .attr('class', 'tooltip-arrow');
29261
29262     enter
29263       .append('div')
29264       .attr('class', 'tooltip-inner');
29265
29266     tip = enter
29267       .merge(tip);
29268
29269     if (animate) {
29270       tip.classed('fade', true);
29271     }
29272
29273     var place = placement.apply(this, arguments);
29274     tip.classed(place, true);
29275
29276     root.on(over, show);
29277     root.on(out, hide);
29278   }
29279
29280
29281   function show() {
29282     var root = d3_select(this),
29283       content = title.apply(this, arguments),
29284       tip = root.selectAll('.tooltip')
29285         .classed('in', true),
29286       markup = html.apply(this, arguments);
29287
29288     tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29289     var place = placement.apply(this, arguments),
29290       outer = getPosition(root.node()),
29291       inner = getPosition(tip.node()),
29292       pos;
29293
29294     switch (place) {
29295       case 'top':
29296         pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29297         break;
29298       case 'right':
29299         pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29300         break;
29301       case 'left':
29302         pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29303         break;
29304       case 'bottom':
29305         pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29306         break;
29307     }
29308
29309     if (pos) {
29310       tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29311     } else {
29312       tip.style('left', null).style('top', null);
29313     }
29314
29315     this.tooltipVisible = true;
29316   }
29317
29318
29319   function hide() {
29320     d3_select(this).selectAll('.tooltip')
29321       .classed('in', false);
29322
29323     this.tooltipVisible = false;
29324   }
29325
29326
29327   function toggle() {
29328     if (this.tooltipVisible) {
29329       hide.apply(this, arguments);
29330     } else {
29331       show.apply(this, arguments);
29332     }
29333   }
29334
29335   return tooltip;
29336 }
29337
29338
29339 function getPosition(node) {
29340   var mode = d3_select(node).style('position');
29341   if (mode === 'absolute' || mode === 'static') {
29342     return {
29343       x: node.offsetLeft,
29344       y: node.offsetTop,
29345       w: node.offsetWidth,
29346       h: node.offsetHeight
29347     };
29348   } else {
29349     return {
29350       x: 0,
29351       y: 0,
29352       w: node.offsetWidth,
29353       h: node.offsetHeight
29354     };
29355   }
29356 }
29357
29358 function behaviorEdit(context) {
29359
29360     function edit() {
29361         context.map()
29362             .minzoom(context.minEditableZoom());
29363     }
29364
29365
29366     edit.off = function() {
29367         context.map()
29368             .minzoom(0);
29369     };
29370
29371
29372     return edit;
29373 }
29374
29375 /*
29376    The hover behavior adds the `.hover` class on mouseover to all elements to which
29377    the identical datum is bound, and removes it on mouseout.
29378
29379    The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29380    representation may consist of several elements scattered throughout the DOM hierarchy.
29381    Only one of these elements can have the :hover pseudo-class, but all of them will
29382    have the .hover class.
29383  */
29384 function behaviorHover(context) {
29385     var dispatch$$1 = dispatch('hover');
29386     var _selection = d3_select(null);
29387     var _newId = null;
29388     var _buttonDown;
29389     var _altDisables;
29390     var _target;
29391
29392
29393     function keydown() {
29394         if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29395             _selection.selectAll('.hover')
29396                 .classed('hover-suppressed', true)
29397                 .classed('hover', false);
29398
29399             _selection
29400                 .classed('hover-disabled', true);
29401
29402             dispatch$$1.call('hover', this, null);
29403         }
29404     }
29405
29406
29407     function keyup() {
29408         if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29409             _selection.selectAll('.hover-suppressed')
29410                 .classed('hover-suppressed', false)
29411                 .classed('hover', true);
29412
29413             _selection
29414                 .classed('hover-disabled', false);
29415
29416             dispatch$$1.call('hover', this, _target ? _target.id : null);
29417         }
29418     }
29419
29420
29421     var hover = function(selection$$1) {
29422         _selection = selection$$1;
29423         _newId = null;
29424
29425         _selection
29426             .on('mouseover.hover', mouseover)
29427             .on('mouseout.hover', mouseout)
29428             .on('mousedown.hover', mousedown);
29429
29430         d3_select(window)
29431             .on('keydown.hover', keydown)
29432             .on('keyup.hover', keyup);
29433
29434
29435         function mouseover() {
29436             if (_buttonDown) return;
29437             var target = event.target;
29438             enter(target ? target.__data__ : null);
29439         }
29440
29441
29442         function mouseout() {
29443             if (_buttonDown) return;
29444             var target = event.relatedTarget;
29445             enter(target ? target.__data__ : null);
29446         }
29447
29448
29449         function mousedown() {
29450             _buttonDown = true;
29451             d3_select(window)
29452                 .on('mouseup.hover', mouseup, true);
29453         }
29454
29455
29456         function mouseup() {
29457             _buttonDown = false;
29458             d3_select(window)
29459                 .on('mouseup.hover', null, true);
29460         }
29461
29462
29463         function enter(datum) {
29464             if (datum === _target) return;
29465             _target = datum;
29466
29467             _selection.selectAll('.hover')
29468                 .classed('hover', false);
29469             _selection.selectAll('.hover-suppressed')
29470                 .classed('hover-suppressed', false);
29471
29472             var entity;
29473             if (datum instanceof osmEntity$$1) {
29474                 entity = datum;
29475             } else {
29476                 entity = datum && datum.properties && datum.properties.entity;
29477             }
29478
29479             if (entity && entity.id !== _newId) {
29480                 // If drawing a way, don't hover on a node that was just placed. #3974
29481                 var mode = context.mode() && context.mode().id;
29482                 if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29483                     _newId = entity.id;
29484                     return;
29485                 }
29486
29487                 var selector$$1 = '.' + entity.id;
29488
29489                 if (entity.type === 'relation') {
29490                     entity.members.forEach(function(member) {
29491                         selector$$1 += ', .' + member.id;
29492                     });
29493                 }
29494
29495                 var suppressed = _altDisables && event && event.altKey;
29496
29497                 _selection.selectAll(selector$$1)
29498                     .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29499
29500                 dispatch$$1.call('hover', this, !suppressed && entity.id);
29501
29502             } else {
29503                 dispatch$$1.call('hover', this, null);
29504             }
29505         }
29506
29507     };
29508
29509
29510     hover.off = function(selection$$1) {
29511         selection$$1.selectAll('.hover')
29512             .classed('hover', false);
29513         selection$$1.selectAll('.hover-suppressed')
29514             .classed('hover-suppressed', false);
29515         selection$$1
29516             .classed('hover-disabled', false);
29517
29518         selection$$1
29519             .on('mouseover.hover', null)
29520             .on('mouseout.hover', null)
29521             .on('mousedown.hover', null);
29522
29523         d3_select(window)
29524             .on('keydown.hover', null)
29525             .on('keyup.hover', null);
29526     };
29527
29528
29529     hover.altDisables = function(_) {
29530         if (!arguments.length) return _altDisables;
29531         _altDisables = _;
29532         return hover;
29533     };
29534
29535
29536     return utilRebind(hover, dispatch$$1, 'on');
29537 }
29538
29539 function refresh(selection, node) {
29540     var cr = node.getBoundingClientRect();
29541     var prop = [cr.width, cr.height];
29542     selection.property('__dimensions__', prop);
29543     return prop;
29544 }
29545
29546 function utilGetDimensions(selection, force) {
29547     if (!selection || selection.empty()) {
29548         return [0, 0];
29549     }
29550     var node = selection.node(),
29551         cached = selection.property('__dimensions__');
29552     return (!cached || force) ? refresh(selection, node) : cached;
29553 }
29554
29555
29556 function utilSetDimensions(selection, dimensions) {
29557     if (!selection || selection.empty()) {
29558         return selection;
29559     }
29560     var node = selection.node();
29561     if (dimensions === null) {
29562         refresh(selection, node);
29563         return selection;
29564     }
29565     return selection
29566         .property('__dimensions__', [dimensions[0], dimensions[1]])
29567         .attr('width', dimensions[0])
29568         .attr('height', dimensions[1]);
29569 }
29570
29571 function behaviorTail() {
29572     var text,
29573         container,
29574         xmargin = 25,
29575         tooltipSize = [0, 0],
29576         selectionSize = [0, 0];
29577
29578
29579     function tail(selection$$1) {
29580         if (!text) return;
29581
29582         d3_select(window)
29583             .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
29584
29585         container = d3_select(document.body)
29586             .append('div')
29587             .style('display', 'none')
29588             .attr('class', 'tail tooltip-inner');
29589
29590         container.append('div')
29591             .text(text);
29592
29593         selection$$1
29594             .on('mousemove.tail', mousemove)
29595             .on('mouseenter.tail', mouseenter)
29596             .on('mouseleave.tail', mouseleave);
29597
29598         container
29599             .on('mousemove.tail', mousemove);
29600
29601         tooltipSize = utilGetDimensions(container);
29602         selectionSize = utilGetDimensions(selection$$1);
29603
29604
29605         function show() {
29606             container.style('display', 'block');
29607             tooltipSize = utilGetDimensions(container);
29608         }
29609
29610
29611         function mousemove() {
29612             if (container.style('display') === 'none') show();
29613             var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
29614                 -tooltipSize[0] - xmargin : xmargin;
29615             container.classed('left', xoffset > 0);
29616             utilSetTransform(container, event.clientX + xoffset, event.clientY);
29617         }
29618
29619
29620         function mouseleave() {
29621             if (event.relatedTarget !== container.node()) {
29622                 container.style('display', 'none');
29623             }
29624         }
29625
29626
29627         function mouseenter() {
29628             if (event.relatedTarget !== container.node()) {
29629                 show();
29630             }
29631         }
29632     }
29633
29634
29635     tail.off = function(selection$$1) {
29636         if (!text) return;
29637
29638         container
29639             .on('mousemove.tail', null)
29640             .remove();
29641
29642         selection$$1
29643             .on('mousemove.tail', null)
29644             .on('mouseenter.tail', null)
29645             .on('mouseleave.tail', null);
29646
29647         d3_select(window)
29648             .on('resize.tail', null);
29649     };
29650
29651
29652     tail.text = function(_) {
29653         if (!arguments.length) return text;
29654         text = _;
29655         return tail;
29656     };
29657
29658
29659     return tail;
29660 }
29661
29662 var _usedTails = {};
29663 var _disableSpace = false;
29664 var _lastSpace = null;
29665
29666
29667 function behaviorDraw(context) {
29668     var dispatch$$1 = dispatch(
29669         'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
29670     );
29671
29672     var keybinding = d3keybinding('draw');
29673
29674     var hover = behaviorHover(context).altDisables(true)
29675         .on('hover', context.ui().sidebar.hover);
29676     var tail = behaviorTail();
29677     var edit = behaviorEdit(context);
29678
29679     var closeTolerance = 4;
29680     var tolerance = 12;
29681     var _mouseLeave = false;
29682     var _lastMouse = null;
29683
29684
29685     // related code
29686     // - `mode/drag_node.js` `datum()`
29687     function datum() {
29688         if (event.altKey) return {};
29689
29690         var element;
29691         if (event.type === 'keydown') {
29692             element = _lastMouse && _lastMouse.target;
29693         } else {
29694             element = event.target;
29695         }
29696
29697         // When drawing, snap only to touch targets..
29698         // (this excludes area fills and active drawing elements)
29699         var d = element.__data__;
29700         return (d && d.properties && d.properties.target) ? d : {};
29701     }
29702
29703
29704     function mousedown() {
29705
29706         function point$$1() {
29707             var p = context.container().node();
29708             return touchId !== null ? d3_touches(p).filter(function(p) {
29709                 return p.identifier === touchId;
29710             })[0] : d3_mouse(p);
29711         }
29712
29713         var element = d3_select(this);
29714         var touchId = event.touches ? event.changedTouches[0].identifier : null;
29715         var t1 = +new Date();
29716         var p1 = point$$1();
29717
29718         element.on('mousemove.draw', null);
29719
29720         d3_select(window).on('mouseup.draw', function() {
29721             var t2 = +new Date();
29722             var p2 = point$$1();
29723             var dist = geoVecLength(p1, p2);
29724
29725             element.on('mousemove.draw', mousemove);
29726             d3_select(window).on('mouseup.draw', null);
29727
29728             if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
29729                 // Prevent a quick second click
29730                 d3_select(window).on('click.draw-block', function() {
29731                     event.stopPropagation();
29732                 }, true);
29733
29734                 context.map().dblclickEnable(false);
29735
29736                 window.setTimeout(function() {
29737                     context.map().dblclickEnable(true);
29738                     d3_select(window).on('click.draw-block', null);
29739                 }, 500);
29740
29741                 click();
29742             }
29743         }, true);
29744     }
29745
29746
29747     function mousemove() {
29748         _lastMouse = event;
29749         dispatch$$1.call('move', this, datum());
29750     }
29751
29752
29753     function mouseenter() {
29754         _mouseLeave = false;
29755     }
29756
29757
29758     function mouseleave() {
29759         _mouseLeave = true;
29760     }
29761
29762
29763     // related code
29764     // - `mode/drag_node.js`     `doMode()`
29765     // - `behavior/draw.js`      `click()`
29766     // - `behavior/draw_way.js`  `move()`
29767     function click() {
29768         var d = datum();
29769         var target = d && d.properties && d.properties.entity;
29770
29771         if (target && target.type === 'node') {   // Snap to a node
29772             dispatch$$1.call('clickNode', this, target, d);
29773             return;
29774
29775         } else if (target && target.type === 'way') {   // Snap to a way
29776             var choice = geoChooseEdge(
29777                 context.childNodes(target), context.mouse(), context.projection, context.activeID()
29778             );
29779             if (choice) {
29780                 var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
29781                 dispatch$$1.call('clickWay', this, choice.loc, edge, d);
29782                 return;
29783             }
29784         }
29785
29786         dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
29787     }
29788
29789
29790     function space() {
29791         event.preventDefault();
29792         event.stopPropagation();
29793
29794         var currSpace = context.mouse();
29795         if (_disableSpace && _lastSpace) {
29796             var dist = geoVecLength(_lastSpace, currSpace);
29797             if (dist > tolerance) {
29798                 _disableSpace = false;
29799             }
29800         }
29801
29802         if (_disableSpace || _mouseLeave || !_lastMouse) return;
29803
29804         // user must move mouse or release space bar to allow another click
29805         _lastSpace = currSpace;
29806         _disableSpace = true;
29807
29808         d3_select(window).on('keyup.space-block', function() {
29809             event.preventDefault();
29810             event.stopPropagation();
29811             _disableSpace = false;
29812             d3_select(window).on('keyup.space-block', null);
29813         });
29814
29815         click();
29816     }
29817
29818
29819     function backspace() {
29820         event.preventDefault();
29821         dispatch$$1.call('undo');
29822     }
29823
29824
29825     function del() {
29826         event.preventDefault();
29827         dispatch$$1.call('cancel');
29828     }
29829
29830
29831     function ret() {
29832         event.preventDefault();
29833         dispatch$$1.call('finish');
29834     }
29835
29836
29837     function draw(selection$$1) {
29838         context.install(hover);
29839         context.install(edit);
29840
29841         if (!context.inIntro() && !_usedTails[tail.text()]) {
29842             context.install(tail);
29843         }
29844
29845         keybinding
29846             .on('⌫', backspace)
29847             .on('⌦', del)
29848             .on('⎋', ret)
29849             .on('↩', ret)
29850             .on('space', space)
29851             .on('⌥space', space);
29852
29853         selection$$1
29854             .on('mouseenter.draw', mouseenter)
29855             .on('mouseleave.draw', mouseleave)
29856             .on('mousedown.draw', mousedown)
29857             .on('mousemove.draw', mousemove);
29858
29859         d3_select(document)
29860             .call(keybinding);
29861
29862         return draw;
29863     }
29864
29865
29866     draw.off = function(selection$$1) {
29867         context.ui().sidebar.hover.cancel();
29868         context.uninstall(hover);
29869         context.uninstall(edit);
29870
29871         if (!context.inIntro() && !_usedTails[tail.text()]) {
29872             context.uninstall(tail);
29873             _usedTails[tail.text()] = true;
29874         }
29875
29876         selection$$1
29877             .on('mouseenter.draw', null)
29878             .on('mouseleave.draw', null)
29879             .on('mousedown.draw', null)
29880             .on('mousemove.draw', null);
29881
29882         d3_select(window)
29883             .on('mouseup.draw', null);
29884             // note: keyup.space-block, click.draw-block should remain
29885
29886         d3_select(document)
29887             .call(keybinding.off);
29888     };
29889
29890
29891     draw.tail = function(_) {
29892         tail.text(_);
29893         return draw;
29894     };
29895
29896
29897     return utilRebind(draw, dispatch$$1, 'on');
29898 }
29899
29900 function modeAddArea$$1(context) {
29901     var mode = {
29902         id: 'add-area',
29903         button: 'area',
29904         title: t('modes.add_area.title'),
29905         description: t('modes.add_area.description'),
29906         key: '3'
29907     };
29908
29909     var behavior = behaviorAddWay(context)
29910             .tail(t('modes.add_area.tail'))
29911             .on('start', start)
29912             .on('startFromWay', startFromWay)
29913             .on('startFromNode', startFromNode),
29914         defaultTags = { area: 'yes' };
29915
29916
29917     function actionClose(wayId) {
29918         return function (graph) {
29919             return graph.replace(graph.entity(wayId).close());
29920         };
29921     }
29922
29923
29924     function start(loc) {
29925         var startGraph = context.graph(),
29926             node = osmNode({ loc: loc }),
29927             way = osmWay({ tags: defaultTags });
29928
29929         context.perform(
29930             actionAddEntity(node),
29931             actionAddEntity(way),
29932             actionAddVertex(way.id, node.id),
29933             actionClose(way.id)
29934         );
29935
29936         context.enter(modeDrawArea(context, way.id, startGraph));
29937     }
29938
29939
29940     function startFromWay(loc, edge) {
29941         var startGraph = context.graph(),
29942             node = osmNode({ loc: loc }),
29943             way = osmWay({ tags: defaultTags });
29944
29945         context.perform(
29946             actionAddEntity(node),
29947             actionAddEntity(way),
29948             actionAddVertex(way.id, node.id),
29949             actionClose(way.id),
29950             actionAddMidpoint({ loc: loc, edge: edge }, node)
29951         );
29952
29953         context.enter(modeDrawArea(context, way.id, startGraph));
29954     }
29955
29956
29957     function startFromNode(node) {
29958         var startGraph = context.graph(),
29959             way = osmWay({ tags: defaultTags });
29960
29961         context.perform(
29962             actionAddEntity(way),
29963             actionAddVertex(way.id, node.id),
29964             actionClose(way.id)
29965         );
29966
29967         context.enter(modeDrawArea(context, way.id, startGraph));
29968     }
29969
29970
29971     mode.enter = function() {
29972         context.install(behavior);
29973     };
29974
29975
29976     mode.exit = function() {
29977         context.uninstall(behavior);
29978     };
29979
29980
29981     return mode;
29982 }
29983
29984 function modeAddLine$$1(context) {
29985     var mode = {
29986         id: 'add-line',
29987         button: 'line',
29988         title: t('modes.add_line.title'),
29989         description: t('modes.add_line.description'),
29990         key: '2'
29991     };
29992
29993     var behavior = behaviorAddWay(context)
29994         .tail(t('modes.add_line.tail'))
29995         .on('start', start)
29996         .on('startFromWay', startFromWay)
29997         .on('startFromNode', startFromNode);
29998
29999
30000     function start(loc) {
30001         var startGraph = context.graph(),
30002             node = osmNode({ loc: loc }),
30003             way = osmWay();
30004
30005         context.perform(
30006             actionAddEntity(node),
30007             actionAddEntity(way),
30008             actionAddVertex(way.id, node.id)
30009         );
30010
30011         context.enter(modeDrawLine(context, way.id, startGraph));
30012     }
30013
30014
30015     function startFromWay(loc, edge) {
30016         var startGraph = context.graph(),
30017             node = osmNode({ loc: loc }),
30018             way = osmWay();
30019
30020         context.perform(
30021             actionAddEntity(node),
30022             actionAddEntity(way),
30023             actionAddVertex(way.id, node.id),
30024             actionAddMidpoint({ loc: loc, edge: edge }, node)
30025         );
30026
30027         context.enter(modeDrawLine(context, way.id, startGraph));
30028     }
30029
30030
30031     function startFromNode(node) {
30032         var startGraph = context.graph(),
30033             way = osmWay();
30034
30035         context.perform(
30036             actionAddEntity(way),
30037             actionAddVertex(way.id, node.id)
30038         );
30039
30040         context.enter(modeDrawLine(context, way.id, startGraph));
30041     }
30042
30043
30044     mode.enter = function() {
30045         context.install(behavior);
30046     };
30047
30048
30049     mode.exit = function() {
30050         context.uninstall(behavior);
30051     };
30052
30053     return mode;
30054 }
30055
30056 function modeAddPoint$$1(context) {
30057     var mode = {
30058         id: 'add-point',
30059         button: 'point',
30060         title: t('modes.add_point.title'),
30061         description: t('modes.add_point.description'),
30062         key: '1'
30063     };
30064
30065     var behavior = behaviorDraw(context)
30066         .tail(t('modes.add_point.tail'))
30067         .on('click', add)
30068         .on('clickWay', addWay)
30069         .on('clickNode', addNode)
30070         .on('cancel', cancel)
30071         .on('finish', cancel);
30072
30073
30074     function add(loc) {
30075         var node = osmNode({ loc: loc });
30076
30077         context.perform(
30078             actionAddEntity(node),
30079             t('operations.add.annotation.point')
30080         );
30081
30082         context.enter(
30083             modeSelect(context, [node.id]).newFeature(true)
30084         );
30085     }
30086
30087
30088     function addWay(loc) {
30089         add(loc);
30090     }
30091
30092
30093     function addNode(node) {
30094         add(node.loc);
30095     }
30096
30097
30098     function cancel() {
30099         context.enter(modeBrowse(context));
30100     }
30101
30102
30103     mode.enter = function() {
30104         context.install(behavior);
30105     };
30106
30107
30108     mode.exit = function() {
30109         context.uninstall(behavior);
30110     };
30111
30112
30113     return mode;
30114 }
30115
30116 function modeDragNode$$1(context) {
30117     var mode = {
30118         id: 'drag-node',
30119         button: 'browse'
30120     };
30121     var hover = behaviorHover(context).altDisables(true)
30122         .on('hover', context.ui().sidebar.hover);
30123     var edit = behaviorEdit(context);
30124
30125     var _nudgeInterval;
30126     var _restoreSelectedIDs = [];
30127     var _wasMidpoint = false;
30128     var _isCancelled = false;
30129     var _activeEntity;
30130     var _startLoc;
30131     var _lastLoc;
30132
30133
30134     function startNudge(entity, nudge) {
30135         if (_nudgeInterval) window.clearInterval(_nudgeInterval);
30136         _nudgeInterval = window.setInterval(function() {
30137             context.pan(nudge);
30138             doMove(entity, nudge);
30139         }, 50);
30140     }
30141
30142
30143     function stopNudge() {
30144         if (_nudgeInterval) {
30145             window.clearInterval(_nudgeInterval);
30146             _nudgeInterval = null;
30147         }
30148     }
30149
30150
30151     function moveAnnotation(entity) {
30152         return t('operations.move.annotation.' + entity.geometry(context.graph()));
30153     }
30154
30155
30156     function connectAnnotation(entity) {
30157         return t('operations.connect.annotation.' + entity.geometry(context.graph()));
30158     }
30159
30160
30161     function origin(entity) {
30162         return context.projection(entity.loc);
30163     }
30164
30165
30166     function keydown() {
30167         if (event.keyCode === d3keybinding.modifierCodes.alt) {
30168             if (context.surface().classed('nope')) {
30169                 context.surface()
30170                     .classed('nope-suppressed', true);
30171             }
30172             context.surface()
30173                 .classed('nope', false)
30174                 .classed('nope-disabled', true);
30175         }
30176     }
30177
30178
30179     function keyup() {
30180         if (event.keyCode === d3keybinding.modifierCodes.alt) {
30181             if (context.surface().classed('nope-suppressed')) {
30182                 context.surface()
30183                     .classed('nope', true);
30184             }
30185             context.surface()
30186                 .classed('nope-suppressed', false)
30187                 .classed('nope-disabled', false);
30188         }
30189     }
30190
30191
30192     function start(entity) {
30193         _wasMidpoint = entity.type === 'midpoint';
30194         var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
30195         _isCancelled = event.sourceEvent.shiftKey || hasHidden;
30196
30197
30198         if (_isCancelled) {
30199             if (hasHidden) {
30200                 uiFlash().text(t('modes.drag_node.connected_to_hidden'))();
30201             }
30202             return drag.cancel();
30203         }
30204
30205         if (_wasMidpoint) {
30206             var midpoint = entity;
30207             entity = osmNode();
30208             context.perform(actionAddMidpoint(midpoint, entity));
30209             entity = context.entity(entity.id);   // get post-action entity
30210
30211             var vertex = context.surface().selectAll('.' + entity.id);
30212             drag.target(vertex.node(), entity);
30213
30214         } else {
30215             context.perform(actionNoop());
30216         }
30217
30218         _activeEntity = entity;
30219         _startLoc = entity.loc;
30220
30221         context.surface().selectAll('.' + _activeEntity.id)
30222             .classed('active', true);
30223
30224         context.enter(mode);
30225     }
30226
30227
30228     // related code
30229     // - `behavior/draw.js` `datum()`
30230     function datum() {
30231         var event$$1 = event && event.sourceEvent;
30232         if (!event$$1 || event$$1.altKey) {
30233             return {};
30234         } else {
30235             // When dragging, snap only to touch targets..
30236             // (this excludes area fills and active drawing elements)
30237             var d = event$$1.target.__data__;
30238             return (d && d.properties && d.properties.target) ? d : {};
30239         }
30240     }
30241
30242
30243     function doMove(entity, nudge) {
30244         nudge = nudge || [0, 0];
30245
30246         var currPoint = (event && event.point) || context.projection(_lastLoc);
30247         var currMouse = geoVecSubtract(currPoint, nudge);
30248         var loc = context.projection.invert(currMouse);
30249
30250         if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
30251             // related code
30252             // - `mode/drag_node.js`     `doMode()`
30253             // - `behavior/draw.js`      `click()`
30254             // - `behavior/draw_way.js`  `move()`
30255             var d = datum();
30256             var targetLoc = d && d.properties && d.properties.entity && d.properties.entity.loc;
30257             var targetNodes = d && d.properties && d.properties.nodes;
30258
30259             if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
30260                 loc = targetLoc;
30261
30262             } else if (targetNodes) {   // snap to way - a line target with `.nodes`
30263                 var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
30264                 if (choice) {
30265                     loc = choice.loc;
30266                 }
30267             }
30268         }
30269
30270         context.replace(
30271             actionMoveNode(entity.id, loc),
30272             moveAnnotation(entity)
30273         );
30274
30275
30276         // check if this movement causes the geometry to break
30277         var nopeDisabled = context.surface().classed('nope-disabled');
30278         var isInvalid = isInvalidGeometry(entity, context.graph());
30279         if (nopeDisabled) {
30280             context.surface()
30281                 .classed('nope', false)
30282                 .classed('nope-suppressed', isInvalid);
30283         } else {
30284             context.surface()
30285                 .classed('nope', isInvalid)
30286                 .classed('nope-suppressed', false);
30287         }
30288
30289         _lastLoc = loc;
30290     }
30291
30292
30293     function isInvalidGeometry(entity, graph) {
30294         var parents = graph.parentWays(entity);
30295         var i, j, k;
30296
30297         for (i = 0; i < parents.length; i++) {
30298             var parent = parents[i];
30299             var nodes = [];
30300             var activeIndex = null;    // which multipolygon ring contains node being dragged
30301
30302             // test any parent multipolygons for valid geometry
30303             var relations = graph.parentRelations(parent);
30304             for (j = 0; j < relations.length; j++) {
30305                 if (!relations[j].isMultipolygon()) continue;
30306
30307                 var rings = osmJoinWays(relations[j].members, graph);
30308
30309                 // find active ring and test it for self intersections
30310                 for (k = 0; k < rings.length; k++) {
30311                     nodes = rings[k].nodes;
30312                     if (find$1(nodes, function(n) { return n.id === entity.id; })) {
30313                         activeIndex = k;
30314                         if (geoHasSelfIntersections(nodes, entity.id)) {
30315                             return true;
30316                         }
30317                     }
30318                     rings[k].coords = nodes.map(function(n) { return n.loc; });
30319                 }
30320
30321                 // test active ring for intersections with other rings in the multipolygon
30322                 for (k = 0; k < rings.length; k++) {
30323                     if (k === activeIndex) continue;
30324
30325                     // make sure active ring doesnt cross passive rings
30326                     if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
30327                         return true;
30328                     }
30329                 }
30330             }
30331
30332
30333             // If we still haven't tested this node's parent way for self-intersections.
30334             // (because it's not a member of a multipolygon), test it now.
30335             if (activeIndex === null) {
30336                 nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
30337                 if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
30338                     return true;
30339                 }
30340             }
30341
30342         }
30343
30344         return false;
30345     }
30346
30347
30348     function move(entity) {
30349         if (_isCancelled) return;
30350         event.sourceEvent.stopPropagation();
30351
30352         context.surface().classed('nope-disabled', event.sourceEvent.altKey);
30353
30354         _lastLoc = context.projection.invert(event.point);
30355
30356         doMove(entity);
30357         var nudge = geoViewportEdge(event.point, context.map().dimensions());
30358         if (nudge) {
30359             startNudge(entity, nudge);
30360         } else {
30361             stopNudge();
30362         }
30363     }
30364
30365
30366     function end(entity) {
30367         if (_isCancelled) return;
30368
30369         var d = datum();
30370         var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
30371         var target = d && d.properties && d.properties.entity;   // entity to snap to
30372
30373         if (nope) {   // bounce back
30374             context.perform(
30375                 _actionBounceBack(entity.id, _startLoc)
30376             );
30377
30378         } else if (target && target.type === 'way') {
30379             var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
30380             context.replace(
30381                 actionAddMidpoint({
30382                     loc: choice.loc,
30383                     edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
30384                 }, entity),
30385                 connectAnnotation(target)
30386             );
30387
30388         } else if (target && target.type === 'node') {
30389             context.replace(
30390                 actionConnect([target.id, entity.id]),
30391                 connectAnnotation(target)
30392             );
30393
30394         } else if (_wasMidpoint) {
30395             context.replace(
30396                 actionNoop(),
30397                 t('operations.add.annotation.vertex')
30398             );
30399
30400         } else {
30401             context.replace(
30402                 actionNoop(),
30403                 moveAnnotation(entity)
30404             );
30405         }
30406
30407         var reselection = _restoreSelectedIDs.filter(function(id) {
30408             return context.graph().hasEntity(id);
30409         });
30410
30411         if (reselection.length) {
30412             context.enter(modeSelect(context, reselection));
30413         } else {
30414             context.enter(modeBrowse(context));
30415         }
30416     }
30417
30418
30419     function _actionBounceBack(nodeID, toLoc) {
30420         var moveNode = actionMoveNode(nodeID, toLoc);
30421         var action = function(graph, t$$1) {
30422             // last time through, pop off the bounceback perform.
30423             // it will then overwrite the initial perform with a moveNode that does nothing
30424             if (t$$1 === 1) context.pop();
30425             return moveNode(graph, t$$1);
30426         };
30427         action.transitionable = true;
30428         return action;
30429     }
30430
30431
30432     function cancel() {
30433         drag.cancel();
30434         context.enter(modeBrowse(context));
30435     }
30436
30437
30438     var drag = behaviorDrag()
30439         .selector('.layer-points-targets .target')
30440         .surface(d3_select('#map').node())
30441         .origin(origin)
30442         .on('start', start)
30443         .on('move', move)
30444         .on('end', end);
30445
30446
30447     mode.enter = function() {
30448         context.install(hover);
30449         context.install(edit);
30450
30451         d3_select(window)
30452             .on('keydown.drawWay', keydown)
30453             .on('keyup.drawWay', keyup);
30454
30455         context.history()
30456             .on('undone.drag-node', cancel);
30457     };
30458
30459
30460     mode.exit = function() {
30461         context.ui().sidebar.hover.cancel();
30462         context.uninstall(hover);
30463         context.uninstall(edit);
30464
30465         d3_select(window)
30466             .on('keydown.hover', null)
30467             .on('keyup.hover', null);
30468
30469         context.history()
30470             .on('undone.drag-node', null);
30471
30472         context.map()
30473             .on('drawn.drag-node', null);
30474
30475         _activeEntity = null;
30476
30477         context.surface()
30478             .classed('nope', false)
30479             .classed('nope-suppressed', false)
30480             .classed('nope-disabled', false)
30481             .selectAll('.active')
30482             .classed('active', false);
30483
30484         stopNudge();
30485     };
30486
30487
30488     mode.selectedIDs = function() {
30489         if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
30490         // no assign
30491         return mode;
30492     };
30493
30494
30495     mode.activeID = function() {
30496         if (!arguments.length) return _activeEntity && _activeEntity.id;
30497         // no assign
30498         return mode;
30499     };
30500
30501
30502     mode.restoreSelectedIDs = function(_) {
30503         if (!arguments.length) return _restoreSelectedIDs;
30504         _restoreSelectedIDs = _;
30505         return mode;
30506     };
30507
30508
30509     mode.behavior = drag;
30510
30511
30512     return mode;
30513 }
30514
30515 function modeBrowse(context) {
30516     var mode = {
30517         button: 'browse',
30518         id: 'browse',
30519         title: t('modes.browse.title'),
30520         description: t('modes.browse.description')
30521     }, sidebar;
30522
30523     var behaviors = [
30524         behaviorPaste(context),
30525         behaviorHover(context).on('hover', context.ui().sidebar.hover),
30526         behaviorSelect(context),
30527         behaviorLasso(context),
30528         modeDragNode$$1(context).behavior
30529     ];
30530
30531
30532     mode.enter = function() {
30533         behaviors.forEach(function(behavior) {
30534             context.install(behavior);
30535         });
30536
30537         // Get focus on the body.
30538         if (document.activeElement && document.activeElement.blur) {
30539             document.activeElement.blur();
30540         }
30541
30542         if (sidebar) {
30543             context.ui().sidebar.show(sidebar);
30544         } else {
30545             context.ui().sidebar.select(null);
30546         }
30547     };
30548
30549
30550     mode.exit = function() {
30551         context.ui().sidebar.hover.cancel();
30552         behaviors.forEach(function(behavior) {
30553             context.uninstall(behavior);
30554         });
30555
30556         if (sidebar) {
30557             context.ui().sidebar.hide();
30558         }
30559     };
30560
30561
30562     mode.sidebar = function(_) {
30563         if (!arguments.length) return sidebar;
30564         sidebar = _;
30565         return mode;
30566     };
30567
30568
30569     return mode;
30570 }
30571
30572 function modeDrawArea(context, wayId, startGraph) {
30573     var mode = {
30574         button: 'area',
30575         id: 'draw-area'
30576     };
30577
30578     var behavior;
30579
30580
30581     mode.enter = function() {
30582         var way = context.entity(wayId);
30583
30584         behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
30585             .tail(t('modes.draw_area.tail'));
30586
30587         var addNode = behavior.addNode;
30588
30589         behavior.addNode = function(node, d) {
30590             var length = way.nodes.length;
30591             var penultimate = length > 2 ? way.nodes[length - 2] : null;
30592
30593             if (node.id === way.first() || node.id === penultimate) {
30594                 behavior.finish();
30595             } else {
30596                 addNode(node, d);
30597             }
30598         };
30599
30600         context.install(behavior);
30601     };
30602
30603
30604     mode.exit = function() {
30605         context.uninstall(behavior);
30606     };
30607
30608
30609     mode.selectedIDs = function() {
30610         return [wayId];
30611     };
30612
30613
30614     mode.activeID = function() {
30615         return (behavior && behavior.activeID()) || [];
30616     };
30617
30618
30619     return mode;
30620 }
30621
30622 function modeDrawLine(context, wayId, startGraph, affix) {
30623     var mode = {
30624         button: 'line',
30625         id: 'draw-line'
30626     };
30627
30628     var behavior;
30629
30630
30631     mode.enter = function() {
30632         var way = context.entity(wayId);
30633         var index = (affix === 'prefix') ? 0 : undefined;
30634         var headId = (affix === 'prefix') ? way.first() : way.last();
30635
30636         behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
30637             .tail(t('modes.draw_line.tail'));
30638
30639         var addNode = behavior.addNode;
30640         behavior.addNode = function(node, d) {
30641             if (node.id === headId) {
30642                 behavior.finish();
30643             } else {
30644                 addNode(node, d);
30645             }
30646         };
30647
30648         context.install(behavior);
30649     };
30650
30651
30652     mode.exit = function() {
30653         context.uninstall(behavior);
30654     };
30655
30656
30657     mode.selectedIDs = function() {
30658         return [wayId];
30659     };
30660
30661
30662     mode.activeID = function() {
30663         return (behavior && behavior.activeID()) || [];
30664     };
30665
30666     return mode;
30667 }
30668
30669 function operationCircularize(selectedIDs, context) {
30670     var entityId = selectedIDs[0],
30671         entity = context.entity(entityId),
30672         extent = entity.extent(context.graph()),
30673         geometry = context.geometry(entityId),
30674         action = actionCircularize(entityId, context.projection);
30675
30676
30677     var operation = function() {
30678         context.perform(action, operation.annotation());
30679     };
30680
30681
30682     operation.available = function() {
30683         return selectedIDs.length === 1 &&
30684             entity.type === 'way' &&
30685             uniq(entity.nodes).length > 1;
30686     };
30687
30688
30689     operation.disabled = function() {
30690         var reason;
30691         if (extent.percentContainedIn(context.extent()) < 0.8) {
30692             reason = 'too_large';
30693         } else if (context.hasHiddenConnections(entityId)) {
30694             reason = 'connected_to_hidden';
30695         }
30696         return action.disabled(context.graph()) || reason;
30697     };
30698
30699
30700     operation.tooltip = function() {
30701         var disable = operation.disabled();
30702         return disable ?
30703             t('operations.circularize.' + disable) :
30704             t('operations.circularize.description.' + geometry);
30705     };
30706
30707
30708     operation.annotation = function() {
30709         return t('operations.circularize.annotation.' + geometry);
30710     };
30711
30712
30713     operation.id = 'circularize';
30714     operation.keys = [t('operations.circularize.key')];
30715     operation.title = t('operations.circularize.title');
30716     operation.behavior = behaviorOperation(context).which(operation);
30717
30718     return operation;
30719 }
30720
30721 function operationContinue(selectedIDs, context) {
30722     var graph = context.graph(),
30723         entities = selectedIDs.map(function(id) { return graph.entity(id); }),
30724         geometries = assignIn({ line: [], vertex: [] },
30725             groupBy(entities, function(entity) { return entity.geometry(graph); })),
30726         vertex = geometries.vertex[0];
30727
30728
30729     function candidateWays() {
30730         return graph.parentWays(vertex).filter(function(parent) {
30731             return parent.geometry(graph) === 'line' &&
30732                 !parent.isClosed() &&
30733                 parent.affix(vertex.id) &&
30734                 (geometries.line.length === 0 || geometries.line[0] === parent);
30735         });
30736     }
30737
30738
30739     var operation = function() {
30740         var candidate = candidateWays()[0];
30741         context.enter(
30742             modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
30743         );
30744     };
30745
30746
30747     operation.available = function() {
30748         return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
30749             !context.features().hasHiddenConnections(vertex, context.graph());
30750     };
30751
30752
30753     operation.disabled = function() {
30754         var candidates = candidateWays();
30755         if (candidates.length === 0)
30756             return 'not_eligible';
30757         if (candidates.length > 1)
30758             return 'multiple';
30759     };
30760
30761
30762     operation.tooltip = function() {
30763         var disable = operation.disabled();
30764         return disable ?
30765             t('operations.continue.' + disable) :
30766             t('operations.continue.description');
30767     };
30768
30769
30770     operation.annotation = function() {
30771         return t('operations.continue.annotation.line');
30772     };
30773
30774
30775     operation.id = 'continue';
30776     operation.keys = [t('operations.continue.key')];
30777     operation.title = t('operations.continue.title');
30778     operation.behavior = behaviorOperation(context).which(operation);
30779
30780     return operation;
30781 }
30782
30783 function operationDelete(selectedIDs, context) {
30784     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
30785         action = actionDeleteMultiple(selectedIDs),
30786         extent = selectedIDs.reduce(function(extent, id) {
30787                 return extent.extend(context.entity(id).extent(context.graph()));
30788             }, geoExtent$$1());
30789
30790
30791     var operation = function() {
30792         var nextSelectedID;
30793         var nextSelectedLoc;
30794
30795         if (selectedIDs.length === 1) {
30796             var id = selectedIDs[0],
30797                 entity = context.entity(id),
30798                 geometry = context.geometry(id),
30799                 parents = context.graph().parentWays(entity),
30800                 parent = parents[0];
30801
30802             // Select the next closest node in the way.
30803             if (geometry === 'vertex') {
30804                 var nodes = parent.nodes,
30805                     i = nodes.indexOf(id);
30806
30807                 if (i === 0) {
30808                     i++;
30809                 } else if (i === nodes.length - 1) {
30810                     i--;
30811                 } else {
30812                     var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
30813                         b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
30814                     i = a < b ? i - 1 : i + 1;
30815                 }
30816
30817                 nextSelectedID = nodes[i];
30818                 nextSelectedLoc = context.entity(nextSelectedID).loc;
30819             }
30820         }
30821
30822         context.perform(action, operation.annotation());
30823
30824         if (nextSelectedID && nextSelectedLoc) {
30825             if (context.hasEntity(nextSelectedID)) {
30826                 context.enter(modeSelect(context, [nextSelectedID]).follow(true));
30827             } else {
30828                 context.map().centerEase(nextSelectedLoc);
30829                 context.enter(modeBrowse(context));
30830             }
30831         } else {
30832             context.enter(modeBrowse(context));
30833         }
30834
30835     };
30836
30837
30838     operation.available = function() {
30839         return true;
30840     };
30841
30842
30843     operation.disabled = function() {
30844         var reason;
30845         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
30846             reason = 'too_large';
30847         } else if (some(selectedIDs, context.hasHiddenConnections)) {
30848             reason = 'connected_to_hidden';
30849         } else if (some(selectedIDs, protectedMember)) {
30850             reason = 'part_of_relation';
30851         } else if (some(selectedIDs, incompleteRelation)) {
30852             reason = 'incomplete_relation';
30853         }
30854         return reason;
30855
30856         function incompleteRelation(id) {
30857             var entity = context.entity(id);
30858             return entity.type === 'relation' && !entity.isComplete(context.graph());
30859         }
30860
30861         function protectedMember(id) {
30862             var entity = context.entity(id);
30863             if (entity.type !== 'way') return false;
30864
30865             var parents = context.graph().parentRelations(entity);
30866             for (var i = 0; i < parents.length; i++) {
30867                 var parent = parents[i],
30868                     type = parent.tags.type,
30869                     role = parent.memberById(id).role || 'outer';
30870                 if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
30871                     return true;
30872                 }
30873             }
30874             return false;
30875         }
30876
30877     };
30878
30879
30880     operation.tooltip = function() {
30881         var disable = operation.disabled();
30882         return disable ?
30883             t('operations.delete.' + disable + '.' + multi) :
30884             t('operations.delete.description' + '.' + multi);
30885     };
30886
30887
30888     operation.annotation = function() {
30889         return selectedIDs.length === 1 ?
30890             t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
30891             t('operations.delete.annotation.multiple', { n: selectedIDs.length });
30892     };
30893
30894
30895     operation.id = 'delete';
30896     operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
30897     operation.title = t('operations.delete.title');
30898     operation.behavior = behaviorOperation(context).which(operation);
30899
30900     return operation;
30901 }
30902
30903 function operationDisconnect(selectedIDs, context) {
30904     var vertices = filter(selectedIDs, function(entityId) {
30905         return context.geometry(entityId) === 'vertex';
30906     });
30907
30908     var entityId = vertices[0],
30909         action = actionDisconnect(entityId);
30910
30911     if (selectedIDs.length > 1) {
30912         action.limitWays(without(selectedIDs, entityId));
30913     }
30914
30915
30916     var operation = function() {
30917         context.perform(action, operation.annotation());
30918     };
30919
30920
30921     operation.available = function() {
30922         return vertices.length === 1;
30923     };
30924
30925
30926     operation.disabled = function() {
30927         var reason;
30928         if (some(selectedIDs, context.hasHiddenConnections)) {
30929             reason = 'connected_to_hidden';
30930         }
30931         return action.disabled(context.graph()) || reason;
30932     };
30933
30934
30935     operation.tooltip = function() {
30936         var disable = operation.disabled();
30937         return disable ?
30938             t('operations.disconnect.' + disable) :
30939             t('operations.disconnect.description');
30940     };
30941
30942
30943     operation.annotation = function() {
30944         return t('operations.disconnect.annotation');
30945     };
30946
30947
30948     operation.id = 'disconnect';
30949     operation.keys = [t('operations.disconnect.key')];
30950     operation.title = t('operations.disconnect.title');
30951     operation.behavior = behaviorOperation(context).which(operation);
30952
30953     return operation;
30954 }
30955
30956 function operationMerge(selectedIDs, context) {
30957
30958     function updatePresetTags(newGraph, ids) {
30959         var id = ids[0],
30960             newEntity = newGraph.hasEntity(id);
30961
30962         if (!newEntity) return;
30963
30964         var newPreset = context.presets().match(newEntity, newGraph);
30965
30966         context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
30967     }
30968
30969
30970     var join = actionJoin(selectedIDs),
30971         merge = actionMerge(selectedIDs),
30972         mergePolygon = actionMergePolygon(selectedIDs);
30973
30974
30975     var operation = function() {
30976         var origGraph = context.graph(),
30977             action;
30978
30979         if (!join.disabled(origGraph)) {
30980             action = join;
30981         } else if (!merge.disabled(origGraph)) {
30982             action = merge;
30983         } else {
30984             action = mergePolygon;
30985         }
30986
30987         context.perform(action, operation.annotation());
30988
30989         var ids = selectedIDs.filter(function(id) {
30990             var entity = context.hasEntity(id);
30991             return entity && entity.type !== 'node';
30992         });
30993
30994         // if we merged tags, rematch preset to update tags if necessary (#3851)
30995         if (action === merge) {
30996             updatePresetTags(context.graph(), ids);
30997         }
30998
30999         context.enter(modeSelect(context, ids));
31000     };
31001
31002
31003     operation.available = function() {
31004         return selectedIDs.length >= 2;
31005     };
31006
31007
31008     operation.disabled = function() {
31009         return join.disabled(context.graph()) &&
31010             merge.disabled(context.graph()) &&
31011             mergePolygon.disabled(context.graph());
31012     };
31013
31014
31015     operation.tooltip = function() {
31016         var j = join.disabled(context.graph()),
31017             m = merge.disabled(context.graph()),
31018             p = mergePolygon.disabled(context.graph());
31019
31020         if (j === 'restriction' && m && p) {
31021             return t('operations.merge.restriction',
31022                 { relation: context.presets().item('type/restriction').name() });
31023         }
31024
31025         if (p === 'incomplete_relation' && j && m) {
31026             return t('operations.merge.incomplete_relation');
31027         }
31028
31029         if (j && m && p) {
31030             return t('operations.merge.' + j);
31031         }
31032
31033         return t('operations.merge.description');
31034     };
31035
31036
31037     operation.annotation = function() {
31038         return t('operations.merge.annotation', { n: selectedIDs.length });
31039     };
31040
31041
31042     operation.id = 'merge';
31043     operation.keys = [t('operations.merge.key')];
31044     operation.title = t('operations.merge.title');
31045     operation.behavior = behaviorOperation(context).which(operation);
31046
31047     return operation;
31048 }
31049
31050 function operationMove(selectedIDs, context) {
31051     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
31052     var extent = selectedIDs.reduce(function(extent, id) {
31053         return extent.extend(context.entity(id).extent(context.graph()));
31054     }, geoExtent$$1());
31055
31056
31057     var operation = function() {
31058         context.enter(modeMove$$1(context, selectedIDs));
31059     };
31060
31061
31062     operation.available = function() {
31063         return selectedIDs.length > 1 ||
31064             context.entity(selectedIDs[0]).type !== 'node';
31065     };
31066
31067
31068     operation.disabled = function() {
31069         var reason;
31070         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31071             reason = 'too_large';
31072         } else if (some(selectedIDs, context.hasHiddenConnections)) {
31073             reason = 'connected_to_hidden';
31074         } else if (some(selectedIDs, incompleteRelation)) {
31075             reason = 'incomplete_relation';
31076         }
31077         return reason;
31078
31079         function incompleteRelation(id) {
31080             var entity = context.entity(id);
31081             return entity.type === 'relation' && !entity.isComplete(context.graph());
31082         }
31083     };
31084
31085
31086     operation.tooltip = function() {
31087         var disable = operation.disabled();
31088         return disable ?
31089             t('operations.move.' + disable + '.' + multi) :
31090             t('operations.move.description.' + multi);
31091     };
31092
31093
31094     operation.annotation = function() {
31095         return selectedIDs.length === 1 ?
31096             t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
31097             t('operations.move.annotation.multiple');
31098     };
31099
31100
31101     operation.id = 'move';
31102     operation.keys = [t('operations.move.key')];
31103     operation.title = t('operations.move.title');
31104     operation.behavior = behaviorOperation(context).which(operation);
31105
31106     return operation;
31107 }
31108
31109 function operationOrthogonalize(selectedIDs, context) {
31110     var entityId = selectedIDs[0],
31111         entity = context.entity(entityId),
31112         extent = entity.extent(context.graph()),
31113         geometry = context.geometry(entityId),
31114         action = actionOrthogonalize(entityId, context.projection);
31115
31116
31117     var operation = function() {
31118         context.perform(action, operation.annotation());
31119     };
31120
31121
31122     operation.available = function() {
31123         return selectedIDs.length === 1 &&
31124             entity.type === 'way' &&
31125             entity.isClosed() &&
31126             uniq(entity.nodes).length > 2;
31127     };
31128
31129
31130     operation.disabled = function() {
31131         var reason;
31132         if (extent.percentContainedIn(context.extent()) < 0.8) {
31133             reason = 'too_large';
31134         } else if (context.hasHiddenConnections(entityId)) {
31135             reason = 'connected_to_hidden';
31136         }
31137         return action.disabled(context.graph()) || reason;
31138     };
31139
31140
31141     operation.tooltip = function() {
31142         var disable = operation.disabled();
31143         return disable ?
31144             t('operations.orthogonalize.' + disable) :
31145             t('operations.orthogonalize.description.' + geometry);
31146     };
31147
31148
31149     operation.annotation = function() {
31150         return t('operations.orthogonalize.annotation.' + geometry);
31151     };
31152
31153
31154     operation.id = 'orthogonalize';
31155     operation.keys = [t('operations.orthogonalize.key')];
31156     operation.title = t('operations.orthogonalize.title');
31157     operation.behavior = behaviorOperation(context).which(operation);
31158
31159     return operation;
31160 }
31161
31162 /**
31163  * This method is like `_.uniq` except that it accepts `iteratee` which is
31164  * invoked for each element in `array` to generate the criterion by which
31165  * uniqueness is computed. The order of result values is determined by the
31166  * order they occur in the array. The iteratee is invoked with one argument:
31167  * (value).
31168  *
31169  * @static
31170  * @memberOf _
31171  * @since 4.0.0
31172  * @category Array
31173  * @param {Array} array The array to inspect.
31174  * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
31175  * @returns {Array} Returns the new duplicate free array.
31176  * @example
31177  *
31178  * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
31179  * // => [2.1, 1.2]
31180  *
31181  * // The `_.property` iteratee shorthand.
31182  * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
31183  * // => [{ 'x': 1 }, { 'x': 2 }]
31184  */
31185 function uniqBy(array, iteratee) {
31186   return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
31187 }
31188
31189 function operationReflectShort(selectedIDs, context) {
31190     return operationReflect(selectedIDs, context, 'short');
31191 }
31192
31193
31194 function operationReflectLong(selectedIDs, context) {
31195     return operationReflect(selectedIDs, context, 'long');
31196 }
31197
31198
31199 function operationReflect(selectedIDs, context, axis) {
31200     axis = axis || 'long';
31201     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31202         extent = selectedIDs.reduce(function(extent, id) {
31203             return extent.extend(context.entity(id).extent(context.graph()));
31204         }, geoExtent$$1());
31205
31206
31207     var operation = function() {
31208         var action = actionReflect(selectedIDs, context.projection)
31209             .useLongAxis(Boolean(axis === 'long'));
31210         context.perform(action, operation.annotation());
31211     };
31212
31213
31214     operation.available = function() {
31215         var nodes = utilGetAllNodes(selectedIDs, context.graph());
31216         return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
31217     };
31218
31219
31220     operation.disabled = function() {
31221         var reason;
31222         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31223             reason = 'too_large';
31224         } else if (some(selectedIDs, context.hasHiddenConnections)) {
31225             reason = 'connected_to_hidden';
31226         } else if (some(selectedIDs, incompleteRelation)) {
31227             reason = 'incomplete_relation';
31228         }
31229         return reason;
31230
31231         function incompleteRelation(id) {
31232             var entity = context.entity(id);
31233             return entity.type === 'relation' && !entity.isComplete(context.graph());
31234         }
31235     };
31236
31237
31238     operation.tooltip = function() {
31239         var disable = operation.disabled();
31240         return disable ?
31241             t('operations.reflect.' + disable + '.' + multi) :
31242             t('operations.reflect.description.' + axis + '.' + multi);
31243     };
31244
31245
31246     operation.annotation = function() {
31247         return t('operations.reflect.annotation.' + axis + '.' + multi);
31248     };
31249
31250
31251     operation.id = 'reflect-' + axis;
31252     operation.keys = [t('operations.reflect.key.' + axis)];
31253     operation.title = t('operations.reflect.title.' + axis);
31254     operation.behavior = behaviorOperation(context).which(operation);
31255
31256     return operation;
31257 }
31258
31259 function operationReverse(selectedIDs, context) {
31260     var entityId = selectedIDs[0];
31261
31262     var operation = function() {
31263         context.perform(actionReverse(entityId), operation.annotation());
31264     };
31265
31266
31267     operation.available = function() {
31268         return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
31269     };
31270
31271
31272     operation.disabled = function() {
31273         return false;
31274     };
31275
31276
31277     operation.tooltip = function() {
31278         return t('operations.reverse.description');
31279     };
31280
31281
31282     operation.annotation = function() {
31283         return t('operations.reverse.annotation');
31284     };
31285
31286
31287     operation.id = 'reverse';
31288     operation.keys = [t('operations.reverse.key')];
31289     operation.title = t('operations.reverse.title');
31290     operation.behavior = behaviorOperation(context).which(operation);
31291
31292     return operation;
31293 }
31294
31295 function operationRotate(selectedIDs, context) {
31296     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31297         extent = selectedIDs.reduce(function(extent, id) {
31298             return extent.extend(context.entity(id).extent(context.graph()));
31299         }, geoExtent$$1());
31300
31301
31302     var operation = function() {
31303         context.enter(modeRotate$$1(context, selectedIDs));
31304     };
31305
31306
31307     operation.available = function() {
31308         var nodes = utilGetAllNodes(selectedIDs, context.graph());
31309         return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
31310     };
31311
31312
31313     operation.disabled = function() {
31314         var reason;
31315         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31316             reason = 'too_large';
31317         } else if (some(selectedIDs, context.hasHiddenConnections)) {
31318             reason = 'connected_to_hidden';
31319         } else if (some(selectedIDs, incompleteRelation)) {
31320             reason = 'incomplete_relation';
31321         }
31322         return reason;
31323
31324         function incompleteRelation(id) {
31325             var entity = context.entity(id);
31326             return entity.type === 'relation' && !entity.isComplete(context.graph());
31327         }
31328     };
31329
31330
31331     operation.tooltip = function() {
31332         var disable = operation.disabled();
31333         return disable ?
31334             t('operations.rotate.' + disable + '.' + multi) :
31335             t('operations.rotate.description.' + multi);
31336     };
31337
31338
31339     operation.annotation = function() {
31340         return selectedIDs.length === 1 ?
31341             t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
31342             t('operations.rotate.annotation.multiple');
31343     };
31344
31345
31346     operation.id = 'rotate';
31347     operation.keys = [t('operations.rotate.key')];
31348     operation.title = t('operations.rotate.title');
31349     operation.behavior = behaviorOperation(context).which(operation);
31350
31351     return operation;
31352 }
31353
31354 function operationSplit(selectedIDs, context) {
31355     var vertices = filter(selectedIDs, function(entityId) {
31356         return context.geometry(entityId) === 'vertex';
31357     });
31358
31359     var entityId = vertices[0],
31360         action = actionSplit(entityId),
31361         ways = [];
31362
31363     if (vertices.length === 1) {
31364         if (selectedIDs.length > 1) {
31365             action.limitWays(without(selectedIDs, entityId));
31366         }
31367         ways = action.ways(context.graph());
31368     }
31369
31370
31371     var operation = function() {
31372         var difference = context.perform(action, operation.annotation());
31373         context.enter(modeSelect(context, difference.extantIDs()));
31374     };
31375
31376
31377     operation.available = function() {
31378         return vertices.length === 1;
31379     };
31380
31381
31382     operation.disabled = function() {
31383         var reason;
31384         if (some(selectedIDs, context.hasHiddenConnections)) {
31385             reason = 'connected_to_hidden';
31386         }
31387         return action.disabled(context.graph()) || reason;
31388     };
31389
31390
31391     operation.tooltip = function() {
31392         var disable = operation.disabled();
31393         if (disable) {
31394             return t('operations.split.' + disable);
31395         }
31396         if (ways.length === 1) {
31397             return t('operations.split.description.' + context.geometry(ways[0].id));
31398         } else {
31399             return t('operations.split.description.multiple');
31400         }
31401     };
31402
31403
31404     operation.annotation = function() {
31405         return ways.length === 1 ?
31406             t('operations.split.annotation.' + context.geometry(ways[0].id)) :
31407             t('operations.split.annotation.multiple', { n: ways.length });
31408     };
31409
31410
31411     operation.id = 'split';
31412     operation.keys = [t('operations.split.key')];
31413     operation.title = t('operations.split.title');
31414     operation.behavior = behaviorOperation(context).which(operation);
31415
31416     return operation;
31417 }
31418
31419 function operationStraighten(selectedIDs, context) {
31420     var entityId = selectedIDs[0],
31421         action = actionStraighten(entityId, context.projection);
31422
31423
31424     function operation() {
31425         context.perform(action, operation.annotation());
31426     }
31427
31428
31429     operation.available = function() {
31430         var entity = context.entity(entityId);
31431         return selectedIDs.length === 1 &&
31432             entity.type === 'way' &&
31433             !entity.isClosed() &&
31434             uniq(entity.nodes).length > 2;
31435     };
31436
31437
31438     operation.disabled = function() {
31439         var reason;
31440         if (context.hasHiddenConnections(entityId)) {
31441             reason = 'connected_to_hidden';
31442         }
31443         return action.disabled(context.graph()) || reason;
31444     };
31445
31446
31447     operation.tooltip = function() {
31448         var disable = operation.disabled();
31449         return disable ?
31450             t('operations.straighten.' + disable) :
31451             t('operations.straighten.description');
31452     };
31453
31454
31455     operation.annotation = function() {
31456         return t('operations.straighten.annotation');
31457     };
31458
31459
31460     operation.id = 'straighten';
31461     operation.keys = [t('operations.straighten.key')];
31462     operation.title = t('operations.straighten.title');
31463     operation.behavior = behaviorOperation(context).which(operation);
31464
31465     return operation;
31466 }
31467
31468
31469
31470 var Operations = Object.freeze({
31471         operationCircularize: operationCircularize,
31472         operationContinue: operationContinue,
31473         operationDelete: operationDelete,
31474         operationDisconnect: operationDisconnect,
31475         operationMerge: operationMerge,
31476         operationMove: operationMove,
31477         operationOrthogonalize: operationOrthogonalize,
31478         operationReflectShort: operationReflectShort,
31479         operationReflectLong: operationReflectLong,
31480         operationReverse: operationReverse,
31481         operationRotate: operationRotate,
31482         operationSplit: operationSplit,
31483         operationStraighten: operationStraighten
31484 });
31485
31486 function modeMove$$1(context, entityIDs, baseGraph) {
31487     var mode = {
31488         id: 'move',
31489         button: 'browse'
31490     };
31491
31492     var keybinding = d3keybinding('move');
31493     var behaviors = [
31494         behaviorEdit(context),
31495         operationCircularize(entityIDs, context).behavior,
31496         operationDelete(entityIDs, context).behavior,
31497         operationOrthogonalize(entityIDs, context).behavior,
31498         operationReflectLong(entityIDs, context).behavior,
31499         operationReflectShort(entityIDs, context).behavior,
31500         operationRotate(entityIDs, context).behavior
31501     ];
31502     var annotation = entityIDs.length === 1 ?
31503         t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
31504         t('operations.move.annotation.multiple');
31505
31506     var _prevGraph;
31507     var _cache;
31508     var _origin;
31509     var _nudgeInterval;
31510
31511
31512     function doMove(nudge) {
31513         nudge = nudge || [0, 0];
31514
31515         var fn;
31516         if (_prevGraph !== context.graph()) {
31517             _cache = {};
31518             _origin = context.map().mouseCoordinates();
31519             fn = context.perform;
31520         } else {
31521             fn = context.overwrite;
31522         }
31523
31524         var currMouse = context.mouse();
31525         var origMouse = context.projection(_origin);
31526         var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
31527
31528         fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
31529         _prevGraph = context.graph();
31530     }
31531
31532
31533     function startNudge(nudge) {
31534         if (_nudgeInterval) window.clearInterval(_nudgeInterval);
31535         _nudgeInterval = window.setInterval(function() {
31536             context.pan(nudge);
31537             doMove(nudge);
31538         }, 50);
31539     }
31540
31541
31542     function stopNudge() {
31543         if (_nudgeInterval) {
31544             window.clearInterval(_nudgeInterval);
31545             _nudgeInterval = null;
31546         }
31547     }
31548
31549
31550     function move() {
31551         doMove();
31552         var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
31553         if (nudge) {
31554             startNudge(nudge);
31555         } else {
31556             stopNudge();
31557         }
31558     }
31559
31560
31561     function finish() {
31562         event.stopPropagation();
31563         context.enter(modeSelect(context, entityIDs));
31564         stopNudge();
31565     }
31566
31567
31568     function cancel() {
31569         if (baseGraph) {
31570             while (context.graph() !== baseGraph) context.pop();
31571             context.enter(modeBrowse(context));
31572         } else {
31573             context.pop();
31574             context.enter(modeSelect(context, entityIDs));
31575         }
31576         stopNudge();
31577     }
31578
31579
31580     function undone() {
31581         context.enter(modeBrowse(context));
31582     }
31583
31584
31585     mode.enter = function() {
31586         _origin = context.map().mouseCoordinates();
31587         _prevGraph = null;
31588         _cache = {};
31589
31590         behaviors.forEach(function(behavior) {
31591             context.install(behavior);
31592         });
31593
31594         context.surface()
31595             .on('mousemove.move', move)
31596             .on('click.move', finish);
31597
31598         context.history()
31599             .on('undone.move', undone);
31600
31601         keybinding
31602             .on('⎋', cancel)
31603             .on('↩', finish);
31604
31605         d3_select(document)
31606             .call(keybinding);
31607     };
31608
31609
31610     mode.exit = function() {
31611         stopNudge();
31612
31613         behaviors.forEach(function(behavior) {
31614             context.uninstall(behavior);
31615         });
31616
31617         context.surface()
31618             .on('mousemove.move', null)
31619             .on('click.move', null);
31620
31621         context.history()
31622             .on('undone.move', null);
31623
31624         keybinding.off();
31625     };
31626
31627
31628     mode.selectedIDs = function() {
31629         if (!arguments.length) return entityIDs;
31630         // no assign
31631         return mode;
31632     };
31633
31634
31635     return mode;
31636 }
31637
31638 function modeRotate$$1(context, entityIDs) {
31639     var mode = {
31640         id: 'rotate',
31641         button: 'browse'
31642     };
31643
31644     var keybinding = d3keybinding('rotate');
31645     var behaviors = [
31646         behaviorEdit(context),
31647         operationCircularize(entityIDs, context).behavior,
31648         operationDelete(entityIDs, context).behavior,
31649         operationMove(entityIDs, context).behavior,
31650         operationOrthogonalize(entityIDs, context).behavior,
31651         operationReflectLong(entityIDs, context).behavior,
31652         operationReflectShort(entityIDs, context).behavior
31653     ];
31654     var annotation = entityIDs.length === 1 ?
31655         t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
31656         t('operations.rotate.annotation.multiple');
31657
31658     var _prevGraph;
31659     var _prevAngle;
31660     var _prevTransform;
31661     var _pivot;
31662
31663
31664     function doRotate() {
31665         var fn;
31666         if (context.graph() !== _prevGraph) {
31667             fn = context.perform;
31668         } else {
31669             fn = context.replace;
31670         }
31671
31672         // projection changed, recalculate _pivot
31673         var projection = context.projection;
31674         var currTransform = projection.transform();
31675         if (!_prevTransform ||
31676             currTransform.k !== _prevTransform.k ||
31677             currTransform.x !== _prevTransform.x ||
31678             currTransform.y !== _prevTransform.y) {
31679
31680             var nodes = utilGetAllNodes(entityIDs, context.graph());
31681             var points = nodes.map(function(n) { return projection(n.loc); });
31682
31683             if (points.length === 1) {  // degenerate case
31684                 _pivot = points[0];
31685             } else if (points.length === 2) {
31686                 _pivot = geoVecInterp(points[0], points[1], 0.5);
31687             } else {
31688                 _pivot = d3_polygonCentroid(d3_polygonHull(points));
31689             }
31690             _prevAngle = undefined;
31691         }
31692
31693
31694         var currMouse = context.mouse();
31695         var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
31696
31697         if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
31698         var delta = currAngle - _prevAngle;
31699
31700         fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
31701
31702         _prevTransform = currTransform;
31703         _prevAngle = currAngle;
31704         _prevGraph = context.graph();
31705     }
31706
31707
31708     function finish() {
31709         event.stopPropagation();
31710         context.enter(modeSelect(context, entityIDs));
31711     }
31712
31713
31714     function cancel() {
31715         context.pop();
31716         context.enter(modeSelect(context, entityIDs));
31717     }
31718
31719
31720     function undone() {
31721         context.enter(modeBrowse(context));
31722     }
31723
31724
31725     mode.enter = function() {
31726         behaviors.forEach(function(behavior) {
31727             context.install(behavior);
31728         });
31729
31730         context.surface()
31731             .on('mousemove.rotate', doRotate)
31732             .on('click.rotate', finish);
31733
31734         context.history()
31735             .on('undone.rotate', undone);
31736
31737         keybinding
31738             .on('⎋', cancel)
31739             .on('↩', finish);
31740
31741         d3_select(document)
31742             .call(keybinding);
31743     };
31744
31745
31746     mode.exit = function() {
31747         behaviors.forEach(function(behavior) {
31748             context.uninstall(behavior);
31749         });
31750
31751         context.surface()
31752             .on('mousemove.rotate', null)
31753             .on('click.rotate', null);
31754
31755         context.history()
31756             .on('undone.rotate', null);
31757
31758         keybinding.off();
31759     };
31760
31761
31762     mode.selectedIDs = function() {
31763         if (!arguments.length) return entityIDs;
31764         // no assign
31765         return mode;
31766     };
31767
31768
31769     return mode;
31770 }
31771
31772 /**
31773  * A specialized version of `_.reduce` for arrays without support for
31774  * iteratee shorthands.
31775  *
31776  * @private
31777  * @param {Array} [array] The array to iterate over.
31778  * @param {Function} iteratee The function invoked per iteration.
31779  * @param {*} [accumulator] The initial value.
31780  * @param {boolean} [initAccum] Specify using the first element of `array` as
31781  *  the initial value.
31782  * @returns {*} Returns the accumulated value.
31783  */
31784 function arrayReduce(array, iteratee, accumulator, initAccum) {
31785   var index = -1,
31786       length = array == null ? 0 : array.length;
31787
31788   if (initAccum && length) {
31789     accumulator = array[++index];
31790   }
31791   while (++index < length) {
31792     accumulator = iteratee(accumulator, array[index], index, array);
31793   }
31794   return accumulator;
31795 }
31796
31797 /**
31798  * The base implementation of `_.reduce` and `_.reduceRight`, without support
31799  * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
31800  *
31801  * @private
31802  * @param {Array|Object} collection The collection to iterate over.
31803  * @param {Function} iteratee The function invoked per iteration.
31804  * @param {*} accumulator The initial value.
31805  * @param {boolean} initAccum Specify using the first or last element of
31806  *  `collection` as the initial value.
31807  * @param {Function} eachFunc The function to iterate over `collection`.
31808  * @returns {*} Returns the accumulated value.
31809  */
31810 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
31811   eachFunc(collection, function(value, index, collection) {
31812     accumulator = initAccum
31813       ? (initAccum = false, value)
31814       : iteratee(accumulator, value, index, collection);
31815   });
31816   return accumulator;
31817 }
31818
31819 /**
31820  * Reduces `collection` to a value which is the accumulated result of running
31821  * each element in `collection` thru `iteratee`, where each successive
31822  * invocation is supplied the return value of the previous. If `accumulator`
31823  * is not given, the first element of `collection` is used as the initial
31824  * value. The iteratee is invoked with four arguments:
31825  * (accumulator, value, index|key, collection).
31826  *
31827  * Many lodash methods are guarded to work as iteratees for methods like
31828  * `_.reduce`, `_.reduceRight`, and `_.transform`.
31829  *
31830  * The guarded methods are:
31831  * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
31832  * and `sortBy`
31833  *
31834  * @static
31835  * @memberOf _
31836  * @since 0.1.0
31837  * @category Collection
31838  * @param {Array|Object} collection The collection to iterate over.
31839  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
31840  * @param {*} [accumulator] The initial value.
31841  * @returns {*} Returns the accumulated value.
31842  * @see _.reduceRight
31843  * @example
31844  *
31845  * _.reduce([1, 2], function(sum, n) {
31846  *   return sum + n;
31847  * }, 0);
31848  * // => 3
31849  *
31850  * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
31851  *   (result[value] || (result[value] = [])).push(key);
31852  *   return result;
31853  * }, {});
31854  * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
31855  */
31856 function reduce(collection, iteratee, accumulator) {
31857   var func = isArray(collection) ? arrayReduce : baseReduce,
31858       initAccum = arguments.length < 3;
31859
31860   return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
31861 }
31862
31863 var _isSaving = false;
31864
31865
31866 function modeSave$$1(context) {
31867     var mode = { id: 'save' };
31868     var keybinding = d3keybinding('modeSave');
31869
31870     var loading = uiLoading(context)
31871         .message(t('save.uploading'))
31872         .blocking(true);
31873
31874     var commit = uiCommit(context)
31875         .on('cancel', cancel)
31876         .on('save', save);
31877
31878     var _toCheck = [];
31879     var _toLoad = [];
31880     var _loaded = {};
31881     var _toLoadCount = 0;
31882     var _toLoadTotal = 0;
31883
31884     var _conflicts = [];
31885     var _errors = [];
31886     var _origChanges;
31887
31888
31889     function cancel(selectedID) {
31890         if (selectedID) {
31891             context.enter(modeSelect(context, [selectedID]));
31892         } else {
31893             context.enter(modeBrowse(context));
31894         }
31895     }
31896
31897
31898     function save(changeset, tryAgain, checkConflicts) {
31899         // Guard against accidentally entering save code twice - #4641
31900         if (_isSaving && !tryAgain) {
31901             return;
31902         }
31903
31904         var osm = context.connection();
31905         if (!osm) {
31906             cancel();
31907             return;
31908         }
31909
31910         // If user somehow got logged out mid-save, try to reauthenticate..
31911         // This can happen if they were logged in from before, but the tokens are no longer valid.
31912         if (!osm.authenticated()) {
31913             osm.authenticate(function(err) {
31914                 if (err) {
31915                     cancel();   // quit save mode..
31916                 } else {
31917                     save(changeset, tryAgain, checkConflicts);  // continue where we left off..
31918                 }
31919             });
31920             return;
31921         }
31922
31923         if (!_isSaving) {
31924             keybindingOff();
31925             context.container().call(loading);  // block input
31926             _isSaving = true;
31927         }
31928
31929         var history = context.history();
31930         var localGraph = context.graph();
31931         var remoteGraph = coreGraph$$1(history.base(), true);
31932
31933         _conflicts = [];
31934         _errors = [];
31935
31936         // Store original changes, in case user wants to download them as an .osc file
31937         _origChanges = history.changes(actionDiscardTags(history.difference()));
31938
31939         // First time, `history.perform` a no-op action.
31940         // Any conflict resolutions will be done as `history.replace`
31941         if (!tryAgain) {
31942             history.perform(actionNoop());
31943         }
31944
31945         // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
31946         if (!checkConflicts) {
31947             upload(changeset);
31948
31949         // Do the full (slow) conflict check..
31950         } else {
31951             var modified = filter(history.difference().summary(), { changeType: 'modified' });
31952             _toCheck = map$3(map$3(modified, 'entity'), 'id');
31953             _toLoad = withChildNodes(_toCheck, localGraph);
31954             _loaded = {};
31955             _toLoadCount = 0;
31956             _toLoadTotal = _toLoad.length;
31957
31958             if (_toCheck.length) {
31959                 showProgress(_toLoadCount, _toLoadTotal);
31960                 _toLoad.forEach(function(id) { _loaded[id] = false; });
31961                 osm.loadMultiple(_toLoad, loaded);
31962             } else {
31963                 upload(changeset);
31964             }
31965         }
31966
31967         return;
31968
31969
31970         function withChildNodes(ids, graph) {
31971             return uniq(reduce(ids, function(result, id) {
31972                 var entity = graph.entity(id);
31973                 if (entity.type === 'way') {
31974                     try {
31975                         var children = graph.childNodes(entity);
31976                         result.push.apply(result, map$3(filter(children, 'version'), 'id'));
31977                     } catch (err) {
31978                         /* eslint-disable no-console */
31979                         if (typeof console !== 'undefined') console.error(err);
31980                         /* eslint-enable no-console */
31981                     }
31982                 }
31983                 return result;
31984             }, clone(ids)));
31985         }
31986
31987
31988         // Reload modified entities into an alternate graph and check for conflicts..
31989         function loaded(err, result) {
31990             if (_errors.length) return;
31991
31992             if (err) {
31993                 _errors.push({
31994                     msg: err.message || err.responseText,
31995                     details: [ t('save.status_code', { code: err.status }) ]
31996                 });
31997                 showErrors();
31998
31999             } else {
32000                 var loadMore = [];
32001
32002                 result.data.forEach(function(entity) {
32003                     remoteGraph.replace(entity);
32004                     _loaded[entity.id] = true;
32005                     _toLoad = without(_toLoad, entity.id);
32006
32007                     if (!entity.visible) return;
32008
32009                     // Because loadMultiple doesn't download /full like loadEntity,
32010                     // need to also load children that aren't already being checked..
32011                     var i, id;
32012                     if (entity.type === 'way') {
32013                         for (i = 0; i < entity.nodes.length; i++) {
32014                             id = entity.nodes[i];
32015                             if (_loaded[id] === undefined) {
32016                                 _loaded[id] = false;
32017                                 loadMore.push(id);
32018                             }
32019                         }
32020                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
32021                         for (i = 0; i < entity.members.length; i++) {
32022                             id = entity.members[i].id;
32023                             if (_loaded[id] === undefined) {
32024                                 _loaded[id] = false;
32025                                 loadMore.push(id);
32026                             }
32027                         }
32028                     }
32029                 });
32030
32031                 _toLoadCount += result.data.length;
32032                 _toLoadTotal += loadMore.length;
32033                 showProgress(_toLoadCount, _toLoadTotal);
32034
32035                 if (loadMore.length) {
32036                     _toLoad.push.apply(_toLoad, loadMore);
32037                     osm.loadMultiple(loadMore, loaded);
32038                 }
32039
32040                 if (!_toLoad.length) {
32041                     detectConflicts();
32042                 }
32043             }
32044         }
32045
32046
32047         function detectConflicts() {
32048             function choice(id, text, action) {
32049                 return { id: id, text: text, action: function() { history.replace(action); } };
32050             }
32051             function formatUser(d) {
32052                 return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
32053             }
32054             function entityName(entity) {
32055                 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
32056             }
32057
32058             function sameVersions(local$$1, remote) {
32059                 if (local$$1.version !== remote.version) return false;
32060
32061                 if (local$$1.type === 'way') {
32062                     var children = union(local$$1.nodes, remote.nodes);
32063                     for (var i = 0; i < children.length; i++) {
32064                         var a = localGraph.hasEntity(children[i]);
32065                         var b = remoteGraph.hasEntity(children[i]);
32066                         if (a && b && a.version !== b.version) return false;
32067                     }
32068                 }
32069
32070                 return true;
32071             }
32072
32073             _toCheck.forEach(function(id) {
32074                 var local$$1 = localGraph.entity(id);
32075                 var remote = remoteGraph.entity(id);
32076
32077                 if (sameVersions(local$$1, remote)) return;
32078
32079                 var action = actionMergeRemoteChanges;
32080                 var merge = action(id, localGraph, remoteGraph, formatUser);
32081
32082                 history.replace(merge);
32083
32084                 var mergeConflicts = merge.conflicts();
32085                 if (!mergeConflicts.length) return;  // merged safely
32086
32087                 var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
32088                 var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
32089                 var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
32090                 var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
32091
32092                 _conflicts.push({
32093                     id: id,
32094                     name: entityName(local$$1),
32095                     details: mergeConflicts,
32096                     chosen: 1,
32097                     choices: [
32098                         choice(id, keepMine, forceLocal),
32099                         choice(id, keepTheirs, forceRemote)
32100                     ]
32101                 });
32102             });
32103
32104             upload(changeset);
32105         }
32106     }
32107
32108
32109     function upload(changeset) {
32110         var osm = context.connection();
32111         if (!osm) {
32112             _errors.push({ msg: 'No OSM Service' });
32113         }
32114
32115         if (_conflicts.length) {
32116             _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
32117             showConflicts(changeset);
32118
32119         } else if (_errors.length) {
32120             showErrors();
32121
32122         } else {
32123             var history = context.history();
32124             var changes = history.changes(actionDiscardTags(history.difference()));
32125             if (changes.modified.length || changes.created.length || changes.deleted.length) {
32126                 osm.putChangeset(changeset, changes, uploadCallback);
32127             } else {        // changes were insignificant or reverted by user
32128                 d3_select('.inspector-wrap *').remove();
32129                 loading.close();
32130                 _isSaving = false;
32131                 context.flush();
32132                 cancel();
32133             }
32134         }
32135     }
32136
32137
32138     function uploadCallback(err, changeset) {
32139         if (err) {
32140             if (err.status === 409) {          // 409 Conflict
32141                 save(changeset, true, true);   // tryAgain = true, checkConflicts = true
32142             } else {
32143                 _errors.push({
32144                     msg: err.message || err.responseText,
32145                     details: [ t('save.status_code', { code: err.status }) ]
32146                 });
32147                 showErrors();
32148             }
32149
32150         } else {
32151             context.history().clearSaved();
32152             success(changeset);
32153             // Add delay to allow for postgres replication #1646 #2678
32154             window.setTimeout(function() {
32155                 d3_select('.inspector-wrap *').remove();
32156                 loading.close();
32157                 _isSaving = false;
32158                 context.flush();
32159             }, 2500);
32160         }
32161     }
32162
32163
32164     function showProgress(num, total) {
32165         var modal = context.container().select('.loading-modal .modal-section');
32166         var progress = modal.selectAll('.progress')
32167             .data([0]);
32168
32169         // enter/update
32170         progress.enter()
32171             .append('div')
32172             .attr('class', 'progress')
32173             .merge(progress)
32174             .text(t('save.conflict_progress', { num: num, total: total }));
32175     }
32176
32177
32178     function showConflicts(changeset) {
32179         var history = context.history();
32180         var selection$$1 = context.container()
32181             .select('#sidebar')
32182             .append('div')
32183             .attr('class','sidebar-component');
32184
32185         loading.close();
32186         _isSaving = false;
32187
32188         var ui = uiConflicts(context)
32189             .conflictList(_conflicts)
32190             .origChanges(_origChanges)
32191             .on('cancel', function() {
32192                 history.pop();
32193                 selection$$1.remove();
32194                 keybindingOn();
32195             })
32196             .on('save', function() {
32197                 for (var i = 0; i < _conflicts.length; i++) {
32198                     if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
32199                         var entity = context.hasEntity(_conflicts[i].id);
32200                         if (entity && entity.type === 'way') {
32201                             var children = uniq(entity.nodes);
32202                             for (var j = 0; j < children.length; j++) {
32203                                 history.replace(actionRevert(children[j]));
32204                             }
32205                         }
32206                         history.replace(actionRevert(_conflicts[i].id));
32207                     }
32208                 }
32209
32210                 selection$$1.remove();
32211                 save(changeset, true, false);  // tryAgain = true, checkConflicts = false
32212             });
32213
32214         selection$$1.call(ui);
32215     }
32216
32217
32218     function showErrors() {
32219         keybindingOn();
32220         context.history().pop();
32221         loading.close();
32222         _isSaving = false;
32223
32224         var selection$$1 = uiConfirm(context.container());
32225         selection$$1
32226             .select('.modal-section.header')
32227             .append('h3')
32228             .text(t('save.error'));
32229
32230         addErrors(selection$$1, _errors);
32231         selection$$1.okButton();
32232     }
32233
32234
32235     function addErrors(selection$$1, data) {
32236         var message = selection$$1
32237             .select('.modal-section.message-text');
32238
32239         var items = message
32240             .selectAll('.error-container')
32241             .data(data);
32242
32243         var enter = items.enter()
32244             .append('div')
32245             .attr('class', 'error-container');
32246
32247         enter
32248             .append('a')
32249             .attr('class', 'error-description')
32250             .attr('href', '#')
32251             .classed('hide-toggle', true)
32252             .text(function(d) { return d.msg || t('save.unknown_error_details'); })
32253             .on('click', function() {
32254                 event.preventDefault();
32255
32256                 var error = d3_select(this);
32257                 var detail = d3_select(this.nextElementSibling);
32258                 var exp = error.classed('expanded');
32259
32260                 detail.style('display', exp ? 'none' : 'block');
32261                 error.classed('expanded', !exp);
32262             });
32263
32264         var details = enter
32265             .append('div')
32266             .attr('class', 'error-detail-container')
32267             .style('display', 'none');
32268
32269         details
32270             .append('ul')
32271             .attr('class', 'error-detail-list')
32272             .selectAll('li')
32273             .data(function(d) { return d.details || []; })
32274             .enter()
32275             .append('li')
32276             .attr('class', 'error-detail-item')
32277             .text(function(d) { return d; });
32278
32279         items.exit()
32280             .remove();
32281     }
32282
32283
32284     function success(changeset) {
32285         commit.reset();
32286
32287         var ui = uiSuccess(context)
32288             .changeset(changeset)
32289             .on('cancel', function() { context.ui().sidebar.hide(); });
32290
32291         context.enter(modeBrowse(context).sidebar(ui));
32292     }
32293
32294
32295     function keybindingOn() {
32296         d3_select(document)
32297             .call(keybinding.on('⎋', cancel, true));
32298     }
32299
32300
32301     function keybindingOff() {
32302         d3_select(document)
32303             .call(keybinding.off);
32304     }
32305
32306
32307     mode.enter = function() {
32308         function done() {
32309             context.ui().sidebar.show(commit);
32310         }
32311
32312         keybindingOn();
32313
32314         context.container().selectAll('#content')
32315             .attr('class', 'inactive');
32316
32317         var osm = context.connection();
32318         if (!osm) {
32319             cancel();
32320             return;
32321         }
32322
32323         if (osm.authenticated()) {
32324             done();
32325         } else {
32326             osm.authenticate(function(err) {
32327                 if (err) {
32328                     cancel();
32329                 } else {
32330                     done();
32331                 }
32332             });
32333         }
32334     };
32335
32336
32337     mode.exit = function() {
32338         _isSaving = false;
32339
32340         keybindingOff();
32341
32342         context.container().selectAll('#content')
32343             .attr('class', 'active');
32344
32345         context.ui().sidebar.hide();
32346     };
32347
32348     return mode;
32349 }
32350
32351 /* Built-in method references for those with the same name as other `lodash` methods. */
32352 var nativeMin$1 = Math.min;
32353
32354 /**
32355  * The base implementation of methods like `_.intersection`, without support
32356  * for iteratee shorthands, that accepts an array of arrays to inspect.
32357  *
32358  * @private
32359  * @param {Array} arrays The arrays to inspect.
32360  * @param {Function} [iteratee] The iteratee invoked per element.
32361  * @param {Function} [comparator] The comparator invoked per element.
32362  * @returns {Array} Returns the new array of shared values.
32363  */
32364 function baseIntersection(arrays, iteratee, comparator) {
32365   var includes = comparator ? arrayIncludesWith : arrayIncludes,
32366       length = arrays[0].length,
32367       othLength = arrays.length,
32368       othIndex = othLength,
32369       caches = Array(othLength),
32370       maxLength = Infinity,
32371       result = [];
32372
32373   while (othIndex--) {
32374     var array = arrays[othIndex];
32375     if (othIndex && iteratee) {
32376       array = arrayMap(array, baseUnary(iteratee));
32377     }
32378     maxLength = nativeMin$1(array.length, maxLength);
32379     caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
32380       ? new SetCache(othIndex && array)
32381       : undefined;
32382   }
32383   array = arrays[0];
32384
32385   var index = -1,
32386       seen = caches[0];
32387
32388   outer:
32389   while (++index < length && result.length < maxLength) {
32390     var value = array[index],
32391         computed = iteratee ? iteratee(value) : value;
32392
32393     value = (comparator || value !== 0) ? value : 0;
32394     if (!(seen
32395           ? cacheHas(seen, computed)
32396           : includes(result, computed, comparator)
32397         )) {
32398       othIndex = othLength;
32399       while (--othIndex) {
32400         var cache = caches[othIndex];
32401         if (!(cache
32402               ? cacheHas(cache, computed)
32403               : includes(arrays[othIndex], computed, comparator))
32404             ) {
32405           continue outer;
32406         }
32407       }
32408       if (seen) {
32409         seen.push(computed);
32410       }
32411       result.push(value);
32412     }
32413   }
32414   return result;
32415 }
32416
32417 /**
32418  * Casts `value` to an empty array if it's not an array like object.
32419  *
32420  * @private
32421  * @param {*} value The value to inspect.
32422  * @returns {Array|Object} Returns the cast array-like object.
32423  */
32424 function castArrayLikeObject(value) {
32425   return isArrayLikeObject(value) ? value : [];
32426 }
32427
32428 /**
32429  * Creates an array of unique values that are included in all given arrays
32430  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
32431  * for equality comparisons. The order and references of result values are
32432  * determined by the first array.
32433  *
32434  * @static
32435  * @memberOf _
32436  * @since 0.1.0
32437  * @category Array
32438  * @param {...Array} [arrays] The arrays to inspect.
32439  * @returns {Array} Returns the new array of intersecting values.
32440  * @example
32441  *
32442  * _.intersection([2, 1], [2, 3]);
32443  * // => [2]
32444  */
32445 var intersection = baseRest(function(arrays) {
32446   var mapped = arrayMap(arrays, castArrayLikeObject);
32447   return (mapped.length && mapped[0] === arrays[0])
32448     ? baseIntersection(mapped)
32449     : [];
32450 });
32451
32452 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
32453 // For example, ⌘Z -> Ctrl+Z
32454 var uiCmd = function (code) {
32455     var detected = utilDetect();
32456
32457     if (detected.os === 'mac') {
32458         return code;
32459     }
32460
32461     if (detected.os === 'win') {
32462         if (code === '⌘⇧Z') return 'Ctrl+Y';
32463     }
32464
32465     var result = '',
32466         replacements = {
32467             '⌘': 'Ctrl',
32468             '⇧': 'Shift',
32469             '⌥': 'Alt',
32470             '⌫': 'Backspace',
32471             '⌦': 'Delete'
32472         };
32473
32474     for (var i = 0; i < code.length; i++) {
32475         if (code[i] in replacements) {
32476             result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
32477         } else {
32478             result += code[i];
32479         }
32480     }
32481
32482     return result;
32483 };
32484
32485
32486 // return a display-focused string for a given keyboard code
32487 uiCmd.display = function(code) {
32488     if (code.length !== 1) return code;
32489
32490     var detected = utilDetect();
32491     var mac = (detected.os === 'mac');
32492     var replacements = {
32493         '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
32494         '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
32495         '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
32496         '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
32497         '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
32498         '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
32499         '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
32500         '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
32501         '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
32502         '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
32503         '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
32504         '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
32505     };
32506
32507     return replacements[code] || code;
32508 };
32509
32510 var relatedParent;
32511
32512
32513 function modeSelect(context, selectedIDs) {
32514     var mode = {
32515         id: 'select',
32516         button: 'browse'
32517     };
32518
32519     var keybinding = d3keybinding('select');
32520     var timeout = null;
32521     var behaviors = [
32522         behaviorCopy(context),
32523         behaviorPaste(context),
32524         behaviorBreathe(context),
32525         behaviorHover(context),
32526         behaviorSelect(context),
32527         behaviorLasso(context),
32528         modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior
32529     ];
32530     var inspector;
32531     var editMenu;
32532     var newFeature = false;
32533     var suppressMenu = true;
32534     var follow = false;
32535
32536
32537     var wrap = context.container()
32538         .select('.inspector-wrap');
32539
32540
32541     function singular() {
32542         if (selectedIDs.length === 1) {
32543             return context.hasEntity(selectedIDs[0]);
32544         }
32545     }
32546
32547
32548     function checkSelectedIDs() {
32549         var ids = [];
32550         if (Array.isArray(selectedIDs)) {
32551             ids = selectedIDs.filter(function(id) {
32552                 return context.hasEntity(id);
32553             });
32554         }
32555
32556         if (ids.length) {
32557             selectedIDs = ids;
32558         } else {
32559             context.enter(modeBrowse(context));
32560         }
32561         return !!ids.length;
32562     }
32563
32564
32565     // find the common parent ways for nextVertex, previousVertex
32566     function commonParents() {
32567         var graph = context.graph();
32568         var commonParents = [];
32569
32570         for (var i = 0; i < selectedIDs.length; i++) {
32571             var entity = context.hasEntity(selectedIDs[i]);
32572             if (!entity || entity.geometry(graph) !== 'vertex') {
32573                 return [];  // selection includes some not vertexes
32574             }
32575
32576             var currParents = map$3(graph.parentWays(entity), 'id');
32577             if (!commonParents.length) {
32578                 commonParents = currParents;
32579                 continue;
32580             }
32581
32582             commonParents = intersection(commonParents, currParents);
32583             if (!commonParents.length) {
32584                 return [];
32585             }
32586         }
32587
32588         return commonParents;
32589     }
32590
32591
32592     function singularParent() {
32593         var parents = commonParents();
32594         if (!parents || parents.length === 0) {
32595             relatedParent = null;
32596             return null;
32597         }
32598
32599         // relatedParent is used when we visit a vertex with multiple
32600         // parents, and we want to remember which parent line we started on.
32601
32602         if (parents.length === 1) {
32603             relatedParent = parents[0];  // remember this parent for later
32604             return relatedParent;
32605         }
32606
32607         if (parents.indexOf(relatedParent) !== -1) {
32608             return relatedParent;   // prefer the previously seen parent
32609         }
32610
32611         return parents[0];
32612     }
32613
32614
32615     function closeMenu() {
32616         if (editMenu) {
32617             context.surface().call(editMenu.close);
32618         }
32619     }
32620
32621
32622     function positionMenu() {
32623         if (!editMenu) { return; }
32624
32625         var entity = singular();
32626         if (entity && context.geometry(entity.id) === 'relation') {
32627             suppressMenu = true;
32628         } else {
32629             var point$$1 = context.mouse();
32630             var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
32631
32632             if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
32633                 editMenu.center(point$$1);
32634             } else {
32635                 suppressMenu = true;
32636             }
32637         }
32638     }
32639
32640
32641     function showMenu() {
32642         closeMenu();
32643         if (editMenu) {
32644             context.surface().call(editMenu);
32645         }
32646     }
32647
32648
32649     function toggleMenu() {
32650         // deprecation warning - Radial Menu to be removed in iD v3
32651         if (d3_select('.edit-menu, .radial-menu').empty()) {
32652             positionMenu();
32653             showMenu();
32654         } else {
32655             closeMenu();
32656         }
32657     }
32658
32659
32660     mode.selectedIDs = function() {
32661         return selectedIDs;
32662     };
32663
32664
32665     mode.reselect = function() {
32666         if (!checkSelectedIDs()) return;
32667
32668         var surfaceNode = context.surface().node();
32669         if (surfaceNode.focus) {   // FF doesn't support it
32670             surfaceNode.focus();
32671         }
32672
32673         positionMenu();
32674         if (!suppressMenu) {
32675             showMenu();
32676         }
32677     };
32678
32679
32680     mode.newFeature = function(_) {
32681         if (!arguments.length) return newFeature;
32682         newFeature = _;
32683         return mode;
32684     };
32685
32686
32687     mode.suppressMenu = function(_) {
32688         if (!arguments.length) return suppressMenu;
32689         suppressMenu = _;
32690         return mode;
32691     };
32692
32693
32694     mode.follow = function(_) {
32695         if (!arguments.length) return follow;
32696         follow = _;
32697         return mode;
32698     };
32699
32700
32701     mode.enter = function() {
32702
32703         function update() {
32704             closeMenu();
32705             checkSelectedIDs();
32706         }
32707
32708
32709         function dblclick() {
32710             var target = d3_select(event.target);
32711
32712             var datum = target.datum();
32713             var entity = datum && datum.properties && datum.properties.entity;
32714             if (!entity) return;
32715
32716             if (entity instanceof osmWay && target.classed('target')) {
32717                 var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
32718                 var prev = entity.nodes[choice.index - 1];
32719                 var next = entity.nodes[choice.index];
32720
32721                 context.perform(
32722                     actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
32723                     t('operations.add.annotation.vertex')
32724                 );
32725
32726                 event.preventDefault();
32727                 event.stopPropagation();
32728
32729             } else if (entity.type === 'midpoint') {
32730                 context.perform(
32731                     actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
32732                     t('operations.add.annotation.vertex'));
32733
32734                 event.preventDefault();
32735                 event.stopPropagation();
32736             }
32737         }
32738
32739
32740         function selectElements(drawn) {
32741             if (!checkSelectedIDs()) return;
32742
32743             var surface = context.surface();
32744             var entity = singular();
32745
32746             if (entity && context.geometry(entity.id) === 'relation') {
32747                 suppressMenu = true;
32748                 return;
32749             }
32750
32751             surface.selectAll('.related')
32752                 .classed('related', false);
32753
32754             singularParent();
32755             if (relatedParent) {
32756                 surface.selectAll(utilEntitySelector([relatedParent]))
32757                     .classed('related', true);
32758             }
32759
32760             var selection$$1 = context.surface()
32761                 .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
32762
32763             if (selection$$1.empty()) {
32764                 // Return to browse mode if selected DOM elements have
32765                 // disappeared because the user moved them out of view..
32766                 var source = event && event.type === 'zoom' && event.sourceEvent;
32767                 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
32768                     context.enter(modeBrowse(context));
32769                 }
32770             } else {
32771                 selection$$1
32772                     .classed('selected', true);
32773             }
32774         }
32775
32776
32777         function esc() {
32778             context.enter(modeBrowse(context));
32779         }
32780
32781
32782         function firstVertex() {
32783             event.preventDefault();
32784             var entity = singular();
32785             var parent = singularParent();
32786             var way;
32787
32788             if (entity && entity.type === 'way') {
32789                 way = entity;
32790             } else if (parent) {
32791                 way = context.entity(parent);
32792             }
32793
32794             if (way) {
32795                 context.enter(
32796                     modeSelect(context, [way.first()]).follow(true)
32797                 );
32798             }
32799         }
32800
32801
32802         function lastVertex() {
32803             event.preventDefault();
32804             var entity = singular();
32805             var parent = singularParent();
32806             var way;
32807
32808             if (entity && entity.type === 'way') {
32809                 way = entity;
32810             } else if (parent) {
32811                 way = context.entity(parent);
32812             }
32813
32814             if (way) {
32815                 context.enter(
32816                     modeSelect(context, [way.last()]).follow(true)
32817                 );
32818             }
32819         }
32820
32821
32822         function previousVertex() {
32823             event.preventDefault();
32824             var parent = singularParent();
32825             if (!parent) return;
32826
32827             var way = context.entity(parent);
32828             var length = way.nodes.length;
32829             var curr = way.nodes.indexOf(selectedIDs[0]);
32830             var index = -1;
32831
32832             if (curr > 0) {
32833                 index = curr - 1;
32834             } else if (way.isClosed()) {
32835                 index = length - 2;
32836             }
32837
32838             if (index !== -1) {
32839                 context.enter(
32840                     modeSelect(context, [way.nodes[index]]).follow(true)
32841                 );
32842             }
32843         }
32844
32845
32846         function nextVertex() {
32847             event.preventDefault();
32848             var parent = singularParent();
32849             if (!parent) return;
32850
32851             var way = context.entity(parent);
32852             var length = way.nodes.length;
32853             var curr = way.nodes.indexOf(selectedIDs[0]);
32854             var index = -1;
32855
32856             if (curr < length - 1) {
32857                 index = curr + 1;
32858             } else if (way.isClosed()) {
32859                 index = 0;
32860             }
32861
32862             if (index !== -1) {
32863                 context.enter(
32864                     modeSelect(context, [way.nodes[index]]).follow(true)
32865                 );
32866             }
32867         }
32868
32869
32870         function nextParent() {
32871             event.preventDefault();
32872             var parents = uniq(commonParents());
32873             if (!parents || parents.length < 2) return;
32874
32875             var index = parents.indexOf(relatedParent);
32876             if (index < 0 || index > parents.length - 2) {
32877                 relatedParent = parents[0];
32878             } else {
32879                 relatedParent = parents[index + 1];
32880             }
32881
32882             var surface = context.surface();
32883             surface.selectAll('.related')
32884                 .classed('related', false);
32885
32886             if (relatedParent) {
32887                 surface.selectAll(utilEntitySelector([relatedParent]))
32888                     .classed('related', true);
32889             }
32890         }
32891
32892
32893         if (!checkSelectedIDs()) return;
32894
32895         var operations = without(values$1(Operations), operationDelete)
32896             .map(function(o) { return o(selectedIDs, context); })
32897             .filter(function(o) { return o.available(); });
32898
32899         // deprecation warning - Radial Menu to be removed in iD v3
32900         var isRadialMenu = context.storage('edit-menu-style') === 'radial';
32901         if (isRadialMenu) {
32902             operations = operations.slice(0,7);
32903             operations.unshift(operationDelete(selectedIDs, context));
32904         } else {
32905             operations.push(operationDelete(selectedIDs, context));
32906         }
32907
32908         operations.forEach(function(operation) {
32909             if (operation.behavior) {
32910                 behaviors.push(operation.behavior);
32911             }
32912         });
32913
32914         behaviors.forEach(function(behavior) {
32915             context.install(behavior);
32916         });
32917
32918         keybinding
32919             .on(['[', 'pgup'], previousVertex)
32920             .on([']', 'pgdown'], nextVertex)
32921             .on(['{', uiCmd('⌘['), 'home'], firstVertex)
32922             .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
32923             .on(['\\', 'pause'], nextParent)
32924             .on('⎋', esc, true)
32925             .on('space', toggleMenu);
32926
32927         d3_select(document)
32928             .call(keybinding);
32929
32930
32931         // deprecation warning - Radial Menu to be removed in iD v3
32932         editMenu = isRadialMenu
32933             ? uiRadialMenu(context, operations)
32934             : uiEditMenu(context, operations);
32935
32936         context.ui().sidebar
32937             .select(singular() ? singular().id : null, newFeature);
32938
32939         context.history()
32940             .on('undone.select', update)
32941             .on('redone.select', update);
32942
32943         context.map()
32944             .on('move.select', closeMenu)
32945             .on('drawn.select', selectElements);
32946
32947         context.surface()
32948             .on('dblclick.select', dblclick);
32949
32950
32951         selectElements();
32952
32953         if (selectedIDs.length > 1) {
32954             var entities = uiSelectionList(context, selectedIDs);
32955             context.ui().sidebar.show(entities);
32956         }
32957
32958         if (follow) {
32959             var extent = geoExtent$$1();
32960             var graph = context.graph();
32961             selectedIDs.forEach(function(id) {
32962                 var entity = context.entity(id);
32963                 extent._extend(entity.extent(graph));
32964             });
32965
32966             var loc = extent.center();
32967             context.map().centerEase(loc);
32968         } else if (singular() && singular().type === 'way') {
32969             context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
32970         }
32971
32972         timeout = window.setTimeout(function() {
32973             positionMenu();
32974             if (!suppressMenu) {
32975                 showMenu();
32976             }
32977         }, 270);  /* after any centerEase completes */
32978
32979     };
32980
32981
32982     mode.exit = function() {
32983         if (timeout) window.clearTimeout(timeout);
32984         if (inspector) wrap.call(inspector.close);
32985
32986         behaviors.forEach(function(behavior) {
32987             context.uninstall(behavior);
32988         });
32989
32990         keybinding.off();
32991         closeMenu();
32992         editMenu = undefined;
32993
32994         context.history()
32995             .on('undone.select', null)
32996             .on('redone.select', null);
32997
32998         var surface = context.surface();
32999
33000         surface
33001             .on('dblclick.select', null);
33002
33003         surface
33004             .selectAll('.selected')
33005             .classed('selected', false);
33006
33007         surface
33008             .selectAll('.related')
33009             .classed('related', false);
33010
33011         context.map().on('drawn.select', null);
33012         context.ui().sidebar.hide();
33013     };
33014
33015
33016     return mode;
33017 }
33018
33019 function behaviorAddWay(context) {
33020     var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
33021         draw = behaviorDraw(context);
33022
33023     var addWay = function(surface) {
33024         draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
33025             .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
33026             .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
33027             .on('cancel', addWay.cancel)
33028             .on('finish', addWay.cancel);
33029
33030         context.map()
33031             .dblclickEnable(false);
33032
33033         surface.call(draw);
33034     };
33035
33036
33037     addWay.off = function(surface) {
33038         surface.call(draw.off);
33039     };
33040
33041
33042     addWay.cancel = function() {
33043         window.setTimeout(function() {
33044             context.map().dblclickEnable(true);
33045         }, 1000);
33046
33047         context.enter(modeBrowse(context));
33048     };
33049
33050
33051     addWay.tail = function(text) {
33052         draw.tail(text);
33053         return addWay;
33054     };
33055
33056
33057     return utilRebind(addWay, dispatch$$1, 'on');
33058 }
33059
33060 function behaviorBreathe() {
33061     var duration = 800,
33062         steps = 4,
33063         selector$$1 = '.selected.shadow, .selected .shadow',
33064         selected = d3_select(null),
33065         classed = '',
33066         params = {},
33067         done = false,
33068         timer$$1;
33069
33070
33071     function ratchetyInterpolator(a, b, steps, units) {
33072         a = parseFloat(a);
33073         b = parseFloat(b);
33074         var sample = quantize()
33075             .domain([0, 1])
33076             .range(d3_quantize(d3_interpolateNumber(a, b), steps));
33077
33078         return function(t) {
33079             return String(sample(t)) + (units || '');
33080         };
33081     }
33082
33083
33084     function reset(selection$$1) {
33085         selection$$1
33086             .style('stroke-opacity', null)
33087             .style('stroke-width', null)
33088             .style('fill-opacity', null)
33089             .style('r', null);
33090     }
33091
33092
33093     function setAnimationParams(transition, fromTo) {
33094         var toFrom = (fromTo === 'from' ? 'to' : 'from');
33095
33096         transition
33097             .styleTween('stroke-opacity', function(d) {
33098                 return ratchetyInterpolator(
33099                     params[d.id][toFrom].opacity,
33100                     params[d.id][fromTo].opacity,
33101                     steps
33102                 );
33103             })
33104             .styleTween('stroke-width', function(d) {
33105                 return ratchetyInterpolator(
33106                     params[d.id][toFrom].width,
33107                     params[d.id][fromTo].width,
33108                     steps,
33109                     'px'
33110                 );
33111             })
33112             .styleTween('fill-opacity', function(d) {
33113                 return ratchetyInterpolator(
33114                     params[d.id][toFrom].opacity,
33115                     params[d.id][fromTo].opacity,
33116                     steps
33117                 );
33118             })
33119             .styleTween('r', function(d) {
33120                 return ratchetyInterpolator(
33121                     params[d.id][toFrom].width,
33122                     params[d.id][fromTo].width,
33123                     steps,
33124                     'px'
33125                 );
33126             });
33127     }
33128
33129
33130     function calcAnimationParams(selection$$1) {
33131         selection$$1
33132             .call(reset)
33133             .each(function(d) {
33134                 var s = d3_select(this),
33135                     tag = s.node().tagName,
33136                     p = {'from': {}, 'to': {}},
33137                     opacity, width;
33138
33139                 // determine base opacity and width
33140                 if (tag === 'circle') {
33141                     opacity = parseFloat(s.style('fill-opacity') || 0.5);
33142                     width = parseFloat(s.style('r') || 15.5);
33143                 } else {
33144                     opacity = parseFloat(s.style('stroke-opacity') || 0.7);
33145                     width = parseFloat(s.style('stroke-width') || 10);
33146                 }
33147
33148                 // calculate from/to interpolation params..
33149                 p.tag = tag;
33150                 p.from.opacity = opacity * 0.6;
33151                 p.to.opacity = opacity * 1.25;
33152                 p.from.width = width * 0.7;
33153                 p.to.width = width * (tag === 'circle' ? 1.5 : 1);
33154                 params[d.id] = p;
33155             });
33156     }
33157
33158
33159     function run(surface, fromTo) {
33160         var toFrom = (fromTo === 'from' ? 'to' : 'from'),
33161             currSelected = surface.selectAll(selector$$1),
33162             currClassed = surface.attr('class');
33163
33164         if (done || currSelected.empty()) {
33165             selected.call(reset);
33166             return;
33167         }
33168
33169         if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
33170             selected.call(reset);
33171             classed = currClassed;
33172             selected = currSelected.call(calcAnimationParams);
33173         }
33174
33175         selected
33176             .transition()
33177             .duration(duration)
33178             .call(setAnimationParams, fromTo)
33179             .on('end', function() {
33180                 surface.call(run, toFrom);
33181             });
33182     }
33183
33184
33185     var breathe = function(surface) {
33186         done = false;
33187         timer$$1 = timer(function() {
33188             // wait for elements to actually become selected
33189             if (surface.selectAll(selector$$1).empty()) {
33190                 return false;
33191             }
33192
33193             surface.call(run, 'from');
33194             timer$$1.stop();
33195             return true;
33196         }, 20);
33197     };
33198
33199
33200     breathe.off = function() {
33201         done = true;
33202         if (timer$$1) {
33203             timer$$1.stop();
33204         }
33205         selected
33206             .interrupt()
33207             .call(reset);
33208     };
33209
33210
33211     return breathe;
33212 }
33213
33214 function behaviorCopy(context) {
33215     var keybinding = d3keybinding('copy');
33216
33217
33218     function groupEntities(ids, graph) {
33219         var entities = ids.map(function (id) { return graph.entity(id); });
33220         return assignIn({relation: [], way: [], node: []},
33221             groupBy(entities, function(entity) { return entity.type; }));
33222     }
33223
33224
33225     function getDescendants(id, graph, descendants) {
33226         var entity = graph.entity(id),
33227             i, children;
33228
33229         descendants = descendants || {};
33230
33231         if (entity.type === 'relation') {
33232             children = map$3(entity.members, 'id');
33233         } else if (entity.type === 'way') {
33234             children = entity.nodes;
33235         } else {
33236             children = [];
33237         }
33238
33239         for (i = 0; i < children.length; i++) {
33240             if (!descendants[children[i]]) {
33241                 descendants[children[i]] = true;
33242                 descendants = getDescendants(children[i], graph, descendants);
33243             }
33244         }
33245
33246         return descendants;
33247     }
33248
33249
33250     function doCopy() {
33251         if (!getSelectionText()) event.preventDefault();
33252
33253         var graph = context.graph(),
33254             selected = groupEntities(context.selectedIDs(), graph),
33255             canCopy = [],
33256             skip = {},
33257             i, entity;
33258
33259         for (i = 0; i < selected.relation.length; i++) {
33260             entity = selected.relation[i];
33261             if (!skip[entity.id] && entity.isComplete(graph)) {
33262                 canCopy.push(entity.id);
33263                 skip = getDescendants(entity.id, graph, skip);
33264             }
33265         }
33266         for (i = 0; i < selected.way.length; i++) {
33267             entity = selected.way[i];
33268             if (!skip[entity.id]) {
33269                 canCopy.push(entity.id);
33270                 skip = getDescendants(entity.id, graph, skip);
33271             }
33272         }
33273         for (i = 0; i < selected.node.length; i++) {
33274             entity = selected.node[i];
33275             if (!skip[entity.id]) {
33276                 canCopy.push(entity.id);
33277             }
33278         }
33279
33280         context.copyIDs(canCopy);
33281     }
33282
33283
33284     function copy() {
33285         keybinding.on(uiCmd('⌘C'), doCopy);
33286         d3_select(document).call(keybinding);
33287         return copy;
33288     }
33289
33290     function getSelectionText() {
33291         return window.getSelection().toString();
33292     }
33293
33294     copy.off = function() {
33295         d3_select(document).call(keybinding.off);
33296     };
33297
33298
33299     return copy;
33300 }
33301
33302 /*
33303     `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
33304
33305     * The `origin` function is expected to return an [x, y] tuple rather than an
33306       {x, y} object.
33307     * The events are `start`, `move`, and `end`.
33308       (https://github.com/mbostock/d3/issues/563)
33309     * The `start` event is not dispatched until the first cursor movement occurs.
33310       (https://github.com/mbostock/d3/pull/368)
33311     * The `move` event has a `point` and `delta` [x, y] tuple properties rather
33312       than `x`, `y`, `dx`, and `dy` properties.
33313     * The `end` event is not dispatched if no movement occurs.
33314     * An `off` function is available that unbinds the drag's internal event handlers.
33315  */
33316
33317 function behaviorDrag() {
33318     var dispatch$$1 = dispatch('start', 'move', 'end');
33319     var _origin = null;
33320     var _selector = '';
33321     var _event;
33322     var _target;
33323     var _surface;
33324
33325
33326     var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
33327     var d3_event_userSelectSuppress = function() {
33328             var selection$$1 = selection();
33329             var select$$1 = selection$$1.style(d3_event_userSelectProperty);
33330             selection$$1.style(d3_event_userSelectProperty, 'none');
33331             return function() {
33332                 selection$$1.style(d3_event_userSelectProperty, select$$1);
33333             };
33334         };
33335
33336
33337     function d3_eventCancel() {
33338         event.stopPropagation();
33339         event.preventDefault();
33340     }
33341
33342
33343     function eventOf(thiz, argumentz) {
33344         return function(e1) {
33345             e1.target = drag;
33346             customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
33347         };
33348     }
33349
33350
33351     function dragstart() {
33352         _target = this;
33353         _event = eventOf(_target, arguments);
33354
33355         var eventTarget = event.target;
33356         var touchId = event.touches ? event.changedTouches[0].identifier : null;
33357         var offset;
33358         var startOrigin = point$$1();
33359         var started = false;
33360         var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
33361
33362         d3_select(window)
33363             .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
33364             .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
33365
33366         if (_origin) {
33367             offset = _origin.apply(_target, arguments);
33368             offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
33369         } else {
33370             offset = [0, 0];
33371         }
33372
33373         if (touchId === null) {
33374             event.stopPropagation();
33375         }
33376
33377
33378         function point$$1() {
33379             var p = _surface || _target.parentNode;
33380             return touchId !== null ? d3_touches(p).filter(function(p) {
33381                 return p.identifier === touchId;
33382             })[0] : d3_mouse(p);
33383         }
33384
33385
33386         function dragmove() {
33387             var p = point$$1();
33388             var dx = p[0] - startOrigin[0];
33389             var dy = p[1] - startOrigin[1];
33390
33391             if (dx === 0 && dy === 0)
33392                 return;
33393
33394             startOrigin = p;
33395             d3_eventCancel();
33396
33397             if (!started) {
33398                 started = true;
33399                 _event({ type: 'start' });
33400             } else {
33401                 _event({
33402                     type: 'move',
33403                     point: [p[0] + offset[0],  p[1] + offset[1]],
33404                     delta: [dx, dy]
33405                 });
33406             }
33407         }
33408
33409
33410         function dragend() {
33411             if (started) {
33412                 _event({ type: 'end' });
33413
33414                 d3_eventCancel();
33415                 if (event.target === eventTarget) {
33416                     d3_select(window)
33417                         .on('click.drag', click, true);
33418                 }
33419             }
33420
33421             d3_select(window)
33422                 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
33423                 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
33424
33425             selectEnable();
33426         }
33427
33428
33429         function click() {
33430             d3_eventCancel();
33431             d3_select(window)
33432                 .on('click.drag', null);
33433         }
33434     }
33435
33436
33437     function drag(selection$$1) {
33438         var matchesSelector = utilPrefixDOMProperty('matchesSelector');
33439         var delegate = dragstart;
33440
33441         if (_selector) {
33442             delegate = function() {
33443                 var root = this;
33444                 var target = event.target;
33445                 for (; target && target !== root; target = target.parentNode) {
33446                     var datum = target.__data__;
33447                     var entity = datum && datum.properties && datum.properties.entity;
33448                     if (entity && target[matchesSelector](_selector)) {
33449                         return dragstart.call(target, entity);
33450                     }
33451                 }
33452             };
33453         }
33454
33455         selection$$1
33456             .on('mousedown.drag' + _selector, delegate)
33457             .on('touchstart.drag' + _selector, delegate);
33458     }
33459
33460
33461     drag.off = function(selection$$1) {
33462         selection$$1
33463             .on('mousedown.drag' + _selector, null)
33464             .on('touchstart.drag' + _selector, null);
33465     };
33466
33467
33468     drag.selector = function(_) {
33469         if (!arguments.length) return _selector;
33470         _selector = _;
33471         return drag;
33472     };
33473
33474
33475     drag.origin = function (_) {
33476         if (!arguments.length) return _origin;
33477         _origin = _;
33478         return drag;
33479     };
33480
33481
33482     drag.cancel = function() {
33483         d3_select(window)
33484             .on('mousemove.drag', null)
33485             .on('mouseup.drag', null);
33486         return drag;
33487     };
33488
33489
33490     drag.target = function() {
33491         if (!arguments.length) return _target;
33492         _target = arguments[0];
33493         _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
33494         return drag;
33495     };
33496
33497
33498     drag.surface = function() {
33499         if (!arguments.length) return _surface;
33500         _surface = arguments[0];
33501         return drag;
33502     };
33503
33504
33505     return utilRebind(drag, dispatch$$1, 'on');
33506 }
33507
33508 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
33509     var origWay = context.entity(wayId);
33510     var annotation = t((origWay.isDegenerate() ?
33511         'operations.start.annotation.' :
33512         'operations.continue.annotation.') + context.geometry(wayId)
33513     );
33514     var behavior = behaviorDraw(context);
33515     var _tempEdits = 0;
33516
33517     var end = osmNode({ loc: context.map().mouseCoordinates() });
33518
33519     // Push an annotated state for undo to return back to.
33520     // We must make sure to remove this edit later.
33521     context.perform(actionNoop(), annotation);
33522     _tempEdits++;
33523
33524     // Add the drawing node to the graph.
33525     // We must make sure to remove this edit later.
33526     context.perform(_actionAddDrawNode());
33527     _tempEdits++;
33528
33529
33530
33531     function keydown() {
33532         if (event.keyCode === d3keybinding.modifierCodes.alt) {
33533             if (context.surface().classed('nope')) {
33534                 context.surface()
33535                     .classed('nope-suppressed', true);
33536             }
33537             context.surface()
33538                 .classed('nope', false)
33539                 .classed('nope-disabled', true);
33540         }
33541     }
33542
33543
33544     function keyup() {
33545         if (event.keyCode === d3keybinding.modifierCodes.alt) {
33546             if (context.surface().classed('nope-suppressed')) {
33547                 context.surface()
33548                     .classed('nope', true);
33549             }
33550             context.surface()
33551                 .classed('nope-suppressed', false)
33552                 .classed('nope-disabled', false);
33553         }
33554     }
33555
33556
33557     // related code
33558     // - `mode/drag_node.js`     `doMode()`
33559     // - `behavior/draw.js`      `click()`
33560     // - `behavior/draw_way.js`  `move()`
33561     function move(datum) {
33562         context.surface().classed('nope-disabled', event.altKey);
33563
33564         var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
33565         var targetNodes = datum && datum.properties && datum.properties.nodes;
33566         var loc = context.map().mouseCoordinates();
33567
33568         if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
33569             loc = targetLoc;
33570
33571         } else if (targetNodes) {   // snap to way - a line target with `.nodes`
33572             var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
33573             if (choice) {
33574                 loc = choice.loc;
33575             }
33576         }
33577
33578         context.replace(actionMoveNode(end.id, loc));
33579         end = context.entity(end.id);
33580         checkGeometry(origWay.isClosed());    // skipLast = true when drawing areas
33581     }
33582
33583
33584     // Check whether this edit causes the geometry to break.
33585     // If so, class the surface with a nope cursor.
33586     // `skipLast` - include closing segment in the check, see #4655
33587     function checkGeometry(skipLast) {
33588         var nopeDisabled = context.surface().classed('nope-disabled');
33589         var isInvalid = isInvalidGeometry(end, context.graph(), skipLast);
33590
33591         if (nopeDisabled) {
33592             context.surface()
33593                 .classed('nope', false)
33594                 .classed('nope-suppressed', isInvalid);
33595         } else {
33596             context.surface()
33597                 .classed('nope', isInvalid)
33598                 .classed('nope-suppressed', false);
33599         }
33600     }
33601
33602
33603     function isInvalidGeometry(entity, graph, skipLast) {
33604         var parents = graph.parentWays(entity);
33605
33606         for (var i = 0; i < parents.length; i++) {
33607             var parent = parents[i];
33608             var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
33609             if (skipLast)  nodes.pop();   // disregard closing segment - #4655
33610             if (geoHasSelfIntersections(nodes, entity.id)) {
33611                 return true;
33612             }
33613         }
33614
33615         return false;
33616     }
33617
33618
33619     function undone() {
33620         // Undo popped the history back to the initial annotated no-op edit.
33621         // Remove initial no-op edit and whatever edit happened immediately before it.
33622         context.pop(2);
33623         _tempEdits = 0;
33624
33625         if (context.hasEntity(wayId)) {
33626             context.enter(mode);
33627         } else {
33628             context.enter(modeBrowse(context));
33629         }
33630     }
33631
33632
33633     function setActiveElements() {
33634         context.surface().selectAll('.' + end.id)
33635             .classed('active', true);
33636     }
33637
33638
33639     var drawWay = function(surface) {
33640         behavior
33641             .on('move', move)
33642             .on('click', drawWay.add)
33643             .on('clickWay', drawWay.addWay)
33644             .on('clickNode', drawWay.addNode)
33645             .on('undo', context.undo)
33646             .on('cancel', drawWay.cancel)
33647             .on('finish', drawWay.finish);
33648
33649         d3_select(window)
33650             .on('keydown.drawWay', keydown)
33651             .on('keyup.drawWay', keyup);
33652
33653         context.map()
33654             .dblclickEnable(false)
33655             .on('drawn.draw', setActiveElements);
33656
33657         setActiveElements();
33658
33659         surface.call(behavior);
33660
33661         context.history()
33662             .on('undone.draw', undone);
33663     };
33664
33665
33666     drawWay.off = function(surface) {
33667         // Drawing was interrupted unexpectedly.
33668         // This can happen if the user changes modes,
33669         // clicks geolocate button, a hashchange event occurs, etc.
33670         if (_tempEdits) {
33671             context.pop(_tempEdits);
33672             while (context.graph() !== startGraph) {
33673                 context.pop();
33674             }
33675         }
33676
33677         context.map()
33678             .on('drawn.draw', null);
33679
33680         surface.call(behavior.off)
33681             .selectAll('.active')
33682             .classed('active', false);
33683
33684         surface
33685             .classed('nope', false)
33686             .classed('nope-suppressed', false)
33687             .classed('nope-disabled', false);
33688
33689         d3_select(window)
33690             .on('keydown.hover', null)
33691             .on('keyup.hover', null);
33692
33693         context.history()
33694             .on('undone.draw', null);
33695     };
33696
33697
33698     function _actionAddDrawNode() {
33699         return function(graph) {
33700             return graph
33701                 .replace(end)
33702                 .replace(origWay.addNode(end.id, index));
33703         };
33704     }
33705
33706
33707     function _actionReplaceDrawNode(newNode) {
33708         return function(graph) {
33709             return graph
33710                 .replace(origWay.addNode(newNode.id, index))
33711                 .remove(end);
33712         };
33713     }
33714
33715
33716     // Accept the current position of the drawing node and continue drawing.
33717     drawWay.add = function(loc, d) {
33718         if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33719             return;   // can't click here
33720         }
33721
33722         context.pop(_tempEdits);
33723         _tempEdits = 0;
33724
33725         context.perform(
33726             _actionAddDrawNode(),
33727             annotation
33728         );
33729
33730         checkGeometry(false);   // skipLast = false
33731         context.enter(mode);
33732     };
33733
33734
33735     // Connect the way to an existing way.
33736     drawWay.addWay = function(loc, edge, d) {
33737         if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33738             return;   // can't click here
33739         }
33740
33741         context.pop(_tempEdits);
33742         _tempEdits = 0;
33743
33744         context.perform(
33745             _actionAddDrawNode(),
33746             actionAddMidpoint({ loc: loc, edge: edge }, end),
33747             annotation
33748         );
33749
33750         checkGeometry(false);   // skipLast = false
33751         context.enter(mode);
33752     };
33753
33754
33755     // Connect the way to an existing node and continue drawing.
33756     drawWay.addNode = function(node, d) {
33757         if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33758             return;   // can't click here
33759         }
33760
33761         context.pop(_tempEdits);
33762         _tempEdits = 0;
33763
33764         context.perform(
33765             _actionReplaceDrawNode(node),
33766             annotation
33767         );
33768
33769         checkGeometry(false);   // skipLast = false
33770         context.enter(mode);
33771     };
33772
33773
33774     // Finish the draw operation, removing the temporary edits.
33775     // If the way has enough nodes to be valid, it's selected.
33776     // Otherwise, delete everything and return to browse mode.
33777     drawWay.finish = function() {
33778         checkGeometry(true);   // skipLast = true
33779         if (context.surface().classed('nope')) {
33780             return;   // can't click here
33781         }
33782
33783         context.pop(_tempEdits);
33784         _tempEdits = 0;
33785
33786         var way = context.hasEntity(wayId);
33787         if (!way || way.isDegenerate()) {
33788             drawWay.cancel();
33789             return;
33790         }
33791
33792         window.setTimeout(function() {
33793             context.map().dblclickEnable(true);
33794         }, 1000);
33795
33796         context.enter(modeSelect(context, [wayId]).newFeature(true));
33797     };
33798
33799
33800     // Cancel the draw operation, delete everything, and return to browse mode.
33801     drawWay.cancel = function() {
33802         context.pop(_tempEdits);
33803         _tempEdits = 0;
33804
33805         while (context.graph() !== startGraph) {
33806             context.pop();
33807         }
33808
33809         window.setTimeout(function() {
33810             context.map().dblclickEnable(true);
33811         }, 1000);
33812
33813         context.surface()
33814             .classed('nope', false)
33815             .classed('nope-disabled', false)
33816             .classed('nope-suppressed', false);
33817
33818         context.enter(modeBrowse(context));
33819     };
33820
33821
33822     drawWay.activeID = function() {
33823         if (!arguments.length) return end.id;
33824         // no assign
33825         return drawWay;
33826     };
33827
33828
33829     drawWay.tail = function(text) {
33830         behavior.tail(text);
33831         return drawWay;
33832     };
33833
33834
33835     return drawWay;
33836 }
33837
33838 /** Error message constants. */
33839 var FUNC_ERROR_TEXT$3 = 'Expected a function';
33840
33841 /**
33842  * Creates a throttled function that only invokes `func` at most once per
33843  * every `wait` milliseconds. The throttled function comes with a `cancel`
33844  * method to cancel delayed `func` invocations and a `flush` method to
33845  * immediately invoke them. Provide `options` to indicate whether `func`
33846  * should be invoked on the leading and/or trailing edge of the `wait`
33847  * timeout. The `func` is invoked with the last arguments provided to the
33848  * throttled function. Subsequent calls to the throttled function return the
33849  * result of the last `func` invocation.
33850  *
33851  * **Note:** If `leading` and `trailing` options are `true`, `func` is
33852  * invoked on the trailing edge of the timeout only if the throttled function
33853  * is invoked more than once during the `wait` timeout.
33854  *
33855  * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
33856  * until to the next tick, similar to `setTimeout` with a timeout of `0`.
33857  *
33858  * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
33859  * for details over the differences between `_.throttle` and `_.debounce`.
33860  *
33861  * @static
33862  * @memberOf _
33863  * @since 0.1.0
33864  * @category Function
33865  * @param {Function} func The function to throttle.
33866  * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
33867  * @param {Object} [options={}] The options object.
33868  * @param {boolean} [options.leading=true]
33869  *  Specify invoking on the leading edge of the timeout.
33870  * @param {boolean} [options.trailing=true]
33871  *  Specify invoking on the trailing edge of the timeout.
33872  * @returns {Function} Returns the new throttled function.
33873  * @example
33874  *
33875  * // Avoid excessively updating the position while scrolling.
33876  * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
33877  *
33878  * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
33879  * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
33880  * jQuery(element).on('click', throttled);
33881  *
33882  * // Cancel the trailing throttled invocation.
33883  * jQuery(window).on('popstate', throttled.cancel);
33884  */
33885 function throttle(func, wait, options) {
33886   var leading = true,
33887       trailing = true;
33888
33889   if (typeof func != 'function') {
33890     throw new TypeError(FUNC_ERROR_TEXT$3);
33891   }
33892   if (isObject(options)) {
33893     leading = 'leading' in options ? !!options.leading : leading;
33894     trailing = 'trailing' in options ? !!options.trailing : trailing;
33895   }
33896   return debounce(func, wait, {
33897     'leading': leading,
33898     'maxWait': wait,
33899     'trailing': trailing
33900   });
33901 }
33902
33903 function behaviorHash(context) {
33904     var s0 = null, // cached window.location.hash
33905         lat = 90 - 1e-8; // allowable latitude range
33906
33907
33908     var parser = function(map, s) {
33909         var q = utilStringQs(s);
33910         var args = (q.map || '').split('/').map(Number);
33911
33912         if (args.length < 3 || args.some(isNaN)) {
33913             return true; // replace bogus hash
33914
33915         } else if (s !== formatter(map).slice(1)) {   // hash has changed
33916             var mode = context.mode(),
33917                 dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
33918                 maxdist = 500;
33919
33920             // Don't allow the hash location to change too much while drawing
33921             // This can happen if the user accidently hit the back button.  #3996
33922             if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
33923                 context.enter(modeBrowse(context));
33924             }
33925
33926             map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
33927         }
33928     };
33929
33930
33931     var formatter = function(map) {
33932         var center = map.center(),
33933             zoom = map.zoom(),
33934             precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),
33935             q = omit(utilStringQs(window.location.hash.substring(1)),
33936                 ['comment', 'hashtags', 'walkthrough']
33937             ),
33938             newParams = {};
33939
33940         delete q.id;
33941         var selected = context.selectedIDs().filter(function(id) {
33942             return !context.entity(id).isNew();
33943         });
33944         if (selected.length) {
33945             newParams.id = selected.join(',');
33946         }
33947
33948         newParams.map = zoom.toFixed(2) +
33949             '/' + center[1].toFixed(precision) +
33950             '/' + center[0].toFixed(precision);
33951
33952         return '#' + utilQsString(assign(q, newParams), true);
33953     };
33954
33955
33956     function update() {
33957         if (context.inIntro()) return;
33958         var s1 = formatter(context.map());
33959         if (s0 !== s1) {
33960             window.location.replace(s0 = s1);  // don't recenter the map!
33961         }
33962     }
33963
33964
33965     var throttledUpdate = throttle(update, 500);
33966
33967
33968     function hashchange() {
33969         if (window.location.hash === s0) return;  // ignore spurious hashchange events
33970         if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
33971             update(); // replace bogus hash
33972         }
33973     }
33974
33975
33976     function hash() {
33977         context.map()
33978             .on('move.hash', throttledUpdate);
33979
33980         context
33981             .on('enter.hash', throttledUpdate);
33982
33983         d3_select(window)
33984             .on('hashchange.hash', hashchange);
33985
33986         if (window.location.hash) {
33987
33988             var q = utilStringQs(window.location.hash.substring(1));
33989
33990             if (q.id) {
33991                 context.zoomToEntity(q.id.split(',')[0], !q.map);
33992             }
33993
33994             if (q.comment) {
33995                 context.storage('comment', q.comment);
33996                 context.storage('commentDate', Date.now());
33997             }
33998
33999             if (q.hashtags) {
34000                 context.storage('hashtags', q.hashtags);
34001             }
34002
34003             if (q.walkthrough === 'true') {
34004                 hash.startWalkthrough = true;
34005             }
34006
34007             hashchange();
34008
34009             if (q.map) {
34010                 hash.hadHash = true;
34011             }
34012         }
34013     }
34014
34015
34016     hash.off = function() {
34017         throttledUpdate.cancel();
34018
34019         context.map()
34020             .on('move.hash', null);
34021
34022         context
34023             .on('enter.hash', null);
34024
34025         d3_select(window)
34026             .on('hashchange.hash', null);
34027
34028         window.location.hash = '';
34029     };
34030
34031
34032     return hash;
34033 }
34034
34035 function behaviorLasso(context) {
34036
34037     var behavior = function(selection$$1) {
34038         var lasso;
34039
34040
34041         function mousedown() {
34042             var button = 0;  // left
34043             if (event.button === button && event.shiftKey === true) {
34044                 lasso = null;
34045
34046                 d3_select(window)
34047                     .on('mousemove.lasso', mousemove)
34048                     .on('mouseup.lasso', mouseup);
34049
34050                 event.stopPropagation();
34051             }
34052         }
34053
34054
34055         function mousemove() {
34056             if (!lasso) {
34057                 lasso = uiLasso(context);
34058                 context.surface().call(lasso);
34059             }
34060
34061             lasso.p(context.mouse());
34062         }
34063
34064
34065         function normalize(a, b) {
34066             return [
34067                 [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
34068                 [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
34069         }
34070
34071
34072         function lassoed() {
34073             if (!lasso) return [];
34074
34075             var graph = context.graph(),
34076                 bounds = lasso.extent().map(context.projection.invert),
34077                 extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
34078
34079             return map$3(context.intersects(extent).filter(function(entity) {
34080                 return entity.type === 'node' &&
34081                     geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
34082                     !context.features().isHidden(entity, graph, entity.geometry(graph));
34083             }), 'id');
34084         }
34085
34086
34087         function mouseup() {
34088             d3_select(window)
34089                 .on('mousemove.lasso', null)
34090                 .on('mouseup.lasso', null);
34091
34092             if (!lasso) return;
34093
34094             var ids = lassoed();
34095             lasso.close();
34096
34097             if (ids.length) {
34098                 context.enter(modeSelect(context, ids));
34099             }
34100         }
34101
34102         selection$$1
34103             .on('mousedown.lasso', mousedown);
34104     };
34105
34106
34107     behavior.off = function(selection$$1) {
34108         selection$$1.on('mousedown.lasso', null);
34109     };
34110
34111
34112     return behavior;
34113 }
34114
34115 /* Creates a keybinding behavior for an operation */
34116 function behaviorOperation() {
34117     var _operation, keybinding;
34118
34119     var behavior = function () {
34120         if (_operation && _operation.available()) {
34121             keybinding = d3keybinding('behavior.key.' + _operation.id);
34122             keybinding.on(_operation.keys, function() {
34123                 event.preventDefault();
34124                 var disabled = _operation.disabled();
34125                 var flash;
34126
34127                 if (disabled) {
34128                     flash = uiFlash()
34129                         .duration(4000)
34130                         .iconName('#operation-' + _operation.id)
34131                         .iconClass('operation disabled')
34132                         .text(_operation.tooltip);
34133
34134                     flash();
34135
34136                 } else {
34137                     flash = uiFlash()
34138                         .duration(2000)
34139                         .iconName('#operation-' + _operation.id)
34140                         .iconClass('operation')
34141                         .text(_operation.annotation() || _operation.title);
34142
34143                     flash();
34144                     _operation();
34145                 }
34146             });
34147
34148             d3_select(document).call(keybinding);
34149         }
34150
34151         return behavior;
34152     };
34153
34154
34155     behavior.off = function() {
34156         if (keybinding) {
34157             d3_select(document).call(keybinding.off);
34158         }
34159     };
34160
34161
34162     behavior.which = function (_) {
34163         if (!arguments.length) return _operation;
34164         _operation = _;
34165         return behavior;
34166     };
34167
34168
34169     return behavior;
34170 }
34171
34172 /**
34173  * The base implementation of `_.invert` and `_.invertBy` which inverts
34174  * `object` with values transformed by `iteratee` and set by `setter`.
34175  *
34176  * @private
34177  * @param {Object} object The object to iterate over.
34178  * @param {Function} setter The function to set `accumulator` values.
34179  * @param {Function} iteratee The iteratee to transform values.
34180  * @param {Object} accumulator The initial inverted object.
34181  * @returns {Function} Returns `accumulator`.
34182  */
34183 function baseInverter(object, setter, iteratee, accumulator) {
34184   baseForOwn(object, function(value, key, object) {
34185     setter(accumulator, iteratee(value), key, object);
34186   });
34187   return accumulator;
34188 }
34189
34190 /**
34191  * Creates a function like `_.invertBy`.
34192  *
34193  * @private
34194  * @param {Function} setter The function to set accumulator values.
34195  * @param {Function} toIteratee The function to resolve iteratees.
34196  * @returns {Function} Returns the new inverter function.
34197  */
34198 function createInverter(setter, toIteratee) {
34199   return function(object, iteratee) {
34200     return baseInverter(object, setter, toIteratee(iteratee), {});
34201   };
34202 }
34203
34204 /** Used for built-in method references. */
34205 var objectProto$19 = Object.prototype;
34206
34207 /**
34208  * Used to resolve the
34209  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
34210  * of values.
34211  */
34212 var nativeObjectToString$2 = objectProto$19.toString;
34213
34214 /**
34215  * Creates an object composed of the inverted keys and values of `object`.
34216  * If `object` contains duplicate values, subsequent values overwrite
34217  * property assignments of previous values.
34218  *
34219  * @static
34220  * @memberOf _
34221  * @since 0.7.0
34222  * @category Object
34223  * @param {Object} object The object to invert.
34224  * @returns {Object} Returns the new inverted object.
34225  * @example
34226  *
34227  * var object = { 'a': 1, 'b': 2, 'c': 1 };
34228  *
34229  * _.invert(object);
34230  * // => { '1': 'c', '2': 'b' }
34231  */
34232 var invert = createInverter(function(result, value, key) {
34233   if (value != null &&
34234       typeof value.toString != 'function') {
34235     value = nativeObjectToString$2.call(value);
34236   }
34237
34238   result[value] = key;
34239 }, constant$13(identity$8));
34240
34241 /**
34242  * Creates an object with the same keys as `object` and values generated
34243  * by running each own enumerable string keyed property of `object` thru
34244  * `iteratee`. The iteratee is invoked with three arguments:
34245  * (value, key, object).
34246  *
34247  * @static
34248  * @memberOf _
34249  * @since 2.4.0
34250  * @category Object
34251  * @param {Object} object The object to iterate over.
34252  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
34253  * @returns {Object} Returns the new mapped object.
34254  * @see _.mapKeys
34255  * @example
34256  *
34257  * var users = {
34258  *   'fred':    { 'user': 'fred',    'age': 40 },
34259  *   'pebbles': { 'user': 'pebbles', 'age': 1 }
34260  * };
34261  *
34262  * _.mapValues(users, function(o) { return o.age; });
34263  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
34264  *
34265  * // The `_.property` iteratee shorthand.
34266  * _.mapValues(users, 'age');
34267  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
34268  */
34269 function mapValues(object, iteratee) {
34270   var result = {};
34271   iteratee = baseIteratee(iteratee, 3);
34272
34273   baseForOwn(object, function(value, key, object) {
34274     baseAssignValue(result, key, iteratee(value, key, object));
34275   });
34276   return result;
34277 }
34278
34279 function behaviorPaste(context) {
34280     var keybinding = d3keybinding('paste');
34281
34282
34283     function doPaste() {
34284         event.preventDefault();
34285
34286         var baseGraph = context.graph(),
34287             mouse = context.mouse(),
34288             projection = context.projection,
34289             viewport = geoExtent$$1(projection.clipExtent()).polygon();
34290
34291         if (!geoPointInPolygon(mouse, viewport)) return;
34292
34293         var extent = geoExtent$$1(),
34294             oldIDs = context.copyIDs(),
34295             oldGraph = context.copyGraph(),
34296             newIDs = [];
34297
34298         if (!oldIDs.length) return;
34299
34300         var action = actionCopyEntities(oldIDs, oldGraph);
34301         context.perform(action);
34302
34303         var copies = action.copies();
34304         var originals = invert(mapValues(copies, 'id'));
34305         for (var id in copies) {
34306             var oldEntity = oldGraph.entity(id),
34307                 newEntity = copies[id];
34308
34309             extent._extend(oldEntity.extent(oldGraph));
34310
34311             // Exclude child nodes from newIDs if their parent way was also copied.
34312             var parents = context.graph().parentWays(newEntity),
34313                 parentCopied = false;
34314             for (var i = 0; i < parents.length; i++) {
34315                 if (originals[parents[i].id]) {
34316                     parentCopied = true;
34317                     break;
34318                 }
34319             }
34320
34321             if (!parentCopied) {
34322                 newIDs.push(newEntity.id);
34323             }
34324         }
34325
34326         // Put pasted objects where mouse pointer is..
34327         var center = projection(extent.center()),
34328             delta = [ mouse[0] - center[0], mouse[1] - center[1] ];
34329
34330         context.perform(actionMove(newIDs, delta, projection));
34331         context.enter(modeMove$$1(context, newIDs, baseGraph));
34332     }
34333
34334
34335     function paste() {
34336         keybinding.on(uiCmd('⌘V'), doPaste);
34337         d3_select(document).call(keybinding);
34338         return paste;
34339     }
34340
34341
34342     paste.off = function() {
34343         d3_select(document).call(keybinding.off);
34344     };
34345
34346
34347     return paste;
34348 }
34349
34350 function behaviorSelect(context) {
34351     var lastMouse = null;
34352     var suppressMenu = true;
34353     var tolerance = 4;
34354     var p1 = null;
34355
34356
34357     function point$$1() {
34358         return d3_mouse(context.container().node());
34359     }
34360
34361
34362     function keydown() {
34363         var e = event;
34364         if (e && e.shiftKey) {
34365             context.surface()
34366                 .classed('behavior-multiselect', true);
34367         }
34368
34369         if (e && e.keyCode === 93) {  // context menu
34370             e.preventDefault();
34371             e.stopPropagation();
34372         }
34373     }
34374
34375
34376     function keyup() {
34377         var e = event;
34378         if (!e || !e.shiftKey) {
34379             context.surface()
34380                 .classed('behavior-multiselect', false);
34381         }
34382
34383
34384         if (e && e.keyCode === 93) {  // context menu
34385             e.preventDefault();
34386             e.stopPropagation();
34387             contextmenu();
34388         }
34389     }
34390
34391
34392     function mousedown() {
34393         if (!p1) p1 = point$$1();
34394         d3_select(window)
34395             .on('mouseup.select', mouseup, true);
34396
34397         var isShowAlways = +context.storage('edit-menu-show-always') === 1;
34398         suppressMenu = !isShowAlways;
34399     }
34400
34401
34402     function mousemove() {
34403         if (event) lastMouse = event;
34404     }
34405
34406
34407     function mouseup() {
34408         click();
34409     }
34410
34411
34412     function contextmenu() {
34413         var e = event;
34414         e.preventDefault();
34415         e.stopPropagation();
34416
34417         if (!+e.clientX && !+e.clientY) {
34418             if (lastMouse) {
34419                 e.sourceEvent = lastMouse;
34420             } else {
34421                 return;
34422             }
34423         }
34424
34425         if (!p1) p1 = point$$1();
34426         suppressMenu = false;
34427         click();
34428     }
34429
34430
34431     function click() {
34432         d3_select(window)
34433             .on('mouseup.select', null, true);
34434
34435         if (!p1) return;
34436         var p2 = point$$1();
34437         var dist = geoVecLength(p1, p2);
34438
34439         p1 = null;
34440         if (dist > tolerance) {
34441             return;
34442         }
34443
34444         var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
34445         var isShowAlways = +context.storage('edit-menu-show-always') === 1;
34446         var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
34447         var mode = context.mode();
34448
34449         var entity = datum && datum.properties && datum.properties.entity;
34450         if (entity) datum = entity;
34451
34452         if (datum && datum.type === 'midpoint') {
34453             datum = datum.parents[0];
34454         }
34455
34456         if (!(datum instanceof osmEntity$$1)) {
34457             // clicked nothing..
34458             if (!isMultiselect && mode.id !== 'browse') {
34459                 context.enter(modeBrowse(context));
34460             }
34461
34462         } else {
34463             // clicked an entity..
34464             var selectedIDs = context.selectedIDs();
34465
34466             if (!isMultiselect) {
34467                 if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
34468                     // multiple things already selected, just show the menu...
34469                     mode.suppressMenu(false).reselect();
34470                 } else {
34471                     // select a single thing..
34472                     context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
34473                 }
34474
34475             } else {
34476                 if (selectedIDs.indexOf(datum.id) !== -1) {
34477                     // clicked entity is already in the selectedIDs list..
34478                     if (!suppressMenu && !isShowAlways) {
34479                         // don't deselect clicked entity, just show the menu.
34480                         mode.suppressMenu(false).reselect();
34481                     } else {
34482                         // deselect clicked entity, then reenter select mode or return to browse mode..
34483                         selectedIDs = without(selectedIDs, datum.id);
34484                         context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
34485                     }
34486                 } else {
34487                     // clicked entity is not in the selected list, add it..
34488                     selectedIDs = selectedIDs.concat([datum.id]);
34489                     context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
34490                 }
34491             }
34492         }
34493
34494         // reset for next time..
34495         suppressMenu = true;
34496     }
34497
34498
34499     var behavior = function(selection$$1) {
34500         lastMouse = null;
34501         suppressMenu = true;
34502         p1 = null;
34503
34504         d3_select(window)
34505             .on('keydown.select', keydown)
34506             .on('keyup.select', keyup)
34507             .on('contextmenu.select-window', function() {
34508                 // Edge and IE really like to show the contextmenu on the
34509                 // menubar when user presses a keyboard menu button
34510                 // even after we've already preventdefaulted the key event.
34511                 var e = event;
34512                 if (+e.clientX === 0 && +e.clientY === 0) {
34513                     event.preventDefault();
34514                     event.stopPropagation();
34515                 }
34516             });
34517
34518         selection$$1
34519             .on('mousedown.select', mousedown)
34520             .on('mousemove.select', mousemove)
34521             .on('contextmenu.select', contextmenu);
34522
34523         if (event && event.shiftKey) {
34524             context.surface()
34525                 .classed('behavior-multiselect', true);
34526         }
34527     };
34528
34529
34530     behavior.off = function(selection$$1) {
34531         d3_select(window)
34532             .on('keydown.select', null)
34533             .on('keyup.select', null)
34534             .on('contextmenu.select-window', null)
34535             .on('mouseup.select', null, true);
34536
34537         selection$$1
34538             .on('mousedown.select', null)
34539             .on('mousemove.select', null)
34540             .on('contextmenu.select', null);
34541
34542         context.surface()
34543             .classed('behavior-multiselect', false);
34544     };
34545
34546
34547     return behavior;
34548 }
34549
34550 function d3geoTile() {
34551   var size = [960, 500],
34552       scale = 256,
34553       scaleExtent = [0, 20],
34554       translate = [size[0] / 2, size[1] / 2],
34555       zoomDelta = 0;
34556
34557   function bound(_) {
34558       return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
34559   }
34560
34561   function tile() {
34562     var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
34563         z0 = bound(Math.round(z + zoomDelta)),
34564         k = Math.pow(2, z - z0 + 8),
34565         origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
34566         tiles = [],
34567         cols = d3_range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
34568         rows = d3_range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
34569
34570     rows.forEach(function(y) {
34571       cols.forEach(function(x) {
34572         tiles.push([x, y, z0]);
34573       });
34574     });
34575
34576     tiles.translate = origin;
34577     tiles.scale = k;
34578
34579     return tiles;
34580   }
34581
34582   tile.scaleExtent = function(_) {
34583     if (!arguments.length) return scaleExtent;
34584     scaleExtent = _;
34585     return tile;
34586   };
34587
34588   tile.size = function(_) {
34589     if (!arguments.length) return size;
34590     size = _;
34591     return tile;
34592   };
34593
34594   tile.scale = function(_) {
34595     if (!arguments.length) return scale;
34596     scale = _;
34597     return tile;
34598   };
34599
34600   tile.translate = function(_) {
34601     if (!arguments.length) return translate;
34602     translate = _;
34603     return tile;
34604   };
34605
34606   tile.zoomDelta = function(_) {
34607     if (!arguments.length) return zoomDelta;
34608     zoomDelta = +_;
34609     return tile;
34610   };
34611
34612   return tile;
34613 }
34614
34615 /* global Mapillary:false */
34616
34617
34618 var apibase = 'https://a.mapillary.com/v3/',
34619     viewercss = 'mapillary-js/mapillary.min.css',
34620     viewerjs = 'mapillary-js/mapillary.min.js',
34621     clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi',
34622     maxResults = 1000,
34623     tileZoom = 14,
34624     dispatch$1 = dispatch('loadedImages', 'loadedSigns'),
34625     _mlyFallback = false,
34626     _mlyCache,
34627     _mlyClicks,
34628     _mlySelectedImage,
34629     _mlySignDefs,
34630     _mlySignSprite,
34631     _mlyViewer;
34632
34633
34634 function abortRequest(i) {
34635     i.abort();
34636 }
34637
34638
34639 function nearNullIsland(x, y, z) {
34640     if (z >= 7) {
34641         var center = Math.pow(2, z - 1),
34642             width = Math.pow(2, z - 6),
34643             min$$1 = center - (width / 2),
34644             max$$1 = center + (width / 2) - 1;
34645         return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
34646     }
34647     return false;
34648 }
34649
34650
34651 function maxPageAtZoom(z) {
34652     if (z < 15)   return 2;
34653     if (z === 15) return 5;
34654     if (z === 16) return 10;
34655     if (z === 17) return 20;
34656     if (z === 18) return 40;
34657     if (z > 18)   return 80;
34658 }
34659
34660
34661 function localeTimestamp(s) {
34662     if (!s) return null;
34663     var detected = utilDetect();
34664     var options = {
34665         day: 'numeric', month: 'short', year: 'numeric',
34666         hour: 'numeric', minute: 'numeric', second: 'numeric',
34667         timeZone: 'UTC'
34668     };
34669     var d = new Date(s);
34670     if (isNaN(d.getTime())) return null;
34671     return d.toLocaleString(detected.locale, options);
34672 }
34673
34674
34675 function getTiles(projection) {
34676     var s = projection.scale() * 2 * Math.PI,
34677         z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
34678         ts = 256 * Math.pow(2, z - tileZoom),
34679         origin = [
34680             s / 2 - projection.translate()[0],
34681             s / 2 - projection.translate()[1]];
34682
34683     return d3geoTile()
34684         .scaleExtent([tileZoom, tileZoom])
34685         .scale(s)
34686         .size(projection.clipExtent()[1])
34687         .translate(projection.translate())()
34688         .map(function(tile) {
34689             var x = tile[0] * ts - origin[0],
34690                 y = tile[1] * ts - origin[1];
34691
34692             return {
34693                 id: tile.toString(),
34694                 xyz: tile,
34695                 extent: geoExtent$$1(
34696                     projection.invert([x, y + ts]),
34697                     projection.invert([x + ts, y])
34698                 )
34699             };
34700         });
34701 }
34702
34703
34704 function loadTiles(which, url, projection) {
34705     var s = projection.scale() * 2 * Math.PI,
34706         currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
34707
34708     var tiles = getTiles(projection).filter(function(t) {
34709             return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
34710         });
34711
34712     filter(which.inflight, function(v, k) {
34713         var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
34714         if (!wanted) delete which.inflight[k];
34715         return !wanted;
34716     }).map(abortRequest);
34717
34718     tiles.forEach(function(tile) {
34719         loadNextTilePage(which, currZoom, url, tile);
34720     });
34721 }
34722
34723
34724 function loadNextTilePage(which, currZoom, url, tile) {
34725     var cache = _mlyCache[which],
34726         rect = tile.extent.rectangle(),
34727         maxPages = maxPageAtZoom(currZoom),
34728         nextPage = cache.nextPage[tile.id] || 0,
34729         nextURL = cache.nextURL[tile.id] || url +
34730             utilQsString({
34731                 per_page: maxResults,
34732                 page: nextPage,
34733                 client_id: clientId,
34734                 bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
34735             });
34736
34737     if (nextPage > maxPages) return;
34738
34739     var id = tile.id + ',' + String(nextPage);
34740     if (cache.loaded[id] || cache.inflight[id]) return;
34741     cache.inflight[id] = d3_request(nextURL)
34742         .mimeType('application/json')
34743         .response(function(xhr) {
34744             var linkHeader = xhr.getResponseHeader('Link');
34745             if (linkHeader) {
34746                 var pagination = parsePagination(xhr.getResponseHeader('Link'));
34747                 if (pagination.next) {
34748                     cache.nextURL[tile.id] = pagination.next;
34749                 }
34750             }
34751             return JSON.parse(xhr.responseText);
34752         })
34753         .get(function(err, data) {
34754             cache.loaded[id] = true;
34755             delete cache.inflight[id];
34756             if (err || !data.features || !data.features.length) return;
34757
34758             var features = data.features.map(function(feature) {
34759                 var loc = feature.geometry.coordinates,
34760                     d;
34761
34762                 if (which === 'images') {
34763                     d = {
34764                         loc: loc,
34765                         key: feature.properties.key,
34766                         ca: feature.properties.ca,
34767                         captured_at: feature.properties.captured_at,
34768                         captured_by: feature.properties.username,
34769                         pano: feature.properties.pano
34770                     };
34771                     cache.forImageKey[d.key] = d;     // cache imageKey -> image
34772
34773                 } else if (which === 'sequences') {
34774                     var sequenceKey = feature.properties.key;
34775                     cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
34776                     feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
34777                         cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
34778                     });
34779                     return false;  // because no `d` data worth loading into an rbush
34780
34781                 } else if (which === 'objects') {
34782                     d = {
34783                         loc: loc,
34784                         key: feature.properties.key,
34785                         value: feature.properties.value,
34786                         package: feature.properties.package,
34787                         detections: feature.properties.detections
34788                     };
34789
34790                     // cache imageKey -> detectionKey
34791                     feature.properties.detections.forEach(function(detection) {
34792                         var imageKey = detection.image_key;
34793                         var detectionKey = detection.detection_key;
34794                         if (!_mlyCache.detections[imageKey]) {
34795                             _mlyCache.detections[imageKey] = {};
34796                         }
34797                         if (!_mlyCache.detections[imageKey][detectionKey]) {
34798                             _mlyCache.detections[imageKey][detectionKey] = {};
34799                         }
34800                     });
34801                 }
34802
34803                 return {
34804                     minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
34805                 };
34806
34807             }).filter(Boolean);
34808
34809             cache.rtree.load(features);
34810
34811             if (which === 'images' || which === 'sequences') {
34812                 dispatch$1.call('loadedImages');
34813             } else if (which === 'objects') {
34814                 dispatch$1.call('loadedSigns');
34815             }
34816
34817             if (data.features.length === maxResults) {  // more pages to load
34818                 cache.nextPage[tile.id] = nextPage + 1;
34819                 loadNextTilePage(which, currZoom, url, tile);
34820             } else {
34821                 cache.nextPage[tile.id] = Infinity;     // no more pages to load
34822             }
34823         });
34824 }
34825
34826 // extract links to pages of API results
34827 function parsePagination(links) {
34828     return links.split(',').map(function(rel) {
34829         var elements = rel.split(';');
34830         if (elements.length === 2) {
34831             return [
34832                 /<(.+)>/.exec(elements[0])[1],
34833                 /rel="(.+)"/.exec(elements[1])[1]
34834                 ];
34835         } else {
34836             return ['',''];
34837         }
34838     }).reduce(function(pagination, val) {
34839         pagination[val[1]] = val[0];
34840         return pagination;
34841     }, {});
34842 }
34843
34844
34845 // partition viewport into `psize` x `psize` regions
34846 function partitionViewport(psize, projection) {
34847     var dimensions = projection.clipExtent()[1];
34848     psize = psize || 16;
34849     var cols = d3_range(0, dimensions[0], psize),
34850         rows = d3_range(0, dimensions[1], psize),
34851         partitions = [];
34852
34853     rows.forEach(function(y) {
34854         cols.forEach(function(x) {
34855             var min$$1 = [x, y + psize],
34856                 max$$1 = [x + psize, y];
34857             partitions.push(
34858                 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
34859         });
34860     });
34861
34862     return partitions;
34863 }
34864
34865
34866 // no more than `limit` results per partition.
34867 function searchLimited(psize, limit, projection, rtree) {
34868     limit = limit || 3;
34869
34870     var partitions = partitionViewport(psize, projection);
34871     var results;
34872
34873     // console.time('previous');
34874     results =  flatten(map$3(partitions, function(extent$$1) {
34875         return rtree.search(extent$$1.bbox())
34876             .slice(0, limit)
34877             .map(function(d) { return d.data; });
34878     }));
34879     // console.timeEnd('previous');
34880
34881     // console.time('new');
34882     // results = partitions.reduce(function(result, extent) {
34883     //     var found = rtree.search(extent.bbox())
34884     //         .map(function(d) { return d.data; })
34885     //         .sort(function(a, b) {
34886     //             return a.loc[1] - b.loc[1];
34887     //             // return a.key.localeCompare(b.key);
34888     //         })
34889     //         .slice(0, limit);
34890
34891     //     return (found.length ? result.concat(found) : result);
34892     // }, []);
34893     // console.timeEnd('new');
34894
34895     return results;
34896 }
34897
34898
34899
34900 var serviceMapillary = {
34901
34902     init: function() {
34903         if (!_mlyCache) {
34904             this.reset();
34905         }
34906
34907         this.event = utilRebind(this, dispatch$1, 'on');
34908     },
34909
34910     reset: function() {
34911         var cache = _mlyCache;
34912
34913         if (cache) {
34914             if (cache.images && cache.images.inflight) {
34915                 forEach(cache.images.inflight, abortRequest);
34916             }
34917             if (cache.objects && cache.objects.inflight) {
34918                 forEach(cache.objects.inflight, abortRequest);
34919             }
34920             if (cache.sequences && cache.sequences.inflight) {
34921                 forEach(cache.sequences.inflight, abortRequest);
34922             }
34923         }
34924
34925         _mlyCache = {
34926             images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
34927             objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
34928             sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} },
34929             detections: {}
34930         };
34931
34932         _mlySelectedImage = null;
34933         _mlyClicks = [];
34934     },
34935
34936
34937     images: function(projection) {
34938         var psize = 16, limit = 3;
34939         return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
34940     },
34941
34942
34943     signs: function(projection) {
34944         var psize = 32, limit = 3;
34945         return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
34946     },
34947
34948
34949     sequences: function(projection) {
34950         var viewport = projection.clipExtent();
34951         var min$$1 = [viewport[0][0], viewport[1][1]];
34952         var max$$1 = [viewport[1][0], viewport[0][1]];
34953         var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
34954         var sequenceKeys = {};
34955
34956         // all sequences for images in viewport
34957         _mlyCache.images.rtree.search(bbox)
34958             .forEach(function(d) {
34959                 var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
34960                 if (sequenceKey) {
34961                     sequenceKeys[sequenceKey] = true;
34962                 }
34963             });
34964
34965         // Return lineStrings for the sequences
34966         return Object.keys(sequenceKeys).map(function(sequenceKey) {
34967             return _mlyCache.sequences.lineString[sequenceKey];
34968         });
34969     },
34970
34971
34972     signsSupported: function() {
34973         var detected = utilDetect();
34974         if (detected.ie) return false;
34975         if ((detected.browser.toLowerCase() === 'safari') && (parseFloat(detected.version) < 10)) return false;
34976         return true;
34977     },
34978
34979
34980     signHTML: function(d) {
34981         if (!_mlySignDefs || !_mlySignSprite) return;
34982         var position = _mlySignDefs[d.value];
34983         if (!position) return '<div></div>';
34984         var iconStyle = [
34985             'background-image:url(' + _mlySignSprite + ')',
34986             'background-repeat:no-repeat',
34987             'height:' + position.height + 'px',
34988             'width:' + position.width + 'px',
34989             'background-position-x:-' + position.x + 'px',
34990             'background-position-y:-' + position.y + 'px',
34991         ];
34992
34993         return '<div style="' + iconStyle.join(';') +'"></div>';
34994     },
34995
34996
34997     loadImages: function(projection) {
34998         loadTiles('images', apibase + 'images?', projection);
34999         loadTiles('sequences', apibase + 'sequences?', projection);
35000     },
35001
35002
35003     loadSigns: function(context, projection) {
35004         // if we are looking at signs, we'll actually need to fetch images too
35005         loadTiles('images', apibase + 'images?', projection);
35006         loadTiles('objects', apibase + 'objects?', projection);
35007
35008         // load traffic sign defs
35009         if (!_mlySignDefs) {
35010             _mlySignSprite = context.asset('img/traffic-signs/traffic-signs.png');
35011             _mlySignDefs = {};
35012             d3_json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
35013                 if (err) return;
35014                 _mlySignDefs = data;
35015             });
35016         }
35017     },
35018
35019
35020     loadViewer: function(context) {
35021         // add mly-wrapper
35022         var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
35023             .data([0]);
35024
35025         var wrapEnter = wrap.enter()
35026             .append('div')
35027             .attr('id', 'mly')
35028             .attr('class', 'photo-wrapper mly-wrapper')
35029             .classed('hide', true);
35030
35031         wrapEnter
35032             .append('div')
35033             .attr('class', 'photo-attribution fillD');
35034
35035
35036         // load mapillary-viewercss
35037         d3_select('head').selectAll('#mapillary-viewercss')
35038             .data([0])
35039             .enter()
35040             .append('link')
35041             .attr('id', 'mapillary-viewercss')
35042             .attr('rel', 'stylesheet')
35043             .attr('href', context.asset(viewercss));
35044
35045         // load mapillary-viewerjs
35046         d3_select('head').selectAll('#mapillary-viewerjs')
35047             .data([0])
35048             .enter()
35049             .append('script')
35050             .attr('id', 'mapillary-viewerjs')
35051             .attr('src', context.asset(viewerjs));
35052     },
35053
35054
35055     showViewer: function() {
35056         var wrap = d3_select('#photoviewer')
35057             .classed('hide', false);
35058
35059         var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
35060
35061         if (isHidden) {
35062             wrap
35063                 .selectAll('.photo-wrapper:not(.mly-wrapper)')
35064                 .classed('hide', true);
35065
35066             wrap
35067                 .selectAll('.photo-wrapper.mly-wrapper')
35068                 .classed('hide', false);
35069
35070             _mlyViewer.resize();
35071         }
35072
35073         return this;
35074     },
35075
35076
35077     hideViewer: function() {
35078         _mlySelectedImage = null;
35079
35080         if (!_mlyFallback && _mlyViewer) {
35081             _mlyViewer.getComponent('sequence').stop();
35082         }
35083
35084         var viewer = d3_select('#photoviewer');
35085         if (!viewer.empty()) viewer.datum(null);
35086
35087         viewer
35088             .classed('hide', true)
35089             .selectAll('.photo-wrapper')
35090             .classed('hide', true);
35091
35092         d3_selectAll('.viewfield-group, .sequence, .icon-sign')
35093             .classed('selected', false);
35094
35095         return this.setStyles(null, true);
35096     },
35097
35098
35099     parsePagination: parsePagination,
35100
35101
35102     updateViewer: function(imageKey, context) {
35103         if (!imageKey) return this;
35104
35105         if (!_mlyViewer) {
35106             this.initViewer(imageKey, context);
35107         } else {
35108             _mlyViewer.moveToKey(imageKey)
35109                 .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
35110         }
35111
35112         return this;
35113     },
35114
35115
35116     initViewer: function(imageKey, context) {
35117         var that = this;
35118         if (Mapillary && imageKey) {
35119             var opts = {
35120                 baseImageSize: 320,
35121                 component: {
35122                     cover: false,
35123                     keyboard: false,
35124                     tag: true
35125                 }
35126             };
35127
35128             // Disable components requiring WebGL support
35129             if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
35130                 _mlyFallback = true;
35131                 opts.component = {
35132                     cover: false,
35133                     direction: false,
35134                     imagePlane: false,
35135                     keyboard: false,
35136                     mouse: false,
35137                     sequence: false,
35138                     tag: false,
35139                     image: true,        // fallback
35140                     navigation: true    // fallback
35141                 };
35142             }
35143
35144             _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
35145             _mlyViewer.on('nodechanged', nodeChanged);
35146             _mlyViewer.moveToKey(imageKey)
35147                 .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
35148         }
35149
35150         // nodeChanged: called after the viewer has changed images and is ready.
35151         //
35152         // There is some logic here to batch up clicks into a _mlyClicks array
35153         // because the user might click on a lot of markers quickly and nodechanged
35154         // may be called out of order asychronously.
35155         //
35156         // Clicks are added to the array in `selectedImage` and removed here.
35157         //
35158         function nodeChanged(node) {
35159             if (!_mlyFallback) {
35160                 _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
35161             }
35162
35163             var clicks = _mlyClicks;
35164             var index = clicks.indexOf(node.key);
35165             var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
35166
35167             if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
35168                 clicks.splice(index, 1);   // remove the click
35169                 // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
35170                 // one more time to update the detections and attribution..
35171                 if (node.key === selectedKey) {
35172                     that.selectImage(_mlySelectedImage, node.key, true);
35173                 }
35174             } else {             // `nodechanged` initiated from the Mapillary viewer controls..
35175                 var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
35176                 context.map().centerEase(loc);
35177                 that.selectImage(undefined, node.key, true);
35178             }
35179         }
35180     },
35181
35182
35183     // Pass the image datum itself in `d` or the `imageKey` string.
35184     // This allows images to be selected from places that dont have access
35185     // to the full image datum (like the street signs layer or the js viewer)
35186     selectImage: function(d, imageKey, fromViewer) {
35187         if (!d && imageKey) {
35188             // If the user clicked on something that's not an image marker, we
35189             // might get in here.. Cache lookup can fail, e.g. if the user
35190             // clicked a streetsign, but images are loading slowly asynchronously.
35191             // We'll try to carry on anyway if there is no datum.  There just
35192             // might be a delay before user sees detections, captured_at, etc.
35193             d = _mlyCache.images.forImageKey[imageKey];
35194         }
35195
35196         _mlySelectedImage = d;
35197         var viewer = d3_select('#photoviewer');
35198         if (!viewer.empty()) viewer.datum(d);
35199
35200         imageKey = (d && d.key) || imageKey;
35201         if (!fromViewer && imageKey) {
35202             _mlyClicks.push(imageKey);
35203         }
35204
35205         this.setStyles(null, true);
35206
35207         d3_selectAll('.layer-mapillary-signs .icon-sign')
35208             .classed('selected', function(d) {
35209                 return some(d.detections, function(detection) {
35210                     return detection.image_key === imageKey;
35211                 });
35212             });
35213
35214         var wrap = d3_select('#photoviewer .mly-wrapper');
35215         var attribution = wrap.selectAll('.photo-attribution').html('');
35216
35217         if (d) {
35218             if (d.captured_by) {
35219                 attribution
35220                     .append('a')
35221                     .attr('class', 'captured_by')
35222                     .attr('target', '_blank')
35223                     .attr('href', 'https://www.mapillary.com/app/user/' + encodeURIComponent(d.captured_by))
35224                     .text('@' + d.captured_by);
35225
35226                 attribution
35227                     .append('span')
35228                     .text('|');
35229             }
35230
35231             if (d.captured_at) {
35232                 attribution
35233                     .append('span')
35234                     .attr('class', 'captured_at')
35235                     .text(localeTimestamp(d.captured_at));
35236
35237                 attribution
35238                     .append('span')
35239                     .text('|');
35240             }
35241
35242             attribution
35243                 .append('a')
35244                 .attr('class', 'image_link')
35245                 .attr('target', '_blank')
35246                 .attr('href', 'https://www.mapillary.com/app/?pKey=' + encodeURIComponent(d.key) +
35247                     '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
35248                 .text('mapillary.com');
35249
35250             this.updateDetections(d);
35251         }
35252
35253         return this;
35254     },
35255
35256
35257     getSelectedImage: function() {
35258         return _mlySelectedImage;
35259     },
35260
35261
35262     getSequenceKeyForImage: function(d) {
35263         var imageKey = d && d.key;
35264         return imageKey && _mlyCache.sequences.forImageKey[imageKey];
35265     },
35266
35267
35268     setStyles: function(hovered, reset) {
35269         if (reset) {  // reset all layers
35270             d3_selectAll('.viewfield-group')
35271                 .classed('highlighted', false)
35272                 .classed('hovered', false)
35273                 .classed('selected', false);
35274
35275             d3_selectAll('.sequence')
35276                 .classed('highlighted', false)
35277                 .classed('selected', false);
35278         }
35279
35280         var hoveredImageKey = hovered && hovered.key;
35281         var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
35282         var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
35283         var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
35284
35285         var viewer = d3_select('#photoviewer');
35286         var selected = viewer.empty() ? undefined : viewer.datum();
35287         var selectedImageKey = selected && selected.key;
35288         var selectedSequenceKey = this.getSequenceKeyForImage(selected);
35289         var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
35290         var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
35291
35292         // highlight sibling viewfields on either the selected or the hovered sequences
35293         var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
35294
35295         d3_selectAll('.layer-mapillary-images .viewfield-group')
35296             .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
35297             .classed('hovered', function(d) { return d.key === hoveredImageKey; })
35298             .classed('selected', function(d) { return d.key === selectedImageKey; });
35299
35300         d3_selectAll('.layer-mapillary-images .sequence')
35301             .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
35302             .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
35303
35304         return this;
35305     },
35306
35307
35308     updateDetections: function(d) {
35309         if (!_mlyViewer || _mlyFallback) return;
35310
35311         var imageKey = d && d.key;
35312         var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
35313
35314         forEach(detections, function(data, k) {
35315             if (isEmpty(data)) {
35316                 loadDetection(k);
35317             } else {
35318                 var tag = makeTag(data);
35319                 if (tag) {
35320                     var tagComponent = _mlyViewer.getComponent('tag');
35321                     tagComponent.add([tag]);
35322                 }
35323             }
35324         });
35325
35326
35327         function loadDetection(detectionKey) {
35328             var url = apibase + 'detections/'+
35329                 detectionKey + '?' + utilQsString({
35330                     client_id: clientId,
35331                 });
35332
35333             d3_request(url)
35334                 .mimeType('application/json')
35335                 .response(function(xhr) {
35336                     return JSON.parse(xhr.responseText);
35337                 })
35338                 .get(function(err, data) {
35339                     if (!data || !data.properties) return;
35340
35341                     var imageKey = data.properties.image_key;
35342                     _mlyCache.detections[imageKey][detectionKey] = data;
35343
35344                     var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
35345                     if (imageKey === selectedKey) {
35346                         var tag = makeTag(data);
35347                         if (tag) {
35348                             var tagComponent = _mlyViewer.getComponent('tag');
35349                             tagComponent.add([tag]);
35350                         }
35351                     }
35352                 });
35353         }
35354
35355
35356         function makeTag(data) {
35357             var valueParts = data.properties.value.split('--');
35358             if (valueParts.length !== 3) return;
35359
35360             var text = valueParts[1].replace(/-/g, ' ');
35361             var tag;
35362
35363             // Currently only two shapes <Polygon|Point>
35364             if (data.properties.shape.type === 'Polygon') {
35365                 var polygonGeometry = new Mapillary
35366                     .TagComponent
35367                     .PolygonGeometry(data.properties.shape.coordinates[0]);
35368
35369                 tag = new Mapillary.TagComponent.OutlineTag(
35370                     data.properties.key,
35371                     polygonGeometry,
35372                     {
35373                         text: text,
35374                         textColor: 0xffff00,
35375                         lineColor: 0xffff00,
35376                         lineWidth: 2,
35377                         fillColor: 0xffff00,
35378                         fillOpacity: 0.3,
35379                     }
35380                 );
35381
35382             } else if (data.properties.shape.type === 'Point') {
35383                 var pointGeometry = new Mapillary
35384                     .TagComponent
35385                     .PointGeometry(data.properties.shape.coordinates[0]);
35386
35387                 tag = new Mapillary.TagComponent.SpotTag(
35388                     data.properties.key,
35389                     pointGeometry,
35390                     {
35391                         text: text,
35392                         color: 0xffff00,
35393                         textColor: 0xffff00
35394                     }
35395                 );
35396             }
35397
35398             return tag;
35399         }
35400     },
35401
35402
35403     cache: function() {
35404         return _mlyCache;
35405     },
35406
35407
35408     signDefs: function(_) {
35409         if (!arguments.length) return _mlySignDefs;
35410         _mlySignDefs = _;
35411         return this;
35412     }
35413
35414 };
35415
35416 var apibase$1 = 'https://nominatim.openstreetmap.org/',
35417     inflight = {},
35418     nominatimCache;
35419
35420
35421 var serviceNominatim = {
35422
35423     init: function() {
35424         inflight = {};
35425         nominatimCache = rbush_1();
35426     },
35427
35428     reset: function() {
35429         forEach(inflight, function(req) { req.abort(); });
35430         inflight = {};
35431         nominatimCache = rbush_1();
35432     },
35433
35434
35435     countryCode: function (location, callback) {
35436         this.reverse(location, function(err, result) {
35437             if (err) {
35438                 return callback(err);
35439             } else if (result.address) {
35440                 return callback(null, result.address.country_code);
35441             } else {
35442                 return callback('Unable to geocode', null);
35443             }
35444         });
35445     },
35446
35447
35448     reverse: function (location, callback) {
35449         var cached = nominatimCache.search(
35450             { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
35451         );
35452
35453         if (cached.length > 0) {
35454             return callback(null, cached[0].data);
35455         }
35456
35457         var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
35458         var url = apibase$1 + 'reverse?' + utilQsString(params);
35459         if (inflight[url]) return;
35460
35461         inflight[url] = d3_json(url, function(err, result) {
35462             delete inflight[url];
35463
35464             if (err) {
35465                 return callback(err);
35466             } else if (result && result.error) {
35467                 return callback(result.error);
35468             }
35469
35470             var extent = geoExtent$$1(location).padByMeters(200);
35471             nominatimCache.insert(assign(extent.bbox(), {data: result}));
35472
35473             callback(null, result);
35474         });
35475     },
35476
35477
35478     search: function (val, callback) {
35479         var searchVal = encodeURIComponent(val);
35480         var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
35481         if (inflight[url]) return;
35482
35483         inflight[url] = d3_json(url, function(err, result) {
35484             delete inflight[url];
35485             callback(err, result);
35486         });
35487     }
35488
35489 };
35490
35491 var apibase$2 = 'https://openstreetcam.org',
35492     maxResults$1 = 1000,
35493     tileZoom$1 = 14,
35494     dispatch$2 = dispatch('loadedImages'),
35495     imgZoom = d3_zoom()
35496         .extent([[0, 0], [320, 240]])
35497         .translateExtent([[0, 0], [320, 240]])
35498         .scaleExtent([1, 15])
35499         .on('zoom', zoomPan),
35500     _oscCache,
35501     _oscSelectedImage;
35502
35503
35504 function abortRequest$1(i) {
35505     i.abort();
35506 }
35507
35508
35509 function nearNullIsland$1(x, y, z) {
35510     if (z >= 7) {
35511         var center = Math.pow(2, z - 1),
35512             width = Math.pow(2, z - 6),
35513             min$$1 = center - (width / 2),
35514             max$$1 = center + (width / 2) - 1;
35515         return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
35516     }
35517     return false;
35518 }
35519
35520
35521 function maxPageAtZoom$1(z) {
35522     if (z < 15)   return 2;
35523     if (z === 15) return 5;
35524     if (z === 16) return 10;
35525     if (z === 17) return 20;
35526     if (z === 18) return 40;
35527     if (z > 18)   return 80;
35528 }
35529
35530
35531 function getTiles$1(projection) {
35532     var s = projection.scale() * 2 * Math.PI,
35533         z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
35534         ts = 256 * Math.pow(2, z - tileZoom$1),
35535         origin = [
35536             s / 2 - projection.translate()[0],
35537             s / 2 - projection.translate()[1]];
35538
35539     return d3geoTile()
35540         .scaleExtent([tileZoom$1, tileZoom$1])
35541         .scale(s)
35542         .size(projection.clipExtent()[1])
35543         .translate(projection.translate())()
35544         .map(function(tile) {
35545             var x = tile[0] * ts - origin[0],
35546                 y = tile[1] * ts - origin[1];
35547
35548             return {
35549                 id: tile.toString(),
35550                 xyz: tile,
35551                 extent: geoExtent$$1(
35552                     projection.invert([x, y + ts]),
35553                     projection.invert([x + ts, y])
35554                 )
35555             };
35556         });
35557 }
35558
35559
35560 function loadTiles$1(which, url, projection) {
35561     var s = projection.scale() * 2 * Math.PI,
35562         currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
35563
35564     var tiles = getTiles$1(projection).filter(function(t) {
35565             return !nearNullIsland$1(t.xyz[0], t.xyz[1], t.xyz[2]);
35566         });
35567
35568     filter(which.inflight, function(v, k) {
35569         var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
35570         if (!wanted) delete which.inflight[k];
35571         return !wanted;
35572     }).map(abortRequest$1);
35573
35574     tiles.forEach(function(tile) {
35575         loadNextTilePage$1(which, currZoom, url, tile);
35576     });
35577 }
35578
35579
35580 function loadNextTilePage$1(which, currZoom, url, tile) {
35581     var cache = _oscCache[which];
35582     var bbox = tile.extent.bbox();
35583     var maxPages = maxPageAtZoom$1(currZoom);
35584     var nextPage = cache.nextPage[tile.id] || 1;
35585     var params = utilQsString({
35586             ipp: maxResults$1,
35587             page: nextPage,
35588             // client_id: clientId,
35589             bbTopLeft: [bbox.maxY, bbox.minX].join(','),
35590             bbBottomRight: [bbox.minY, bbox.maxX].join(',')
35591         }, true);
35592
35593     if (nextPage > maxPages) return;
35594
35595     var id = tile.id + ',' + String(nextPage);
35596     if (cache.loaded[id] || cache.inflight[id]) return;
35597
35598     cache.inflight[id] = d3_request(url)
35599         .mimeType('application/json')
35600         .header('Content-type', 'application/x-www-form-urlencoded')
35601         .response(function(xhr) { return JSON.parse(xhr.responseText); })
35602         .post(params, function(err, data) {
35603             cache.loaded[id] = true;
35604             delete cache.inflight[id];
35605             if (err || !data.currentPageItems || !data.currentPageItems.length) return;
35606
35607             function localeDateString(s) {
35608                 if (!s) return null;
35609                 var detected = utilDetect();
35610                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
35611                 var d = new Date(s);
35612                 if (isNaN(d.getTime())) return null;
35613                 return d.toLocaleDateString(detected.locale, options);
35614             }
35615
35616             var features = data.currentPageItems.map(function(item) {
35617                 var loc = [+item.lng, +item.lat],
35618                     d;
35619
35620                 if (which === 'images') {
35621                     d = {
35622                         loc: loc,
35623                         key: item.id,
35624                         ca: +item.heading,
35625                         captured_at: localeDateString(item.shot_date || item.date_added),
35626                         captured_by: item.username,
35627                         imagePath: item.lth_name,
35628                         sequence_id: item.sequence_id,
35629                         sequence_index: +item.sequence_index
35630                     };
35631
35632                     // cache sequence info
35633                     var seq = _oscCache.sequences[d.sequence_id];
35634                     if (!seq) {
35635                         seq = { rotation: 0, images: [] };
35636                         _oscCache.sequences[d.sequence_id] = seq;
35637                     }
35638                     seq.images[d.sequence_index] = d;
35639                 }
35640
35641                 return {
35642                     minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
35643                 };
35644             });
35645
35646             cache.rtree.load(features);
35647
35648             if (which === 'images') {
35649                 dispatch$2.call('loadedImages');
35650             }
35651
35652             if (data.currentPageItems.length === maxResults$1) {  // more pages to load
35653                 cache.nextPage[tile.id] = nextPage + 1;
35654                 loadNextTilePage$1(which, currZoom, url, tile);
35655             } else {
35656                 cache.nextPage[tile.id] = Infinity;     // no more pages to load
35657             }
35658         });
35659 }
35660
35661
35662 // partition viewport into `psize` x `psize` regions
35663 function partitionViewport$1(psize, projection) {
35664     var dimensions = projection.clipExtent()[1];
35665     psize = psize || 16;
35666     var cols = d3_range(0, dimensions[0], psize),
35667         rows = d3_range(0, dimensions[1], psize),
35668         partitions = [];
35669
35670     rows.forEach(function(y) {
35671         cols.forEach(function(x) {
35672             var min$$1 = [x, y + psize],
35673                 max$$1 = [x + psize, y];
35674             partitions.push(
35675                 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
35676         });
35677     });
35678
35679     return partitions;
35680 }
35681
35682
35683 // no more than `limit` results per partition.
35684 function searchLimited$1(psize, limit, projection, rtree) {
35685     limit = limit || 3;
35686
35687     var partitions = partitionViewport$1(psize, projection);
35688     var results;
35689
35690     results = flatten(map$3(partitions, function(extent$$1) {
35691         return rtree.search(extent$$1.bbox())
35692             .slice(0, limit)
35693             .map(function(d) { return d.data; });
35694     }));
35695     return results;
35696 }
35697
35698
35699 function zoomPan() {
35700     var t = event.transform;
35701     d3_select('#photoviewer .osc-image-wrap')
35702         .call(utilSetTransform, t.x, t.y, t.k);
35703 }
35704
35705
35706 var serviceOpenstreetcam = {
35707
35708     init: function() {
35709         if (!_oscCache) {
35710             this.reset();
35711         }
35712
35713         this.event = utilRebind(this, dispatch$2, 'on');
35714     },
35715
35716     reset: function() {
35717         var cache = _oscCache;
35718
35719         if (cache) {
35720             if (cache.images && cache.images.inflight) {
35721                 forEach(cache.images.inflight, abortRequest$1);
35722             }
35723         }
35724
35725         _oscCache = {
35726             images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
35727             sequences: {}
35728         };
35729
35730         _oscSelectedImage = null;
35731     },
35732
35733
35734     images: function(projection) {
35735         var psize = 16, limit = 3;
35736         return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
35737     },
35738
35739
35740     sequences: function(projection) {
35741         var viewport = projection.clipExtent();
35742         var min$$1 = [viewport[0][0], viewport[1][1]];
35743         var max$$1 = [viewport[1][0], viewport[0][1]];
35744         var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
35745         var sequenceKeys = {};
35746
35747         // all sequences for images in viewport
35748         _oscCache.images.rtree.search(bbox)
35749             .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
35750
35751         // make linestrings from those sequences
35752         var lineStrings = [];
35753         Object.keys(sequenceKeys)
35754             .forEach(function(sequenceKey) {
35755                 var seq = _oscCache.sequences[sequenceKey];
35756                 var images = seq && seq.images;
35757                 if (images) {
35758                     lineStrings.push({
35759                         type: 'LineString',
35760                         coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
35761                         properties: { key: sequenceKey }
35762                     });
35763                 }
35764             });
35765         return lineStrings;
35766     },
35767
35768
35769     loadImages: function(projection) {
35770         var url = apibase$2 + '/1.0/list/nearby-photos/';
35771         loadTiles$1('images', url, projection);
35772     },
35773
35774
35775     loadViewer: function(context) {
35776         var that = this;
35777
35778         // add osc-wrapper
35779         var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
35780             .data([0]);
35781
35782         var wrapEnter = wrap.enter()
35783             .append('div')
35784             .attr('class', 'photo-wrapper osc-wrapper')
35785             .classed('hide', true)
35786             .call(imgZoom)
35787             .on('dblclick.zoom', null);
35788
35789         wrapEnter
35790             .append('div')
35791             .attr('class', 'photo-attribution fillD');
35792
35793         var controlsEnter = wrapEnter
35794             .append('div')
35795             .attr('class', 'osc-controls-wrap')
35796             .append('div')
35797             .attr('class', 'osc-controls');
35798
35799         controlsEnter
35800             .append('button')
35801             .on('click.back', step(-1))
35802             .text('◄');
35803
35804         controlsEnter
35805             .append('button')
35806             .on('click.rotate-ccw', rotate(-90))
35807             .text('⤿');
35808
35809         controlsEnter
35810             .append('button')
35811             .on('click.rotate-cw', rotate(90))
35812             .text('⤾');
35813
35814         controlsEnter
35815             .append('button')
35816             .on('click.forward', step(1))
35817             .text('►');
35818
35819         wrapEnter
35820             .append('div')
35821             .attr('class', 'osc-image-wrap');
35822
35823
35824         function rotate(deg) {
35825             return function() {
35826                 if (!_oscSelectedImage) return;
35827                 var sequenceKey = _oscSelectedImage.sequence_id;
35828                 var sequence = _oscCache.sequences[sequenceKey];
35829                 if (!sequence) return;
35830
35831                 var r = sequence.rotation || 0;
35832                 r += deg;
35833
35834                 if (r > 180) r -= 360;
35835                 if (r < -180) r += 360;
35836                 sequence.rotation = r;
35837
35838                 var wrap = d3_select('#photoviewer .osc-wrapper');
35839
35840                 wrap
35841                     .transition()
35842                     .duration(100)
35843                     .call(imgZoom.transform, identity$7);
35844
35845                 wrap.selectAll('.osc-image')
35846                     .transition()
35847                     .duration(100)
35848                     .style('transform', 'rotate(' + r + 'deg)');
35849             };
35850         }
35851
35852         function step(stepBy) {
35853             return function() {
35854                 if (!_oscSelectedImage) return;
35855                 var sequenceKey = _oscSelectedImage.sequence_id;
35856                 var sequence = _oscCache.sequences[sequenceKey];
35857                 if (!sequence) return;
35858
35859                 var nextIndex = _oscSelectedImage.sequence_index + stepBy;
35860                 var nextImage = sequence.images[nextIndex];
35861                 if (!nextImage) return;
35862
35863                 context.map().centerEase(nextImage.loc);
35864
35865                 that
35866                     .selectImage(nextImage)
35867                     .updateViewer(nextImage);
35868             };
35869         }
35870     },
35871
35872
35873     showViewer: function() {
35874         var viewer = d3_select('#photoviewer')
35875             .classed('hide', false);
35876
35877         var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
35878
35879         if (isHidden) {
35880             viewer
35881                 .selectAll('.photo-wrapper:not(.osc-wrapper)')
35882                 .classed('hide', true);
35883
35884             viewer
35885                 .selectAll('.photo-wrapper.osc-wrapper')
35886                 .classed('hide', false);
35887         }
35888
35889         return this;
35890     },
35891
35892
35893     hideViewer: function() {
35894         _oscSelectedImage = null;
35895
35896         var viewer = d3_select('#photoviewer');
35897         if (!viewer.empty()) viewer.datum(null);
35898
35899         viewer
35900             .classed('hide', true)
35901             .selectAll('.photo-wrapper')
35902             .classed('hide', true);
35903
35904         d3_selectAll('.viewfield-group, .sequence, .icon-sign')
35905             .classed('selected', false);
35906
35907         return this.setStyles(null, true);
35908     },
35909
35910
35911     updateViewer: function(d) {
35912         var wrap = d3_select('#photoviewer .osc-wrapper');
35913         var imageWrap = wrap.selectAll('.osc-image-wrap');
35914         var attribution = wrap.selectAll('.photo-attribution').html('');
35915
35916         wrap
35917             .transition()
35918             .duration(100)
35919             .call(imgZoom.transform, identity$7);
35920
35921         imageWrap
35922             .selectAll('.osc-image')
35923             .remove();
35924
35925         if (d) {
35926             var sequence = _oscCache.sequences[d.sequence_id];
35927             var r = (sequence && sequence.rotation) || 0;
35928
35929             imageWrap
35930                 .append('img')
35931                 .attr('class', 'osc-image')
35932                 .attr('src', apibase$2 + '/' + d.imagePath)
35933                 .style('transform', 'rotate(' + r + 'deg)');
35934
35935             if (d.captured_by) {
35936                 attribution
35937                     .append('a')
35938                     .attr('class', 'captured_by')
35939                     .attr('target', '_blank')
35940                     .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
35941                     .text('@' + d.captured_by);
35942
35943                 attribution
35944                     .append('span')
35945                     .text('|');
35946             }
35947
35948             if (d.captured_at) {
35949                 attribution
35950                     .append('span')
35951                     .attr('class', 'captured_at')
35952                     .text(d.captured_at);
35953
35954                 attribution
35955                     .append('span')
35956                     .text('|');
35957             }
35958
35959             attribution
35960                 .append('a')
35961                 .attr('class', 'image_link')
35962                 .attr('target', '_blank')
35963                 .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
35964                 .text('openstreetcam.org');
35965         }
35966         return this;
35967     },
35968
35969
35970     selectImage: function(d) {
35971         _oscSelectedImage = d;
35972         var viewer = d3_select('#photoviewer');
35973         if (!viewer.empty()) viewer.datum(d);
35974
35975         this.setStyles(null, true);
35976
35977         d3_selectAll('.icon-sign')
35978             .classed('selected', false);
35979
35980         return this;
35981     },
35982
35983
35984     getSelectedImage: function() {
35985         return _oscSelectedImage;
35986     },
35987
35988
35989     getSequenceKeyForImage: function(d) {
35990         return d && d.sequence_id;
35991     },
35992
35993
35994     setStyles: function(hovered, reset) {
35995         if (reset) {  // reset all layers
35996             d3_selectAll('.viewfield-group')
35997                 .classed('highlighted', false)
35998                 .classed('hovered', false)
35999                 .classed('selected', false);
36000
36001             d3_selectAll('.sequence')
36002                 .classed('highlighted', false)
36003                 .classed('selected', false);
36004         }
36005
36006         var hoveredImageKey = hovered && hovered.key;
36007         var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
36008         var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
36009         var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
36010
36011         var viewer = d3_select('#photoviewer');
36012         var selected = viewer.empty() ? undefined : viewer.datum();
36013         var selectedImageKey = selected && selected.key;
36014         var selectedSequenceKey = this.getSequenceKeyForImage(selected);
36015         var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
36016         var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
36017
36018         // highlight sibling viewfields on either the selected or the hovered sequences
36019         var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
36020
36021         d3_selectAll('.layer-openstreetcam-images .viewfield-group')
36022             .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
36023             .classed('hovered', function(d) { return d.key === hoveredImageKey; })
36024             .classed('selected', function(d) { return d.key === selectedImageKey; });
36025
36026         d3_selectAll('.layer-openstreetcam-images .sequence')
36027             .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
36028             .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
36029
36030         return this;
36031     },
36032
36033
36034     cache: function() {
36035         return _oscCache;
36036     }
36037
36038 };
36039
36040 /* Built-in method references for those with the same name as other `lodash` methods. */
36041 var nativeCeil = Math.ceil,
36042     nativeMax$4 = Math.max;
36043
36044 /**
36045  * Creates an array of elements split into groups the length of `size`.
36046  * If `array` can't be split evenly, the final chunk will be the remaining
36047  * elements.
36048  *
36049  * @static
36050  * @memberOf _
36051  * @since 3.0.0
36052  * @category Array
36053  * @param {Array} array The array to process.
36054  * @param {number} [size=1] The length of each chunk
36055  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
36056  * @returns {Array} Returns the new array of chunks.
36057  * @example
36058  *
36059  * _.chunk(['a', 'b', 'c', 'd'], 2);
36060  * // => [['a', 'b'], ['c', 'd']]
36061  *
36062  * _.chunk(['a', 'b', 'c', 'd'], 3);
36063  * // => [['a', 'b', 'c'], ['d']]
36064  */
36065 function chunk(array, size, guard) {
36066   if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
36067     size = 1;
36068   } else {
36069     size = nativeMax$4(toInteger(size), 0);
36070   }
36071   var length = array == null ? 0 : array.length;
36072   if (!length || size < 1) {
36073     return [];
36074   }
36075   var index = 0,
36076       resIndex = 0,
36077       result = Array(nativeCeil(length / size));
36078
36079   while (index < length) {
36080     result[resIndex++] = baseSlice(array, index, (index += size));
36081   }
36082   return result;
36083 }
36084
36085 var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
36086
36087 function createCommonjsModule(fn, module) {
36088         return module = { exports: {} }, fn(module, module.exports), module.exports;
36089 }
36090
36091 var hashes = createCommonjsModule(function (module, exports) {
36092 /**
36093  * jshashes - https://github.com/h2non/jshashes
36094  * Released under the "New BSD" license
36095  *
36096  * Algorithms specification:
36097  *
36098  * MD5 - http://www.ietf.org/rfc/rfc1321.txt
36099  * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
36100  * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36101  * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36102  * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36103  * HMAC - http://www.ietf.org/rfc/rfc2104.txt
36104  */
36105 (function() {
36106   var Hashes;
36107
36108   function utf8Encode(str) {
36109     var x, y, output = '',
36110       i = -1,
36111       l;
36112
36113     if (str && str.length) {
36114       l = str.length;
36115       while ((i += 1) < l) {
36116         /* Decode utf-16 surrogate pairs */
36117         x = str.charCodeAt(i);
36118         y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
36119         if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
36120           x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
36121           i += 1;
36122         }
36123         /* Encode output as utf-8 */
36124         if (x <= 0x7F) {
36125           output += String.fromCharCode(x);
36126         } else if (x <= 0x7FF) {
36127           output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
36128             0x80 | (x & 0x3F));
36129         } else if (x <= 0xFFFF) {
36130           output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
36131             0x80 | ((x >>> 6) & 0x3F),
36132             0x80 | (x & 0x3F));
36133         } else if (x <= 0x1FFFFF) {
36134           output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
36135             0x80 | ((x >>> 12) & 0x3F),
36136             0x80 | ((x >>> 6) & 0x3F),
36137             0x80 | (x & 0x3F));
36138         }
36139       }
36140     }
36141     return output;
36142   }
36143
36144   function utf8Decode(str) {
36145     var i, ac, c1, c2, c3, arr = [],
36146       l;
36147     i = ac = c1 = c2 = c3 = 0;
36148
36149     if (str && str.length) {
36150       l = str.length;
36151       str += '';
36152
36153       while (i < l) {
36154         c1 = str.charCodeAt(i);
36155         ac += 1;
36156         if (c1 < 128) {
36157           arr[ac] = String.fromCharCode(c1);
36158           i += 1;
36159         } else if (c1 > 191 && c1 < 224) {
36160           c2 = str.charCodeAt(i + 1);
36161           arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
36162           i += 2;
36163         } else {
36164           c2 = str.charCodeAt(i + 1);
36165           c3 = str.charCodeAt(i + 2);
36166           arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
36167           i += 3;
36168         }
36169       }
36170     }
36171     return arr.join('');
36172   }
36173
36174   /**
36175    * Add integers, wrapping at 2^32. This uses 16-bit operations internally
36176    * to work around bugs in some JS interpreters.
36177    */
36178
36179   function safe_add(x, y) {
36180     var lsw = (x & 0xFFFF) + (y & 0xFFFF),
36181       msw = (x >> 16) + (y >> 16) + (lsw >> 16);
36182     return (msw << 16) | (lsw & 0xFFFF);
36183   }
36184
36185   /**
36186    * Bitwise rotate a 32-bit number to the left.
36187    */
36188
36189   function bit_rol(num, cnt) {
36190     return (num << cnt) | (num >>> (32 - cnt));
36191   }
36192
36193   /**
36194    * Convert a raw string to a hex string
36195    */
36196
36197   function rstr2hex(input, hexcase) {
36198     var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
36199       output = '',
36200       x, i = 0,
36201       l = input.length;
36202     for (; i < l; i += 1) {
36203       x = input.charCodeAt(i);
36204       output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
36205     }
36206     return output;
36207   }
36208
36209   /**
36210    * Convert an array of big-endian words to a string
36211    */
36212
36213   function binb2rstr(input) {
36214     var i, l = input.length * 32,
36215       output = '';
36216     for (i = 0; i < l; i += 8) {
36217       output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
36218     }
36219     return output;
36220   }
36221
36222   /**
36223    * Convert an array of little-endian words to a string
36224    */
36225
36226   function binl2rstr(input) {
36227     var i, l = input.length * 32,
36228       output = '';
36229     for (i = 0; i < l; i += 8) {
36230       output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
36231     }
36232     return output;
36233   }
36234
36235   /**
36236    * Convert a raw string to an array of little-endian words
36237    * Characters >255 have their high-byte silently ignored.
36238    */
36239
36240   function rstr2binl(input) {
36241     var i, l = input.length * 8,
36242       output = Array(input.length >> 2),
36243       lo = output.length;
36244     for (i = 0; i < lo; i += 1) {
36245       output[i] = 0;
36246     }
36247     for (i = 0; i < l; i += 8) {
36248       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
36249     }
36250     return output;
36251   }
36252
36253   /**
36254    * Convert a raw string to an array of big-endian words
36255    * Characters >255 have their high-byte silently ignored.
36256    */
36257
36258   function rstr2binb(input) {
36259     var i, l = input.length * 8,
36260       output = Array(input.length >> 2),
36261       lo = output.length;
36262     for (i = 0; i < lo; i += 1) {
36263       output[i] = 0;
36264     }
36265     for (i = 0; i < l; i += 8) {
36266       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
36267     }
36268     return output;
36269   }
36270
36271   /**
36272    * Convert a raw string to an arbitrary string encoding
36273    */
36274
36275   function rstr2any(input, encoding) {
36276     var divisor = encoding.length,
36277       remainders = Array(),
36278       i, q, x, ld, quotient, dividend, output, full_length;
36279
36280     /* Convert to an array of 16-bit big-endian values, forming the dividend */
36281     dividend = Array(Math.ceil(input.length / 2));
36282     ld = dividend.length;
36283     for (i = 0; i < ld; i += 1) {
36284       dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
36285     }
36286
36287     /**
36288      * Repeatedly perform a long division. The binary array forms the dividend,
36289      * the length of the encoding is the divisor. Once computed, the quotient
36290      * forms the dividend for the next step. We stop when the dividend is zerHashes.
36291      * All remainders are stored for later use.
36292      */
36293     while (dividend.length > 0) {
36294       quotient = Array();
36295       x = 0;
36296       for (i = 0; i < dividend.length; i += 1) {
36297         x = (x << 16) + dividend[i];
36298         q = Math.floor(x / divisor);
36299         x -= q * divisor;
36300         if (quotient.length > 0 || q > 0) {
36301           quotient[quotient.length] = q;
36302         }
36303       }
36304       remainders[remainders.length] = x;
36305       dividend = quotient;
36306     }
36307
36308     /* Convert the remainders to the output string */
36309     output = '';
36310     for (i = remainders.length - 1; i >= 0; i--) {
36311       output += encoding.charAt(remainders[i]);
36312     }
36313
36314     /* Append leading zero equivalents */
36315     full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
36316     for (i = output.length; i < full_length; i += 1) {
36317       output = encoding[0] + output;
36318     }
36319     return output;
36320   }
36321
36322   /**
36323    * Convert a raw string to a base-64 string
36324    */
36325
36326   function rstr2b64(input, b64pad) {
36327     var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
36328       output = '',
36329       len = input.length,
36330       i, j, triplet;
36331     b64pad = b64pad || '=';
36332     for (i = 0; i < len; i += 3) {
36333       triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
36334       for (j = 0; j < 4; j += 1) {
36335         if (i * 8 + j * 6 > input.length * 8) {
36336           output += b64pad;
36337         } else {
36338           output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
36339         }
36340       }
36341     }
36342     return output;
36343   }
36344
36345   Hashes = {
36346     /**
36347      * @property {String} version
36348      * @readonly
36349      */
36350     VERSION: '1.0.6',
36351     /**
36352      * @member Hashes
36353      * @class Base64
36354      * @constructor
36355      */
36356     Base64: function() {
36357       // private properties
36358       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
36359         pad = '=', // default pad according with the RFC standard
36360         utf8 = true; // by default enable UTF-8 support encoding
36361
36362       // public method for encoding
36363       this.encode = function(input) {
36364         var i, j, triplet,
36365           output = '',
36366           len = input.length;
36367
36368         pad = pad || '=';
36369         input = (utf8) ? utf8Encode(input) : input;
36370
36371         for (i = 0; i < len; i += 3) {
36372           triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
36373           for (j = 0; j < 4; j += 1) {
36374             if (i * 8 + j * 6 > len * 8) {
36375               output += pad;
36376             } else {
36377               output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
36378             }
36379           }
36380         }
36381         return output;
36382       };
36383
36384       // public method for decoding
36385       this.decode = function(input) {
36386         // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
36387         var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
36388           dec = '',
36389           arr = [];
36390         if (!input) {
36391           return input;
36392         }
36393
36394         i = ac = 0;
36395         input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
36396         //input += '';
36397
36398         do { // unpack four hexets into three octets using index points in b64
36399           h1 = tab.indexOf(input.charAt(i += 1));
36400           h2 = tab.indexOf(input.charAt(i += 1));
36401           h3 = tab.indexOf(input.charAt(i += 1));
36402           h4 = tab.indexOf(input.charAt(i += 1));
36403
36404           bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
36405
36406           o1 = bits >> 16 & 0xff;
36407           o2 = bits >> 8 & 0xff;
36408           o3 = bits & 0xff;
36409           ac += 1;
36410
36411           if (h3 === 64) {
36412             arr[ac] = String.fromCharCode(o1);
36413           } else if (h4 === 64) {
36414             arr[ac] = String.fromCharCode(o1, o2);
36415           } else {
36416             arr[ac] = String.fromCharCode(o1, o2, o3);
36417           }
36418         } while (i < input.length);
36419
36420         dec = arr.join('');
36421         dec = (utf8) ? utf8Decode(dec) : dec;
36422
36423         return dec;
36424       };
36425
36426       // set custom pad string
36427       this.setPad = function(str) {
36428         pad = str || pad;
36429         return this;
36430       };
36431       // set custom tab string characters
36432       this.setTab = function(str) {
36433         tab = str || tab;
36434         return this;
36435       };
36436       this.setUTF8 = function(bool) {
36437         if (typeof bool === 'boolean') {
36438           utf8 = bool;
36439         }
36440         return this;
36441       };
36442     },
36443
36444     /**
36445      * CRC-32 calculation
36446      * @member Hashes
36447      * @method CRC32
36448      * @static
36449      * @param {String} str Input String
36450      * @return {String}
36451      */
36452     CRC32: function(str) {
36453       var crc = 0,
36454         x = 0,
36455         y = 0,
36456         table, i, iTop;
36457       str = utf8Encode(str);
36458
36459       table = [
36460         '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
36461         '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
36462         '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
36463         '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
36464         'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
36465         '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
36466         'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
36467         '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
36468         'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
36469         '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
36470         'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
36471         '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
36472         'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
36473         '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
36474         '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
36475         '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
36476         '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
36477         'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
36478         '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
36479         'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
36480         '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
36481         'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
36482         '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
36483         'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
36484         '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
36485         'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
36486       ].join('');
36487
36488       crc = crc ^ (-1);
36489       for (i = 0, iTop = str.length; i < iTop; i += 1) {
36490         y = (crc ^ str.charCodeAt(i)) & 0xFF;
36491         x = '0x' + table.substr(y * 9, 8);
36492         crc = (crc >>> 8) ^ x;
36493       }
36494       // always return a positive number (that's what >>> 0 does)
36495       return (crc ^ (-1)) >>> 0;
36496     },
36497     /**
36498      * @member Hashes
36499      * @class MD5
36500      * @constructor
36501      * @param {Object} [config]
36502      *
36503      * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
36504      * Digest Algorithm, as defined in RFC 1321.
36505      * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
36506      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36507      * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
36508      */
36509     MD5: function(options) {
36510       /**
36511        * Private config properties. You may need to tweak these to be compatible with
36512        * the server-side, but the defaults work in most cases.
36513        * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
36514        */
36515       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
36516         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
36517         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
36518
36519       // privileged (public) methods
36520       this.hex = function(s) {
36521         return rstr2hex(rstr(s, utf8), hexcase);
36522       };
36523       this.b64 = function(s) {
36524         return rstr2b64(rstr(s), b64pad);
36525       };
36526       this.any = function(s, e) {
36527         return rstr2any(rstr(s, utf8), e);
36528       };
36529       this.raw = function(s) {
36530         return rstr(s, utf8);
36531       };
36532       this.hex_hmac = function(k, d) {
36533         return rstr2hex(rstr_hmac(k, d), hexcase);
36534       };
36535       this.b64_hmac = function(k, d) {
36536         return rstr2b64(rstr_hmac(k, d), b64pad);
36537       };
36538       this.any_hmac = function(k, d, e) {
36539         return rstr2any(rstr_hmac(k, d), e);
36540       };
36541       /**
36542        * Perform a simple self-test to see if the VM is working
36543        * @return {String} Hexadecimal hash sample
36544        */
36545       this.vm_test = function() {
36546         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36547       };
36548       /**
36549        * Enable/disable uppercase hexadecimal returned string
36550        * @param {Boolean}
36551        * @return {Object} this
36552        */
36553       this.setUpperCase = function(a) {
36554         if (typeof a === 'boolean') {
36555           hexcase = a;
36556         }
36557         return this;
36558       };
36559       /**
36560        * Defines a base64 pad string
36561        * @param {String} Pad
36562        * @return {Object} this
36563        */
36564       this.setPad = function(a) {
36565         b64pad = a || b64pad;
36566         return this;
36567       };
36568       /**
36569        * Defines a base64 pad string
36570        * @param {Boolean}
36571        * @return {Object} [this]
36572        */
36573       this.setUTF8 = function(a) {
36574         if (typeof a === 'boolean') {
36575           utf8 = a;
36576         }
36577         return this;
36578       };
36579
36580       // private methods
36581
36582       /**
36583        * Calculate the MD5 of a raw string
36584        */
36585
36586       function rstr(s) {
36587         s = (utf8) ? utf8Encode(s) : s;
36588         return binl2rstr(binl(rstr2binl(s), s.length * 8));
36589       }
36590
36591       /**
36592        * Calculate the HMAC-MD5, of a key and some data (raw strings)
36593        */
36594
36595       function rstr_hmac(key, data) {
36596         var bkey, ipad, opad, hash, i;
36597
36598         key = (utf8) ? utf8Encode(key) : key;
36599         data = (utf8) ? utf8Encode(data) : data;
36600         bkey = rstr2binl(key);
36601         if (bkey.length > 16) {
36602           bkey = binl(bkey, key.length * 8);
36603         }
36604
36605         ipad = Array(16), opad = Array(16);
36606         for (i = 0; i < 16; i += 1) {
36607           ipad[i] = bkey[i] ^ 0x36363636;
36608           opad[i] = bkey[i] ^ 0x5C5C5C5C;
36609         }
36610         hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
36611         return binl2rstr(binl(opad.concat(hash), 512 + 128));
36612       }
36613
36614       /**
36615        * Calculate the MD5 of an array of little-endian words, and a bit length.
36616        */
36617
36618       function binl(x, len) {
36619         var i, olda, oldb, oldc, oldd,
36620           a = 1732584193,
36621           b = -271733879,
36622           c = -1732584194,
36623           d = 271733878;
36624
36625         /* append padding */
36626         x[len >> 5] |= 0x80 << ((len) % 32);
36627         x[(((len + 64) >>> 9) << 4) + 14] = len;
36628
36629         for (i = 0; i < x.length; i += 16) {
36630           olda = a;
36631           oldb = b;
36632           oldc = c;
36633           oldd = d;
36634
36635           a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
36636           d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
36637           c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
36638           b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
36639           a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
36640           d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
36641           c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
36642           b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
36643           a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
36644           d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
36645           c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
36646           b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
36647           a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
36648           d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
36649           c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
36650           b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
36651
36652           a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
36653           d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
36654           c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
36655           b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
36656           a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
36657           d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
36658           c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
36659           b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
36660           a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
36661           d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
36662           c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
36663           b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
36664           a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
36665           d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
36666           c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
36667           b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
36668
36669           a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
36670           d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
36671           c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
36672           b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
36673           a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
36674           d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
36675           c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
36676           b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
36677           a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
36678           d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
36679           c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
36680           b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
36681           a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
36682           d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
36683           c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
36684           b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
36685
36686           a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
36687           d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
36688           c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
36689           b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
36690           a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
36691           d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
36692           c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
36693           b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
36694           a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
36695           d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
36696           c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
36697           b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
36698           a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
36699           d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
36700           c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
36701           b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
36702
36703           a = safe_add(a, olda);
36704           b = safe_add(b, oldb);
36705           c = safe_add(c, oldc);
36706           d = safe_add(d, oldd);
36707         }
36708         return Array(a, b, c, d);
36709       }
36710
36711       /**
36712        * These functions implement the four basic operations the algorithm uses.
36713        */
36714
36715       function md5_cmn(q, a, b, x, s, t) {
36716         return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
36717       }
36718
36719       function md5_ff(a, b, c, d, x, s, t) {
36720         return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
36721       }
36722
36723       function md5_gg(a, b, c, d, x, s, t) {
36724         return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
36725       }
36726
36727       function md5_hh(a, b, c, d, x, s, t) {
36728         return md5_cmn(b ^ c ^ d, a, b, x, s, t);
36729       }
36730
36731       function md5_ii(a, b, c, d, x, s, t) {
36732         return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
36733       }
36734     },
36735     /**
36736      * @member Hashes
36737      * @class Hashes.SHA1
36738      * @param {Object} [config]
36739      * @constructor
36740      *
36741      * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
36742      * Version 2.2 Copyright Paul Johnston 2000 - 2009.
36743      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36744      * See http://pajhome.org.uk/crypt/md5 for details.
36745      */
36746     SHA1: function(options) {
36747       /**
36748        * Private config properties. You may need to tweak these to be compatible with
36749        * the server-side, but the defaults work in most cases.
36750        * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
36751        */
36752       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
36753         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
36754         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
36755
36756       // public methods
36757       this.hex = function(s) {
36758         return rstr2hex(rstr(s, utf8), hexcase);
36759       };
36760       this.b64 = function(s) {
36761         return rstr2b64(rstr(s, utf8), b64pad);
36762       };
36763       this.any = function(s, e) {
36764         return rstr2any(rstr(s, utf8), e);
36765       };
36766       this.raw = function(s) {
36767         return rstr(s, utf8);
36768       };
36769       this.hex_hmac = function(k, d) {
36770         return rstr2hex(rstr_hmac(k, d));
36771       };
36772       this.b64_hmac = function(k, d) {
36773         return rstr2b64(rstr_hmac(k, d), b64pad);
36774       };
36775       this.any_hmac = function(k, d, e) {
36776         return rstr2any(rstr_hmac(k, d), e);
36777       };
36778       /**
36779        * Perform a simple self-test to see if the VM is working
36780        * @return {String} Hexadecimal hash sample
36781        * @public
36782        */
36783       this.vm_test = function() {
36784         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36785       };
36786       /**
36787        * @description Enable/disable uppercase hexadecimal returned string
36788        * @param {boolean}
36789        * @return {Object} this
36790        * @public
36791        */
36792       this.setUpperCase = function(a) {
36793         if (typeof a === 'boolean') {
36794           hexcase = a;
36795         }
36796         return this;
36797       };
36798       /**
36799        * @description Defines a base64 pad string
36800        * @param {string} Pad
36801        * @return {Object} this
36802        * @public
36803        */
36804       this.setPad = function(a) {
36805         b64pad = a || b64pad;
36806         return this;
36807       };
36808       /**
36809        * @description Defines a base64 pad string
36810        * @param {boolean}
36811        * @return {Object} this
36812        * @public
36813        */
36814       this.setUTF8 = function(a) {
36815         if (typeof a === 'boolean') {
36816           utf8 = a;
36817         }
36818         return this;
36819       };
36820
36821       // private methods
36822
36823       /**
36824        * Calculate the SHA-512 of a raw string
36825        */
36826
36827       function rstr(s) {
36828         s = (utf8) ? utf8Encode(s) : s;
36829         return binb2rstr(binb(rstr2binb(s), s.length * 8));
36830       }
36831
36832       /**
36833        * Calculate the HMAC-SHA1 of a key and some data (raw strings)
36834        */
36835
36836       function rstr_hmac(key, data) {
36837         var bkey, ipad, opad, i, hash;
36838         key = (utf8) ? utf8Encode(key) : key;
36839         data = (utf8) ? utf8Encode(data) : data;
36840         bkey = rstr2binb(key);
36841
36842         if (bkey.length > 16) {
36843           bkey = binb(bkey, key.length * 8);
36844         }
36845         ipad = Array(16), opad = Array(16);
36846         for (i = 0; i < 16; i += 1) {
36847           ipad[i] = bkey[i] ^ 0x36363636;
36848           opad[i] = bkey[i] ^ 0x5C5C5C5C;
36849         }
36850         hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
36851         return binb2rstr(binb(opad.concat(hash), 512 + 160));
36852       }
36853
36854       /**
36855        * Calculate the SHA-1 of an array of big-endian words, and a bit length
36856        */
36857
36858       function binb(x, len) {
36859         var i, j, t, olda, oldb, oldc, oldd, olde,
36860           w = Array(80),
36861           a = 1732584193,
36862           b = -271733879,
36863           c = -1732584194,
36864           d = 271733878,
36865           e = -1009589776;
36866
36867         /* append padding */
36868         x[len >> 5] |= 0x80 << (24 - len % 32);
36869         x[((len + 64 >> 9) << 4) + 15] = len;
36870
36871         for (i = 0; i < x.length; i += 16) {
36872           olda = a;
36873           oldb = b;
36874           oldc = c;
36875           oldd = d;
36876           olde = e;
36877
36878           for (j = 0; j < 80; j += 1) {
36879             if (j < 16) {
36880               w[j] = x[i + j];
36881             } else {
36882               w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
36883             }
36884             t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
36885               safe_add(safe_add(e, w[j]), sha1_kt(j)));
36886             e = d;
36887             d = c;
36888             c = bit_rol(b, 30);
36889             b = a;
36890             a = t;
36891           }
36892
36893           a = safe_add(a, olda);
36894           b = safe_add(b, oldb);
36895           c = safe_add(c, oldc);
36896           d = safe_add(d, oldd);
36897           e = safe_add(e, olde);
36898         }
36899         return Array(a, b, c, d, e);
36900       }
36901
36902       /**
36903        * Perform the appropriate triplet combination function for the current
36904        * iteration
36905        */
36906
36907       function sha1_ft(t, b, c, d) {
36908         if (t < 20) {
36909           return (b & c) | ((~b) & d);
36910         }
36911         if (t < 40) {
36912           return b ^ c ^ d;
36913         }
36914         if (t < 60) {
36915           return (b & c) | (b & d) | (c & d);
36916         }
36917         return b ^ c ^ d;
36918       }
36919
36920       /**
36921        * Determine the appropriate additive constant for the current iteration
36922        */
36923
36924       function sha1_kt(t) {
36925         return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
36926           (t < 60) ? -1894007588 : -899497514;
36927       }
36928     },
36929     /**
36930      * @class Hashes.SHA256
36931      * @param {config}
36932      *
36933      * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
36934      * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
36935      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36936      * See http://pajhome.org.uk/crypt/md5 for details.
36937      * Also http://anmar.eu.org/projects/jssha2/
36938      */
36939     SHA256: function(options) {
36940       /**
36941        * Private properties configuration variables. You may need to tweak these to be compatible with
36942        * the server-side, but the defaults work in most cases.
36943        * @see this.setUpperCase() method
36944        * @see this.setPad() method
36945        */
36946       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
36947         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
36948         /* base-64 pad character. Default '=' for strict RFC compliance   */
36949         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
36950         /* enable/disable utf8 encoding */
36951         sha256_K;
36952
36953       /* privileged (public) methods */
36954       this.hex = function(s) {
36955         return rstr2hex(rstr(s, utf8));
36956       };
36957       this.b64 = function(s) {
36958         return rstr2b64(rstr(s, utf8), b64pad);
36959       };
36960       this.any = function(s, e) {
36961         return rstr2any(rstr(s, utf8), e);
36962       };
36963       this.raw = function(s) {
36964         return rstr(s, utf8);
36965       };
36966       this.hex_hmac = function(k, d) {
36967         return rstr2hex(rstr_hmac(k, d));
36968       };
36969       this.b64_hmac = function(k, d) {
36970         return rstr2b64(rstr_hmac(k, d), b64pad);
36971       };
36972       this.any_hmac = function(k, d, e) {
36973         return rstr2any(rstr_hmac(k, d), e);
36974       };
36975       /**
36976        * Perform a simple self-test to see if the VM is working
36977        * @return {String} Hexadecimal hash sample
36978        * @public
36979        */
36980       this.vm_test = function() {
36981         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36982       };
36983       /**
36984        * Enable/disable uppercase hexadecimal returned string
36985        * @param {boolean}
36986        * @return {Object} this
36987        * @public
36988        */
36989       this.setUpperCase = function(a) {
36990         if (typeof a === 'boolean') {
36991           hexcase = a;
36992         }
36993         return this;
36994       };
36995       /**
36996        * @description Defines a base64 pad string
36997        * @param {string} Pad
36998        * @return {Object} this
36999        * @public
37000        */
37001       this.setPad = function(a) {
37002         b64pad = a || b64pad;
37003         return this;
37004       };
37005       /**
37006        * Defines a base64 pad string
37007        * @param {boolean}
37008        * @return {Object} this
37009        * @public
37010        */
37011       this.setUTF8 = function(a) {
37012         if (typeof a === 'boolean') {
37013           utf8 = a;
37014         }
37015         return this;
37016       };
37017
37018       // private methods
37019
37020       /**
37021        * Calculate the SHA-512 of a raw string
37022        */
37023
37024       function rstr(s, utf8) {
37025         s = (utf8) ? utf8Encode(s) : s;
37026         return binb2rstr(binb(rstr2binb(s), s.length * 8));
37027       }
37028
37029       /**
37030        * Calculate the HMAC-sha256 of a key and some data (raw strings)
37031        */
37032
37033       function rstr_hmac(key, data) {
37034         key = (utf8) ? utf8Encode(key) : key;
37035         data = (utf8) ? utf8Encode(data) : data;
37036         var hash, i = 0,
37037           bkey = rstr2binb(key),
37038           ipad = Array(16),
37039           opad = Array(16);
37040
37041         if (bkey.length > 16) {
37042           bkey = binb(bkey, key.length * 8);
37043         }
37044
37045         for (; i < 16; i += 1) {
37046           ipad[i] = bkey[i] ^ 0x36363636;
37047           opad[i] = bkey[i] ^ 0x5C5C5C5C;
37048         }
37049
37050         hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
37051         return binb2rstr(binb(opad.concat(hash), 512 + 256));
37052       }
37053
37054       /*
37055        * Main sha256 function, with its support functions
37056        */
37057
37058       function sha256_S(X, n) {
37059         return (X >>> n) | (X << (32 - n));
37060       }
37061
37062       function sha256_R(X, n) {
37063         return (X >>> n);
37064       }
37065
37066       function sha256_Ch(x, y, z) {
37067         return ((x & y) ^ ((~x) & z));
37068       }
37069
37070       function sha256_Maj(x, y, z) {
37071         return ((x & y) ^ (x & z) ^ (y & z));
37072       }
37073
37074       function sha256_Sigma0256(x) {
37075         return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
37076       }
37077
37078       function sha256_Sigma1256(x) {
37079         return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
37080       }
37081
37082       function sha256_Gamma0256(x) {
37083         return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
37084       }
37085
37086       function sha256_Gamma1256(x) {
37087         return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
37088       }
37089
37090       sha256_K = [
37091         1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
37092         1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
37093         264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
37094         113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
37095         1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
37096         430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
37097         1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
37098       ];
37099
37100       function binb(m, l) {
37101         var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
37102           1359893119, -1694144372, 528734635, 1541459225
37103         ];
37104         var W = new Array(64);
37105         var a, b, c, d, e, f, g, h;
37106         var i, j, T1, T2;
37107
37108         /* append padding */
37109         m[l >> 5] |= 0x80 << (24 - l % 32);
37110         m[((l + 64 >> 9) << 4) + 15] = l;
37111
37112         for (i = 0; i < m.length; i += 16) {
37113           a = HASH[0];
37114           b = HASH[1];
37115           c = HASH[2];
37116           d = HASH[3];
37117           e = HASH[4];
37118           f = HASH[5];
37119           g = HASH[6];
37120           h = HASH[7];
37121
37122           for (j = 0; j < 64; j += 1) {
37123             if (j < 16) {
37124               W[j] = m[j + i];
37125             } else {
37126               W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
37127                 sha256_Gamma0256(W[j - 15])), W[j - 16]);
37128             }
37129
37130             T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
37131               sha256_K[j]), W[j]);
37132             T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
37133             h = g;
37134             g = f;
37135             f = e;
37136             e = safe_add(d, T1);
37137             d = c;
37138             c = b;
37139             b = a;
37140             a = safe_add(T1, T2);
37141           }
37142
37143           HASH[0] = safe_add(a, HASH[0]);
37144           HASH[1] = safe_add(b, HASH[1]);
37145           HASH[2] = safe_add(c, HASH[2]);
37146           HASH[3] = safe_add(d, HASH[3]);
37147           HASH[4] = safe_add(e, HASH[4]);
37148           HASH[5] = safe_add(f, HASH[5]);
37149           HASH[6] = safe_add(g, HASH[6]);
37150           HASH[7] = safe_add(h, HASH[7]);
37151         }
37152         return HASH;
37153       }
37154
37155     },
37156
37157     /**
37158      * @class Hashes.SHA512
37159      * @param {config}
37160      *
37161      * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
37162      * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
37163      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
37164      * See http://pajhome.org.uk/crypt/md5 for details.
37165      */
37166     SHA512: function(options) {
37167       /**
37168        * Private properties configuration variables. You may need to tweak these to be compatible with
37169        * the server-side, but the defaults work in most cases.
37170        * @see this.setUpperCase() method
37171        * @see this.setPad() method
37172        */
37173       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
37174         /* hexadecimal output case format. false - lowercase; true - uppercase  */
37175         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
37176         /* base-64 pad character. Default '=' for strict RFC compliance   */
37177         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
37178         /* enable/disable utf8 encoding */
37179         sha512_k;
37180
37181       /* privileged (public) methods */
37182       this.hex = function(s) {
37183         return rstr2hex(rstr(s));
37184       };
37185       this.b64 = function(s) {
37186         return rstr2b64(rstr(s), b64pad);
37187       };
37188       this.any = function(s, e) {
37189         return rstr2any(rstr(s), e);
37190       };
37191       this.raw = function(s) {
37192         return rstr(s, utf8);
37193       };
37194       this.hex_hmac = function(k, d) {
37195         return rstr2hex(rstr_hmac(k, d));
37196       };
37197       this.b64_hmac = function(k, d) {
37198         return rstr2b64(rstr_hmac(k, d), b64pad);
37199       };
37200       this.any_hmac = function(k, d, e) {
37201         return rstr2any(rstr_hmac(k, d), e);
37202       };
37203       /**
37204        * Perform a simple self-test to see if the VM is working
37205        * @return {String} Hexadecimal hash sample
37206        * @public
37207        */
37208       this.vm_test = function() {
37209         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37210       };
37211       /**
37212        * @description Enable/disable uppercase hexadecimal returned string
37213        * @param {boolean}
37214        * @return {Object} this
37215        * @public
37216        */
37217       this.setUpperCase = function(a) {
37218         if (typeof a === 'boolean') {
37219           hexcase = a;
37220         }
37221         return this;
37222       };
37223       /**
37224        * @description Defines a base64 pad string
37225        * @param {string} Pad
37226        * @return {Object} this
37227        * @public
37228        */
37229       this.setPad = function(a) {
37230         b64pad = a || b64pad;
37231         return this;
37232       };
37233       /**
37234        * @description Defines a base64 pad string
37235        * @param {boolean}
37236        * @return {Object} this
37237        * @public
37238        */
37239       this.setUTF8 = function(a) {
37240         if (typeof a === 'boolean') {
37241           utf8 = a;
37242         }
37243         return this;
37244       };
37245
37246       /* private methods */
37247
37248       /**
37249        * Calculate the SHA-512 of a raw string
37250        */
37251
37252       function rstr(s) {
37253         s = (utf8) ? utf8Encode(s) : s;
37254         return binb2rstr(binb(rstr2binb(s), s.length * 8));
37255       }
37256       /*
37257        * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
37258        */
37259
37260       function rstr_hmac(key, data) {
37261         key = (utf8) ? utf8Encode(key) : key;
37262         data = (utf8) ? utf8Encode(data) : data;
37263
37264         var hash, i = 0,
37265           bkey = rstr2binb(key),
37266           ipad = Array(32),
37267           opad = Array(32);
37268
37269         if (bkey.length > 32) {
37270           bkey = binb(bkey, key.length * 8);
37271         }
37272
37273         for (; i < 32; i += 1) {
37274           ipad[i] = bkey[i] ^ 0x36363636;
37275           opad[i] = bkey[i] ^ 0x5C5C5C5C;
37276         }
37277
37278         hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
37279         return binb2rstr(binb(opad.concat(hash), 1024 + 512));
37280       }
37281
37282       /**
37283        * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
37284        */
37285
37286       function binb(x, len) {
37287         var j, i, l,
37288           W = new Array(80),
37289           hash = new Array(16),
37290           //Initial hash values
37291           H = [
37292             new int64(0x6a09e667, -205731576),
37293             new int64(-1150833019, -2067093701),
37294             new int64(0x3c6ef372, -23791573),
37295             new int64(-1521486534, 0x5f1d36f1),
37296             new int64(0x510e527f, -1377402159),
37297             new int64(-1694144372, 0x2b3e6c1f),
37298             new int64(0x1f83d9ab, -79577749),
37299             new int64(0x5be0cd19, 0x137e2179)
37300           ],
37301           T1 = new int64(0, 0),
37302           T2 = new int64(0, 0),
37303           a = new int64(0, 0),
37304           b = new int64(0, 0),
37305           c = new int64(0, 0),
37306           d = new int64(0, 0),
37307           e = new int64(0, 0),
37308           f = new int64(0, 0),
37309           g = new int64(0, 0),
37310           h = new int64(0, 0),
37311           //Temporary variables not specified by the document
37312           s0 = new int64(0, 0),
37313           s1 = new int64(0, 0),
37314           Ch = new int64(0, 0),
37315           Maj = new int64(0, 0),
37316           r1 = new int64(0, 0),
37317           r2 = new int64(0, 0),
37318           r3 = new int64(0, 0);
37319
37320         if (sha512_k === undefined) {
37321           //SHA512 constants
37322           sha512_k = [
37323             new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
37324             new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
37325             new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
37326             new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
37327             new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
37328             new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
37329             new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
37330             new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
37331             new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
37332             new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
37333             new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
37334             new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
37335             new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
37336             new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
37337             new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
37338             new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
37339             new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
37340             new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
37341             new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
37342             new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
37343             new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
37344             new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
37345             new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
37346             new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
37347             new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
37348             new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
37349             new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
37350             new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
37351             new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
37352             new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
37353             new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
37354             new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
37355             new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
37356             new int64(-354779690, -840897762), new int64(-176337025, -294727304),
37357             new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
37358             new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
37359             new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
37360             new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
37361             new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
37362             new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
37363           ];
37364         }
37365
37366         for (i = 0; i < 80; i += 1) {
37367           W[i] = new int64(0, 0);
37368         }
37369
37370         // append padding to the source string. The format is described in the FIPS.
37371         x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
37372         x[((len + 128 >> 10) << 5) + 31] = len;
37373         l = x.length;
37374         for (i = 0; i < l; i += 32) { //32 dwords is the block size
37375           int64copy(a, H[0]);
37376           int64copy(b, H[1]);
37377           int64copy(c, H[2]);
37378           int64copy(d, H[3]);
37379           int64copy(e, H[4]);
37380           int64copy(f, H[5]);
37381           int64copy(g, H[6]);
37382           int64copy(h, H[7]);
37383
37384           for (j = 0; j < 16; j += 1) {
37385             W[j].h = x[i + 2 * j];
37386             W[j].l = x[i + 2 * j + 1];
37387           }
37388
37389           for (j = 16; j < 80; j += 1) {
37390             //sigma1
37391             int64rrot(r1, W[j - 2], 19);
37392             int64revrrot(r2, W[j - 2], 29);
37393             int64shr(r3, W[j - 2], 6);
37394             s1.l = r1.l ^ r2.l ^ r3.l;
37395             s1.h = r1.h ^ r2.h ^ r3.h;
37396             //sigma0
37397             int64rrot(r1, W[j - 15], 1);
37398             int64rrot(r2, W[j - 15], 8);
37399             int64shr(r3, W[j - 15], 7);
37400             s0.l = r1.l ^ r2.l ^ r3.l;
37401             s0.h = r1.h ^ r2.h ^ r3.h;
37402
37403             int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
37404           }
37405
37406           for (j = 0; j < 80; j += 1) {
37407             //Ch
37408             Ch.l = (e.l & f.l) ^ (~e.l & g.l);
37409             Ch.h = (e.h & f.h) ^ (~e.h & g.h);
37410
37411             //Sigma1
37412             int64rrot(r1, e, 14);
37413             int64rrot(r2, e, 18);
37414             int64revrrot(r3, e, 9);
37415             s1.l = r1.l ^ r2.l ^ r3.l;
37416             s1.h = r1.h ^ r2.h ^ r3.h;
37417
37418             //Sigma0
37419             int64rrot(r1, a, 28);
37420             int64revrrot(r2, a, 2);
37421             int64revrrot(r3, a, 7);
37422             s0.l = r1.l ^ r2.l ^ r3.l;
37423             s0.h = r1.h ^ r2.h ^ r3.h;
37424
37425             //Maj
37426             Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
37427             Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
37428
37429             int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
37430             int64add(T2, s0, Maj);
37431
37432             int64copy(h, g);
37433             int64copy(g, f);
37434             int64copy(f, e);
37435             int64add(e, d, T1);
37436             int64copy(d, c);
37437             int64copy(c, b);
37438             int64copy(b, a);
37439             int64add(a, T1, T2);
37440           }
37441           int64add(H[0], H[0], a);
37442           int64add(H[1], H[1], b);
37443           int64add(H[2], H[2], c);
37444           int64add(H[3], H[3], d);
37445           int64add(H[4], H[4], e);
37446           int64add(H[5], H[5], f);
37447           int64add(H[6], H[6], g);
37448           int64add(H[7], H[7], h);
37449         }
37450
37451         //represent the hash as an array of 32-bit dwords
37452         for (i = 0; i < 8; i += 1) {
37453           hash[2 * i] = H[i].h;
37454           hash[2 * i + 1] = H[i].l;
37455         }
37456         return hash;
37457       }
37458
37459       //A constructor for 64-bit numbers
37460
37461       function int64(h, l) {
37462         this.h = h;
37463         this.l = l;
37464         //this.toString = int64toString;
37465       }
37466
37467       //Copies src into dst, assuming both are 64-bit numbers
37468
37469       function int64copy(dst, src) {
37470         dst.h = src.h;
37471         dst.l = src.l;
37472       }
37473
37474       //Right-rotates a 64-bit number by shift
37475       //Won't handle cases of shift>=32
37476       //The function revrrot() is for that
37477
37478       function int64rrot(dst, x, shift) {
37479         dst.l = (x.l >>> shift) | (x.h << (32 - shift));
37480         dst.h = (x.h >>> shift) | (x.l << (32 - shift));
37481       }
37482
37483       //Reverses the dwords of the source and then rotates right by shift.
37484       //This is equivalent to rotation by 32+shift
37485
37486       function int64revrrot(dst, x, shift) {
37487         dst.l = (x.h >>> shift) | (x.l << (32 - shift));
37488         dst.h = (x.l >>> shift) | (x.h << (32 - shift));
37489       }
37490
37491       //Bitwise-shifts right a 64-bit number by shift
37492       //Won't handle shift>=32, but it's never needed in SHA512
37493
37494       function int64shr(dst, x, shift) {
37495         dst.l = (x.l >>> shift) | (x.h << (32 - shift));
37496         dst.h = (x.h >>> shift);
37497       }
37498
37499       //Adds two 64-bit numbers
37500       //Like the original implementation, does not rely on 32-bit operations
37501
37502       function int64add(dst, x, y) {
37503         var w0 = (x.l & 0xffff) + (y.l & 0xffff);
37504         var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
37505         var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
37506         var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
37507         dst.l = (w0 & 0xffff) | (w1 << 16);
37508         dst.h = (w2 & 0xffff) | (w3 << 16);
37509       }
37510
37511       //Same, except with 4 addends. Works faster than adding them one by one.
37512
37513       function int64add4(dst, a, b, c, d) {
37514         var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
37515         var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
37516         var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
37517         var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
37518         dst.l = (w0 & 0xffff) | (w1 << 16);
37519         dst.h = (w2 & 0xffff) | (w3 << 16);
37520       }
37521
37522       //Same, except with 5 addends
37523
37524       function int64add5(dst, a, b, c, d, e) {
37525         var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
37526           w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
37527           w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
37528           w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
37529         dst.l = (w0 & 0xffff) | (w1 << 16);
37530         dst.h = (w2 & 0xffff) | (w3 << 16);
37531       }
37532     },
37533     /**
37534      * @class Hashes.RMD160
37535      * @constructor
37536      * @param {Object} [config]
37537      *
37538      * A JavaScript implementation of the RIPEMD-160 Algorithm
37539      * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
37540      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
37541      * See http://pajhome.org.uk/crypt/md5 for details.
37542      * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
37543      */
37544     RMD160: function(options) {
37545       /**
37546        * Private properties configuration variables. You may need to tweak these to be compatible with
37547        * the server-side, but the defaults work in most cases.
37548        * @see this.setUpperCase() method
37549        * @see this.setPad() method
37550        */
37551       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
37552         /* hexadecimal output case format. false - lowercase; true - uppercase  */
37553         b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
37554         /* base-64 pad character. Default '=' for strict RFC compliance   */
37555         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
37556         /* enable/disable utf8 encoding */
37557         rmd160_r1 = [
37558           0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
37559           7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
37560           3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
37561           1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
37562           4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
37563         ],
37564         rmd160_r2 = [
37565           5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
37566           6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
37567           15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
37568           8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
37569           12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
37570         ],
37571         rmd160_s1 = [
37572           11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
37573           7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
37574           11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
37575           11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
37576           9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
37577         ],
37578         rmd160_s2 = [
37579           8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
37580           9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
37581           9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
37582           15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
37583           8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
37584         ];
37585
37586       /* privileged (public) methods */
37587       this.hex = function(s) {
37588         return rstr2hex(rstr(s, utf8));
37589       };
37590       this.b64 = function(s) {
37591         return rstr2b64(rstr(s, utf8), b64pad);
37592       };
37593       this.any = function(s, e) {
37594         return rstr2any(rstr(s, utf8), e);
37595       };
37596       this.raw = function(s) {
37597         return rstr(s, utf8);
37598       };
37599       this.hex_hmac = function(k, d) {
37600         return rstr2hex(rstr_hmac(k, d));
37601       };
37602       this.b64_hmac = function(k, d) {
37603         return rstr2b64(rstr_hmac(k, d), b64pad);
37604       };
37605       this.any_hmac = function(k, d, e) {
37606         return rstr2any(rstr_hmac(k, d), e);
37607       };
37608       /**
37609        * Perform a simple self-test to see if the VM is working
37610        * @return {String} Hexadecimal hash sample
37611        * @public
37612        */
37613       this.vm_test = function() {
37614         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37615       };
37616       /**
37617        * @description Enable/disable uppercase hexadecimal returned string
37618        * @param {boolean}
37619        * @return {Object} this
37620        * @public
37621        */
37622       this.setUpperCase = function(a) {
37623         if (typeof a === 'boolean') {
37624           hexcase = a;
37625         }
37626         return this;
37627       };
37628       /**
37629        * @description Defines a base64 pad string
37630        * @param {string} Pad
37631        * @return {Object} this
37632        * @public
37633        */
37634       this.setPad = function(a) {
37635         if (typeof a !== 'undefined') {
37636           b64pad = a;
37637         }
37638         return this;
37639       };
37640       /**
37641        * @description Defines a base64 pad string
37642        * @param {boolean}
37643        * @return {Object} this
37644        * @public
37645        */
37646       this.setUTF8 = function(a) {
37647         if (typeof a === 'boolean') {
37648           utf8 = a;
37649         }
37650         return this;
37651       };
37652
37653       /* private methods */
37654
37655       /**
37656        * Calculate the rmd160 of a raw string
37657        */
37658
37659       function rstr(s) {
37660         s = (utf8) ? utf8Encode(s) : s;
37661         return binl2rstr(binl(rstr2binl(s), s.length * 8));
37662       }
37663
37664       /**
37665        * Calculate the HMAC-rmd160 of a key and some data (raw strings)
37666        */
37667
37668       function rstr_hmac(key, data) {
37669         key = (utf8) ? utf8Encode(key) : key;
37670         data = (utf8) ? utf8Encode(data) : data;
37671         var i, hash,
37672           bkey = rstr2binl(key),
37673           ipad = Array(16),
37674           opad = Array(16);
37675
37676         if (bkey.length > 16) {
37677           bkey = binl(bkey, key.length * 8);
37678         }
37679
37680         for (i = 0; i < 16; i += 1) {
37681           ipad[i] = bkey[i] ^ 0x36363636;
37682           opad[i] = bkey[i] ^ 0x5C5C5C5C;
37683         }
37684         hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
37685         return binl2rstr(binl(opad.concat(hash), 512 + 160));
37686       }
37687
37688       /**
37689        * Convert an array of little-endian words to a string
37690        */
37691
37692       function binl2rstr(input) {
37693         var i, output = '',
37694           l = input.length * 32;
37695         for (i = 0; i < l; i += 8) {
37696           output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
37697         }
37698         return output;
37699       }
37700
37701       /**
37702        * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
37703        */
37704
37705       function binl(x, len) {
37706         var T, j, i, l,
37707           h0 = 0x67452301,
37708           h1 = 0xefcdab89,
37709           h2 = 0x98badcfe,
37710           h3 = 0x10325476,
37711           h4 = 0xc3d2e1f0,
37712           A1, B1, C1, D1, E1,
37713           A2, B2, C2, D2, E2;
37714
37715         /* append padding */
37716         x[len >> 5] |= 0x80 << (len % 32);
37717         x[(((len + 64) >>> 9) << 4) + 14] = len;
37718         l = x.length;
37719
37720         for (i = 0; i < l; i += 16) {
37721           A1 = A2 = h0;
37722           B1 = B2 = h1;
37723           C1 = C2 = h2;
37724           D1 = D2 = h3;
37725           E1 = E2 = h4;
37726           for (j = 0; j <= 79; j += 1) {
37727             T = safe_add(A1, rmd160_f(j, B1, C1, D1));
37728             T = safe_add(T, x[i + rmd160_r1[j]]);
37729             T = safe_add(T, rmd160_K1(j));
37730             T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
37731             A1 = E1;
37732             E1 = D1;
37733             D1 = bit_rol(C1, 10);
37734             C1 = B1;
37735             B1 = T;
37736             T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
37737             T = safe_add(T, x[i + rmd160_r2[j]]);
37738             T = safe_add(T, rmd160_K2(j));
37739             T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
37740             A2 = E2;
37741             E2 = D2;
37742             D2 = bit_rol(C2, 10);
37743             C2 = B2;
37744             B2 = T;
37745           }
37746
37747           T = safe_add(h1, safe_add(C1, D2));
37748           h1 = safe_add(h2, safe_add(D1, E2));
37749           h2 = safe_add(h3, safe_add(E1, A2));
37750           h3 = safe_add(h4, safe_add(A1, B2));
37751           h4 = safe_add(h0, safe_add(B1, C2));
37752           h0 = T;
37753         }
37754         return [h0, h1, h2, h3, h4];
37755       }
37756
37757       // specific algorithm methods
37758
37759       function rmd160_f(j, x, y, z) {
37760         return (0 <= j && j <= 15) ? (x ^ y ^ z) :
37761           (16 <= j && j <= 31) ? (x & y) | (~x & z) :
37762           (32 <= j && j <= 47) ? (x | ~y) ^ z :
37763           (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
37764           (64 <= j && j <= 79) ? x ^ (y | ~z) :
37765           'rmd160_f: j out of range';
37766       }
37767
37768       function rmd160_K1(j) {
37769         return (0 <= j && j <= 15) ? 0x00000000 :
37770           (16 <= j && j <= 31) ? 0x5a827999 :
37771           (32 <= j && j <= 47) ? 0x6ed9eba1 :
37772           (48 <= j && j <= 63) ? 0x8f1bbcdc :
37773           (64 <= j && j <= 79) ? 0xa953fd4e :
37774           'rmd160_K1: j out of range';
37775       }
37776
37777       function rmd160_K2(j) {
37778         return (0 <= j && j <= 15) ? 0x50a28be6 :
37779           (16 <= j && j <= 31) ? 0x5c4dd124 :
37780           (32 <= j && j <= 47) ? 0x6d703ef3 :
37781           (48 <= j && j <= 63) ? 0x7a6d76e9 :
37782           (64 <= j && j <= 79) ? 0x00000000 :
37783           'rmd160_K2: j out of range';
37784       }
37785     }
37786   };
37787
37788   // exposes Hashes
37789   (function(window, undefined) {
37790     var freeExports = false;
37791     {
37792       freeExports = exports;
37793       if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
37794         window = commonjsGlobal;
37795       }
37796     }
37797
37798     if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
37799       // define as an anonymous module, so, through path mapping, it can be aliased
37800       undefined(function() {
37801         return Hashes;
37802       });
37803     } else if (freeExports) {
37804       // in Node.js or RingoJS v0.8.0+
37805       if ('object' === 'object' && module && module.exports === freeExports) {
37806         module.exports = Hashes;
37807       }
37808       // in Narwhal or RingoJS v0.7.0-
37809       else {
37810         freeExports.Hashes = Hashes;
37811       }
37812     } else {
37813       // in a browser or Rhino
37814       window.Hashes = Hashes;
37815     }
37816   }(this));
37817 }()); // IIFE
37818 });
37819
37820 var immutable = extend$2;
37821
37822 var hasOwnProperty$16 = Object.prototype.hasOwnProperty;
37823
37824 function extend$2() {
37825     var target = {};
37826
37827     for (var i = 0; i < arguments.length; i++) {
37828         var source = arguments[i];
37829
37830         for (var key in source) {
37831             if (hasOwnProperty$16.call(source, key)) {
37832                 target[key] = source[key];
37833             }
37834         }
37835     }
37836
37837     return target
37838 }
37839
37840 var sha1 = new hashes.SHA1();
37841
37842 var ohauth = {};
37843
37844 ohauth.qsString = function(obj) {
37845     return Object.keys(obj).sort().map(function(key) {
37846         return ohauth.percentEncode(key) + '=' +
37847             ohauth.percentEncode(obj[key]);
37848     }).join('&');
37849 };
37850
37851 ohauth.stringQs = function(str) {
37852     return str.split('&').filter(function (pair) {
37853         return pair !== '';
37854     }).reduce(function(obj, pair){
37855         var parts = pair.split('=');
37856         obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
37857             '' : decodeURIComponent(parts[1]);
37858         return obj;
37859     }, {});
37860 };
37861
37862 ohauth.rawxhr = function(method, url, data, headers, callback) {
37863     var xhr = new XMLHttpRequest(),
37864         twoHundred = /^20\d$/;
37865     xhr.onreadystatechange = function() {
37866         if (4 === xhr.readyState && 0 !== xhr.status) {
37867             if (twoHundred.test(xhr.status)) callback(null, xhr);
37868             else return callback(xhr, null);
37869         }
37870     };
37871     xhr.onerror = function(e) { return callback(e, null); };
37872     xhr.open(method, url, true);
37873     for (var h in headers) xhr.setRequestHeader(h, headers[h]);
37874     xhr.send(data);
37875     return xhr;
37876 };
37877
37878 ohauth.xhr = function(method, url, auth, data, options, callback) {
37879     var headers = (options && options.header) || {
37880         'Content-Type': 'application/x-www-form-urlencoded'
37881     };
37882     headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
37883     return ohauth.rawxhr(method, url, data, headers, callback);
37884 };
37885
37886 ohauth.nonce = function() {
37887     for (var o = ''; o.length < 6;) {
37888         o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
37889     }
37890     return o;
37891 };
37892
37893 ohauth.authHeader = function(obj) {
37894     return Object.keys(obj).sort().map(function(key) {
37895         return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
37896     }).join(', ');
37897 };
37898
37899 ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
37900
37901 ohauth.percentEncode = function(s) {
37902     return encodeURIComponent(s)
37903         .replace(/\!/g, '%21').replace(/\'/g, '%27')
37904         .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
37905 };
37906
37907 ohauth.baseString = function(method, url, params) {
37908     if (params.oauth_signature) delete params.oauth_signature;
37909     return [
37910         method,
37911         ohauth.percentEncode(url),
37912         ohauth.percentEncode(ohauth.qsString(params))].join('&');
37913 };
37914
37915 ohauth.signature = function(oauth_secret, token_secret, baseString) {
37916     return sha1.b64_hmac(
37917         ohauth.percentEncode(oauth_secret) + '&' +
37918         ohauth.percentEncode(token_secret),
37919         baseString);
37920 };
37921
37922 /**
37923  * Takes an options object for configuration (consumer_key,
37924  * consumer_secret, version, signature_method, token, token_secret)
37925  * and returns a function that generates the Authorization header
37926  * for given data.
37927  *
37928  * The returned function takes these parameters:
37929  * - method: GET/POST/...
37930  * - uri: full URI with protocol, port, path and query string
37931  * - extra_params: any extra parameters (that are passed in the POST data),
37932  *   can be an object or a from-urlencoded string.
37933  *
37934  * Returned function returns full OAuth header with "OAuth" string in it.
37935  */
37936
37937 ohauth.headerGenerator = function(options) {
37938     options = options || {};
37939     var consumer_key = options.consumer_key || '',
37940         consumer_secret = options.consumer_secret || '',
37941         signature_method = options.signature_method || 'HMAC-SHA1',
37942         version = options.version || '1.0',
37943         token = options.token || '',
37944         token_secret = options.token_secret || '';
37945
37946     return function(method, uri, extra_params) {
37947         method = method.toUpperCase();
37948         if (typeof extra_params === 'string' && extra_params.length > 0) {
37949             extra_params = ohauth.stringQs(extra_params);
37950         }
37951
37952         var uri_parts = uri.split('?', 2),
37953         base_uri = uri_parts[0];
37954
37955         var query_params = uri_parts.length === 2 ?
37956             ohauth.stringQs(uri_parts[1]) : {};
37957
37958         var oauth_params = {
37959             oauth_consumer_key: consumer_key,
37960             oauth_signature_method: signature_method,
37961             oauth_version: version,
37962             oauth_timestamp: ohauth.timestamp(),
37963             oauth_nonce: ohauth.nonce()
37964         };
37965
37966         if (token) oauth_params.oauth_token = token;
37967
37968         var all_params = immutable({}, oauth_params, query_params, extra_params),
37969             base_str = ohauth.baseString(method, base_uri, all_params);
37970
37971         oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
37972
37973         return 'OAuth ' + ohauth.authHeader(oauth_params);
37974     };
37975 };
37976
37977 var ohauth_1 = ohauth;
37978
37979 var resolveUrl = createCommonjsModule(function (module, exports) {
37980 // Copyright 2014 Simon Lydell
37981 // X11 (“MIT”) Licensed. (See LICENSE.)
37982
37983 void (function(root, factory) {
37984   if (typeof undefined === "function" && undefined.amd) {
37985     undefined(factory);
37986   } else {
37987     module.exports = factory();
37988   }
37989 }(commonjsGlobal, function() {
37990
37991   function resolveUrl(/* ...urls */) {
37992     var numUrls = arguments.length;
37993
37994     if (numUrls === 0) {
37995       throw new Error("resolveUrl requires at least one argument; got none.")
37996     }
37997
37998     var base = document.createElement("base");
37999     base.href = arguments[0];
38000
38001     if (numUrls === 1) {
38002       return base.href
38003     }
38004
38005     var head = document.getElementsByTagName("head")[0];
38006     head.insertBefore(base, head.firstChild);
38007
38008     var a = document.createElement("a");
38009     var resolved;
38010
38011     for (var index = 1; index < numUrls; index++) {
38012       a.href = arguments[index];
38013       resolved = a.href;
38014       base.href = resolved;
38015     }
38016
38017     head.removeChild(base);
38018
38019     return resolved
38020   }
38021
38022   return resolveUrl
38023
38024 }));
38025 });
38026
38027 var assign$1 = make_assign();
38028 var create$2 = make_create();
38029 var trim = make_trim();
38030 var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
38031
38032 var util = {
38033         assign: assign$1,
38034         create: create$2,
38035         trim: trim,
38036         bind: bind,
38037         slice: slice$7,
38038         each: each,
38039         map: map$4,
38040         pluck: pluck,
38041         isList: isList,
38042         isFunction: isFunction$1,
38043         isObject: isObject$1,
38044         Global: Global
38045 };
38046
38047 function make_assign() {
38048         if (Object.assign) {
38049                 return Object.assign
38050         } else {
38051                 return function shimAssign(obj, props1, props2, etc) {
38052                         for (var i = 1; i < arguments.length; i++) {
38053                                 each(Object(arguments[i]), function(val, key) {
38054                                         obj[key] = val;
38055                                 });
38056                         }                       
38057                         return obj
38058                 }
38059         }
38060 }
38061
38062 function make_create() {
38063         if (Object.create) {
38064                 return function create(obj, assignProps1, assignProps2, etc) {
38065                         var assignArgsList = slice$7(arguments, 1);
38066                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
38067                 }
38068         } else {
38069                 function F() {} // eslint-disable-line no-inner-declarations
38070                 return function create(obj, assignProps1, assignProps2, etc) {
38071                         var assignArgsList = slice$7(arguments, 1);
38072                         F.prototype = obj;
38073                         return assign$1.apply(this, [new F()].concat(assignArgsList))
38074                 }
38075         }
38076 }
38077
38078 function make_trim() {
38079         if (String.prototype.trim) {
38080                 return function trim(str) {
38081                         return String.prototype.trim.call(str)
38082                 }
38083         } else {
38084                 return function trim(str) {
38085                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
38086                 }
38087         }
38088 }
38089
38090 function bind(obj, fn) {
38091         return function() {
38092                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
38093         }
38094 }
38095
38096 function slice$7(arr, index) {
38097         return Array.prototype.slice.call(arr, index || 0)
38098 }
38099
38100 function each(obj, fn) {
38101         pluck(obj, function(val, key) {
38102                 fn(val, key);
38103                 return false
38104         });
38105 }
38106
38107 function map$4(obj, fn) {
38108         var res = (isList(obj) ? [] : {});
38109         pluck(obj, function(v, k) {
38110                 res[k] = fn(v, k);
38111                 return false
38112         });
38113         return res
38114 }
38115
38116 function pluck(obj, fn) {
38117         if (isList(obj)) {
38118                 for (var i=0; i<obj.length; i++) {
38119                         if (fn(obj[i], i)) {
38120                                 return obj[i]
38121                         }
38122                 }
38123         } else {
38124                 for (var key in obj) {
38125                         if (obj.hasOwnProperty(key)) {
38126                                 if (fn(obj[key], key)) {
38127                                         return obj[key]
38128                                 }
38129                         }
38130                 }
38131         }
38132 }
38133
38134 function isList(val) {
38135         return (val != null && typeof val != 'function' && typeof val.length == 'number')
38136 }
38137
38138 function isFunction$1(val) {
38139         return val && {}.toString.call(val) === '[object Function]'
38140 }
38141
38142 function isObject$1(val) {
38143         return val && {}.toString.call(val) === '[object Object]'
38144 }
38145
38146 var slice$8 = util.slice;
38147 var pluck$1 = util.pluck;
38148 var each$1 = util.each;
38149 var bind$1 = util.bind;
38150 var create$3 = util.create;
38151 var isList$1 = util.isList;
38152 var isFunction$2 = util.isFunction;
38153 var isObject$2 = util.isObject;
38154
38155 var storeEngine = {
38156         createStore: createStore
38157 };
38158
38159 var storeAPI = {
38160         version: '2.0.12',
38161         enabled: false,
38162         
38163         // get returns the value of the given key. If that value
38164         // is undefined, it returns optionalDefaultValue instead.
38165         get: function(key, optionalDefaultValue) {
38166                 var data = this.storage.read(this._namespacePrefix + key);
38167                 return this._deserialize(data, optionalDefaultValue)
38168         },
38169
38170         // set will store the given value at key and returns value.
38171         // Calling set with value === undefined is equivalent to calling remove.
38172         set: function(key, value) {
38173                 if (value === undefined) {
38174                         return this.remove(key)
38175                 }
38176                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
38177                 return value
38178         },
38179
38180         // remove deletes the key and value stored at the given key.
38181         remove: function(key) {
38182                 this.storage.remove(this._namespacePrefix + key);
38183         },
38184
38185         // each will call the given callback once for each key-value pair
38186         // in this store.
38187         each: function(callback) {
38188                 var self = this;
38189                 this.storage.each(function(val, namespacedKey) {
38190                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
38191                 });
38192         },
38193
38194         // clearAll will remove all the stored key-value pairs in this store.
38195         clearAll: function() {
38196                 this.storage.clearAll();
38197         },
38198
38199         // additional functionality that can't live in plugins
38200         // ---------------------------------------------------
38201
38202         // hasNamespace returns true if this store instance has the given namespace.
38203         hasNamespace: function(namespace) {
38204                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
38205         },
38206
38207         // createStore creates a store.js instance with the first
38208         // functioning storage in the list of storage candidates,
38209         // and applies the the given mixins to the instance.
38210         createStore: function() {
38211                 return createStore.apply(this, arguments)
38212         },
38213         
38214         addPlugin: function(plugin) {
38215                 this._addPlugin(plugin);
38216         },
38217         
38218         namespace: function(namespace) {
38219                 return createStore(this.storage, this.plugins, namespace)
38220         }
38221 };
38222
38223 function _warn() {
38224         var _console = (typeof console == 'undefined' ? null : console);
38225         if (!_console) { return }
38226         var fn = (_console.warn ? _console.warn : _console.log);
38227         fn.apply(_console, arguments);
38228 }
38229
38230 function createStore(storages, plugins, namespace) {
38231         if (!namespace) {
38232                 namespace = '';
38233         }
38234         if (storages && !isList$1(storages)) {
38235                 storages = [storages];
38236         }
38237         if (plugins && !isList$1(plugins)) {
38238                 plugins = [plugins];
38239         }
38240
38241         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
38242         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
38243         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
38244         if (!legalNamespaces.test(namespace)) {
38245                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
38246         }
38247         
38248         var _privateStoreProps = {
38249                 _namespacePrefix: namespacePrefix,
38250                 _namespaceRegexp: namespaceRegexp,
38251
38252                 _testStorage: function(storage) {
38253                         try {
38254                                 var testStr = '__storejs__test__';
38255                                 storage.write(testStr, testStr);
38256                                 var ok = (storage.read(testStr) === testStr);
38257                                 storage.remove(testStr);
38258                                 return ok
38259                         } catch(e) {
38260                                 return false
38261                         }
38262                 },
38263
38264                 _assignPluginFnProp: function(pluginFnProp, propName) {
38265                         var oldFn = this[propName];
38266                         this[propName] = function pluginFn() {
38267                                 var args = slice$8(arguments, 0);
38268                                 var self = this;
38269
38270                                 // super_fn calls the old function which was overwritten by
38271                                 // this mixin.
38272                                 function super_fn() {
38273                                         if (!oldFn) { return }
38274                                         each$1(arguments, function(arg, i) {
38275                                                 args[i] = arg;
38276                                         });
38277                                         return oldFn.apply(self, args)
38278                                 }
38279
38280                                 // Give mixing function access to super_fn by prefixing all mixin function
38281                                 // arguments with super_fn.
38282                                 var newFnArgs = [super_fn].concat(args);
38283
38284                                 return pluginFnProp.apply(self, newFnArgs)
38285                         };
38286                 },
38287
38288                 _serialize: function(obj) {
38289                         return JSON.stringify(obj)
38290                 },
38291
38292                 _deserialize: function(strVal, defaultVal) {
38293                         if (!strVal) { return defaultVal }
38294                         // It is possible that a raw string value has been previously stored
38295                         // in a storage without using store.js, meaning it will be a raw
38296                         // string value instead of a JSON serialized string. By defaulting
38297                         // to the raw string value in case of a JSON parse error, we allow
38298                         // for past stored values to be forwards-compatible with store.js
38299                         var val = '';
38300                         try { val = JSON.parse(strVal); }
38301                         catch(e) { val = strVal; }
38302
38303                         return (val !== undefined ? val : defaultVal)
38304                 },
38305                 
38306                 _addStorage: function(storage) {
38307                         if (this.enabled) { return }
38308                         if (this._testStorage(storage)) {
38309                                 this.storage = storage;
38310                                 this.enabled = true;
38311                         }
38312                 },
38313
38314                 _addPlugin: function(plugin) {
38315                         var self = this;
38316
38317                         // If the plugin is an array, then add all plugins in the array.
38318                         // This allows for a plugin to depend on other plugins.
38319                         if (isList$1(plugin)) {
38320                                 each$1(plugin, function(plugin) {
38321                                         self._addPlugin(plugin);
38322                                 });
38323                                 return
38324                         }
38325
38326                         // Keep track of all plugins we've seen so far, so that we
38327                         // don't add any of them twice.
38328                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
38329                                 return (plugin === seenPlugin)
38330                         });
38331                         if (seenPlugin) {
38332                                 return
38333                         }
38334                         this.plugins.push(plugin);
38335
38336                         // Check that the plugin is properly formed
38337                         if (!isFunction$2(plugin)) {
38338                                 throw new Error('Plugins must be function values that return objects')
38339                         }
38340
38341                         var pluginProperties = plugin.call(this);
38342                         if (!isObject$2(pluginProperties)) {
38343                                 throw new Error('Plugins must return an object of function properties')
38344                         }
38345
38346                         // Add the plugin function properties to this store instance.
38347                         each$1(pluginProperties, function(pluginFnProp, propName) {
38348                                 if (!isFunction$2(pluginFnProp)) {
38349                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
38350                                 }
38351                                 self._assignPluginFnProp(pluginFnProp, propName);
38352                         });
38353                 },
38354                 
38355                 // Put deprecated properties in the private API, so as to not expose it to accidential
38356                 // discovery through inspection of the store object.
38357                 
38358                 // Deprecated: addStorage
38359                 addStorage: function(storage) {
38360                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
38361                         this._addStorage(storage);
38362                 }
38363         };
38364
38365         var store = create$3(_privateStoreProps, storeAPI, {
38366                 plugins: []
38367         });
38368         store.raw = {};
38369         each$1(store, function(prop, propName) {
38370                 if (isFunction$2(prop)) {
38371                         store.raw[propName] = bind$1(store, prop);                      
38372                 }
38373         });
38374         each$1(storages, function(storage) {
38375                 store._addStorage(storage);
38376         });
38377         each$1(plugins, function(plugin) {
38378                 store._addPlugin(plugin);
38379         });
38380         return store
38381 }
38382
38383 var Global$1 = util.Global;
38384
38385 var localStorage_1 = {
38386         name: 'localStorage',
38387         read: read,
38388         write: write,
38389         each: each$2,
38390         remove: remove$2,
38391         clearAll: clearAll,
38392 };
38393
38394 function localStorage$1() {
38395         return Global$1.localStorage
38396 }
38397
38398 function read(key) {
38399         return localStorage$1().getItem(key)
38400 }
38401
38402 function write(key, data) {
38403         return localStorage$1().setItem(key, data)
38404 }
38405
38406 function each$2(fn) {
38407         for (var i = localStorage$1().length - 1; i >= 0; i--) {
38408                 var key = localStorage$1().key(i);
38409                 fn(read(key), key);
38410         }
38411 }
38412
38413 function remove$2(key) {
38414         return localStorage$1().removeItem(key)
38415 }
38416
38417 function clearAll() {
38418         return localStorage$1().clear()
38419 }
38420
38421 // oldFF-globalStorage provides storage for Firefox
38422 // versions 6 and 7, where no localStorage, etc
38423 // is available.
38424
38425
38426 var Global$2 = util.Global;
38427
38428 var oldFFGlobalStorage = {
38429         name: 'oldFF-globalStorage',
38430         read: read$1,
38431         write: write$1,
38432         each: each$3,
38433         remove: remove$3,
38434         clearAll: clearAll$1,
38435 };
38436
38437 var globalStorage = Global$2.globalStorage;
38438
38439 function read$1(key) {
38440         return globalStorage[key]
38441 }
38442
38443 function write$1(key, data) {
38444         globalStorage[key] = data;
38445 }
38446
38447 function each$3(fn) {
38448         for (var i = globalStorage.length - 1; i >= 0; i--) {
38449                 var key = globalStorage.key(i);
38450                 fn(globalStorage[key], key);
38451         }
38452 }
38453
38454 function remove$3(key) {
38455         return globalStorage.removeItem(key)
38456 }
38457
38458 function clearAll$1() {
38459         each$3(function(key, _) {
38460                 delete globalStorage[key];
38461         });
38462 }
38463
38464 // oldIE-userDataStorage provides storage for Internet Explorer
38465 // versions 6 and 7, where no localStorage, sessionStorage, etc
38466 // is available.
38467
38468
38469 var Global$3 = util.Global;
38470
38471 var oldIEUserDataStorage = {
38472         name: 'oldIE-userDataStorage',
38473         write: write$2,
38474         read: read$2,
38475         each: each$4,
38476         remove: remove$4,
38477         clearAll: clearAll$2,
38478 };
38479
38480 var storageName = 'storejs';
38481 var doc = Global$3.document;
38482 var _withStorageEl = _makeIEStorageElFunction();
38483 var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
38484
38485 function write$2(unfixedKey, data) {
38486         if (disable) { return }
38487         var fixedKey = fixKey(unfixedKey);
38488         _withStorageEl(function(storageEl) {
38489                 storageEl.setAttribute(fixedKey, data);
38490                 storageEl.save(storageName);
38491         });
38492 }
38493
38494 function read$2(unfixedKey) {
38495         if (disable) { return }
38496         var fixedKey = fixKey(unfixedKey);
38497         var res = null;
38498         _withStorageEl(function(storageEl) {
38499                 res = storageEl.getAttribute(fixedKey);
38500         });
38501         return res
38502 }
38503
38504 function each$4(callback) {
38505         _withStorageEl(function(storageEl) {
38506                 var attributes = storageEl.XMLDocument.documentElement.attributes;
38507                 for (var i=attributes.length-1; i>=0; i--) {
38508                         var attr = attributes[i];
38509                         callback(storageEl.getAttribute(attr.name), attr.name);
38510                 }
38511         });
38512 }
38513
38514 function remove$4(unfixedKey) {
38515         var fixedKey = fixKey(unfixedKey);
38516         _withStorageEl(function(storageEl) {
38517                 storageEl.removeAttribute(fixedKey);
38518                 storageEl.save(storageName);
38519         });
38520 }
38521
38522 function clearAll$2() {
38523         _withStorageEl(function(storageEl) {
38524                 var attributes = storageEl.XMLDocument.documentElement.attributes;
38525                 storageEl.load(storageName);
38526                 for (var i=attributes.length-1; i>=0; i--) {
38527                         storageEl.removeAttribute(attributes[i].name);
38528                 }
38529                 storageEl.save(storageName);
38530         });
38531 }
38532
38533 // Helpers
38534 //////////
38535
38536 // In IE7, keys cannot start with a digit or contain certain chars.
38537 // See https://github.com/marcuswestin/store.js/issues/40
38538 // See https://github.com/marcuswestin/store.js/issues/83
38539 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
38540 function fixKey(key) {
38541         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
38542 }
38543
38544 function _makeIEStorageElFunction() {
38545         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
38546                 return null
38547         }
38548         var scriptTag = 'script',
38549                 storageOwner,
38550                 storageContainer,
38551                 storageEl;
38552
38553         // Since #userData storage applies only to specific paths, we need to
38554         // somehow link our data to a specific path.  We choose /favicon.ico
38555         // as a pretty safe option, since all browsers already make a request to
38556         // this URL anyway and being a 404 will not hurt us here.  We wrap an
38557         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
38558         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
38559         // since the iframe access rules appear to allow direct access and
38560         // manipulation of the document element, even for a 404 page.  This
38561         // document can be used instead of the current document (which would
38562         // have been limited to the current path) to perform #userData storage.
38563         try {
38564                 /* global ActiveXObject */
38565                 storageContainer = new ActiveXObject('htmlfile');
38566                 storageContainer.open();
38567                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
38568                 storageContainer.close();
38569                 storageOwner = storageContainer.w.frames[0].document;
38570                 storageEl = storageOwner.createElement('div');
38571         } catch(e) {
38572                 // somehow ActiveXObject instantiation failed (perhaps some special
38573                 // security settings or otherwse), fall back to per-path storage
38574                 storageEl = doc.createElement('div');
38575                 storageOwner = doc.body;
38576         }
38577
38578         return function(storeFunction) {
38579                 var args = [].slice.call(arguments, 0);
38580                 args.unshift(storageEl);
38581                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
38582                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
38583                 storageOwner.appendChild(storageEl);
38584                 storageEl.addBehavior('#default#userData');
38585                 storageEl.load(storageName);
38586                 storeFunction.apply(this, args);
38587                 storageOwner.removeChild(storageEl);
38588                 return
38589         }
38590 }
38591
38592 // cookieStorage is useful Safari private browser mode, where localStorage
38593 // doesn't work but cookies do. This implementation is adopted from
38594 // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
38595
38596
38597 var Global$4 = util.Global;
38598 var trim$1 = util.trim;
38599
38600 var cookieStorage = {
38601         name: 'cookieStorage',
38602         read: read$3,
38603         write: write$3,
38604         each: each$5,
38605         remove: remove$5,
38606         clearAll: clearAll$3,
38607 };
38608
38609 var doc$1 = Global$4.document;
38610
38611 function read$3(key) {
38612         if (!key || !_has(key)) { return null }
38613         var regexpStr = "(?:^|.*;\\s*)" +
38614                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
38615                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
38616         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
38617 }
38618
38619 function each$5(callback) {
38620         var cookies = doc$1.cookie.split(/; ?/g);
38621         for (var i = cookies.length - 1; i >= 0; i--) {
38622                 if (!trim$1(cookies[i])) {
38623                         continue
38624                 }
38625                 var kvp = cookies[i].split('=');
38626                 var key = unescape(kvp[0]);
38627                 var val = unescape(kvp[1]);
38628                 callback(val, key);
38629         }
38630 }
38631
38632 function write$3(key, data) {
38633         if(!key) { return }
38634         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
38635 }
38636
38637 function remove$5(key) {
38638         if (!key || !_has(key)) {
38639                 return
38640         }
38641         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
38642 }
38643
38644 function clearAll$3() {
38645         each$5(function(_, key) {
38646                 remove$5(key);
38647         });
38648 }
38649
38650 function _has(key) {
38651         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
38652 }
38653
38654 var Global$5 = util.Global;
38655
38656 var sessionStorage_1 = {
38657         name: 'sessionStorage',
38658         read: read$4,
38659         write: write$4,
38660         each: each$6,
38661         remove: remove$6,
38662         clearAll: clearAll$4
38663 };
38664
38665 function sessionStorage() {
38666         return Global$5.sessionStorage
38667 }
38668
38669 function read$4(key) {
38670         return sessionStorage().getItem(key)
38671 }
38672
38673 function write$4(key, data) {
38674         return sessionStorage().setItem(key, data)
38675 }
38676
38677 function each$6(fn) {
38678         for (var i = sessionStorage().length - 1; i >= 0; i--) {
38679                 var key = sessionStorage().key(i);
38680                 fn(read$4(key), key);
38681         }
38682 }
38683
38684 function remove$6(key) {
38685         return sessionStorage().removeItem(key)
38686 }
38687
38688 function clearAll$4() {
38689         return sessionStorage().clear()
38690 }
38691
38692 // memoryStorage is a useful last fallback to ensure that the store
38693 // is functions (meaning store.get(), store.set(), etc will all function).
38694 // However, stored values will not persist when the browser navigates to
38695 // a new page or reloads the current page.
38696
38697 var memoryStorage_1 = {
38698         name: 'memoryStorage',
38699         read: read$5,
38700         write: write$5,
38701         each: each$7,
38702         remove: remove$7,
38703         clearAll: clearAll$5,
38704 };
38705
38706 var memoryStorage = {};
38707
38708 function read$5(key) {
38709         return memoryStorage[key]
38710 }
38711
38712 function write$5(key, data) {
38713         memoryStorage[key] = data;
38714 }
38715
38716 function each$7(callback) {
38717         for (var key in memoryStorage) {
38718                 if (memoryStorage.hasOwnProperty(key)) {
38719                         callback(memoryStorage[key], key);
38720                 }
38721         }
38722 }
38723
38724 function remove$7(key) {
38725         delete memoryStorage[key];
38726 }
38727
38728 function clearAll$5(key) {
38729         memoryStorage = {};
38730 }
38731
38732 var all$3 = [
38733         // Listed in order of usage preference
38734         localStorage_1,
38735         oldFFGlobalStorage,
38736         oldIEUserDataStorage,
38737         cookieStorage,
38738         sessionStorage_1,
38739         memoryStorage_1
38740 ];
38741
38742 /* eslint-disable */
38743
38744 //  json2.js
38745 //  2016-10-28
38746 //  Public Domain.
38747 //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
38748 //  See http://www.JSON.org/js.html
38749 //  This code should be minified before deployment.
38750 //  See http://javascript.crockford.com/jsmin.html
38751
38752 //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
38753 //  NOT CONTROL.
38754
38755 //  This file creates a global JSON object containing two methods: stringify
38756 //  and parse. This file provides the ES5 JSON capability to ES3 systems.
38757 //  If a project might run on IE8 or earlier, then this file should be included.
38758 //  This file does nothing on ES5 systems.
38759
38760 //      JSON.stringify(value, replacer, space)
38761 //          value       any JavaScript value, usually an object or array.
38762 //          replacer    an optional parameter that determines how object
38763 //                      values are stringified for objects. It can be a
38764 //                      function or an array of strings.
38765 //          space       an optional parameter that specifies the indentation
38766 //                      of nested structures. If it is omitted, the text will
38767 //                      be packed without extra whitespace. If it is a number,
38768 //                      it will specify the number of spaces to indent at each
38769 //                      level. If it is a string (such as "\t" or "&nbsp;"),
38770 //                      it contains the characters used to indent at each level.
38771 //          This method produces a JSON text from a JavaScript value.
38772 //          When an object value is found, if the object contains a toJSON
38773 //          method, its toJSON method will be called and the result will be
38774 //          stringified. A toJSON method does not serialize: it returns the
38775 //          value represented by the name/value pair that should be serialized,
38776 //          or undefined if nothing should be serialized. The toJSON method
38777 //          will be passed the key associated with the value, and this will be
38778 //          bound to the value.
38779
38780 //          For example, this would serialize Dates as ISO strings.
38781
38782 //              Date.prototype.toJSON = function (key) {
38783 //                  function f(n) {
38784 //                      // Format integers to have at least two digits.
38785 //                      return (n < 10)
38786 //                          ? "0" + n
38787 //                          : n;
38788 //                  }
38789 //                  return this.getUTCFullYear()   + "-" +
38790 //                       f(this.getUTCMonth() + 1) + "-" +
38791 //                       f(this.getUTCDate())      + "T" +
38792 //                       f(this.getUTCHours())     + ":" +
38793 //                       f(this.getUTCMinutes())   + ":" +
38794 //                       f(this.getUTCSeconds())   + "Z";
38795 //              };
38796
38797 //          You can provide an optional replacer method. It will be passed the
38798 //          key and value of each member, with this bound to the containing
38799 //          object. The value that is returned from your method will be
38800 //          serialized. If your method returns undefined, then the member will
38801 //          be excluded from the serialization.
38802
38803 //          If the replacer parameter is an array of strings, then it will be
38804 //          used to select the members to be serialized. It filters the results
38805 //          such that only members with keys listed in the replacer array are
38806 //          stringified.
38807
38808 //          Values that do not have JSON representations, such as undefined or
38809 //          functions, will not be serialized. Such values in objects will be
38810 //          dropped; in arrays they will be replaced with null. You can use
38811 //          a replacer function to replace those with JSON values.
38812
38813 //          JSON.stringify(undefined) returns undefined.
38814
38815 //          The optional space parameter produces a stringification of the
38816 //          value that is filled with line breaks and indentation to make it
38817 //          easier to read.
38818
38819 //          If the space parameter is a non-empty string, then that string will
38820 //          be used for indentation. If the space parameter is a number, then
38821 //          the indentation will be that many spaces.
38822
38823 //          Example:
38824
38825 //          text = JSON.stringify(["e", {pluribus: "unum"}]);
38826 //          // text is '["e",{"pluribus":"unum"}]'
38827
38828 //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
38829 //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
38830
38831 //          text = JSON.stringify([new Date()], function (key, value) {
38832 //              return this[key] instanceof Date
38833 //                  ? "Date(" + this[key] + ")"
38834 //                  : value;
38835 //          });
38836 //          // text is '["Date(---current time---)"]'
38837
38838 //      JSON.parse(text, reviver)
38839 //          This method parses a JSON text to produce an object or array.
38840 //          It can throw a SyntaxError exception.
38841
38842 //          The optional reviver parameter is a function that can filter and
38843 //          transform the results. It receives each of the keys and values,
38844 //          and its return value is used instead of the original value.
38845 //          If it returns what it received, then the structure is not modified.
38846 //          If it returns undefined then the member is deleted.
38847
38848 //          Example:
38849
38850 //          // Parse the text. Values that look like ISO date strings will
38851 //          // be converted to Date objects.
38852
38853 //          myData = JSON.parse(text, function (key, value) {
38854 //              var a;
38855 //              if (typeof value === "string") {
38856 //                  a =
38857 //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
38858 //                  if (a) {
38859 //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
38860 //                          +a[5], +a[6]));
38861 //                  }
38862 //              }
38863 //              return value;
38864 //          });
38865
38866 //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
38867 //              var d;
38868 //              if (typeof value === "string" &&
38869 //                      value.slice(0, 5) === "Date(" &&
38870 //                      value.slice(-1) === ")") {
38871 //                  d = new Date(value.slice(5, -1));
38872 //                  if (d) {
38873 //                      return d;
38874 //                  }
38875 //              }
38876 //              return value;
38877 //          });
38878
38879 //  This is a reference implementation. You are free to copy, modify, or
38880 //  redistribute.
38881
38882 /*jslint
38883     eval, for, this
38884 */
38885
38886 /*property
38887     JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
38888     getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
38889     lastIndex, length, parse, prototype, push, replace, slice, stringify,
38890     test, toJSON, toString, valueOf
38891 */
38892
38893
38894 // Create a JSON object only if one does not already exist. We create the
38895 // methods in a closure to avoid creating global variables.
38896
38897 if (typeof JSON !== "object") {
38898     JSON = {};
38899 }
38900
38901 (function () {
38902
38903     var rx_one = /^[\],:{}\s]*$/;
38904     var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
38905     var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
38906     var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
38907     var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
38908     var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
38909
38910     function f(n) {
38911         // Format integers to have at least two digits.
38912         return n < 10
38913             ? "0" + n
38914             : n;
38915     }
38916
38917     function this_value() {
38918         return this.valueOf();
38919     }
38920
38921     if (typeof Date.prototype.toJSON !== "function") {
38922
38923         Date.prototype.toJSON = function () {
38924
38925             return isFinite(this.valueOf())
38926                 ? this.getUTCFullYear() + "-" +
38927                         f(this.getUTCMonth() + 1) + "-" +
38928                         f(this.getUTCDate()) + "T" +
38929                         f(this.getUTCHours()) + ":" +
38930                         f(this.getUTCMinutes()) + ":" +
38931                         f(this.getUTCSeconds()) + "Z"
38932                 : null;
38933         };
38934
38935         Boolean.prototype.toJSON = this_value;
38936         Number.prototype.toJSON = this_value;
38937         String.prototype.toJSON = this_value;
38938     }
38939
38940     var gap;
38941     var indent;
38942     var meta;
38943     var rep;
38944
38945
38946     function quote(string) {
38947
38948 // If the string contains no control characters, no quote characters, and no
38949 // backslash characters, then we can safely slap some quotes around it.
38950 // Otherwise we must also replace the offending characters with safe escape
38951 // sequences.
38952
38953         rx_escapable.lastIndex = 0;
38954         return rx_escapable.test(string)
38955             ? "\"" + string.replace(rx_escapable, function (a) {
38956                 var c = meta[a];
38957                 return typeof c === "string"
38958                     ? c
38959                     : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
38960             }) + "\""
38961             : "\"" + string + "\"";
38962     }
38963
38964
38965     function str(key, holder) {
38966
38967 // Produce a string from holder[key].
38968
38969         var i;          // The loop counter.
38970         var k;          // The member key.
38971         var v;          // The member value.
38972         var length;
38973         var mind = gap;
38974         var partial;
38975         var value = holder[key];
38976
38977 // If the value has a toJSON method, call it to obtain a replacement value.
38978
38979         if (value && typeof value === "object" &&
38980                 typeof value.toJSON === "function") {
38981             value = value.toJSON(key);
38982         }
38983
38984 // If we were called with a replacer function, then call the replacer to
38985 // obtain a replacement value.
38986
38987         if (typeof rep === "function") {
38988             value = rep.call(holder, key, value);
38989         }
38990
38991 // What happens next depends on the value's type.
38992
38993         switch (typeof value) {
38994         case "string":
38995             return quote(value);
38996
38997         case "number":
38998
38999 // JSON numbers must be finite. Encode non-finite numbers as null.
39000
39001             return isFinite(value)
39002                 ? String(value)
39003                 : "null";
39004
39005         case "boolean":
39006         case "null":
39007
39008 // If the value is a boolean or null, convert it to a string. Note:
39009 // typeof null does not produce "null". The case is included here in
39010 // the remote chance that this gets fixed someday.
39011
39012             return String(value);
39013
39014 // If the type is "object", we might be dealing with an object or an array or
39015 // null.
39016
39017         case "object":
39018
39019 // Due to a specification blunder in ECMAScript, typeof null is "object",
39020 // so watch out for that case.
39021
39022             if (!value) {
39023                 return "null";
39024             }
39025
39026 // Make an array to hold the partial results of stringifying this object value.
39027
39028             gap += indent;
39029             partial = [];
39030
39031 // Is the value an array?
39032
39033             if (Object.prototype.toString.apply(value) === "[object Array]") {
39034
39035 // The value is an array. Stringify every element. Use null as a placeholder
39036 // for non-JSON values.
39037
39038                 length = value.length;
39039                 for (i = 0; i < length; i += 1) {
39040                     partial[i] = str(i, value) || "null";
39041                 }
39042
39043 // Join all of the elements together, separated with commas, and wrap them in
39044 // brackets.
39045
39046                 v = partial.length === 0
39047                     ? "[]"
39048                     : gap
39049                         ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
39050                         : "[" + partial.join(",") + "]";
39051                 gap = mind;
39052                 return v;
39053             }
39054
39055 // If the replacer is an array, use it to select the members to be stringified.
39056
39057             if (rep && typeof rep === "object") {
39058                 length = rep.length;
39059                 for (i = 0; i < length; i += 1) {
39060                     if (typeof rep[i] === "string") {
39061                         k = rep[i];
39062                         v = str(k, value);
39063                         if (v) {
39064                             partial.push(quote(k) + (
39065                                 gap
39066                                     ? ": "
39067                                     : ":"
39068                             ) + v);
39069                         }
39070                     }
39071                 }
39072             } else {
39073
39074 // Otherwise, iterate through all of the keys in the object.
39075
39076                 for (k in value) {
39077                     if (Object.prototype.hasOwnProperty.call(value, k)) {
39078                         v = str(k, value);
39079                         if (v) {
39080                             partial.push(quote(k) + (
39081                                 gap
39082                                     ? ": "
39083                                     : ":"
39084                             ) + v);
39085                         }
39086                     }
39087                 }
39088             }
39089
39090 // Join all of the member texts together, separated with commas,
39091 // and wrap them in braces.
39092
39093             v = partial.length === 0
39094                 ? "{}"
39095                 : gap
39096                     ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
39097                     : "{" + partial.join(",") + "}";
39098             gap = mind;
39099             return v;
39100         }
39101     }
39102
39103 // If the JSON object does not yet have a stringify method, give it one.
39104
39105     if (typeof JSON.stringify !== "function") {
39106         meta = {    // table of character substitutions
39107             "\b": "\\b",
39108             "\t": "\\t",
39109             "\n": "\\n",
39110             "\f": "\\f",
39111             "\r": "\\r",
39112             "\"": "\\\"",
39113             "\\": "\\\\"
39114         };
39115         JSON.stringify = function (value, replacer, space) {
39116
39117 // The stringify method takes a value and an optional replacer, and an optional
39118 // space parameter, and returns a JSON text. The replacer can be a function
39119 // that can replace values, or an array of strings that will select the keys.
39120 // A default replacer method can be provided. Use of the space parameter can
39121 // produce text that is more easily readable.
39122
39123             var i;
39124             gap = "";
39125             indent = "";
39126
39127 // If the space parameter is a number, make an indent string containing that
39128 // many spaces.
39129
39130             if (typeof space === "number") {
39131                 for (i = 0; i < space; i += 1) {
39132                     indent += " ";
39133                 }
39134
39135 // If the space parameter is a string, it will be used as the indent string.
39136
39137             } else if (typeof space === "string") {
39138                 indent = space;
39139             }
39140
39141 // If there is a replacer, it must be a function or an array.
39142 // Otherwise, throw an error.
39143
39144             rep = replacer;
39145             if (replacer && typeof replacer !== "function" &&
39146                     (typeof replacer !== "object" ||
39147                     typeof replacer.length !== "number")) {
39148                 throw new Error("JSON.stringify");
39149             }
39150
39151 // Make a fake root object containing our value under the key of "".
39152 // Return the result of stringifying the value.
39153
39154             return str("", {"": value});
39155         };
39156     }
39157
39158
39159 // If the JSON object does not yet have a parse method, give it one.
39160
39161     if (typeof JSON.parse !== "function") {
39162         JSON.parse = function (text, reviver) {
39163
39164 // The parse method takes a text and an optional reviver function, and returns
39165 // a JavaScript value if the text is a valid JSON text.
39166
39167             var j;
39168
39169             function walk(holder, key) {
39170
39171 // The walk method is used to recursively walk the resulting structure so
39172 // that modifications can be made.
39173
39174                 var k;
39175                 var v;
39176                 var value = holder[key];
39177                 if (value && typeof value === "object") {
39178                     for (k in value) {
39179                         if (Object.prototype.hasOwnProperty.call(value, k)) {
39180                             v = walk(value, k);
39181                             if (v !== undefined) {
39182                                 value[k] = v;
39183                             } else {
39184                                 delete value[k];
39185                             }
39186                         }
39187                     }
39188                 }
39189                 return reviver.call(holder, key, value);
39190             }
39191
39192
39193 // Parsing happens in four stages. In the first stage, we replace certain
39194 // Unicode characters with escape sequences. JavaScript handles many characters
39195 // incorrectly, either silently deleting them, or treating them as line endings.
39196
39197             text = String(text);
39198             rx_dangerous.lastIndex = 0;
39199             if (rx_dangerous.test(text)) {
39200                 text = text.replace(rx_dangerous, function (a) {
39201                     return "\\u" +
39202                             ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
39203                 });
39204             }
39205
39206 // In the second stage, we run the text against regular expressions that look
39207 // for non-JSON patterns. We are especially concerned with "()" and "new"
39208 // because they can cause invocation, and "=" because it can cause mutation.
39209 // But just to be safe, we want to reject all unexpected forms.
39210
39211 // We split the second stage into 4 regexp operations in order to work around
39212 // crippling inefficiencies in IE's and Safari's regexp engines. First we
39213 // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
39214 // replace all simple value tokens with "]" characters. Third, we delete all
39215 // open brackets that follow a colon or comma or that begin the text. Finally,
39216 // we look to see that the remaining characters are only whitespace or "]" or
39217 // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
39218
39219             if (
39220                 rx_one.test(
39221                     text
39222                         .replace(rx_two, "@")
39223                         .replace(rx_three, "]")
39224                         .replace(rx_four, "")
39225                 )
39226             ) {
39227
39228 // In the third stage we use the eval function to compile the text into a
39229 // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
39230 // in JavaScript: it can begin a block or an object literal. We wrap the text
39231 // in parens to eliminate the ambiguity.
39232
39233                 j = eval("(" + text + ")");
39234
39235 // In the optional fourth stage, we recursively walk the new structure, passing
39236 // each name/value pair to a reviver function for possible transformation.
39237
39238                 return (typeof reviver === "function")
39239                     ? walk({"": j}, "")
39240                     : j;
39241             }
39242
39243 // If the text is not JSON parseable, then a SyntaxError is thrown.
39244
39245             throw new SyntaxError("JSON.parse");
39246         };
39247     }
39248 }());
39249
39250 var json2$1 = json2Plugin;
39251
39252 function json2Plugin() {
39253         
39254         return {}
39255 }
39256
39257 var plugins = [json2$1];
39258
39259 var store_legacy = storeEngine.createStore(all$3, plugins);
39260
39261 // # osm-auth
39262 //
39263 // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
39264 // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
39265 // does not support custom headers, which this uses everywhere.
39266 var osmAuth = function(o) {
39267
39268     var oauth = {};
39269
39270     // authenticated users will also have a request token secret, but it's
39271     // not used in transactions with the server
39272     oauth.authenticated = function() {
39273         return !!(token('oauth_token') && token('oauth_token_secret'));
39274     };
39275
39276     oauth.logout = function() {
39277         token('oauth_token', '');
39278         token('oauth_token_secret', '');
39279         token('oauth_request_token_secret', '');
39280         return oauth;
39281     };
39282
39283     // TODO: detect lack of click event
39284     oauth.authenticate = function(callback) {
39285         if (oauth.authenticated()) return callback();
39286
39287         oauth.logout();
39288
39289         // ## Getting a request token
39290         var params = timenonce(getAuth(o)),
39291             url = o.url + '/oauth/request_token';
39292
39293         params.oauth_signature = ohauth_1.signature(
39294             o.oauth_secret, '',
39295             ohauth_1.baseString('POST', url, params));
39296
39297         if (!o.singlepage) {
39298             // Create a 600x550 popup window in the center of the screen
39299             var w = 600, h = 550,
39300                 settings = [
39301                     ['width', w], ['height', h],
39302                     ['left', screen.width / 2 - w / 2],
39303                     ['top', screen.height / 2 - h / 2]].map(function(x) {
39304                         return x.join('=');
39305                     }).join(','),
39306                 popup = window.open('about:blank', 'oauth_window', settings);
39307         }
39308
39309         // Request a request token. When this is complete, the popup
39310         // window is redirected to OSM's authorization page.
39311         ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
39312         o.loading();
39313
39314         function reqTokenDone(err, xhr) {
39315             o.done();
39316             if (err) return callback(err);
39317             var resp = ohauth_1.stringQs(xhr.response);
39318             token('oauth_request_token_secret', resp.oauth_token_secret);
39319             var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
39320                 oauth_token: resp.oauth_token,
39321                 oauth_callback: resolveUrl(o.landing)
39322             });
39323
39324             if (o.singlepage) {
39325                 location.href = authorize_url;
39326             } else {
39327                 popup.location = authorize_url;
39328             }
39329         }
39330
39331         // Called by a function in a landing page, in the popup window. The
39332         // window closes itself.
39333         window.authComplete = function(token) {
39334             var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
39335             get_access_token(oauth_token.oauth_token);
39336             delete window.authComplete;
39337         };
39338
39339         // ## Getting an request token
39340         //
39341         // At this point we have an `oauth_token`, brought in from a function
39342         // call on a landing page popup.
39343         function get_access_token(oauth_token) {
39344             var url = o.url + '/oauth/access_token',
39345                 params = timenonce(getAuth(o)),
39346                 request_token_secret = token('oauth_request_token_secret');
39347             params.oauth_token = oauth_token;
39348             params.oauth_signature = ohauth_1.signature(
39349                 o.oauth_secret,
39350                 request_token_secret,
39351                 ohauth_1.baseString('POST', url, params));
39352
39353             // ## Getting an access token
39354             //
39355             // The final token required for authentication. At this point
39356             // we have a `request token secret`
39357             ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
39358             o.loading();
39359         }
39360
39361         function accessTokenDone(err, xhr) {
39362             o.done();
39363             if (err) return callback(err);
39364             var access_token = ohauth_1.stringQs(xhr.response);
39365             token('oauth_token', access_token.oauth_token);
39366             token('oauth_token_secret', access_token.oauth_token_secret);
39367             callback(null, oauth);
39368         }
39369     };
39370
39371     oauth.bootstrapToken = function(oauth_token, callback) {
39372         // ## Getting an request token
39373         // At this point we have an `oauth_token`, brought in from a function
39374         // call on a landing page popup.
39375         function get_access_token(oauth_token) {
39376             var url = o.url + '/oauth/access_token',
39377                 params = timenonce(getAuth(o)),
39378                 request_token_secret = token('oauth_request_token_secret');
39379             params.oauth_token = oauth_token;
39380             params.oauth_signature = ohauth_1.signature(
39381                 o.oauth_secret,
39382                 request_token_secret,
39383                 ohauth_1.baseString('POST', url, params));
39384
39385             // ## Getting an access token
39386             // The final token required for authentication. At this point
39387             // we have a `request token secret`
39388             ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
39389             o.loading();
39390         }
39391
39392         function accessTokenDone(err, xhr) {
39393             o.done();
39394             if (err) return callback(err);
39395             var access_token = ohauth_1.stringQs(xhr.response);
39396             token('oauth_token', access_token.oauth_token);
39397             token('oauth_token_secret', access_token.oauth_token_secret);
39398             callback(null, oauth);
39399         }
39400
39401         get_access_token(oauth_token);
39402     };
39403
39404     // # xhr
39405     //
39406     // A single XMLHttpRequest wrapper that does authenticated calls if the
39407     // user has logged in.
39408     oauth.xhr = function(options, callback) {
39409         if (!oauth.authenticated()) {
39410             if (o.auto) {
39411                 return oauth.authenticate(run);
39412             } else {
39413                 callback('not authenticated', null);
39414                 return;
39415             }
39416         } else {
39417             return run();
39418         }
39419
39420         function run() {
39421             var params = timenonce(getAuth(o)),
39422                 oauth_token_secret = token('oauth_token_secret'),
39423                 url = (options.prefix !== false) ? o.url + options.path : options.path,
39424                 url_parts = url.replace(/#.*$/, '').split('?', 2),
39425                 base_url = url_parts[0],
39426                 query = (url_parts.length === 2) ? url_parts[1] : '';
39427
39428             // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
39429             if ((!options.options || !options.options.header ||
39430                 options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
39431                 options.content) {
39432                 params = immutable(params, ohauth_1.stringQs(options.content));
39433             }
39434
39435             params.oauth_token = token('oauth_token');
39436             params.oauth_signature = ohauth_1.signature(
39437                 o.oauth_secret,
39438                 oauth_token_secret,
39439                 ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
39440             );
39441
39442             return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
39443         }
39444
39445         function done(err, xhr) {
39446             if (err) return callback(err);
39447             else if (xhr.responseXML) return callback(err, xhr.responseXML);
39448             else return callback(err, xhr.response);
39449         }
39450     };
39451
39452     // pre-authorize this object, if we can just get a token and token_secret
39453     // from the start
39454     oauth.preauth = function(c) {
39455         if (!c) return;
39456         if (c.oauth_token) token('oauth_token', c.oauth_token);
39457         if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
39458         return oauth;
39459     };
39460
39461     oauth.options = function(_) {
39462         if (!arguments.length) return o;
39463
39464         o = _;
39465         o.url = o.url || 'https://www.openstreetmap.org';
39466         o.landing = o.landing || 'land.html';
39467         o.singlepage = o.singlepage || false;
39468
39469         // Optional loading and loading-done functions for nice UI feedback.
39470         // by default, no-ops
39471         o.loading = o.loading || function() {};
39472         o.done = o.done || function() {};
39473
39474         return oauth.preauth(o);
39475     };
39476
39477     // 'stamp' an authentication object from `getAuth()`
39478     // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
39479     // and timestamp
39480     function timenonce(o) {
39481         o.oauth_timestamp = ohauth_1.timestamp();
39482         o.oauth_nonce = ohauth_1.nonce();
39483         return o;
39484     }
39485
39486     // get/set tokens. These are prefixed with the base URL so that `osm-auth`
39487     // can be used with multiple APIs and the keys in `localStorage`
39488     // will not clash
39489     var token;
39490
39491     if (store_legacy.enabled) {
39492         token = function (x, y) {
39493             if (arguments.length === 1) return store_legacy.get(o.url + x);
39494             else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
39495         };
39496     } else {
39497         var storage = {};
39498         token = function (x, y) {
39499             if (arguments.length === 1) return storage[o.url + x];
39500             else if (arguments.length === 2) return storage[o.url + x] = y;
39501         };
39502     }
39503
39504     // Get an authentication object. If you just add and remove properties
39505     // from a single object, you'll need to use `delete` to make sure that
39506     // it doesn't contain undesired properties for authentication
39507     function getAuth(o) {
39508         return {
39509             oauth_consumer_key: o.oauth_consumer_key,
39510             oauth_signature_method: 'HMAC-SHA1'
39511         };
39512     }
39513
39514     // potentially pre-authorize
39515     oauth.options(o);
39516
39517     return oauth;
39518 };
39519
39520 var JXON = new (function () {
39521   var
39522     sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
39523     aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
39524
39525   function parseText (sValue) {
39526     if (rIsNull.test(sValue)) { return null; }
39527     if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
39528     if (isFinite(sValue)) { return parseFloat(sValue); }
39529     if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
39530     return sValue;
39531   }
39532
39533   function EmptyTree () { }
39534   EmptyTree.prototype.toString = function () { return 'null'; };
39535   EmptyTree.prototype.valueOf = function () { return null; };
39536
39537   function objectify (vValue) {
39538     return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
39539   }
39540
39541   function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
39542     var
39543       nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
39544       bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
39545
39546     var
39547       sProp, vContent, nLength = 0, sCollectedTxt = '',
39548       vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
39549
39550     if (bChildren) {
39551       for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
39552         oNode = oParentNode.childNodes.item(nItem);
39553         if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
39554         else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
39555         else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
39556       }
39557     }
39558
39559     var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
39560
39561     if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
39562
39563     for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
39564       sProp = aCache[nElId].nodeName.toLowerCase();
39565       vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
39566       if (vResult.hasOwnProperty(sProp)) {
39567         if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
39568         vResult[sProp].push(vContent);
39569       } else {
39570         vResult[sProp] = vContent;
39571         nLength++;
39572       }
39573     }
39574
39575     if (bAttributes) {
39576       var
39577         nAttrLen = oParentNode.attributes.length,
39578         sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
39579
39580       for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
39581         oAttrib = oParentNode.attributes.item(nAttrib);
39582         oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
39583       }
39584
39585       if (bNesteAttr) {
39586         if (bFreeze) { Object.freeze(oAttrParent); }
39587         vResult[sAttributesProp] = oAttrParent;
39588         nLength -= nAttrLen - 1;
39589       }
39590     }
39591
39592     if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
39593       vResult[sValueProp] = vBuiltVal;
39594     } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
39595       vResult = vBuiltVal;
39596     }
39597
39598     if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
39599
39600     aCache.length = nLevelStart;
39601
39602     return vResult;
39603   }
39604
39605   function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
39606     var vValue, oChild;
39607
39608     if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
39609       oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
39610     } else if (oParentObj.constructor === Date) {
39611       oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
39612     }
39613
39614     for (var sName in oParentObj) {
39615       vValue = oParentObj[sName];
39616       if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
39617       if (sName === sValueProp) {
39618         if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
39619       } else if (sName === sAttributesProp) { /* verbosity level is 3 */
39620         for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
39621       } else if (sName.charAt(0) === sAttrPref) {
39622         oParentEl.setAttribute(sName.slice(1), vValue);
39623       } else if (vValue.constructor === Array) {
39624         for (var nItem = 0; nItem < vValue.length; nItem++) {
39625           oChild = oXMLDoc.createElement(sName);
39626           loadObjTree(oXMLDoc, oChild, vValue[nItem]);
39627           oParentEl.appendChild(oChild);
39628         }
39629       } else {
39630         oChild = oXMLDoc.createElement(sName);
39631         if (vValue instanceof Object) {
39632           loadObjTree(oXMLDoc, oChild, vValue);
39633         } else if (vValue !== null && vValue !== true) {
39634           oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
39635         }
39636         oParentEl.appendChild(oChild);
39637      }
39638    }
39639   }
39640
39641   this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
39642     var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
39643     return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
39644   };
39645
39646   this.unbuild = function (oObjTree) {    
39647     var oNewDoc = document.implementation.createDocument('', '', null);
39648     loadObjTree(oNewDoc, oNewDoc, oObjTree);
39649     return oNewDoc;
39650   };
39651
39652   this.stringify = function (oObjTree) {
39653     return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
39654   };
39655 })();
39656
39657 // var myObject = JXON.build(doc);
39658 // we got our javascript object! try: alert(JSON.stringify(myObject));
39659
39660 // var newDoc = JXON.unbuild(myObject);
39661 // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
39662
39663 var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
39664 var urlroot = 'https://www.openstreetmap.org';
39665 var oauth = osmAuth({
39666     url: urlroot,
39667     oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
39668     oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
39669     loading: authLoading,
39670     done: authDone
39671 });
39672
39673 var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
39674 var _tiles = { loaded: {}, inflight: {} };
39675 var _changeset = {};
39676 var _entityCache = {};
39677 var _connectionID = 1;
39678 var _tileZoom = 16;
39679 var _rateLimitError;
39680 var _userChangesets;
39681 var _userDetails;
39682 var _off;
39683
39684
39685 function authLoading() {
39686     dispatch$3.call('authLoading');
39687 }
39688
39689
39690 function authDone() {
39691     dispatch$3.call('authDone');
39692 }
39693
39694
39695 function abortRequest$2(i) {
39696     if (i) {
39697         i.abort();
39698     }
39699 }
39700
39701
39702 function getLoc(attrs) {
39703     var lon = attrs.lon && attrs.lon.value;
39704     var lat = attrs.lat && attrs.lat.value;
39705     return [parseFloat(lon), parseFloat(lat)];
39706 }
39707
39708
39709 function getNodes(obj) {
39710     var elems = obj.getElementsByTagName('nd');
39711     var nodes = new Array(elems.length);
39712     for (var i = 0, l = elems.length; i < l; i++) {
39713         nodes[i] = 'n' + elems[i].attributes.ref.value;
39714     }
39715     return nodes;
39716 }
39717
39718
39719 function getTags(obj) {
39720     var elems = obj.getElementsByTagName('tag');
39721     var tags = {};
39722     for (var i = 0, l = elems.length; i < l; i++) {
39723         var attrs = elems[i].attributes;
39724         tags[attrs.k.value] = attrs.v.value;
39725     }
39726
39727     return tags;
39728 }
39729
39730
39731 function getMembers(obj) {
39732     var elems = obj.getElementsByTagName('member');
39733     var members = new Array(elems.length);
39734     for (var i = 0, l = elems.length; i < l; i++) {
39735         var attrs = elems[i].attributes;
39736         members[i] = {
39737             id: attrs.type.value[0] + attrs.ref.value,
39738             type: attrs.type.value,
39739             role: attrs.role.value
39740         };
39741     }
39742     return members;
39743 }
39744
39745
39746 function getVisible(attrs) {
39747     return (!attrs.visible || attrs.visible.value !== 'false');
39748 }
39749
39750
39751 var parsers = {
39752     node: function nodeData(obj, uid) {
39753         var attrs = obj.attributes;
39754         return new osmNode({
39755             id:uid,
39756             visible: getVisible(attrs),
39757             version: attrs.version.value,
39758             changeset: attrs.changeset && attrs.changeset.value,
39759             timestamp: attrs.timestamp && attrs.timestamp.value,
39760             user: attrs.user && attrs.user.value,
39761             uid: attrs.uid && attrs.uid.value,
39762             loc: getLoc(attrs),
39763             tags: getTags(obj)
39764         });
39765     },
39766
39767     way: function wayData(obj, uid) {
39768         var attrs = obj.attributes;
39769         return new osmWay({
39770             id: uid,
39771             visible: getVisible(attrs),
39772             version: attrs.version.value,
39773             changeset: attrs.changeset && attrs.changeset.value,
39774             timestamp: attrs.timestamp && attrs.timestamp.value,
39775             user: attrs.user && attrs.user.value,
39776             uid: attrs.uid && attrs.uid.value,
39777             tags: getTags(obj),
39778             nodes: getNodes(obj),
39779         });
39780     },
39781
39782     relation: function relationData(obj, uid) {
39783         var attrs = obj.attributes;
39784         return new osmRelation({
39785             id: uid,
39786             visible: getVisible(attrs),
39787             version: attrs.version.value,
39788             changeset: attrs.changeset && attrs.changeset.value,
39789             timestamp: attrs.timestamp && attrs.timestamp.value,
39790             user: attrs.user && attrs.user.value,
39791             uid: attrs.uid && attrs.uid.value,
39792             tags: getTags(obj),
39793             members: getMembers(obj)
39794         });
39795     }
39796 };
39797
39798
39799 function parse(xml$$1, callback, options) {
39800     options = assignIn({ cache: true }, options);
39801     if (!xml$$1 || !xml$$1.childNodes) return;
39802
39803     var root = xml$$1.childNodes[0];
39804     var children = root.childNodes;
39805
39806     function parseChild(child) {
39807         var parser = parsers[child.nodeName];
39808         if (parser) {
39809             var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
39810             if (options.cache && _entityCache[uid]) {
39811                 return null;
39812             }
39813             return parser(child, uid);
39814         }
39815     }
39816
39817     utilIdleWorker(children, parseChild, callback);
39818 }
39819
39820
39821 var serviceOsm = {
39822
39823     init: function() {
39824         utilRebind(this, dispatch$3, 'on');
39825     },
39826
39827
39828     reset: function() {
39829         _connectionID++;
39830         _userChangesets = undefined;
39831         _userDetails = undefined;
39832         _rateLimitError = undefined;
39833         forEach(_tiles.inflight, abortRequest$2);
39834         if (_changeset.inflight) abortRequest$2(_changeset.inflight);
39835         _tiles = { loaded: {}, inflight: {} };
39836         _changeset = {};
39837         _entityCache = {};
39838         return this;
39839     },
39840
39841
39842     getConnectionId: function() {
39843         return _connectionID;
39844     },
39845
39846
39847     changesetURL: function(changesetId) {
39848         return urlroot + '/changeset/' + changesetId;
39849     },
39850
39851
39852     changesetsURL: function(center, zoom) {
39853         var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
39854         return urlroot + '/history#map=' +
39855             Math.floor(zoom) + '/' +
39856             center[1].toFixed(precision) + '/' +
39857             center[0].toFixed(precision);
39858     },
39859
39860
39861     entityURL: function(entity) {
39862         return urlroot + '/' + entity.type + '/' + entity.osmId();
39863     },
39864
39865
39866     historyURL: function(entity) {
39867         return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
39868     },
39869
39870
39871     userURL: function(username) {
39872         return urlroot + '/user/' + username;
39873     },
39874
39875
39876     loadFromAPI: function(path, callback, options) {
39877         options = assignIn({ cache: true }, options);
39878         var that = this;
39879         var cid = _connectionID;
39880
39881         function done(err, xml$$1) {
39882             if (that.getConnectionId() !== cid) {
39883                 if (callback) callback({ message: 'Connection Switched', status: -1 });
39884                 return;
39885             }
39886
39887             var isAuthenticated = that.authenticated();
39888
39889             // 400 Bad Request, 401 Unauthorized, 403 Forbidden
39890             // Logout and retry the request..
39891             if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
39892                 that.logout();
39893                 that.loadFromAPI(path, callback);
39894
39895             // else, no retry..
39896             } else {
39897                 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
39898                 // Set the rateLimitError flag and trigger a warning..
39899                 if (!isAuthenticated && !_rateLimitError && err &&
39900                         (err.status === 509 || err.status === 429)) {
39901                     _rateLimitError = err;
39902                     dispatch$3.call('change');
39903                 }
39904
39905                 if (callback) {
39906                     if (err) return callback(err, null);
39907                     parse(xml$$1, function (entities) {
39908                         if (options.cache) {
39909                             for (var i in entities) {
39910                                 _entityCache[entities[i].id] = true;
39911                             }
39912                         }
39913                         callback(null, entities);
39914                     }, options);
39915                 }
39916             }
39917         }
39918
39919         if (this.authenticated()) {
39920             return oauth.xhr({ method: 'GET', path: path }, done);
39921         } else {
39922             var url = urlroot + path;
39923             return d3_xml(url).get(done);
39924         }
39925     },
39926
39927
39928     loadEntity: function(id, callback) {
39929         var type = osmEntity$$1.id.type(id);
39930         var osmID = osmEntity$$1.id.toOSM(id);
39931         var options = { cache: false };
39932
39933         this.loadFromAPI(
39934             '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
39935             function(err, entities) {
39936                 if (callback) callback(err, { data: entities });
39937             },
39938             options
39939         );
39940     },
39941
39942
39943     loadEntityVersion: function(id, version, callback) {
39944         var type = osmEntity$$1.id.type(id);
39945         var osmID = osmEntity$$1.id.toOSM(id);
39946         var options = { cache: false };
39947
39948         this.loadFromAPI(
39949             '/api/0.6/' + type + '/' + osmID + '/' + version,
39950             function(err, entities) {
39951                 if (callback) callback(err, { data: entities });
39952             },
39953             options
39954         );
39955     },
39956
39957
39958     loadMultiple: function(ids, callback) {
39959         var that = this;
39960
39961         forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
39962             var type = k + 's';
39963             var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
39964             var options = { cache: false };
39965
39966             forEach(chunk(osmIDs, 150), function(arr) {
39967                 that.loadFromAPI(
39968                     '/api/0.6/' + type + '?' + type + '=' + arr.join(),
39969                     function(err, entities) {
39970                         if (callback) callback(err, { data: entities });
39971                     },
39972                     options
39973                 );
39974             });
39975         });
39976     },
39977
39978
39979     authenticated: function() {
39980         return oauth.authenticated();
39981     },
39982
39983
39984     putChangeset: function(changeset, changes, callback) {
39985         if (_changeset.inflight) {
39986             return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
39987         }
39988
39989         var that = this;
39990         var cid = _connectionID;
39991
39992         if (_changeset.open) {   // reuse existing open changeset..
39993             createdChangeset(null, _changeset.open);
39994         } else {                 // open a new changeset..
39995             _changeset.inflight = oauth.xhr({
39996                 method: 'PUT',
39997                 path: '/api/0.6/changeset/create',
39998                 options: { header: { 'Content-Type': 'text/xml' } },
39999                 content: JXON.stringify(changeset.asJXON())
40000             }, createdChangeset);
40001         }
40002
40003
40004         function createdChangeset(err, changesetID) {
40005             _changeset.inflight = null;
40006
40007             if (err) {
40008                 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40009                 if (err.status === 400 || err.status === 401 || err.status === 403) {
40010                     that.logout();
40011                 }
40012                 return callback(err, changeset);
40013             }
40014             if (that.getConnectionId() !== cid) {
40015                 return callback({ message: 'Connection Switched', status: -1 }, changeset);
40016             }
40017
40018             _changeset.open = changesetID;
40019             changeset = changeset.update({ id: changesetID });
40020
40021             // Upload the changeset..
40022             _changeset.inflight = oauth.xhr({
40023                 method: 'POST',
40024                 path: '/api/0.6/changeset/' + changesetID + '/upload',
40025                 options: { header: { 'Content-Type': 'text/xml' } },
40026                 content: JXON.stringify(changeset.osmChangeJXON(changes))
40027             }, uploadedChangeset);
40028         }
40029
40030
40031         function uploadedChangeset(err) {
40032             _changeset.inflight = null;
40033
40034             if (err) return callback(err, changeset);
40035
40036             // Upload was successful, safe to call the callback.
40037             // Add delay to allow for postgres replication #1646 #2678
40038             window.setTimeout(function() {
40039                 callback(null, changeset);
40040             }, 2500);
40041
40042             _changeset.open = null;
40043
40044             // At this point, we don't really care if the connection was switched..
40045             // Only try to close the changeset if we're still talking to the same server.
40046             if (that.getConnectionId() === cid) {
40047                 // Still attempt to close changeset, but ignore response because #2667
40048                 oauth.xhr({
40049                     method: 'PUT',
40050                     path: '/api/0.6/changeset/' + changeset.id + '/close',
40051                     options: { header: { 'Content-Type': 'text/xml' } }
40052                 }, function() { return true; });
40053             }
40054         }
40055     },
40056
40057
40058     userDetails: function(callback) {
40059         if (_userDetails) {
40060             callback(undefined, _userDetails);
40061             return;
40062         }
40063
40064         var that = this;
40065         var cid = _connectionID;
40066
40067         function done(err, user_details) {
40068             if (err) {
40069                 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40070                 if (err.status === 400 || err.status === 401 || err.status === 403) {
40071                     that.logout();
40072                 }
40073                 return callback(err);
40074             }
40075             if (that.getConnectionId() !== cid) {
40076                 return callback({ message: 'Connection Switched', status: -1 });
40077             }
40078
40079
40080             var u = user_details.getElementsByTagName('user')[0];
40081             var img = u.getElementsByTagName('img');
40082             var image_url = '';
40083
40084             if (img && img[0] && img[0].getAttribute('href')) {
40085                 image_url = img[0].getAttribute('href');
40086             }
40087
40088             var changesets = u.getElementsByTagName('changesets');
40089             var changesets_count = 0;
40090
40091             if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
40092                 changesets_count = changesets[0].getAttribute('count');
40093             }
40094
40095             _userDetails = {
40096                 id: u.attributes.id.value,
40097                 display_name: u.attributes.display_name.value,
40098                 image_url: image_url,
40099                 changesets_count: changesets_count
40100             };
40101
40102             callback(undefined, _userDetails);
40103         }
40104
40105         oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
40106     },
40107
40108
40109     userChangesets: function(callback) {
40110         if (_userChangesets) {
40111             callback(undefined, _userChangesets);
40112             return;
40113         }
40114
40115         var that = this;
40116         var cid = _connectionID;
40117
40118         this.userDetails(function(err, user) {
40119             if (err) {
40120                 return callback(err);
40121             }
40122             if (that.getConnectionId() !== cid) {
40123                 return callback({ message: 'Connection Switched', status: -1 });
40124             }
40125
40126             function done(err, changesets) {
40127                 if (err) {
40128                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40129                     if (err.status === 400 || err.status === 401 || err.status === 403) {
40130                         that.logout();
40131                     }
40132                     return callback(err);
40133                 }
40134                 if (that.getConnectionId() !== cid) {
40135                     return callback({ message: 'Connection Switched', status: -1 });
40136                 }
40137
40138                 _userChangesets = Array.prototype.map.call(
40139                     changesets.getElementsByTagName('changeset'),
40140                     function (changeset) {
40141                         return { tags: getTags(changeset) };
40142                     }
40143                 ).filter(function (changeset) {
40144                     var comment = changeset.tags.comment;
40145                     return comment && comment !== '';
40146                 });
40147
40148                 callback(undefined, _userChangesets);
40149             }
40150
40151             oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
40152         });
40153     },
40154
40155
40156     status: function(callback) {
40157         var that = this;
40158         var cid = _connectionID;
40159
40160         function done(xml$$1) {
40161             if (that.getConnectionId() !== cid) {
40162                 return callback({ message: 'Connection Switched', status: -1 }, 'connectionSwitched');
40163             }
40164
40165             // update blacklists
40166             var elements = xml$$1.getElementsByTagName('blacklist');
40167             var regexes = [];
40168             for (var i = 0; i < elements.length; i++) {
40169                 var regex = elements[i].getAttribute('regex');  // needs unencode?
40170                 if (regex) {
40171                     regexes.push(regex);
40172                 }
40173             }
40174             if (regexes.length) {
40175                 _blacklists = regexes;
40176             }
40177
40178
40179             if (_rateLimitError) {
40180                 callback(_rateLimitError, 'rateLimited');
40181             } else {
40182                 var apiStatus = xml$$1.getElementsByTagName('status');
40183                 var val = apiStatus[0].getAttribute('api');
40184
40185                 callback(undefined, val);
40186             }
40187         }
40188
40189         d3_xml(urlroot + '/api/capabilities').get()
40190             .on('load', done)
40191             .on('error', callback);
40192     },
40193
40194
40195     imageryBlacklists: function() {
40196         return _blacklists;
40197     },
40198
40199
40200     tileZoom: function(_) {
40201         if (!arguments.length) return _tileZoom;
40202         _tileZoom = _;
40203         return this;
40204     },
40205
40206
40207     loadTiles: function(projection, dimensions, callback) {
40208         if (_off) return;
40209
40210         var that = this;
40211         var s = projection.scale() * 2 * Math.PI;
40212         var z = Math.max(Math.log(s) / Math.log(2) - 8, 0);
40213         var ts = 256 * Math.pow(2, z - _tileZoom);
40214         var origin = [
40215             s / 2 - projection.translate()[0],
40216             s / 2 - projection.translate()[1]
40217         ];
40218
40219         var tiles = d3geoTile()
40220             .scaleExtent([_tileZoom, _tileZoom])
40221             .scale(s)
40222             .size(dimensions)
40223             .translate(projection.translate())()
40224             .map(function(tile) {
40225                 var x = tile[0] * ts - origin[0];
40226                 var y = tile[1] * ts - origin[1];
40227
40228                 return {
40229                     id: tile.toString(),
40230                     extent: geoExtent$$1(
40231                         projection.invert([x, y + ts]),
40232                         projection.invert([x + ts, y]))
40233                 };
40234             });
40235
40236         filter(_tiles.inflight, function(v, i) {
40237             var wanted = find$1(tiles, function(tile) {
40238                 return i === tile.id;
40239             });
40240             if (!wanted) delete _tiles.inflight[i];
40241             return !wanted;
40242         }).map(abortRequest$2);
40243
40244         tiles.forEach(function(tile) {
40245             var id = tile.id;
40246
40247             if (_tiles.loaded[id] || _tiles.inflight[id]) return;
40248
40249             if (isEmpty(_tiles.inflight)) {
40250                 dispatch$3.call('loading');
40251             }
40252
40253             _tiles.inflight[id] = that.loadFromAPI(
40254                 '/api/0.6/map?bbox=' + tile.extent.toParam(),
40255                 function(err, parsed) {
40256                     delete _tiles.inflight[id];
40257                     if (!err) {
40258                         _tiles.loaded[id] = true;
40259                     }
40260
40261                     if (callback) {
40262                         callback(err, assignIn({ data: parsed }, tile));
40263                     }
40264
40265                     if (isEmpty(_tiles.inflight)) {
40266                         dispatch$3.call('loaded');
40267                     }
40268                 }
40269             );
40270         });
40271     },
40272
40273
40274     switch: function(options) {
40275         urlroot = options.urlroot;
40276
40277         oauth.options(assignIn({
40278             url: urlroot,
40279             loading: authLoading,
40280             done: authDone
40281         }, options));
40282
40283         this.reset();
40284         this.userChangesets(function() {});  // eagerly load user details/changesets
40285         dispatch$3.call('change');
40286         return this;
40287     },
40288
40289
40290     toggle: function(_) {
40291         _off = !_;
40292         return this;
40293     },
40294
40295
40296     loadedTiles: function(_) {
40297         if (!arguments.length) return _tiles.loaded;
40298         _tiles.loaded = _;
40299         return this;
40300     },
40301
40302
40303     logout: function() {
40304         _userChangesets = undefined;
40305         _userDetails = undefined;
40306         oauth.logout();
40307         dispatch$3.call('change');
40308         return this;
40309     },
40310
40311
40312     authenticate: function(callback) {
40313         var that = this;
40314         var cid = _connectionID;
40315         _userChangesets = undefined;
40316         _userDetails = undefined;
40317
40318         function done(err, res) {
40319             if (err) {
40320                 if (callback) callback(err);
40321                 return;
40322             }
40323             if (that.getConnectionId() !== cid) {
40324                 if (callback) callback({ message: 'Connection Switched', status: -1 });
40325                 return;
40326             }
40327             _rateLimitError = undefined;
40328             dispatch$3.call('change');
40329             if (callback) callback(err, res);
40330             that.userChangesets(function() {});  // eagerly load user details/changesets
40331         }
40332
40333         return oauth.authenticate(done);
40334     }
40335 };
40336
40337 var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
40338     inflight$1 = {},
40339     popularKeys = {},
40340     taginfoCache = {},
40341     tag_sorts = {
40342         point: 'count_nodes',
40343         vertex: 'count_nodes',
40344         area: 'count_ways',
40345         line: 'count_ways'
40346     },
40347     tag_sort_members = {
40348         point: 'count_node_members',
40349         vertex: 'count_node_members',
40350         area: 'count_way_members',
40351         line: 'count_way_members',
40352         relation: 'count_relation_members'
40353     },
40354     tag_filters = {
40355         point: 'nodes',
40356         vertex: 'nodes',
40357         area: 'ways',
40358         line: 'ways'
40359     },
40360     tag_members_fractions = {
40361         point: 'count_node_members_fraction',
40362         vertex: 'count_node_members_fraction',
40363         area: 'count_way_members_fraction',
40364         line: 'count_way_members_fraction',
40365         relation: 'count_relation_members_fraction'
40366     };
40367
40368
40369 function sets(params, n, o) {
40370     if (params.geometry && o[params.geometry]) {
40371         params[n] = o[params.geometry];
40372     }
40373     return params;
40374 }
40375
40376
40377 function setFilter(params) {
40378     return sets(params, 'filter', tag_filters);
40379 }
40380
40381
40382 function setSort(params) {
40383     return sets(params, 'sortname', tag_sorts);
40384 }
40385
40386
40387 function setSortMembers(params) {
40388     return sets(params, 'sortname', tag_sort_members);
40389 }
40390
40391
40392 function clean(params) {
40393     return omit(params, ['geometry', 'debounce']);
40394 }
40395
40396
40397 function filterKeys(type) {
40398     var count_type = type ? 'count_' + type : 'count_all';
40399     return function(d) {
40400         return parseFloat(d[count_type]) > 2500 || d.in_wiki;
40401     };
40402 }
40403
40404
40405 function filterMultikeys(prefix) {
40406     return function(d) {
40407         // d.key begins with prefix, and d.key contains no additional ':'s
40408         var re = new RegExp('^' + prefix + '(.*)$');
40409         var matches = d.key.match(re) || [];
40410         return (matches.length === 2 && matches[1].indexOf(':') === -1);
40411     };
40412 }
40413
40414
40415 function filterValues(allowUpperCase) {
40416     return function(d) {
40417         if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
40418         if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
40419         return parseFloat(d.fraction) > 0.0 || d.in_wiki;
40420     };
40421 }
40422
40423
40424 function filterRoles(geometry) {
40425     return function(d) {
40426         if (d.role === '') return false; // exclude empty role
40427         if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
40428         return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
40429     };
40430 }
40431
40432
40433 function valKey(d) {
40434     return {
40435         value: d.key,
40436         title: d.key
40437     };
40438 }
40439
40440
40441 function valKeyDescription(d) {
40442     return {
40443         value: d.value,
40444         title: d.description || d.value
40445     };
40446 }
40447
40448
40449 function roleKey(d) {
40450     return {
40451         value: d.role,
40452         title: d.role
40453     };
40454 }
40455
40456
40457 // sort keys with ':' lower than keys without ':'
40458 function sortKeys(a, b) {
40459     return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
40460         : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
40461         : 0;
40462 }
40463
40464
40465 var debouncedRequest = debounce(request, 500, { leading: false });
40466
40467 function request(url, params, exactMatch, callback, loaded) {
40468     if (inflight$1[url]) return;
40469
40470     if (checkCache(url, params, exactMatch, callback)) return;
40471
40472     inflight$1[url] = d3_json(url, function (err, data) {
40473         delete inflight$1[url];
40474         loaded(err, data);
40475     });
40476 }
40477
40478
40479 function checkCache(url, params, exactMatch, callback) {
40480     var rp = params.rp || 25,
40481         testQuery = params.query || '',
40482         testUrl = url;
40483
40484     do {
40485         var hit = taginfoCache[testUrl];
40486
40487         // exact match, or shorter match yielding fewer than max results (rp)
40488         if (hit && (url === testUrl || hit.length < rp)) {
40489             callback(null, hit);
40490             return true;
40491         }
40492
40493         // don't try to shorten the query
40494         if (exactMatch || !testQuery.length) return false;
40495
40496         // do shorten the query to see if we already have a cached result
40497         // that has returned fewer than max results (rp)
40498         testQuery = testQuery.slice(0, -1);
40499         testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
40500     } while (testQuery.length >= 0);
40501
40502     return false;
40503 }
40504
40505
40506 var serviceTaginfo = {
40507
40508     init: function() {
40509         inflight$1 = {};
40510         taginfoCache = {};
40511         popularKeys = {};
40512
40513         // Fetch popular keys.  We'll exclude these from `values`
40514         // lookups because they stress taginfo, and they aren't likely
40515         // to yield meaningful autocomplete results.. see #3955
40516         var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
40517         this.keys(params, function(err, data) {
40518             if (err) return;
40519             data.forEach(function(d) {
40520                 if (d.value === 'opening_hours') return;  // exception
40521                 popularKeys[d.value] = true;
40522             });
40523         });
40524     },
40525
40526
40527     reset: function() {
40528         forEach(inflight$1, function(req) { req.abort(); });
40529         inflight$1 = {};
40530     },
40531
40532
40533     keys: function(params, callback) {
40534         var doRequest = params.debounce ? debouncedRequest : request;
40535         params = clean(setSort(params));
40536         params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40537
40538         var url = apibase$3 + 'keys/all?' + utilQsString(params);
40539         doRequest(url, params, false, callback, function(err, d) {
40540             if (err) {
40541                 callback(err);
40542             } else {
40543                 var f = filterKeys(params.filter);
40544                 var result = d.data.filter(f).sort(sortKeys).map(valKey);
40545                 taginfoCache[url] = result;
40546                 callback(null, result);
40547             }
40548         });
40549     },
40550
40551
40552     multikeys: function(params, callback) {
40553         var doRequest = params.debounce ? debouncedRequest : request;
40554         params = clean(setSort(params));
40555         params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40556         var prefix = params.query;
40557
40558         var url = apibase$3 + 'keys/all?' + utilQsString(params);
40559         doRequest(url, params, true, callback, function(err, d) {
40560             if (err) {
40561                 callback(err);
40562             } else {
40563                 var f = filterMultikeys(prefix);
40564                 var result = d.data.filter(f).map(valKey);
40565                 taginfoCache[url] = result;
40566                 callback(null, result);
40567             }
40568         });
40569     },
40570
40571
40572     values: function(params, callback) {
40573         // Exclude popular keys from values lookups.. see #3955
40574         var key = params.key;
40575         if (key && popularKeys[key]) {
40576             callback(null, []);
40577             return;
40578         }
40579
40580         var doRequest = params.debounce ? debouncedRequest : request;
40581         params = clean(setSort(setFilter(params)));
40582         params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40583
40584         var url = apibase$3 + 'key/values?' + utilQsString(params);
40585         doRequest(url, params, false, callback, function(err, d) {
40586             if (err) {
40587                 callback(err);
40588             } else {
40589                 // In most cases we prefer taginfo value results with lowercase letters.
40590                 // A few OSM keys expect values to contain uppercase values (see #3377).
40591                 // This is not an exhaustive list (e.g. `name` also has uppercase values)
40592                 // but these are the fields where taginfo value lookup is most useful.
40593                 var re = /network|taxon|genus|species|brand|grape_variety|rating|:output|_hours|_times/;
40594                 var allowUpperCase = (params.key.match(re) !== null);
40595                 var f = filterValues(allowUpperCase);
40596
40597                 var result = d.data.filter(f).map(valKeyDescription);
40598                 taginfoCache[url] = result;
40599                 callback(null, result);
40600             }
40601         });
40602     },
40603
40604
40605     roles: function(params, callback) {
40606         var doRequest = params.debounce ? debouncedRequest : request;
40607         var geometry = params.geometry;
40608         params = clean(setSortMembers(params));
40609         params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
40610
40611         var url = apibase$3 + 'relation/roles?' + utilQsString(params);
40612         doRequest(url, params, true, callback, function(err, d) {
40613             if (err) {
40614                 callback(err);
40615             } else {
40616                 var f = filterRoles(geometry);
40617                 var result = d.data.filter(f).map(roleKey);
40618                 taginfoCache[url] = result;
40619                 callback(null, result);
40620             }
40621         });
40622     },
40623
40624
40625     docs: function(params, callback) {
40626         var doRequest = params.debounce ? debouncedRequest : request;
40627         params = clean(setSort(params));
40628
40629         var path = 'key/wiki_pages?';
40630         if (params.value) path = 'tag/wiki_pages?';
40631         else if (params.rtype) path = 'relation/wiki_pages?';
40632
40633         var url = apibase$3 + path + utilQsString(params);
40634         doRequest(url, params, true, callback, function(err, d) {
40635             if (err) {
40636                 callback(err);
40637             } else {
40638                 taginfoCache[url] = d.data;
40639                 callback(null, d.data);
40640             }
40641         });
40642     },
40643
40644
40645     apibase: function(_) {
40646         if (!arguments.length) return apibase$3;
40647         apibase$3 = _;
40648         return this;
40649     }
40650
40651 };
40652
40653 var jsonpCache = {};
40654 window.jsonpCache = jsonpCache;
40655
40656 function jsonpRequest(url, callback) {
40657
40658   if (window.JSONP_FIX) {
40659     if (window.JSONP_DELAY === 0) {
40660       callback(window.JSONP_FIX);
40661     } else {
40662       setTimeout(function() {
40663         callback(window.JSONP_FIX);
40664       }, window.JSONP_DELAY || 0);
40665     }
40666     return;
40667   }
40668
40669   function rand() {
40670     var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
40671       c = '', i = -1;
40672     while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
40673     return c;
40674   }
40675
40676   function create$$1(url) {
40677     var e = url.match(/callback=(\w+)/),
40678       c = e ? e[1] : rand();
40679     jsonpCache[c] = function(data) {
40680       callback(data);
40681       delete jsonpCache[c];
40682       script.remove();
40683     };
40684     return 'jsonpCache.' + c;
40685   }
40686
40687   var cb = create$$1(url),
40688     script = d3_select('head')
40689     .append('script')
40690     .attr('type', 'text/javascript')
40691     .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
40692 }
40693
40694 var endpoint = 'https://www.wikidata.org/w/api.php?';
40695
40696 var serviceWikidata = {
40697
40698     init: function() {},
40699     reset: function() {},
40700
40701
40702     // Given a Wikipedia language and article title, return an array of
40703     // corresponding Wikidata entities.
40704     itemsByTitle: function(lang, title, callback) {
40705         if (!title) {
40706             callback('', {});
40707             return;
40708         }
40709
40710         lang = lang || 'en';
40711         jsonpRequest(endpoint + utilQsString({
40712             action: 'wbgetentities',
40713             format: 'json',
40714             sites: lang.replace(/-/g, '_') + 'wiki',
40715             titles: title,
40716             languages: 'en', // shrink response by filtering to one language
40717             callback: '{callback}'
40718         }), function(data) {
40719             if (!data || data.error) {
40720                 callback('', {});
40721             } else {
40722                 callback(title, data.entities || {});
40723             }
40724         });
40725     }
40726
40727 };
40728
40729 var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
40730
40731 var serviceWikipedia = {
40732
40733     init: function() {},
40734     reset: function() {},
40735
40736
40737     search: function(lang, query, callback) {
40738         if (!query) {
40739             callback('', []);
40740             return;
40741         }
40742
40743         lang = lang || 'en';
40744         jsonpRequest(endpoint$1.replace('en', lang) +
40745             utilQsString({
40746                 action: 'query',
40747                 list: 'search',
40748                 srlimit: '10',
40749                 srinfo: 'suggestion',
40750                 format: 'json',
40751                 callback: '{callback}',
40752                 srsearch: query
40753             }), function(data) {
40754                 if (!data || !data.query || !data.query.search || data.error) {
40755                     callback('', []);
40756                 } else {
40757                     var results = data.query.search.map(function(d) { return d.title; });
40758                     callback(query, results);
40759                 }
40760             }
40761         );
40762     },
40763
40764
40765     suggestions: function(lang, query, callback) {
40766         if (!query) {
40767             callback('', []);
40768             return;
40769         }
40770
40771         lang = lang || 'en';
40772         jsonpRequest(endpoint$1.replace('en', lang) +
40773             utilQsString({
40774                 action: 'opensearch',
40775                 namespace: 0,
40776                 suggest: '',
40777                 format: 'json',
40778                 callback: '{callback}',
40779                 search: query
40780             }), function(data) {
40781                 if (!data || data.error) {
40782                     callback('', []);
40783                 } else {
40784                     callback(data[0], data[1] || []);
40785                 }
40786             }
40787         );
40788     },
40789
40790
40791     translations: function(lang, title, callback) {
40792         if (!title) {
40793             callback({});
40794             return;
40795         }
40796
40797         jsonpRequest(endpoint$1.replace('en', lang) +
40798             utilQsString({
40799                 action: 'query',
40800                 prop: 'langlinks',
40801                 format: 'json',
40802                 callback: '{callback}',
40803                 lllimit: 500,
40804                 titles: title
40805             }), function(data) {
40806                 if (!data || !data.query || !data.query.pages || data.error) {
40807                     callback({});
40808                 } else {
40809                     var list = data.query.pages[Object.keys(data.query.pages)[0]],
40810                         translations = {};
40811                     if (list && list.langlinks) {
40812                         list.langlinks.forEach(function(d) {
40813                             translations[d.lang] = d['*'];
40814                         });
40815                     }
40816                     callback(translations);
40817                 }
40818             }
40819         );
40820     }
40821
40822 };
40823
40824 var services = {
40825     geocoder: serviceNominatim,
40826     mapillary: serviceMapillary,
40827     openstreetcam: serviceOpenstreetcam,
40828     osm: serviceOsm,
40829     taginfo: serviceTaginfo,
40830     wikidata: serviceWikidata,
40831     wikipedia: serviceWikipedia
40832 };
40833
40834 function svgAreas$$1(projection, context) {
40835     // Patterns only work in Firefox when set directly on element.
40836     // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
40837     var patterns = {
40838         beach: 'beach',
40839         cemetery: 'cemetery',
40840         construction: 'construction',
40841         farm: 'farmland',
40842         farmland: 'farmland',
40843         grave_yard: 'cemetery',
40844         meadow: 'meadow',
40845         military: 'construction',
40846         orchard: 'orchard',
40847         sand: 'beach',
40848         scrub: 'scrub',
40849         wetland: 'wetland',
40850     };
40851
40852     var patternKeys = ['landuse', 'natural', 'amenity'];
40853
40854
40855     function setPattern(d) {
40856         for (var i = 0; i < patternKeys.length; i++) {
40857             if (d.tags.building && d.tags.building !== 'no') continue;
40858
40859             if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
40860                 this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
40861                 return;
40862             }
40863         }
40864         this.style.fill = this.style.stroke = '';
40865     }
40866
40867
40868     function drawTargets(selection, graph, entities, filter) {
40869         var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40870         var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
40871         var getPath = svgPath(projection).geojson;
40872         var activeID = context.activeID();
40873
40874         // The targets and nopes will be MultiLineString sub-segments of the ways
40875         var data = { targets: [], nopes: [] };
40876
40877         entities.forEach(function(way) {
40878             var features = svgSegmentWay(way, graph, activeID);
40879             data.targets.push.apply(data.targets, features.passive);
40880             data.nopes.push.apply(data.nopes, features.active);
40881         });
40882
40883
40884         // Targets allow hover and vertex snapping
40885         var targetData = data.targets.filter(getPath);
40886         var targets = selection.selectAll('.area.target-allowed')
40887             .filter(function(d) { return filter(d.properties.entity); })
40888             .data(targetData, function key(d) { return d.id; });
40889
40890         // exit
40891         targets.exit()
40892             .remove();
40893
40894         // enter/update
40895         targets.enter()
40896             .append('path')
40897             .merge(targets)
40898             .attr('d', getPath)
40899             .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
40900
40901
40902         // NOPE
40903         var nopeData = data.nopes.filter(getPath);
40904         var nopes = selection.selectAll('.area.target-nope')
40905             .filter(function(d) { return filter(d.properties.entity); })
40906             .data(nopeData, function key(d) { return d.id; });
40907
40908         // exit
40909         nopes.exit()
40910             .remove();
40911
40912         // enter/update
40913         nopes.enter()
40914             .append('path')
40915             .merge(nopes)
40916             .attr('d', getPath)
40917             .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
40918     }
40919
40920
40921     function drawAreas(selection, graph, entities, filter) {
40922         var path = svgPath(projection, graph, true),
40923             areas = {},
40924             multipolygon;
40925
40926         for (var i = 0; i < entities.length; i++) {
40927             var entity = entities[i];
40928             if (entity.geometry(graph) !== 'area') continue;
40929
40930             multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
40931             if (multipolygon) {
40932                 areas[multipolygon.id] = {
40933                     entity: multipolygon.mergeTags(entity.tags),
40934                     area: Math.abs(entity.area(graph))
40935                 };
40936             } else if (!areas[entity.id]) {
40937                 areas[entity.id] = {
40938                     entity: entity,
40939                     area: Math.abs(entity.area(graph))
40940                 };
40941             }
40942         }
40943
40944         areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
40945         areas.sort(function areaSort(a, b) { return b.area - a.area; });
40946         areas = map$3(areas, 'entity');
40947
40948         var strokes = areas.filter(function(area) {
40949             return area.type === 'way';
40950         });
40951
40952         var data = {
40953             clip: areas,
40954             shadow: strokes,
40955             stroke: strokes,
40956             fill: areas
40957         };
40958
40959         var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
40960            .filter(filter)
40961            .data(data.clip, osmEntity$$1.key);
40962
40963         clipPaths.exit()
40964            .remove();
40965
40966         var clipPathsEnter = clipPaths.enter()
40967            .append('clipPath')
40968            .attr('class', 'clipPath')
40969            .attr('id', function(entity) { return entity.id + '-clippath'; });
40970
40971         clipPathsEnter
40972            .append('path');
40973
40974         clipPaths.merge(clipPathsEnter)
40975            .selectAll('path')
40976            .attr('d', path);
40977
40978
40979         var layer = selection.selectAll('.layer-areas .layer-areas-areas');
40980
40981         var areagroup = layer
40982             .selectAll('g.areagroup')
40983             .data(['fill', 'shadow', 'stroke']);
40984
40985         areagroup = areagroup.enter()
40986             .append('g')
40987             .attr('class', function(d) { return 'areagroup area-' + d; })
40988             .merge(areagroup);
40989
40990         var paths = areagroup
40991             .selectAll('path')
40992             .filter(filter)
40993             .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
40994
40995         paths.exit()
40996             .remove();
40997
40998         var fills = selection.selectAll('.area-fill path.area').nodes();
40999
41000         var bisect = d3_bisector(function(node) {
41001             return -node.__data__.area(graph);
41002         }).left;
41003
41004         function sortedByArea(entity) {
41005             if (this._parent.__data__ === 'fill') {
41006                 return fills[bisect(fills, -entity.area(graph))];
41007             }
41008         }
41009
41010         paths = paths.enter()
41011             .insert('path', sortedByArea)
41012             .merge(paths)
41013             .each(function(entity) {
41014                 var layer = this.parentNode.__data__;
41015
41016                 this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
41017
41018                 if (layer === 'fill') {
41019                     this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
41020                     setPattern.apply(this, arguments);
41021                 }
41022             })
41023             .call(svgTagClasses())
41024             .attr('d', path);
41025
41026
41027         // touch targets
41028         selection.selectAll('.layer-areas .layer-areas-targets')
41029             .call(drawTargets, graph, data.stroke, filter);
41030     }
41031
41032     return drawAreas;
41033 }
41034
41035 function svgDebug$$1(projection, context) {
41036
41037     function multipolygons(imagery) {
41038         return imagery.map(function(data$$1) {
41039             return {
41040                 type: 'MultiPolygon',
41041                 coordinates: [ data$$1.polygon ]
41042             };
41043         });
41044     }
41045
41046     function drawDebug(selection$$1) {
41047         var showsTile = context.getDebug('tile');
41048         var showsCollision = context.getDebug('collision');
41049         var showsImagery = context.getDebug('imagery');
41050         var showsImperial = context.getDebug('imperial');
41051         var showsDriveLeft = context.getDebug('driveLeft');
41052         var showsTouchTargets = context.getDebug('target');
41053
41054         var debugData = [];
41055         if (showsTile) {
41056             debugData.push({ class: 'red', label: 'tile' });
41057         }
41058         if (showsCollision) {
41059             debugData.push({ class: 'yellow', label: 'collision' });
41060         }
41061         if (showsImagery) {
41062             debugData.push({ class: 'orange', label: 'imagery' });
41063         }
41064         if (showsImperial) {
41065             debugData.push({ class: 'cyan', label: 'imperial' });
41066         }
41067         if (showsDriveLeft) {
41068             debugData.push({ class: 'green', label: 'driveLeft' });
41069         }
41070         if (showsTouchTargets) {
41071             debugData.push({ class: 'pink', label: 'touchTargets' });
41072         }
41073
41074
41075         var legend = d3_select('#content')
41076             .selectAll('.debug-legend')
41077             .data(debugData.length ? [0] : []);
41078
41079         legend.exit()
41080             .remove();
41081
41082         legend = legend.enter()
41083             .append('div')
41084             .attr('class', 'fillD debug-legend')
41085             .merge(legend);
41086
41087
41088         var legendItems = legend.selectAll('.debug-legend-item')
41089             .data(debugData, function(d) { return d.label; });
41090
41091         legendItems.exit()
41092             .remove();
41093
41094         legendItems.enter()
41095             .append('span')
41096             .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
41097             .text(function(d) { return d.label; });
41098
41099
41100         var layer = selection$$1.selectAll('.layer-debug')
41101             .data(showsImagery || showsImperial || showsDriveLeft ? [0] : []);
41102
41103         layer.exit()
41104             .remove();
41105
41106         layer = layer.enter()
41107             .append('g')
41108             .attr('class', 'layer-debug')
41109             .merge(layer);
41110
41111
41112         var extent = context.map().extent();
41113         var dataImagery = data.imagery || [];
41114         var availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
41115             if (!source.polygon) return false;
41116             return source.polygon.some(function(polygon) {
41117                 return geoPolygonIntersectsPolygon(polygon, extent, true);
41118             });
41119         }));
41120
41121         var imagery = layer.selectAll('path.debug-imagery')
41122             .data(showsImagery ? availableImagery : []);
41123
41124         imagery.exit()
41125             .remove();
41126
41127         imagery.enter()
41128             .append('path')
41129             .attr('class', 'debug-imagery debug orange');
41130
41131
41132         var imperial = layer
41133             .selectAll('path.debug-imperial')
41134             .data(showsImperial ? [dataImperial] : []);
41135
41136         imperial.exit()
41137             .remove();
41138
41139         imperial.enter()
41140             .append('path')
41141             .attr('class', 'debug-imperial debug cyan');
41142
41143
41144         var driveLeft = layer
41145             .selectAll('path.debug-drive-left')
41146             .data(showsDriveLeft ? [dataDriveLeft] : []);
41147
41148         driveLeft.exit()
41149             .remove();
41150
41151         driveLeft.enter()
41152             .append('path')
41153             .attr('class', 'debug-drive-left debug green');
41154
41155
41156         // update
41157         layer.selectAll('path')
41158             .attr('d', svgPath(projection).geojson);
41159     }
41160
41161
41162     // This looks strange because `enabled` methods on other layers are
41163     // chainable getter/setters, and this one is just a getter.
41164     drawDebug.enabled = function() {
41165         if (!arguments.length) {
41166             return context.getDebug('tile') ||
41167                 context.getDebug('collision') ||
41168                 context.getDebug('imagery') ||
41169                 context.getDebug('imperial') ||
41170                 context.getDebug('driveLeft') ||
41171                 context.getDebug('target');
41172         } else {
41173             return this;
41174         }
41175     };
41176
41177
41178     return drawDebug;
41179 }
41180
41181 /*
41182     A standalone SVG element that contains only a `defs` sub-element. To be
41183     used once globally, since defs IDs must be unique within a document.
41184 */
41185 function svgDefs(context) {
41186
41187     function SVGSpriteDefinition(id, href) {
41188         return function(defs) {
41189             d3_request(href)
41190                 .mimeType('image/svg+xml')
41191                 .response(function(xhr) { return xhr.responseXML; })
41192                 .get(function(err, svg) {
41193                     if (err) return;
41194                     defs.node().appendChild(
41195                         d3_select(svg.documentElement).attr('id', id).node()
41196                     );
41197                 });
41198         };
41199     }
41200
41201
41202     return function drawDefs(selection$$1) {
41203         var defs = selection$$1.append('defs');
41204
41205         // markers
41206         defs
41207             .append('marker')
41208             .attr('id', 'oneway-marker')
41209             .attr('viewBox', '0 0 10 5')
41210             .attr('refX', 2.5)
41211             .attr('refY', 2.5)
41212             .attr('markerWidth', 2)
41213             .attr('markerHeight', 2)
41214             .attr('markerUnits', 'strokeWidth')
41215             .attr('orient', 'auto')
41216             .append('path')
41217             .attr('class', 'oneway-marker-path')
41218             .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')
41219             .attr('stroke', 'none')
41220             .attr('fill', '#000')
41221             .attr('opacity', '0.75');
41222
41223         defs
41224             .append('marker')
41225             .attr('id', 'viewfield-marker')
41226             .attr('viewBox', '0 0 16 16')
41227             .attr('refX', 8)
41228             .attr('refY', 16)
41229             .attr('markerWidth', 4)
41230             .attr('markerHeight', 4)
41231             .attr('markerUnits', 'strokeWidth')
41232             .attr('orient', 'auto')
41233             .append('path')
41234             .attr('class', 'viewfield-marker-path')
41235             .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')
41236             .attr('fill', '#333')
41237             .attr('fill-opacity', '0.75')
41238             .attr('stroke', '#fff')
41239             .attr('stroke-width', '0.5px')
41240             .attr('stroke-opacity', '0.75');
41241
41242         defs
41243             .append('marker')
41244             .attr('id', 'viewfield-marker-wireframe')
41245             .attr('viewBox', '0 0 16 16')
41246             .attr('refX', 8)
41247             .attr('refY', 16)
41248             .attr('markerWidth', 4)
41249             .attr('markerHeight', 4)
41250             .attr('markerUnits', 'strokeWidth')
41251             .attr('orient', 'auto')
41252             .append('path')
41253             .attr('class', 'viewfield-marker-path')
41254             .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')
41255             .attr('fill', 'none')
41256             .attr('stroke', '#fff')
41257             .attr('stroke-width', '0.5px')
41258             .attr('stroke-opacity', '0.75');
41259
41260         // patterns
41261         var patterns = defs.selectAll('pattern')
41262             .data([
41263                 // pattern name, pattern image name
41264                 ['wetland', 'wetland'],
41265                 ['construction', 'construction'],
41266                 ['cemetery', 'cemetery'],
41267                 ['orchard', 'orchard'],
41268                 ['farmland', 'farmland'],
41269                 ['beach', 'dots'],
41270                 ['scrub', 'dots'],
41271                 ['meadow', 'dots']
41272             ])
41273             .enter()
41274             .append('pattern')
41275             .attr('id', function (d) { return 'pattern-' + d[0]; })
41276             .attr('width', 32)
41277             .attr('height', 32)
41278             .attr('patternUnits', 'userSpaceOnUse');
41279
41280         patterns
41281             .append('rect')
41282             .attr('x', 0)
41283             .attr('y', 0)
41284             .attr('width', 32)
41285             .attr('height', 32)
41286             .attr('class', function (d) { return 'pattern-color-' + d[0]; });
41287
41288         patterns
41289             .append('image')
41290             .attr('x', 0)
41291             .attr('y', 0)
41292             .attr('width', 32)
41293             .attr('height', 32)
41294             .attr('xlink:href', function (d) {
41295                 return context.imagePath('pattern/' + d[1] + '.png');
41296             });
41297
41298         // clip paths
41299         defs.selectAll('clipPath')
41300             .data([12, 18, 20, 32, 45])
41301             .enter()
41302             .append('clipPath')
41303             .attr('id', function (d) { return 'clip-square-' + d; })
41304             .append('rect')
41305             .attr('x', 0)
41306             .attr('y', 0)
41307             .attr('width', function (d) { return d; })
41308             .attr('height', function (d) { return d; });
41309
41310         // symbol spritesheets
41311         defs
41312             .call(SVGSpriteDefinition('iD-sprite', context.imagePath('iD-sprite.svg')))
41313             .call(SVGSpriteDefinition('maki-sprite', context.imagePath('maki-sprite.svg')));
41314     };
41315 }
41316
41317 /**
41318  * Checks if `value` is `undefined`.
41319  *
41320  * @static
41321  * @since 0.1.0
41322  * @memberOf _
41323  * @category Lang
41324  * @param {*} value The value to check.
41325  * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
41326  * @example
41327  *
41328  * _.isUndefined(void 0);
41329  * // => true
41330  *
41331  * _.isUndefined(null);
41332  * // => false
41333  */
41334 function isUndefined(value) {
41335   return value === undefined;
41336 }
41337
41338 //[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]
41339 //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
41340 //[5]           Name       ::=          NameStartChar (NameChar)*
41341 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
41342 var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
41343 var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
41344 //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
41345 //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(',')
41346
41347 //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
41348 //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
41349 var S_TAG = 0;//tag name offerring
41350 var S_ATTR = 1;//attr name offerring 
41351 var S_ATTR_SPACE=2;//attr name end and space offer
41352 var S_EQ = 3;//=space?
41353 var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
41354 var S_ATTR_END = 5;//attr value end and no space(quot end)
41355 var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
41356 var S_TAG_CLOSE = 7;//closed el<el />
41357
41358 function XMLReader(){
41359         
41360 }
41361
41362 XMLReader.prototype = {
41363         parse:function(source,defaultNSMap,entityMap){
41364                 var domBuilder = this.domBuilder;
41365                 domBuilder.startDocument();
41366                 _copy(defaultNSMap ,defaultNSMap = {});
41367                 parse$1(source,defaultNSMap,entityMap,
41368                                 domBuilder,this.errorHandler);
41369                 domBuilder.endDocument();
41370         }
41371 };
41372 function parse$1(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
41373         function fixedFromCharCode(code) {
41374                 // String.prototype.fromCharCode does not supports
41375                 // > 2 bytes unicode chars directly
41376                 if (code > 0xffff) {
41377                         code -= 0x10000;
41378                         var surrogate1 = 0xd800 + (code >> 10)
41379                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
41380
41381                         return String.fromCharCode(surrogate1, surrogate2);
41382                 } else {
41383                         return String.fromCharCode(code);
41384                 }
41385         }
41386         function entityReplacer(a){
41387                 var k = a.slice(1,-1);
41388                 if(k in entityMap){
41389                         return entityMap[k]; 
41390                 }else if(k.charAt(0) === '#'){
41391                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
41392                 }else{
41393                         errorHandler.error('entity not found:'+a);
41394                         return a;
41395                 }
41396         }
41397         function appendText(end){//has some bugs
41398                 if(end>start){
41399                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
41400                         locator&&position(start);
41401                         domBuilder.characters(xt,0,end-start);
41402                         start = end;
41403                 }
41404         }
41405         function position(p,m){
41406                 while(p>=lineEnd && (m = linePattern.exec(source))){
41407                         lineStart = m.index;
41408                         lineEnd = lineStart + m[0].length;
41409                         locator.lineNumber++;
41410                         //console.log('line++:',locator,startPos,endPos)
41411                 }
41412                 locator.columnNumber = p-lineStart+1;
41413         }
41414         var lineStart = 0;
41415         var lineEnd = 0;
41416         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
41417         var locator = domBuilder.locator;
41418         
41419         var parseStack = [{currentNSMap:defaultNSMapCopy}];
41420         var closeMap = {};
41421         var start = 0;
41422         while(true){
41423                 try{
41424                         var tagStart = source.indexOf('<',start);
41425                         if(tagStart<0){
41426                                 if(!source.substr(start).match(/^\s*$/)){
41427                                         var doc = domBuilder.doc;
41428                                 var text = doc.createTextNode(source.substr(start));
41429                                 doc.appendChild(text);
41430                                 domBuilder.currentElement = text;
41431                                 }
41432                                 return;
41433                         }
41434                         if(tagStart>start){
41435                                 appendText(tagStart);
41436                         }
41437                         switch(source.charAt(tagStart+1)){
41438                         case '/':
41439                                 var end = source.indexOf('>',tagStart+3);
41440                                 var tagName = source.substring(tagStart+2,end);
41441                                 var config = parseStack.pop();
41442                                 if(end<0){
41443                                         
41444                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
41445                                 //console.error('#@@@@@@'+tagName)
41446                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
41447                                 end = tagStart+1+tagName.length;
41448                         }else if(tagName.match(/\s</)){
41449                                 tagName = tagName.replace(/[\s<].*/,'');
41450                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
41451                                 end = tagStart+1+tagName.length;
41452                                 }
41453                                 //console.error(parseStack.length,parseStack)
41454                                 //console.error(config);
41455                                 var localNSMap = config.localNSMap;
41456                                 var endMatch = config.tagName == tagName;
41457                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
41458                         if(endIgnoreCaseMach){
41459                                 domBuilder.endElement(config.uri,config.localName,tagName);
41460                                         if(localNSMap){
41461                                                 for(var prefix in localNSMap){
41462                                                         domBuilder.endPrefixMapping(prefix) ;
41463                                                 }
41464                                         }
41465                                         if(!endMatch){
41466                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
41467                                         }
41468                         }else{
41469                                 parseStack.push(config);
41470                         }
41471                                 
41472                                 end++;
41473                                 break;
41474                                 // end elment
41475                         case '?':// <?...?>
41476                                 locator&&position(tagStart);
41477                                 end = parseInstruction(source,tagStart,domBuilder);
41478                                 break;
41479                         case '!':// <!doctype,<![CDATA,<!--
41480                                 locator&&position(tagStart);
41481                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
41482                                 break;
41483                         default:
41484                                 locator&&position(tagStart);
41485                                 var el = new ElementAttributes();
41486                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
41487                                 //elStartEnd
41488                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
41489                                 var len = el.length;
41490                                 
41491                                 
41492                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
41493                                         el.closed = true;
41494                                         if(!entityMap.nbsp){
41495                                                 errorHandler.warning('unclosed xml attribute');
41496                                         }
41497                                 }
41498                                 if(locator && len){
41499                                         var locator2 = copyLocator(locator,{});
41500                                         //try{//attribute position fixed
41501                                         for(var i = 0;i<len;i++){
41502                                                 var a = el[i];
41503                                                 position(a.offset);
41504                                                 a.locator = copyLocator(locator,{});
41505                                         }
41506                                         //}catch(e){console.error('@@@@@'+e)}
41507                                         domBuilder.locator = locator2;
41508                                         if(appendElement(el,domBuilder,currentNSMap)){
41509                                                 parseStack.push(el);
41510                                         }
41511                                         domBuilder.locator = locator;
41512                                 }else{
41513                                         if(appendElement(el,domBuilder,currentNSMap)){
41514                                                 parseStack.push(el);
41515                                         }
41516                                 }
41517                                 
41518                                 
41519                                 
41520                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
41521                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
41522                                 }else{
41523                                         end++;
41524                                 }
41525                         }
41526                 }catch(e){
41527                         errorHandler.error('element parse error: '+e);
41528                         //errorHandler.error('element parse error: '+e);
41529                         end = -1;
41530                         //throw e;
41531                 }
41532                 if(end>start){
41533                         start = end;
41534                 }else{
41535                         //TODO: 这里有可能sax回退,有位置错误风险
41536                         appendText(Math.max(tagStart,start)+1);
41537                 }
41538         }
41539 }
41540 function copyLocator(f,t){
41541         t.lineNumber = f.lineNumber;
41542         t.columnNumber = f.columnNumber;
41543         return t;
41544 }
41545
41546 /**
41547  * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
41548  * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
41549  */
41550 function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
41551         var attrName;
41552         var value;
41553         var p = ++start;
41554         var s = S_TAG;//status
41555         while(true){
41556                 var c = source.charAt(p);
41557                 switch(c){
41558                 case '=':
41559                         if(s === S_ATTR){//attrName
41560                                 attrName = source.slice(start,p);
41561                                 s = S_EQ;
41562                         }else if(s === S_ATTR_SPACE){
41563                                 s = S_EQ;
41564                         }else{
41565                                 //fatalError: equal must after attrName or space after attrName
41566                                 throw new Error('attribute equal must after attrName');
41567                         }
41568                         break;
41569                 case '\'':
41570                 case '"':
41571                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
41572                                 ){//equal
41573                                 if(s === S_ATTR){
41574                                         errorHandler.warning('attribute value must after "="');
41575                                         attrName = source.slice(start,p);
41576                                 }
41577                                 start = p+1;
41578                                 p = source.indexOf(c,start);
41579                                 if(p>0){
41580                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41581                                         el.add(attrName,value,start-1);
41582                                         s = S_ATTR_END;
41583                                 }else{
41584                                         //fatalError: no end quot match
41585                                         throw new Error('attribute value no end \''+c+'\' match');
41586                                 }
41587                         }else if(s == S_ATTR_NOQUOT_VALUE){
41588                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41589                                 //console.log(attrName,value,start,p)
41590                                 el.add(attrName,value,start);
41591                                 //console.dir(el)
41592                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
41593                                 start = p+1;
41594                                 s = S_ATTR_END;
41595                         }else{
41596                                 //fatalError: no equal before
41597                                 throw new Error('attribute value must after "="');
41598                         }
41599                         break;
41600                 case '/':
41601                         switch(s){
41602                         case S_TAG:
41603                                 el.setTagName(source.slice(start,p));
41604                         case S_ATTR_END:
41605                         case S_TAG_SPACE:
41606                         case S_TAG_CLOSE:
41607                                 s =S_TAG_CLOSE;
41608                                 el.closed = true;
41609                         case S_ATTR_NOQUOT_VALUE:
41610                         case S_ATTR:
41611                         case S_ATTR_SPACE:
41612                                 break;
41613                         //case S_EQ:
41614                         default:
41615                                 throw new Error("attribute invalid close char('/')")
41616                         }
41617                         break;
41618                 case ''://end document
41619                         //throw new Error('unexpected end of input')
41620                         errorHandler.error('unexpected end of input');
41621                         if(s == S_TAG){
41622                                 el.setTagName(source.slice(start,p));
41623                         }
41624                         return p;
41625                 case '>':
41626                         switch(s){
41627                         case S_TAG:
41628                                 el.setTagName(source.slice(start,p));
41629                         case S_ATTR_END:
41630                         case S_TAG_SPACE:
41631                         case S_TAG_CLOSE:
41632                                 break;//normal
41633                         case S_ATTR_NOQUOT_VALUE://Compatible state
41634                         case S_ATTR:
41635                                 value = source.slice(start,p);
41636                                 if(value.slice(-1) === '/'){
41637                                         el.closed  = true;
41638                                         value = value.slice(0,-1);
41639                                 }
41640                         case S_ATTR_SPACE:
41641                                 if(s === S_ATTR_SPACE){
41642                                         value = attrName;
41643                                 }
41644                                 if(s == S_ATTR_NOQUOT_VALUE){
41645                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
41646                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
41647                                 }else{
41648                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
41649                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
41650                                         }
41651                                         el.add(value,value,start);
41652                                 }
41653                                 break;
41654                         case S_EQ:
41655                                 throw new Error('attribute value missed!!');
41656                         }
41657 //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
41658                         return p;
41659                 /*xml space '\x20' | #x9 | #xD | #xA; */
41660                 case '\u0080':
41661                         c = ' ';
41662                 default:
41663                         if(c<= ' '){//space
41664                                 switch(s){
41665                                 case S_TAG:
41666                                         el.setTagName(source.slice(start,p));//tagName
41667                                         s = S_TAG_SPACE;
41668                                         break;
41669                                 case S_ATTR:
41670                                         attrName = source.slice(start,p);
41671                                         s = S_ATTR_SPACE;
41672                                         break;
41673                                 case S_ATTR_NOQUOT_VALUE:
41674                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41675                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
41676                                         el.add(attrName,value,start);
41677                                 case S_ATTR_END:
41678                                         s = S_TAG_SPACE;
41679                                         break;
41680                                 //case S_TAG_SPACE:
41681                                 //case S_EQ:
41682                                 //case S_ATTR_SPACE:
41683                                 //      void();break;
41684                                 //case S_TAG_CLOSE:
41685                                         //ignore warning
41686                                 }
41687                         }else{//not space
41688 //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
41689 //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
41690                                 switch(s){
41691                                 //case S_TAG:void();break;
41692                                 //case S_ATTR:void();break;
41693                                 //case S_ATTR_NOQUOT_VALUE:void();break;
41694                                 case S_ATTR_SPACE:
41695                                         var tagName =  el.tagName;
41696                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
41697                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
41698                                         }
41699                                         el.add(attrName,attrName,start);
41700                                         start = p;
41701                                         s = S_ATTR;
41702                                         break;
41703                                 case S_ATTR_END:
41704                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
41705                                 case S_TAG_SPACE:
41706                                         s = S_ATTR;
41707                                         start = p;
41708                                         break;
41709                                 case S_EQ:
41710                                         s = S_ATTR_NOQUOT_VALUE;
41711                                         start = p;
41712                                         break;
41713                                 case S_TAG_CLOSE:
41714                                         throw new Error("elements closed character '/' and '>' must be connected to");
41715                                 }
41716                         }
41717                 }//end outer switch
41718                 //console.log('p++',p)
41719                 p++;
41720         }
41721 }
41722 /**
41723  * @return true if has new namespace define
41724  */
41725 function appendElement(el,domBuilder,currentNSMap){
41726         var tagName = el.tagName;
41727         var localNSMap = null;
41728         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
41729         var i = el.length;
41730         while(i--){
41731                 var a = el[i];
41732                 var qName = a.qName;
41733                 var value = a.value;
41734                 var nsp = qName.indexOf(':');
41735                 if(nsp>0){
41736                         var prefix = a.prefix = qName.slice(0,nsp);
41737                         var localName = qName.slice(nsp+1);
41738                         var nsPrefix = prefix === 'xmlns' && localName;
41739                 }else{
41740                         localName = qName;
41741                         prefix = null;
41742                         nsPrefix = qName === 'xmlns' && '';
41743                 }
41744                 //can not set prefix,because prefix !== ''
41745                 a.localName = localName ;
41746                 //prefix == null for no ns prefix attribute 
41747                 if(nsPrefix !== false){//hack!!
41748                         if(localNSMap == null){
41749                                 localNSMap = {};
41750                                 //console.log(currentNSMap,0)
41751                                 _copy(currentNSMap,currentNSMap={});
41752                                 //console.log(currentNSMap,1)
41753                         }
41754                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
41755                         a.uri = 'http://www.w3.org/2000/xmlns/';
41756                         domBuilder.startPrefixMapping(nsPrefix, value); 
41757                 }
41758         }
41759         var i = el.length;
41760         while(i--){
41761                 a = el[i];
41762                 var prefix = a.prefix;
41763                 if(prefix){//no prefix attribute has no namespace
41764                         if(prefix === 'xml'){
41765                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
41766                         }if(prefix !== 'xmlns'){
41767                                 a.uri = currentNSMap[prefix || ''];
41768                                 
41769                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
41770                         }
41771                 }
41772         }
41773         var nsp = tagName.indexOf(':');
41774         if(nsp>0){
41775                 prefix = el.prefix = tagName.slice(0,nsp);
41776                 localName = el.localName = tagName.slice(nsp+1);
41777         }else{
41778                 prefix = null;//important!!
41779                 localName = el.localName = tagName;
41780         }
41781         //no prefix element has default namespace
41782         var ns = el.uri = currentNSMap[prefix || ''];
41783         domBuilder.startElement(ns,localName,tagName,el);
41784         //endPrefixMapping and startPrefixMapping have not any help for dom builder
41785         //localNSMap = null
41786         if(el.closed){
41787                 domBuilder.endElement(ns,localName,tagName);
41788                 if(localNSMap){
41789                         for(prefix in localNSMap){
41790                                 domBuilder.endPrefixMapping(prefix); 
41791                         }
41792                 }
41793         }else{
41794                 el.currentNSMap = currentNSMap;
41795                 el.localNSMap = localNSMap;
41796                 //parseStack.push(el);
41797                 return true;
41798         }
41799 }
41800 function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
41801         if(/^(?:script|textarea)$/i.test(tagName)){
41802                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
41803                 var text = source.substring(elStartEnd+1,elEndStart);
41804                 if(/[&<]/.test(text)){
41805                         if(/^script$/i.test(tagName)){
41806                                 //if(!/\]\]>/.test(text)){
41807                                         //lexHandler.startCDATA();
41808                                         domBuilder.characters(text,0,text.length);
41809                                         //lexHandler.endCDATA();
41810                                         return elEndStart;
41811                                 //}
41812                         }//}else{//text area
41813                                 text = text.replace(/&#?\w+;/g,entityReplacer);
41814                                 domBuilder.characters(text,0,text.length);
41815                                 return elEndStart;
41816                         //}
41817                         
41818                 }
41819         }
41820         return elStartEnd+1;
41821 }
41822 function fixSelfClosed(source,elStartEnd,tagName,closeMap){
41823         //if(tagName in closeMap){
41824         var pos = closeMap[tagName];
41825         if(pos == null){
41826                 //console.log(tagName)
41827                 pos =  source.lastIndexOf('</'+tagName+'>');
41828                 if(pos<elStartEnd){//忘记闭合
41829                         pos = source.lastIndexOf('</'+tagName);
41830                 }
41831                 closeMap[tagName] =pos;
41832         }
41833         return pos<elStartEnd;
41834         //} 
41835 }
41836 function _copy(source,target){
41837         for(var n in source){target[n] = source[n];}
41838 }
41839 function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
41840         var next= source.charAt(start+2);
41841         switch(next){
41842         case '-':
41843                 if(source.charAt(start + 3) === '-'){
41844                         var end = source.indexOf('-->',start+4);
41845                         //append comment source.substring(4,end)//<!--
41846                         if(end>start){
41847                                 domBuilder.comment(source,start+4,end-start-4);
41848                                 return end+3;
41849                         }else{
41850                                 errorHandler.error("Unclosed comment");
41851                                 return -1;
41852                         }
41853                 }else{
41854                         //error
41855                         return -1;
41856                 }
41857         default:
41858                 if(source.substr(start+3,6) == 'CDATA['){
41859                         var end = source.indexOf(']]>',start+9);
41860                         domBuilder.startCDATA();
41861                         domBuilder.characters(source,start+9,end-start-9);
41862                         domBuilder.endCDATA(); 
41863                         return end+3;
41864                 }
41865                 //<!DOCTYPE
41866                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
41867                 var matchs = split(source,start);
41868                 var len = matchs.length;
41869                 if(len>1 && /!doctype/i.test(matchs[0][0])){
41870                         var name = matchs[1][0];
41871                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
41872                         var sysid = len>4 && matchs[4][0];
41873                         var lastMatch = matchs[len-1];
41874                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
41875                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
41876                         domBuilder.endDTD();
41877                         
41878                         return lastMatch.index+lastMatch[0].length
41879                 }
41880         }
41881         return -1;
41882 }
41883
41884
41885
41886 function parseInstruction(source,start,domBuilder){
41887         var end = source.indexOf('?>',start);
41888         if(end){
41889                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
41890                 if(match){
41891                         var len = match[0].length;
41892                         domBuilder.processingInstruction(match[1], match[2]) ;
41893                         return end+2;
41894                 }else{//error
41895                         return -1;
41896                 }
41897         }
41898         return -1;
41899 }
41900
41901 /**
41902  * @param source
41903  */
41904 function ElementAttributes(source){
41905         
41906 }
41907 ElementAttributes.prototype = {
41908         setTagName:function(tagName){
41909                 if(!tagNamePattern.test(tagName)){
41910                         throw new Error('invalid tagName:'+tagName)
41911                 }
41912                 this.tagName = tagName;
41913         },
41914         add:function(qName,value,offset){
41915                 if(!tagNamePattern.test(qName)){
41916                         throw new Error('invalid attribute:'+qName)
41917                 }
41918                 this[this.length++] = {qName:qName,value:value,offset:offset};
41919         },
41920         length:0,
41921         getLocalName:function(i){return this[i].localName},
41922         getLocator:function(i){return this[i].locator},
41923         getQName:function(i){return this[i].qName},
41924         getURI:function(i){return this[i].uri},
41925         getValue:function(i){return this[i].value}
41926 //      ,getIndex:function(uri, localName)){
41927 //              if(localName){
41928 //                      
41929 //              }else{
41930 //                      var qName = uri
41931 //              }
41932 //      },
41933 //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
41934 //      getType:function(uri,localName){}
41935 //      getType:function(i){},
41936 };
41937
41938
41939
41940
41941 function _set_proto_(thiz,parent){
41942         thiz.__proto__ = parent;
41943         return thiz;
41944 }
41945 if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
41946         _set_proto_ = function(thiz,parent){
41947                 function p(){}          p.prototype = parent;
41948                 p = new p();
41949                 for(parent in thiz){
41950                         p[parent] = thiz[parent];
41951                 }
41952                 return p;
41953         };
41954 }
41955
41956 function split(source,start){
41957         var match;
41958         var buf = [];
41959         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
41960         reg.lastIndex = start;
41961         reg.exec(source);//skip <
41962         while(match = reg.exec(source)){
41963                 buf.push(match);
41964                 if(match[1])return buf;
41965         }
41966 }
41967
41968 var XMLReader_1 = XMLReader;
41969
41970 var sax = {
41971         XMLReader: XMLReader_1
41972 };
41973
41974 /*
41975  * DOM Level 2
41976  * Object DOMException
41977  * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
41978  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
41979  */
41980
41981 function copy$1(src,dest){
41982         for(var p in src){
41983                 dest[p] = src[p];
41984         }
41985 }
41986 /**
41987 ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
41988 ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
41989  */
41990 function _extends(Class,Super){
41991         var pt = Class.prototype;
41992         if(Object.create){
41993                 var ppt = Object.create(Super.prototype);
41994                 pt.__proto__ = ppt;
41995         }
41996         if(!(pt instanceof Super)){
41997                 function t(){}          t.prototype = Super.prototype;
41998                 t = new t();
41999                 copy$1(pt,t);
42000                 Class.prototype = pt = t;
42001         }
42002         if(pt.constructor != Class){
42003                 if(typeof Class != 'function'){
42004                         console.error("unknow Class:"+Class);
42005                 }
42006                 pt.constructor = Class;
42007         }
42008 }
42009 var htmlns = 'http://www.w3.org/1999/xhtml' ;
42010 // Node Types
42011 var NodeType = {};
42012 var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
42013 var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
42014 var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
42015 var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
42016 var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
42017 var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
42018 var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
42019 var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
42020 var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
42021 var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
42022 var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
42023 var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
42024
42025 // ExceptionCode
42026 var ExceptionCode = {};
42027 var ExceptionMessage = {};
42028 var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = (ExceptionMessage[1]="Index size error", 1);
42029 var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = (ExceptionMessage[2]="DOMString size error", 2);
42030 var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = (ExceptionMessage[3]="Hierarchy request error", 3);
42031 var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = (ExceptionMessage[4]="Wrong document", 4);
42032 var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = (ExceptionMessage[5]="Invalid character", 5);
42033 var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = (ExceptionMessage[6]="No data allowed", 6);
42034 var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = (ExceptionMessage[7]="No modification allowed", 7);
42035 var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = (ExceptionMessage[8]="Not found", 8);
42036 var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = (ExceptionMessage[9]="Not supported", 9);
42037 var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = (ExceptionMessage[10]="Attribute in use", 10);
42038 //level2
42039 var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = (ExceptionMessage[11]="Invalid state", 11);
42040 var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = (ExceptionMessage[12]="Syntax error", 12);
42041 var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = (ExceptionMessage[13]="Invalid modification", 13);
42042 var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = (ExceptionMessage[14]="Invalid namespace", 14);
42043 var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = (ExceptionMessage[15]="Invalid access", 15);
42044
42045
42046 function DOMException(code, message) {
42047         if(message instanceof Error){
42048                 var error = message;
42049         }else{
42050                 error = this;
42051                 Error.call(this, ExceptionMessage[code]);
42052                 this.message = ExceptionMessage[code];
42053                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
42054         }
42055         error.code = code;
42056         if(message) this.message = this.message + ": " + message;
42057         return error;
42058 }DOMException.prototype = Error.prototype;
42059 copy$1(ExceptionCode,DOMException);
42060 /**
42061  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
42062  * 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.
42063  * The items in the NodeList are accessible via an integral index, starting from 0.
42064  */
42065 function NodeList() {
42066 }NodeList.prototype = {
42067         /**
42068          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
42069          * @standard level1
42070          */
42071         length:0, 
42072         /**
42073          * 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.
42074          * @standard level1
42075          * @param index  unsigned long 
42076          *   Index into the collection.
42077          * @return Node
42078          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
42079          */
42080         item: function(index) {
42081                 return this[index] || null;
42082         },
42083         toString:function(isHTML,nodeFilter){
42084                 for(var buf = [], i = 0;i<this.length;i++){
42085                         serializeToString(this[i],buf,isHTML,nodeFilter);
42086                 }
42087                 return buf.join('');
42088         }
42089 };
42090 function LiveNodeList(node,refresh){
42091         this._node = node;
42092         this._refresh = refresh;
42093         _updateLiveList(this);
42094 }
42095 function _updateLiveList(list){
42096         var inc = list._node._inc || list._node.ownerDocument._inc;
42097         if(list._inc != inc){
42098                 var ls = list._refresh(list._node);
42099                 //console.log(ls.length)
42100                 __set__(list,'length',ls.length);
42101                 copy$1(ls,list);
42102                 list._inc = inc;
42103         }
42104 }
42105 LiveNodeList.prototype.item = function(i){
42106         _updateLiveList(this);
42107         return this[i];
42108 };
42109
42110 _extends(LiveNodeList,NodeList);
42111 /**
42112  * 
42113  * 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.
42114  * NamedNodeMap objects in the DOM are live.
42115  * used for attributes or DocumentType entities 
42116  */
42117 function NamedNodeMap() {
42118 }
42119 function _findNodeIndex(list,node){
42120         var i = list.length;
42121         while(i--){
42122                 if(list[i] === node){return i}
42123         }
42124 }
42125
42126 function _addNamedNode(el,list,newAttr,oldAttr){
42127         if(oldAttr){
42128                 list[_findNodeIndex(list,oldAttr)] = newAttr;
42129         }else{
42130                 list[list.length++] = newAttr;
42131         }
42132         if(el){
42133                 newAttr.ownerElement = el;
42134                 var doc = el.ownerDocument;
42135                 if(doc){
42136                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
42137                         _onAddAttribute(doc,el,newAttr);
42138                 }
42139         }
42140 }
42141 function _removeNamedNode(el,list,attr){
42142         //console.log('remove attr:'+attr)
42143         var i = _findNodeIndex(list,attr);
42144         if(i>=0){
42145                 var lastIndex = list.length-1;
42146                 while(i<lastIndex){
42147                         list[i] = list[++i];
42148                 }
42149                 list.length = lastIndex;
42150                 if(el){
42151                         var doc = el.ownerDocument;
42152                         if(doc){
42153                                 _onRemoveAttribute(doc,el,attr);
42154                                 attr.ownerElement = null;
42155                         }
42156                 }
42157         }else{
42158                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
42159         }
42160 }
42161 NamedNodeMap.prototype = {
42162         length:0,
42163         item:NodeList.prototype.item,
42164         getNamedItem: function(key) {
42165 //              if(key.indexOf(':')>0 || key == 'xmlns'){
42166 //                      return null;
42167 //              }
42168                 //console.log()
42169                 var i = this.length;
42170                 while(i--){
42171                         var attr = this[i];
42172                         //console.log(attr.nodeName,key)
42173                         if(attr.nodeName == key){
42174                                 return attr;
42175                         }
42176                 }
42177         },
42178         setNamedItem: function(attr) {
42179                 var el = attr.ownerElement;
42180                 if(el && el!=this._ownerElement){
42181                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
42182                 }
42183                 var oldAttr = this.getNamedItem(attr.nodeName);
42184                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
42185                 return oldAttr;
42186         },
42187         /* returns Node */
42188         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
42189                 var el = attr.ownerElement, oldAttr;
42190                 if(el && el!=this._ownerElement){
42191                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
42192                 }
42193                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
42194                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
42195                 return oldAttr;
42196         },
42197
42198         /* returns Node */
42199         removeNamedItem: function(key) {
42200                 var attr = this.getNamedItem(key);
42201                 _removeNamedNode(this._ownerElement,this,attr);
42202                 return attr;
42203                 
42204                 
42205         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
42206         
42207         //for level2
42208         removeNamedItemNS:function(namespaceURI,localName){
42209                 var attr = this.getNamedItemNS(namespaceURI,localName);
42210                 _removeNamedNode(this._ownerElement,this,attr);
42211                 return attr;
42212         },
42213         getNamedItemNS: function(namespaceURI, localName) {
42214                 var i = this.length;
42215                 while(i--){
42216                         var node = this[i];
42217                         if(node.localName == localName && node.namespaceURI == namespaceURI){
42218                                 return node;
42219                         }
42220                 }
42221                 return null;
42222         }
42223 };
42224 /**
42225  * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
42226  */
42227 function DOMImplementation(/* Object */ features) {
42228         this._features = {};
42229         if (features) {
42230                 for (var feature in features) {
42231                          this._features = features[feature];
42232                 }
42233         }
42234 }
42235 DOMImplementation.prototype = {
42236         hasFeature: function(/* string */ feature, /* string */ version) {
42237                 var versions = this._features[feature.toLowerCase()];
42238                 if (versions && (!version || version in versions)) {
42239                         return true;
42240                 } else {
42241                         return false;
42242                 }
42243         },
42244         // Introduced in DOM Level 2:
42245         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
42246                 var doc = new Document();
42247                 doc.implementation = this;
42248                 doc.childNodes = new NodeList();
42249                 doc.doctype = doctype;
42250                 if(doctype){
42251                         doc.appendChild(doctype);
42252                 }
42253                 if(qualifiedName){
42254                         var root = doc.createElementNS(namespaceURI,qualifiedName);
42255                         doc.appendChild(root);
42256                 }
42257                 return doc;
42258         },
42259         // Introduced in DOM Level 2:
42260         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
42261                 var node = new DocumentType();
42262                 node.name = qualifiedName;
42263                 node.nodeName = qualifiedName;
42264                 node.publicId = publicId;
42265                 node.systemId = systemId;
42266                 // Introduced in DOM Level 2:
42267                 //readonly attribute DOMString        internalSubset;
42268                 
42269                 //TODO:..
42270                 //  readonly attribute NamedNodeMap     entities;
42271                 //  readonly attribute NamedNodeMap     notations;
42272                 return node;
42273         }
42274 };
42275
42276
42277 /**
42278  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
42279  */
42280
42281 function Node$2() {
42282 }
42283 Node$2.prototype = {
42284         firstChild : null,
42285         lastChild : null,
42286         previousSibling : null,
42287         nextSibling : null,
42288         attributes : null,
42289         parentNode : null,
42290         childNodes : null,
42291         ownerDocument : null,
42292         nodeValue : null,
42293         namespaceURI : null,
42294         prefix : null,
42295         localName : null,
42296         // Modified in DOM Level 2:
42297         insertBefore:function(newChild, refChild){//raises 
42298                 return _insertBefore(this,newChild,refChild);
42299         },
42300         replaceChild:function(newChild, oldChild){//raises 
42301                 this.insertBefore(newChild,oldChild);
42302                 if(oldChild){
42303                         this.removeChild(oldChild);
42304                 }
42305         },
42306         removeChild:function(oldChild){
42307                 return _removeChild(this,oldChild);
42308         },
42309         appendChild:function(newChild){
42310                 return this.insertBefore(newChild,null);
42311         },
42312         hasChildNodes:function(){
42313                 return this.firstChild != null;
42314         },
42315         cloneNode:function(deep){
42316                 return cloneNode(this.ownerDocument||this,this,deep);
42317         },
42318         // Modified in DOM Level 2:
42319         normalize:function(){
42320                 var child = this.firstChild;
42321                 while(child){
42322                         var next = child.nextSibling;
42323                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
42324                                 this.removeChild(next);
42325                                 child.appendData(next.data);
42326                         }else{
42327                                 child.normalize();
42328                                 child = next;
42329                         }
42330                 }
42331         },
42332         // Introduced in DOM Level 2:
42333         isSupported:function(feature, version){
42334                 return this.ownerDocument.implementation.hasFeature(feature,version);
42335         },
42336     // Introduced in DOM Level 2:
42337     hasAttributes:function(){
42338         return this.attributes.length>0;
42339     },
42340     lookupPrefix:function(namespaceURI){
42341         var el = this;
42342         while(el){
42343                 var map = el._nsMap;
42344                 //console.dir(map)
42345                 if(map){
42346                         for(var n in map){
42347                                 if(map[n] == namespaceURI){
42348                                         return n;
42349                                 }
42350                         }
42351                 }
42352                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
42353         }
42354         return null;
42355     },
42356     // Introduced in DOM Level 3:
42357     lookupNamespaceURI:function(prefix){
42358         var el = this;
42359         while(el){
42360                 var map = el._nsMap;
42361                 //console.dir(map)
42362                 if(map){
42363                         if(prefix in map){
42364                                 return map[prefix] ;
42365                         }
42366                 }
42367                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
42368         }
42369         return null;
42370     },
42371     // Introduced in DOM Level 3:
42372     isDefaultNamespace:function(namespaceURI){
42373         var prefix = this.lookupPrefix(namespaceURI);
42374         return prefix == null;
42375     }
42376 };
42377
42378
42379 function _xmlEncoder(c){
42380         return c == '<' && '&lt;' ||
42381          c == '>' && '&gt;' ||
42382          c == '&' && '&amp;' ||
42383          c == '"' && '&quot;' ||
42384          '&#'+c.charCodeAt()+';'
42385 }
42386
42387
42388 copy$1(NodeType,Node$2);
42389 copy$1(NodeType,Node$2.prototype);
42390
42391 /**
42392  * @param callback return true for continue,false for break
42393  * @return boolean true: break visit;
42394  */
42395 function _visitNode(node,callback){
42396         if(callback(node)){
42397                 return true;
42398         }
42399         if(node = node.firstChild){
42400                 do{
42401                         if(_visitNode(node,callback)){return true}
42402         }while(node=node.nextSibling)
42403     }
42404 }
42405
42406
42407
42408 function Document(){
42409 }
42410 function _onAddAttribute(doc,el,newAttr){
42411         doc && doc._inc++;
42412         var ns = newAttr.namespaceURI ;
42413         if(ns == 'http://www.w3.org/2000/xmlns/'){
42414                 //update namespace
42415                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
42416         }
42417 }
42418 function _onRemoveAttribute(doc,el,newAttr,remove){
42419         doc && doc._inc++;
42420         var ns = newAttr.namespaceURI ;
42421         if(ns == 'http://www.w3.org/2000/xmlns/'){
42422                 //update namespace
42423                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
42424         }
42425 }
42426 function _onUpdateChild(doc,el,newChild){
42427         if(doc && doc._inc){
42428                 doc._inc++;
42429                 //update childNodes
42430                 var cs = el.childNodes;
42431                 if(newChild){
42432                         cs[cs.length++] = newChild;
42433                 }else{
42434                         //console.log(1)
42435                         var child = el.firstChild;
42436                         var i = 0;
42437                         while(child){
42438                                 cs[i++] = child;
42439                                 child =child.nextSibling;
42440                         }
42441                         cs.length = i;
42442                 }
42443         }
42444 }
42445
42446 /**
42447  * attributes;
42448  * children;
42449  * 
42450  * writeable properties:
42451  * nodeValue,Attr:value,CharacterData:data
42452  * prefix
42453  */
42454 function _removeChild(parentNode,child){
42455         var previous = child.previousSibling;
42456         var next = child.nextSibling;
42457         if(previous){
42458                 previous.nextSibling = next;
42459         }else{
42460                 parentNode.firstChild = next;
42461         }
42462         if(next){
42463                 next.previousSibling = previous;
42464         }else{
42465                 parentNode.lastChild = previous;
42466         }
42467         _onUpdateChild(parentNode.ownerDocument,parentNode);
42468         return child;
42469 }
42470 /**
42471  * preformance key(refChild == null)
42472  */
42473 function _insertBefore(parentNode,newChild,nextChild){
42474         var cp = newChild.parentNode;
42475         if(cp){
42476                 cp.removeChild(newChild);//remove and update
42477         }
42478         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
42479                 var newFirst = newChild.firstChild;
42480                 if (newFirst == null) {
42481                         return newChild;
42482                 }
42483                 var newLast = newChild.lastChild;
42484         }else{
42485                 newFirst = newLast = newChild;
42486         }
42487         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
42488
42489         newFirst.previousSibling = pre;
42490         newLast.nextSibling = nextChild;
42491         
42492         
42493         if(pre){
42494                 pre.nextSibling = newFirst;
42495         }else{
42496                 parentNode.firstChild = newFirst;
42497         }
42498         if(nextChild == null){
42499                 parentNode.lastChild = newLast;
42500         }else{
42501                 nextChild.previousSibling = newLast;
42502         }
42503         do{
42504                 newFirst.parentNode = parentNode;
42505         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
42506         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
42507         //console.log(parentNode.lastChild.nextSibling == null)
42508         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
42509                 newChild.firstChild = newChild.lastChild = null;
42510         }
42511         return newChild;
42512 }
42513 function _appendSingleChild(parentNode,newChild){
42514         var cp = newChild.parentNode;
42515         if(cp){
42516                 var pre = parentNode.lastChild;
42517                 cp.removeChild(newChild);//remove and update
42518                 var pre = parentNode.lastChild;
42519         }
42520         var pre = parentNode.lastChild;
42521         newChild.parentNode = parentNode;
42522         newChild.previousSibling = pre;
42523         newChild.nextSibling = null;
42524         if(pre){
42525                 pre.nextSibling = newChild;
42526         }else{
42527                 parentNode.firstChild = newChild;
42528         }
42529         parentNode.lastChild = newChild;
42530         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
42531         return newChild;
42532         //console.log("__aa",parentNode.lastChild.nextSibling == null)
42533 }
42534 Document.prototype = {
42535         //implementation : null,
42536         nodeName :  '#document',
42537         nodeType :  DOCUMENT_NODE,
42538         doctype :  null,
42539         documentElement :  null,
42540         _inc : 1,
42541         
42542         insertBefore :  function(newChild, refChild){//raises 
42543                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
42544                         var child = newChild.firstChild;
42545                         while(child){
42546                                 var next = child.nextSibling;
42547                                 this.insertBefore(child,refChild);
42548                                 child = next;
42549                         }
42550                         return newChild;
42551                 }
42552                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
42553                         this.documentElement = newChild;
42554                 }
42555                 
42556                 return _insertBefore(this,newChild,refChild), newChild.ownerDocument = this, newChild;
42557         },
42558         removeChild :  function(oldChild){
42559                 if(this.documentElement == oldChild){
42560                         this.documentElement = null;
42561                 }
42562                 return _removeChild(this,oldChild);
42563         },
42564         // Introduced in DOM Level 2:
42565         importNode : function(importedNode,deep){
42566                 return importNode(this,importedNode,deep);
42567         },
42568         // Introduced in DOM Level 2:
42569         getElementById :        function(id){
42570                 var rtv = null;
42571                 _visitNode(this.documentElement,function(node){
42572                         if(node.nodeType == ELEMENT_NODE){
42573                                 if(node.getAttribute('id') == id){
42574                                         rtv = node;
42575                                         return true;
42576                                 }
42577                         }
42578                 });
42579                 return rtv;
42580         },
42581         
42582         //document factory method:
42583         createElement : function(tagName){
42584                 var node = new Element();
42585                 node.ownerDocument = this;
42586                 node.nodeName = tagName;
42587                 node.tagName = tagName;
42588                 node.childNodes = new NodeList();
42589                 var attrs       = node.attributes = new NamedNodeMap();
42590                 attrs._ownerElement = node;
42591                 return node;
42592         },
42593         createDocumentFragment :        function(){
42594                 var node = new DocumentFragment();
42595                 node.ownerDocument = this;
42596                 node.childNodes = new NodeList();
42597                 return node;
42598         },
42599         createTextNode :        function(data){
42600                 var node = new Text();
42601                 node.ownerDocument = this;
42602                 node.appendData(data);
42603                 return node;
42604         },
42605         createComment : function(data){
42606                 var node = new Comment();
42607                 node.ownerDocument = this;
42608                 node.appendData(data);
42609                 return node;
42610         },
42611         createCDATASection :    function(data){
42612                 var node = new CDATASection();
42613                 node.ownerDocument = this;
42614                 node.appendData(data);
42615                 return node;
42616         },
42617         createProcessingInstruction :   function(target,data){
42618                 var node = new ProcessingInstruction();
42619                 node.ownerDocument = this;
42620                 node.tagName = node.target = target;
42621                 node.nodeValue= node.data = data;
42622                 return node;
42623         },
42624         createAttribute :       function(name){
42625                 var node = new Attr();
42626                 node.ownerDocument      = this;
42627                 node.name = name;
42628                 node.nodeName   = name;
42629                 node.localName = name;
42630                 node.specified = true;
42631                 return node;
42632         },
42633         createEntityReference : function(name){
42634                 var node = new EntityReference();
42635                 node.ownerDocument      = this;
42636                 node.nodeName   = name;
42637                 return node;
42638         },
42639         // Introduced in DOM Level 2:
42640         createElementNS :       function(namespaceURI,qualifiedName){
42641                 var node = new Element();
42642                 var pl = qualifiedName.split(':');
42643                 var attrs       = node.attributes = new NamedNodeMap();
42644                 node.childNodes = new NodeList();
42645                 node.ownerDocument = this;
42646                 node.nodeName = qualifiedName;
42647                 node.tagName = qualifiedName;
42648                 node.namespaceURI = namespaceURI;
42649                 if(pl.length == 2){
42650                         node.prefix = pl[0];
42651                         node.localName = pl[1];
42652                 }else{
42653                         //el.prefix = null;
42654                         node.localName = qualifiedName;
42655                 }
42656                 attrs._ownerElement = node;
42657                 return node;
42658         },
42659         // Introduced in DOM Level 2:
42660         createAttributeNS :     function(namespaceURI,qualifiedName){
42661                 var node = new Attr();
42662                 var pl = qualifiedName.split(':');
42663                 node.ownerDocument = this;
42664                 node.nodeName = qualifiedName;
42665                 node.name = qualifiedName;
42666                 node.namespaceURI = namespaceURI;
42667                 node.specified = true;
42668                 if(pl.length == 2){
42669                         node.prefix = pl[0];
42670                         node.localName = pl[1];
42671                 }else{
42672                         //el.prefix = null;
42673                         node.localName = qualifiedName;
42674                 }
42675                 return node;
42676         }
42677 };
42678 _extends(Document,Node$2);
42679
42680
42681 function Element() {
42682         this._nsMap = {};
42683 }Element.prototype = {
42684         nodeType : ELEMENT_NODE,
42685         hasAttribute : function(name){
42686                 return this.getAttributeNode(name)!=null;
42687         },
42688         getAttribute : function(name){
42689                 var attr = this.getAttributeNode(name);
42690                 return attr && attr.value || '';
42691         },
42692         getAttributeNode : function(name){
42693                 return this.attributes.getNamedItem(name);
42694         },
42695         setAttribute : function(name, value){
42696                 var attr = this.ownerDocument.createAttribute(name);
42697                 attr.value = attr.nodeValue = "" + value;
42698                 this.setAttributeNode(attr);
42699         },
42700         removeAttribute : function(name){
42701                 var attr = this.getAttributeNode(name);
42702                 attr && this.removeAttributeNode(attr);
42703         },
42704         
42705         //four real opeartion method
42706         appendChild:function(newChild){
42707                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
42708                         return this.insertBefore(newChild,null);
42709                 }else{
42710                         return _appendSingleChild(this,newChild);
42711                 }
42712         },
42713         setAttributeNode : function(newAttr){
42714                 return this.attributes.setNamedItem(newAttr);
42715         },
42716         setAttributeNodeNS : function(newAttr){
42717                 return this.attributes.setNamedItemNS(newAttr);
42718         },
42719         removeAttributeNode : function(oldAttr){
42720                 //console.log(this == oldAttr.ownerElement)
42721                 return this.attributes.removeNamedItem(oldAttr.nodeName);
42722         },
42723         //get real attribute name,and remove it by removeAttributeNode
42724         removeAttributeNS : function(namespaceURI, localName){
42725                 var old = this.getAttributeNodeNS(namespaceURI, localName);
42726                 old && this.removeAttributeNode(old);
42727         },
42728         
42729         hasAttributeNS : function(namespaceURI, localName){
42730                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
42731         },
42732         getAttributeNS : function(namespaceURI, localName){
42733                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
42734                 return attr && attr.value || '';
42735         },
42736         setAttributeNS : function(namespaceURI, qualifiedName, value){
42737                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
42738                 attr.value = attr.nodeValue = "" + value;
42739                 this.setAttributeNode(attr);
42740         },
42741         getAttributeNodeNS : function(namespaceURI, localName){
42742                 return this.attributes.getNamedItemNS(namespaceURI, localName);
42743         },
42744         
42745         getElementsByTagName : function(tagName){
42746                 return new LiveNodeList(this,function(base){
42747                         var ls = [];
42748                         _visitNode(base,function(node){
42749                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
42750                                         ls.push(node);
42751                                 }
42752                         });
42753                         return ls;
42754                 });
42755         },
42756         getElementsByTagNameNS : function(namespaceURI, localName){
42757                 return new LiveNodeList(this,function(base){
42758                         var ls = [];
42759                         _visitNode(base,function(node){
42760                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
42761                                         ls.push(node);
42762                                 }
42763                         });
42764                         return ls;
42765                         
42766                 });
42767         }
42768 };
42769 Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
42770 Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
42771
42772
42773 _extends(Element,Node$2);
42774 function Attr() {
42775 }Attr.prototype.nodeType = ATTRIBUTE_NODE;
42776 _extends(Attr,Node$2);
42777
42778
42779 function CharacterData() {
42780 }CharacterData.prototype = {
42781         data : '',
42782         substringData : function(offset, count) {
42783                 return this.data.substring(offset, offset+count);
42784         },
42785         appendData: function(text) {
42786                 text = this.data+text;
42787                 this.nodeValue = this.data = text;
42788                 this.length = text.length;
42789         },
42790         insertData: function(offset,text) {
42791                 this.replaceData(offset,0,text);
42792         
42793         },
42794         appendChild:function(newChild){
42795                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
42796         },
42797         deleteData: function(offset, count) {
42798                 this.replaceData(offset,count,"");
42799         },
42800         replaceData: function(offset, count, text) {
42801                 var start = this.data.substring(0,offset);
42802                 var end = this.data.substring(offset+count);
42803                 text = start + text + end;
42804                 this.nodeValue = this.data = text;
42805                 this.length = text.length;
42806         }
42807 };
42808 _extends(CharacterData,Node$2);
42809 function Text() {
42810 }Text.prototype = {
42811         nodeName : "#text",
42812         nodeType : TEXT_NODE,
42813         splitText : function(offset) {
42814                 var text = this.data;
42815                 var newText = text.substring(offset);
42816                 text = text.substring(0, offset);
42817                 this.data = this.nodeValue = text;
42818                 this.length = text.length;
42819                 var newNode = this.ownerDocument.createTextNode(newText);
42820                 if(this.parentNode){
42821                         this.parentNode.insertBefore(newNode, this.nextSibling);
42822                 }
42823                 return newNode;
42824         }
42825 };
42826 _extends(Text,CharacterData);
42827 function Comment() {
42828 }Comment.prototype = {
42829         nodeName : "#comment",
42830         nodeType : COMMENT_NODE
42831 };
42832 _extends(Comment,CharacterData);
42833
42834 function CDATASection() {
42835 }CDATASection.prototype = {
42836         nodeName : "#cdata-section",
42837         nodeType : CDATA_SECTION_NODE
42838 };
42839 _extends(CDATASection,CharacterData);
42840
42841
42842 function DocumentType() {
42843 }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
42844 _extends(DocumentType,Node$2);
42845
42846 function Notation() {
42847 }Notation.prototype.nodeType = NOTATION_NODE;
42848 _extends(Notation,Node$2);
42849
42850 function Entity() {
42851 }Entity.prototype.nodeType = ENTITY_NODE;
42852 _extends(Entity,Node$2);
42853
42854 function EntityReference() {
42855 }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
42856 _extends(EntityReference,Node$2);
42857
42858 function DocumentFragment() {
42859 }DocumentFragment.prototype.nodeName =  "#document-fragment";
42860 DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
42861 _extends(DocumentFragment,Node$2);
42862
42863
42864 function ProcessingInstruction() {
42865 }
42866 ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
42867 _extends(ProcessingInstruction,Node$2);
42868 function XMLSerializer$1(){}
42869 XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
42870         return nodeSerializeToString.call(node,isHtml,nodeFilter);
42871 };
42872 Node$2.prototype.toString = nodeSerializeToString;
42873 function nodeSerializeToString(isHtml,nodeFilter){
42874         var buf = [];
42875         var refNode = this.nodeType == 9?this.documentElement:this;
42876         var prefix = refNode.prefix;
42877         var uri = refNode.namespaceURI;
42878         
42879         if(uri && prefix == null){
42880                 //console.log(prefix)
42881                 var prefix = refNode.lookupPrefix(uri);
42882                 if(prefix == null){
42883                         //isHTML = true;
42884                         var visibleNamespaces=[
42885                         {namespace:uri,prefix:null}
42886                         //{namespace:uri,prefix:''}
42887                         ];
42888                 }
42889         }
42890         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
42891         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
42892         return buf.join('');
42893 }
42894 function needNamespaceDefine(node,isHTML, visibleNamespaces) {
42895         var prefix = node.prefix||'';
42896         var uri = node.namespaceURI;
42897         if (!prefix && !uri){
42898                 return false;
42899         }
42900         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
42901                 || uri == 'http://www.w3.org/2000/xmlns/'){
42902                 return false;
42903         }
42904         
42905         var i = visibleNamespaces.length; 
42906         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
42907         while (i--) {
42908                 var ns = visibleNamespaces[i];
42909                 // get namespace prefix
42910                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
42911                 if (ns.prefix == prefix){
42912                         return ns.namespace != uri;
42913                 }
42914         }
42915         //console.log(isHTML,uri,prefix=='')
42916         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
42917         //      return false;
42918         //}
42919         //node.flag = '11111'
42920         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
42921         return true;
42922 }
42923 function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
42924         if(nodeFilter){
42925                 node = nodeFilter(node);
42926                 if(node){
42927                         if(typeof node == 'string'){
42928                                 buf.push(node);
42929                                 return;
42930                         }
42931                 }else{
42932                         return;
42933                 }
42934                 //buf.sort.apply(attrs, attributeSorter);
42935         }
42936         switch(node.nodeType){
42937         case ELEMENT_NODE:
42938                 if (!visibleNamespaces) visibleNamespaces = [];
42939                 var startVisibleNamespaces = visibleNamespaces.length;
42940                 var attrs = node.attributes;
42941                 var len = attrs.length;
42942                 var child = node.firstChild;
42943                 var nodeName = node.tagName;
42944                 
42945                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
42946                 buf.push('<',nodeName);
42947                 
42948                 
42949                 
42950                 for(var i=0;i<len;i++){
42951                         // add namespaces for attributes
42952                         var attr = attrs.item(i);
42953                         if (attr.prefix == 'xmlns') {
42954                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
42955                         }else if(attr.nodeName == 'xmlns'){
42956                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
42957                         }
42958                 }
42959                 for(var i=0;i<len;i++){
42960                         var attr = attrs.item(i);
42961                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
42962                                 var prefix = attr.prefix||'';
42963                                 var uri = attr.namespaceURI;
42964                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
42965                                 buf.push(ns, '="' , uri , '"');
42966                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
42967                         }
42968                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
42969                 }
42970                 // add namespace for current node               
42971                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
42972                         var prefix = node.prefix||'';
42973                         var uri = node.namespaceURI;
42974                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
42975                         buf.push(ns, '="' , uri , '"');
42976                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
42977                 }
42978                 
42979                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
42980                         buf.push('>');
42981                         //if is cdata child node
42982                         if(isHTML && /^script$/i.test(nodeName)){
42983                                 while(child){
42984                                         if(child.data){
42985                                                 buf.push(child.data);
42986                                         }else{
42987                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
42988                                         }
42989                                         child = child.nextSibling;
42990                                 }
42991                         }else
42992                         {
42993                                 while(child){
42994                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
42995                                         child = child.nextSibling;
42996                                 }
42997                         }
42998                         buf.push('</',nodeName,'>');
42999                 }else{
43000                         buf.push('/>');
43001                 }
43002                 // remove added visible namespaces
43003                 //visibleNamespaces.length = startVisibleNamespaces;
43004                 return;
43005         case DOCUMENT_NODE:
43006         case DOCUMENT_FRAGMENT_NODE:
43007                 var child = node.firstChild;
43008                 while(child){
43009                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43010                         child = child.nextSibling;
43011                 }
43012                 return;
43013         case ATTRIBUTE_NODE:
43014                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
43015         case TEXT_NODE:
43016                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
43017         case CDATA_SECTION_NODE:
43018                 return buf.push( '<![CDATA[',node.data,']]>');
43019         case COMMENT_NODE:
43020                 return buf.push( "<!--",node.data,"-->");
43021         case DOCUMENT_TYPE_NODE:
43022                 var pubid = node.publicId;
43023                 var sysid = node.systemId;
43024                 buf.push('<!DOCTYPE ',node.name);
43025                 if(pubid){
43026                         buf.push(' PUBLIC "',pubid);
43027                         if (sysid && sysid!='.') {
43028                                 buf.push( '" "',sysid);
43029                         }
43030                         buf.push('">');
43031                 }else if(sysid && sysid!='.'){
43032                         buf.push(' SYSTEM "',sysid,'">');
43033                 }else{
43034                         var sub = node.internalSubset;
43035                         if(sub){
43036                                 buf.push(" [",sub,"]");
43037                         }
43038                         buf.push(">");
43039                 }
43040                 return;
43041         case PROCESSING_INSTRUCTION_NODE:
43042                 return buf.push( "<?",node.target," ",node.data,"?>");
43043         case ENTITY_REFERENCE_NODE:
43044                 return buf.push( '&',node.nodeName,';');
43045         //case ENTITY_NODE:
43046         //case NOTATION_NODE:
43047         default:
43048                 buf.push('??',node.nodeName);
43049         }
43050 }
43051 function importNode(doc,node,deep){
43052         var node2;
43053         switch (node.nodeType) {
43054         case ELEMENT_NODE:
43055                 node2 = node.cloneNode(false);
43056                 node2.ownerDocument = doc;
43057                 //var attrs = node2.attributes;
43058                 //var len = attrs.length;
43059                 //for(var i=0;i<len;i++){
43060                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
43061                 //}
43062         case DOCUMENT_FRAGMENT_NODE:
43063                 break;
43064         case ATTRIBUTE_NODE:
43065                 deep = true;
43066                 break;
43067         //case ENTITY_REFERENCE_NODE:
43068         //case PROCESSING_INSTRUCTION_NODE:
43069         ////case TEXT_NODE:
43070         //case CDATA_SECTION_NODE:
43071         //case COMMENT_NODE:
43072         //      deep = false;
43073         //      break;
43074         //case DOCUMENT_NODE:
43075         //case DOCUMENT_TYPE_NODE:
43076         //cannot be imported.
43077         //case ENTITY_NODE:
43078         //case NOTATION_NODE:
43079         //can not hit in level3
43080         //default:throw e;
43081         }
43082         if(!node2){
43083                 node2 = node.cloneNode(false);//false
43084         }
43085         node2.ownerDocument = doc;
43086         node2.parentNode = null;
43087         if(deep){
43088                 var child = node.firstChild;
43089                 while(child){
43090                         node2.appendChild(importNode(doc,child,deep));
43091                         child = child.nextSibling;
43092                 }
43093         }
43094         return node2;
43095 }
43096 //
43097 //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
43098 //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
43099 function cloneNode(doc,node,deep){
43100         var node2 = new node.constructor();
43101         for(var n in node){
43102                 var v = node[n];
43103                 if(typeof v != 'object' ){
43104                         if(v != node2[n]){
43105                                 node2[n] = v;
43106                         }
43107                 }
43108         }
43109         if(node.childNodes){
43110                 node2.childNodes = new NodeList();
43111         }
43112         node2.ownerDocument = doc;
43113         switch (node2.nodeType) {
43114         case ELEMENT_NODE:
43115                 var attrs       = node.attributes;
43116                 var attrs2      = node2.attributes = new NamedNodeMap();
43117                 var len = attrs.length;
43118                 attrs2._ownerElement = node2;
43119                 for(var i=0;i<len;i++){
43120                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
43121                 }
43122                 break;
43123         case ATTRIBUTE_NODE:
43124                 deep = true;
43125         }
43126         if(deep){
43127                 var child = node.firstChild;
43128                 while(child){
43129                         node2.appendChild(cloneNode(doc,child,deep));
43130                         child = child.nextSibling;
43131                 }
43132         }
43133         return node2;
43134 }
43135
43136 function __set__(object,key,value){
43137         object[key] = value;
43138 }
43139 //do dynamic
43140 try{
43141         if(Object.defineProperty){
43142                 Object.defineProperty(LiveNodeList.prototype,'length',{
43143                         get:function(){
43144                                 _updateLiveList(this);
43145                                 return this.$$length;
43146                         }
43147                 });
43148                 Object.defineProperty(Node$2.prototype,'textContent',{
43149                         get:function(){
43150                                 return getTextContent(this);
43151                         },
43152                         set:function(data){
43153                                 switch(this.nodeType){
43154                                 case ELEMENT_NODE:
43155                                 case DOCUMENT_FRAGMENT_NODE:
43156                                         while(this.firstChild){
43157                                                 this.removeChild(this.firstChild);
43158                                         }
43159                                         if(data || String(data)){
43160                                                 this.appendChild(this.ownerDocument.createTextNode(data));
43161                                         }
43162                                         break;
43163                                 default:
43164                                         //TODO:
43165                                         this.data = data;
43166                                         this.value = data;
43167                                         this.nodeValue = data;
43168                                 }
43169                         }
43170                 });
43171                 
43172                 function getTextContent(node){
43173                         switch(node.nodeType){
43174                         case ELEMENT_NODE:
43175                         case DOCUMENT_FRAGMENT_NODE:
43176                                 var buf = [];
43177                                 node = node.firstChild;
43178                                 while(node){
43179                                         if(node.nodeType!==7 && node.nodeType !==8){
43180                                                 buf.push(getTextContent(node));
43181                                         }
43182                                         node = node.nextSibling;
43183                                 }
43184                                 return buf.join('');
43185                         default:
43186                                 return node.nodeValue;
43187                         }
43188                 }
43189                 __set__ = function(object,key,value){
43190                         //console.log(value)
43191                         object['$$'+key] = value;
43192                 };
43193         }
43194 }catch(e){//ie8
43195 }
43196
43197 //if(typeof require == 'function'){
43198         var DOMImplementation_1 = DOMImplementation;
43199         var XMLSerializer_1 = XMLSerializer$1;
43200 //}
43201
43202 var dom = {
43203         DOMImplementation: DOMImplementation_1,
43204         XMLSerializer: XMLSerializer_1
43205 };
43206
43207 var domParser = createCommonjsModule(function (module, exports) {
43208 function DOMParser(options){
43209         this.options = options ||{locator:{}};
43210         
43211 }
43212 DOMParser.prototype.parseFromString = function(source,mimeType){
43213         var options = this.options;
43214         var sax$$1 =  new XMLReader();
43215         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
43216         var errorHandler = options.errorHandler;
43217         var locator = options.locator;
43218         var defaultNSMap = options.xmlns||{};
43219         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
43220         if(locator){
43221                 domBuilder.setDocumentLocator(locator);
43222         }
43223         
43224         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
43225         sax$$1.domBuilder = options.domBuilder || domBuilder;
43226         if(/\/x?html?$/.test(mimeType)){
43227                 entityMap.nbsp = '\xa0';
43228                 entityMap.copy = '\xa9';
43229                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
43230         }
43231         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
43232         if(source){
43233                 sax$$1.parse(source,defaultNSMap,entityMap);
43234         }else{
43235                 sax$$1.errorHandler.error("invalid doc source");
43236         }
43237         return domBuilder.doc;
43238 };
43239 function buildErrorHandler(errorImpl,domBuilder,locator){
43240         if(!errorImpl){
43241                 if(domBuilder instanceof DOMHandler){
43242                         return domBuilder;
43243                 }
43244                 errorImpl = domBuilder ;
43245         }
43246         var errorHandler = {};
43247         var isCallback = errorImpl instanceof Function;
43248         locator = locator||{};
43249         function build(key){
43250                 var fn = errorImpl[key];
43251                 if(!fn && isCallback){
43252                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
43253                 }
43254                 errorHandler[key] = fn && function(msg){
43255                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
43256                 }||function(){};
43257         }
43258         build('warning');
43259         build('error');
43260         build('fatalError');
43261         return errorHandler;
43262 }
43263
43264 //console.log('#\n\n\n\n\n\n\n####')
43265 /**
43266  * +ContentHandler+ErrorHandler
43267  * +LexicalHandler+EntityResolver2
43268  * -DeclHandler-DTDHandler 
43269  * 
43270  * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
43271  * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
43272  * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
43273  */
43274 function DOMHandler() {
43275     this.cdata = false;
43276 }
43277 function position(locator,node){
43278         node.lineNumber = locator.lineNumber;
43279         node.columnNumber = locator.columnNumber;
43280 }
43281 /**
43282  * @see org.xml.sax.ContentHandler#startDocument
43283  * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
43284  */ 
43285 DOMHandler.prototype = {
43286         startDocument : function() {
43287         this.doc = new DOMImplementation().createDocument(null, null, null);
43288         if (this.locator) {
43289                 this.doc.documentURI = this.locator.systemId;
43290         }
43291         },
43292         startElement:function(namespaceURI, localName, qName, attrs) {
43293                 var doc = this.doc;
43294             var el = doc.createElementNS(namespaceURI, qName||localName);
43295             var len = attrs.length;
43296             appendElement(this, el);
43297             this.currentElement = el;
43298             
43299                 this.locator && position(this.locator,el);
43300             for (var i = 0 ; i < len; i++) {
43301                 var namespaceURI = attrs.getURI(i);
43302                 var value = attrs.getValue(i);
43303                 var qName = attrs.getQName(i);
43304                         var attr = doc.createAttributeNS(namespaceURI, qName);
43305                         this.locator &&position(attrs.getLocator(i),attr);
43306                         attr.value = attr.nodeValue = value;
43307                         el.setAttributeNode(attr);
43308             }
43309         },
43310         endElement:function(namespaceURI, localName, qName) {
43311                 var current = this.currentElement;
43312                 var tagName = current.tagName;
43313                 this.currentElement = current.parentNode;
43314         },
43315         startPrefixMapping:function(prefix, uri) {
43316         },
43317         endPrefixMapping:function(prefix) {
43318         },
43319         processingInstruction:function(target, data) {
43320             var ins = this.doc.createProcessingInstruction(target, data);
43321             this.locator && position(this.locator,ins);
43322             appendElement(this, ins);
43323         },
43324         ignorableWhitespace:function(ch, start, length) {
43325         },
43326         characters:function(chars, start, length) {
43327                 chars = _toString.apply(this,arguments);
43328                 //console.log(chars)
43329                 if(chars){
43330                         if (this.cdata) {
43331                                 var charNode = this.doc.createCDATASection(chars);
43332                         } else {
43333                                 var charNode = this.doc.createTextNode(chars);
43334                         }
43335                         if(this.currentElement){
43336                                 this.currentElement.appendChild(charNode);
43337                         }else if(/^\s*$/.test(chars)){
43338                                 this.doc.appendChild(charNode);
43339                                 //process xml
43340                         }
43341                         this.locator && position(this.locator,charNode);
43342                 }
43343         },
43344         skippedEntity:function(name) {
43345         },
43346         endDocument:function() {
43347                 this.doc.normalize();
43348         },
43349         setDocumentLocator:function (locator) {
43350             if(this.locator = locator){// && !('lineNumber' in locator)){
43351                 locator.lineNumber = 0;
43352             }
43353         },
43354         //LexicalHandler
43355         comment:function(chars, start, length) {
43356                 chars = _toString.apply(this,arguments);
43357             var comm = this.doc.createComment(chars);
43358             this.locator && position(this.locator,comm);
43359             appendElement(this, comm);
43360         },
43361         
43362         startCDATA:function() {
43363             //used in characters() methods
43364             this.cdata = true;
43365         },
43366         endCDATA:function() {
43367             this.cdata = false;
43368         },
43369         
43370         startDTD:function(name, publicId, systemId) {
43371                 var impl = this.doc.implementation;
43372             if (impl && impl.createDocumentType) {
43373                 var dt = impl.createDocumentType(name, publicId, systemId);
43374                 this.locator && position(this.locator,dt);
43375                 appendElement(this, dt);
43376             }
43377         },
43378         /**
43379          * @see org.xml.sax.ErrorHandler
43380          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
43381          */
43382         warning:function(error) {
43383                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
43384         },
43385         error:function(error) {
43386                 console.error('[xmldom error]\t'+error,_locator(this.locator));
43387         },
43388         fatalError:function(error) {
43389                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
43390             throw error;
43391         }
43392 };
43393 function _locator(l){
43394         if(l){
43395                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
43396         }
43397 }
43398 function _toString(chars,start,length){
43399         if(typeof chars == 'string'){
43400                 return chars.substr(start,length)
43401         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
43402                 if(chars.length >= start+length || start){
43403                         return new java.lang.String(chars,start,length)+'';
43404                 }
43405                 return chars;
43406         }
43407 }
43408
43409 /*
43410  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
43411  * used method of org.xml.sax.ext.LexicalHandler:
43412  *  #comment(chars, start, length)
43413  *  #startCDATA()
43414  *  #endCDATA()
43415  *  #startDTD(name, publicId, systemId)
43416  *
43417  *
43418  * IGNORED method of org.xml.sax.ext.LexicalHandler:
43419  *  #endDTD()
43420  *  #startEntity(name)
43421  *  #endEntity(name)
43422  *
43423  *
43424  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
43425  * IGNORED method of org.xml.sax.ext.DeclHandler
43426  *      #attributeDecl(eName, aName, type, mode, value)
43427  *  #elementDecl(name, model)
43428  *  #externalEntityDecl(name, publicId, systemId)
43429  *  #internalEntityDecl(name, value)
43430  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
43431  * IGNORED method of org.xml.sax.EntityResolver2
43432  *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
43433  *  #resolveEntity(publicId, systemId)
43434  *  #getExternalSubset(name, baseURI)
43435  * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
43436  * IGNORED method of org.xml.sax.DTDHandler
43437  *  #notationDecl(name, publicId, systemId) {};
43438  *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
43439  */
43440 "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
43441         DOMHandler.prototype[key] = function(){return null};
43442 });
43443
43444 /* 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 */
43445 function appendElement (hander,node) {
43446     if (!hander.currentElement) {
43447         hander.doc.appendChild(node);
43448     } else {
43449         hander.currentElement.appendChild(node);
43450     }
43451 }//appendChild and setAttributeNS are preformance key
43452
43453 //if(typeof require == 'function'){
43454         var XMLReader = sax.XMLReader;
43455         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
43456         exports.XMLSerializer = dom.XMLSerializer ;
43457         exports.DOMParser = DOMParser;
43458 //}
43459 });
43460 var domParser_1 = domParser.DOMImplementation;
43461 var domParser_2 = domParser.XMLSerializer;
43462 var domParser_3 = domParser.DOMParser;
43463
43464 var togeojson = createCommonjsModule(function (module, exports) {
43465 var toGeoJSON = (function() {
43466
43467     var removeSpace = /\s*/g,
43468         trimSpace = /^\s*|\s*$/g,
43469         splitSpace = /\s+/;
43470     // generate a short, numeric hash of a string
43471     function okhash(x) {
43472         if (!x || !x.length) return 0;
43473         for (var i = 0, h = 0; i < x.length; i++) {
43474             h = ((h << 5) - h) + x.charCodeAt(i) | 0;
43475         } return h;
43476     }
43477     // all Y children of X
43478     function get(x, y) { return x.getElementsByTagName(y); }
43479     function attr(x, y) { return x.getAttribute(y); }
43480     function attrf(x, y) { return parseFloat(attr(x, y)); }
43481     // one Y child of X, if any, otherwise null
43482     function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
43483     // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
43484     function norm(el) { if (el.normalize) { el.normalize(); } return el; }
43485     // cast array x into numbers
43486     function numarray(x) {
43487         for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
43488         return o;
43489     }
43490     // get the content of a text node, if any
43491     function nodeVal(x) {
43492         if (x) { norm(x); }
43493         return (x && x.textContent) || '';
43494     }
43495     // get the contents of multiple text nodes, if present
43496     function getMulti(x, ys) {
43497         var o = {}, n, k;
43498         for (k = 0; k < ys.length; k++) {
43499             n = get1(x, ys[k]);
43500             if (n) o[ys[k]] = nodeVal(n);
43501         }
43502         return o;
43503     }
43504     // add properties of Y to X, overwriting if present in both
43505     function extend(x, y) { for (var k in y) x[k] = y[k]; }
43506     // get one coordinate from a coordinate array, if any
43507     function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
43508     // get all coordinates from a coordinate array as [[],[]]
43509     function coord(v) {
43510         var coords = v.replace(trimSpace, '').split(splitSpace),
43511             o = [];
43512         for (var i = 0; i < coords.length; i++) {
43513             o.push(coord1(coords[i]));
43514         }
43515         return o;
43516     }
43517     function coordPair(x) {
43518         var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
43519             ele = get1(x, 'ele'),
43520             // handle namespaced attribute in browser
43521             heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
43522             time = get1(x, 'time'),
43523             e;
43524         if (ele) {
43525             e = parseFloat(nodeVal(ele));
43526             if (!isNaN(e)) {
43527                 ll.push(e);
43528             }
43529         }
43530         return {
43531             coordinates: ll,
43532             time: time ? nodeVal(time) : null,
43533             heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
43534         };
43535     }
43536
43537     // create a new feature collection parent object
43538     function fc() {
43539         return {
43540             type: 'FeatureCollection',
43541             features: []
43542         };
43543     }
43544
43545     var serializer;
43546     if (typeof XMLSerializer !== 'undefined') {
43547         /* istanbul ignore next */
43548         serializer = new XMLSerializer();
43549     // only require xmldom in a node environment
43550     } else if ('object' === 'object' && typeof process === 'object' && !process.browser) {
43551         serializer = new (domParser.XMLSerializer)();
43552     }
43553     function xml2str(str) {
43554         // IE9 will create a new XMLSerializer but it'll crash immediately.
43555         // This line is ignored because we don't run coverage tests in IE9
43556         /* istanbul ignore next */
43557         if (str.xml !== undefined) return str.xml;
43558         return serializer.serializeToString(str);
43559     }
43560
43561     var t = {
43562         kml: function(doc) {
43563
43564             var gj = fc(),
43565                 // styleindex keeps track of hashed styles in order to match features
43566                 styleIndex = {}, styleByHash = {},
43567                 // stylemapindex keeps track of style maps to expose in properties
43568                 styleMapIndex = {},
43569                 // atomic geospatial types supported by KML - MultiGeometry is
43570                 // handled separately
43571                 geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
43572                 // all root placemarks in the file
43573                 placemarks = get(doc, 'Placemark'),
43574                 styles = get(doc, 'Style'),
43575                 styleMaps = get(doc, 'StyleMap');
43576
43577             for (var k = 0; k < styles.length; k++) {
43578                 var hash = okhash(xml2str(styles[k])).toString(16);
43579                 styleIndex['#' + attr(styles[k], 'id')] = hash;
43580                 styleByHash[hash] = styles[k];
43581             }
43582             for (var l = 0; l < styleMaps.length; l++) {
43583                 styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
43584                 var pairs = get(styleMaps[l], 'Pair');
43585                 var pairsMap = {};
43586                 for (var m = 0; m < pairs.length; m++) {
43587                     pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
43588                 }
43589                 styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
43590
43591             }
43592             for (var j = 0; j < placemarks.length; j++) {
43593                 gj.features = gj.features.concat(getPlacemark(placemarks[j]));
43594             }
43595             function kmlColor(v) {
43596                 var color, opacity;
43597                 v = v || '';
43598                 if (v.substr(0, 1) === '#') { v = v.substr(1); }
43599                 if (v.length === 6 || v.length === 3) { color = v; }
43600                 if (v.length === 8) {
43601                     opacity = parseInt(v.substr(0, 2), 16) / 255;
43602                     color = '#' + v.substr(6, 2) +
43603                         v.substr(4, 2) +
43604                         v.substr(2, 2);
43605                 }
43606                 return [color, isNaN(opacity) ? undefined : opacity];
43607             }
43608             function gxCoord(v) { return numarray(v.split(' ')); }
43609             function gxCoords(root) {
43610                 var elems = get(root, 'coord', 'gx'), coords = [], times = [];
43611                 if (elems.length === 0) elems = get(root, 'gx:coord');
43612                 for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
43613                 var timeElems = get(root, 'when');
43614                 for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
43615                 return {
43616                     coords: coords,
43617                     times: times
43618                 };
43619             }
43620             function getGeometry(root) {
43621                 var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
43622                 if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
43623                 if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
43624                 if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
43625                 for (i = 0; i < geotypes.length; i++) {
43626                     geomNodes = get(root, geotypes[i]);
43627                     if (geomNodes) {
43628                         for (j = 0; j < geomNodes.length; j++) {
43629                             geomNode = geomNodes[j];
43630                             if (geotypes[i] === 'Point') {
43631                                 geoms.push({
43632                                     type: 'Point',
43633                                     coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
43634                                 });
43635                             } else if (geotypes[i] === 'LineString') {
43636                                 geoms.push({
43637                                     type: 'LineString',
43638                                     coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
43639                                 });
43640                             } else if (geotypes[i] === 'Polygon') {
43641                                 var rings = get(geomNode, 'LinearRing'),
43642                                     coords = [];
43643                                 for (k = 0; k < rings.length; k++) {
43644                                     coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
43645                                 }
43646                                 geoms.push({
43647                                     type: 'Polygon',
43648                                     coordinates: coords
43649                                 });
43650                             } else if (geotypes[i] === 'Track' ||
43651                                 geotypes[i] === 'gx:Track') {
43652                                 var track = gxCoords(geomNode);
43653                                 geoms.push({
43654                                     type: 'LineString',
43655                                     coordinates: track.coords
43656                                 });
43657                                 if (track.times.length) coordTimes.push(track.times);
43658                             }
43659                         }
43660                     }
43661                 }
43662                 return {
43663                     geoms: geoms,
43664                     coordTimes: coordTimes
43665                 };
43666             }
43667             function getPlacemark(root) {
43668                 var geomsAndTimes = getGeometry(root), i, properties = {},
43669                     name = nodeVal(get1(root, 'name')),
43670                     address = nodeVal(get1(root, 'address')),
43671                     styleUrl = nodeVal(get1(root, 'styleUrl')),
43672                     description = nodeVal(get1(root, 'description')),
43673                     timeSpan = get1(root, 'TimeSpan'),
43674                     timeStamp = get1(root, 'TimeStamp'),
43675                     extendedData = get1(root, 'ExtendedData'),
43676                     lineStyle = get1(root, 'LineStyle'),
43677                     polyStyle = get1(root, 'PolyStyle'),
43678                     visibility = get1(root, 'visibility');
43679
43680                 if (!geomsAndTimes.geoms.length) return [];
43681                 if (name) properties.name = name;
43682                 if (address) properties.address = address;
43683                 if (styleUrl) {
43684                     if (styleUrl[0] !== '#') {
43685                         styleUrl = '#' + styleUrl;
43686                     }
43687
43688                     properties.styleUrl = styleUrl;
43689                     if (styleIndex[styleUrl]) {
43690                         properties.styleHash = styleIndex[styleUrl];
43691                     }
43692                     if (styleMapIndex[styleUrl]) {
43693                         properties.styleMapHash = styleMapIndex[styleUrl];
43694                         properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
43695                     }
43696                     // Try to populate the lineStyle or polyStyle since we got the style hash
43697                     var style = styleByHash[properties.styleHash];
43698                     if (style) {
43699                         if (!lineStyle) lineStyle = get1(style, 'LineStyle');
43700                         if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
43701                     }
43702                 }
43703                 if (description) properties.description = description;
43704                 if (timeSpan) {
43705                     var begin = nodeVal(get1(timeSpan, 'begin'));
43706                     var end = nodeVal(get1(timeSpan, 'end'));
43707                     properties.timespan = { begin: begin, end: end };
43708                 }
43709                 if (timeStamp) {
43710                     properties.timestamp = nodeVal(get1(timeStamp, 'when'));
43711                 }
43712                 if (lineStyle) {
43713                     var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
43714                         color = linestyles[0],
43715                         opacity = linestyles[1],
43716                         width = parseFloat(nodeVal(get1(lineStyle, 'width')));
43717                     if (color) properties.stroke = color;
43718                     if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
43719                     if (!isNaN(width)) properties['stroke-width'] = width;
43720                 }
43721                 if (polyStyle) {
43722                     var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
43723                         pcolor = polystyles[0],
43724                         popacity = polystyles[1],
43725                         fill = nodeVal(get1(polyStyle, 'fill')),
43726                         outline = nodeVal(get1(polyStyle, 'outline'));
43727                     if (pcolor) properties.fill = pcolor;
43728                     if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
43729                     if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
43730                     if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
43731                 }
43732                 if (extendedData) {
43733                     var datas = get(extendedData, 'Data'),
43734                         simpleDatas = get(extendedData, 'SimpleData');
43735
43736                     for (i = 0; i < datas.length; i++) {
43737                         properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
43738                     }
43739                     for (i = 0; i < simpleDatas.length; i++) {
43740                         properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
43741                     }
43742                 }
43743                 if (visibility) {
43744                     properties.visibility = nodeVal(visibility);
43745                 }
43746                 if (geomsAndTimes.coordTimes.length) {
43747                     properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
43748                         geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
43749                 }
43750                 var feature = {
43751                     type: 'Feature',
43752                     geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
43753                         type: 'GeometryCollection',
43754                         geometries: geomsAndTimes.geoms
43755                     },
43756                     properties: properties
43757                 };
43758                 if (attr(root, 'id')) feature.id = attr(root, 'id');
43759                 return [feature];
43760             }
43761             return gj;
43762         },
43763         gpx: function(doc) {
43764             var i,
43765                 tracks = get(doc, 'trk'),
43766                 routes = get(doc, 'rte'),
43767                 waypoints = get(doc, 'wpt'),
43768                 // a feature collection
43769                 gj = fc(),
43770                 feature;
43771             for (i = 0; i < tracks.length; i++) {
43772                 feature = getTrack(tracks[i]);
43773                 if (feature) gj.features.push(feature);
43774             }
43775             for (i = 0; i < routes.length; i++) {
43776                 feature = getRoute(routes[i]);
43777                 if (feature) gj.features.push(feature);
43778             }
43779             for (i = 0; i < waypoints.length; i++) {
43780                 gj.features.push(getPoint(waypoints[i]));
43781             }
43782             function getPoints(node, pointname) {
43783                 var pts = get(node, pointname),
43784                     line = [],
43785                     times = [],
43786                     heartRates = [],
43787                     l = pts.length;
43788                 if (l < 2) return {};  // Invalid line in GeoJSON
43789                 for (var i = 0; i < l; i++) {
43790                     var c = coordPair(pts[i]);
43791                     line.push(c.coordinates);
43792                     if (c.time) times.push(c.time);
43793                     if (c.heartRate) heartRates.push(c.heartRate);
43794                 }
43795                 return {
43796                     line: line,
43797                     times: times,
43798                     heartRates: heartRates
43799                 };
43800             }
43801             function getTrack(node) {
43802                 var segments = get(node, 'trkseg'),
43803                     track = [],
43804                     times = [],
43805                     heartRates = [],
43806                     line;
43807                 for (var i = 0; i < segments.length; i++) {
43808                     line = getPoints(segments[i], 'trkpt');
43809                     if (line) {
43810                         if (line.line) track.push(line.line);
43811                         if (line.times && line.times.length) times.push(line.times);
43812                         if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
43813                     }
43814                 }
43815                 if (track.length === 0) return;
43816                 var properties = getProperties(node);
43817                 extend(properties, getLineStyle(get1(node, 'extensions')));
43818                 if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
43819                 if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
43820                 return {
43821                     type: 'Feature',
43822                     properties: properties,
43823                     geometry: {
43824                         type: track.length === 1 ? 'LineString' : 'MultiLineString',
43825                         coordinates: track.length === 1 ? track[0] : track
43826                     }
43827                 };
43828             }
43829             function getRoute(node) {
43830                 var line = getPoints(node, 'rtept');
43831                 if (!line.line) return;
43832                 var prop = getProperties(node);
43833                 extend(prop, getLineStyle(get1(node, 'extensions')));
43834                 var routeObj = {
43835                     type: 'Feature',
43836                     properties: prop,
43837                     geometry: {
43838                         type: 'LineString',
43839                         coordinates: line.line
43840                     }
43841                 };
43842                 return routeObj;
43843             }
43844             function getPoint(node) {
43845                 var prop = getProperties(node);
43846                 extend(prop, getMulti(node, ['sym']));
43847                 return {
43848                     type: 'Feature',
43849                     properties: prop,
43850                     geometry: {
43851                         type: 'Point',
43852                         coordinates: coordPair(node).coordinates
43853                     }
43854                 };
43855             }
43856             function getLineStyle(extensions) {
43857                 var style = {};
43858                 if (extensions) {
43859                     var lineStyle = get1(extensions, 'line');
43860                     if (lineStyle) {
43861                         var color = nodeVal(get1(lineStyle, 'color')),
43862                             opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
43863                             width = parseFloat(nodeVal(get1(lineStyle, 'width')));
43864                         if (color) style.stroke = color;
43865                         if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
43866                         // GPX width is in mm, convert to px with 96 px per inch
43867                         if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
43868                     }
43869                 }
43870                 return style;
43871             }
43872             function getProperties(node) {
43873                 var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
43874                     links = get(node, 'link');
43875                 if (links.length) prop.links = [];
43876                 for (var i = 0, link; i < links.length; i++) {
43877                     link = { href: attr(links[i], 'href') };
43878                     extend(link, getMulti(links[i], ['text', 'type']));
43879                     prop.links.push(link);
43880                 }
43881                 return prop;
43882             }
43883             return gj;
43884         }
43885     };
43886     return t;
43887 })();
43888
43889 module.exports = toGeoJSON;
43890 });
43891
43892 var _initialized = false;
43893 var _enabled = false;
43894 var _geojson;
43895
43896
43897 function svgGpx$$1(projection$$1, context, dispatch) {
43898     var _showLabels = true;
43899     var detected = utilDetect();
43900     var layer;
43901     var _src;
43902
43903
43904     function init() {
43905         if (_initialized) return;  // run once
43906
43907         _geojson = {};
43908         _enabled = true;
43909
43910         function over() {
43911             event.stopPropagation();
43912             event.preventDefault();
43913             event.dataTransfer.dropEffect = 'copy';
43914         }
43915
43916         d3_select('body')
43917             .attr('dropzone', 'copy')
43918             .on('drop.localgpx', function() {
43919                 event.stopPropagation();
43920                 event.preventDefault();
43921                 if (!detected.filedrop) return;
43922                 drawGpx.files(event.dataTransfer.files);
43923             })
43924             .on('dragenter.localgpx', over)
43925             .on('dragexit.localgpx', over)
43926             .on('dragover.localgpx', over);
43927
43928         _initialized = true;
43929     }
43930
43931
43932     function drawGpx(selection$$1) {
43933         var getPath = svgPath(projection$$1).geojson;
43934
43935         layer = selection$$1.selectAll('.layer-gpx')
43936             .data(_enabled ? [0] : []);
43937
43938         layer.exit()
43939             .remove();
43940
43941         layer = layer.enter()
43942             .append('g')
43943             .attr('class', 'layer-gpx')
43944             .merge(layer);
43945
43946
43947         var paths = layer
43948             .selectAll('path')
43949             .data([_geojson]);
43950
43951         paths.exit()
43952             .remove();
43953
43954         paths = paths.enter()
43955             .append('path')
43956             .attr('class', 'gpx')
43957             .merge(paths);
43958
43959         paths
43960             .attr('d', getPath);
43961
43962
43963         var labelData = _showLabels && _geojson.features ? _geojson.features : [];
43964         labelData = labelData.filter(getPath);
43965
43966         layer
43967             .call(drawLabels, 'gpxlabel-halo', labelData)
43968             .call(drawLabels, 'gpxlabel', labelData);
43969
43970
43971         function drawLabels(selection$$1, textClass, data) {
43972             var labels = selection$$1.selectAll('text.' + textClass)
43973                 .data(data);
43974
43975             // exit
43976             labels.exit()
43977                 .remove();
43978
43979             // enter/update
43980             labels = labels.enter()
43981                 .append('text')
43982                 .attr('class', textClass)
43983                 .merge(labels)
43984                 .text(function(d) {
43985                     if (d.properties) {
43986                         return d.properties.desc || d.properties.name;
43987                     }
43988                     return null;
43989                 })
43990                 .attr('x', function(d) {
43991                     var centroid = getPath.centroid(d);
43992                     return centroid[0] + 11;
43993                 })
43994                 .attr('y', function(d) {
43995                     var centroid = getPath.centroid(d);
43996                     return centroid[1];
43997                 });
43998         }
43999     }
44000
44001
44002     function toDom(x) {
44003         return (new DOMParser()).parseFromString(x, 'text/xml');
44004     }
44005
44006
44007     function getExtension(fileName) {
44008         if (isUndefined(fileName)) {
44009             return '';
44010         }
44011
44012         var lastDotIndex = fileName.lastIndexOf('.');
44013         if (lastDotIndex < 0) {
44014             return '';
44015         }
44016
44017         return fileName.substr(lastDotIndex);
44018     }
44019
44020
44021     function parseSaveAndZoom(extension, data) {
44022         switch (extension) {
44023             default:
44024                 drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
44025                 break;
44026             case '.kml':
44027                 drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
44028                 break;
44029             case '.geojson':
44030             case '.json':
44031                 drawGpx.geojson(JSON.parse(data)).fitZoom();
44032                 break;
44033         }
44034     }
44035
44036
44037     drawGpx.showLabels = function(_) {
44038         if (!arguments.length) return _showLabels;
44039         _showLabels = _;
44040         return this;
44041     };
44042
44043
44044     drawGpx.enabled = function(_) {
44045         if (!arguments.length) return _enabled;
44046         _enabled = _;
44047         dispatch.call('change');
44048         return this;
44049     };
44050
44051
44052     drawGpx.hasGpx = function() {
44053         return (!(isEmpty(_geojson) || isEmpty(_geojson.features)));
44054     };
44055
44056
44057     drawGpx.geojson = function(gj) {
44058         if (!arguments.length) return _geojson;
44059         if (isEmpty(gj) || isEmpty(gj.features)) return this;
44060         _geojson = gj;
44061         dispatch.call('change');
44062         return this;
44063     };
44064
44065
44066     drawGpx.url = function(url) {
44067         d3_text(url, function(err, data) {
44068             if (!err) {
44069                 _src = url;
44070                 var extension = getExtension(url);
44071                 parseSaveAndZoom(extension, data);
44072             }
44073         });
44074         return this;
44075     };
44076
44077
44078     drawGpx.files = function(fileList) {
44079         if (!fileList.length) return this;
44080         var f = fileList[0],
44081             reader = new FileReader();
44082
44083         reader.onload = (function(file) {
44084             _src = file.name;
44085             var extension = getExtension(file.name);
44086             return function (e) {
44087                 parseSaveAndZoom(extension, e.target.result);
44088             };
44089         })(f);
44090
44091         reader.readAsText(f);
44092         return this;
44093     };
44094
44095
44096     drawGpx.getSrc = function () {
44097         return _src;
44098     };
44099
44100
44101     drawGpx.fitZoom = function() {
44102         if (!this.hasGpx()) return this;
44103
44104         var map = context.map();
44105         var viewport = map.trimmedExtent().polygon();
44106         var coords = reduce(_geojson.features, function(coords, feature) {
44107             var c = feature.geometry.coordinates;
44108
44109             /* eslint-disable no-fallthrough */
44110             switch (feature.geometry.type) {
44111                 case 'Point':
44112                     c = [c];
44113                 case 'MultiPoint':
44114                 case 'LineString':
44115                     break;
44116
44117                 case 'MultiPolygon':
44118                     c = flatten(c);
44119                 case 'Polygon':
44120                 case 'MultiLineString':
44121                     c = flatten(c);
44122                     break;
44123             }
44124             /* eslint-enable no-fallthrough */
44125
44126             return union(coords, c);
44127         }, []);
44128
44129         if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
44130             var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
44131             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
44132         }
44133
44134         return this;
44135     };
44136
44137
44138     init();
44139     return drawGpx;
44140 }
44141
44142 function svgIcon(name, svgklass, useklass) {
44143     return function drawIcon(selection) {
44144         selection.selectAll('svg')
44145             .data([0])
44146             .enter()
44147             .append('svg')
44148             .attr('class', 'icon ' + (svgklass || ''))
44149             .append('use')
44150             .attr('xlink:href', name)
44151             .attr('class', useklass);
44152     };
44153 }
44154
44155 function svgLabels(projection$$1, context) {
44156     var path = d3_geoPath(projection$$1);
44157     var detected = utilDetect();
44158     var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
44159     var _rdrawn = rbush_1();
44160     var _rskipped = rbush_1();
44161     var _textWidthCache = {};
44162     var _entitybboxes = {};
44163
44164     // Listed from highest to lowest priority
44165     var labelStack = [
44166         ['line', 'aeroway', '*', 12],
44167         ['line', 'highway', 'motorway', 12],
44168         ['line', 'highway', 'trunk', 12],
44169         ['line', 'highway', 'primary', 12],
44170         ['line', 'highway', 'secondary', 12],
44171         ['line', 'highway', 'tertiary', 12],
44172         ['line', 'highway', '*', 12],
44173         ['line', 'railway', '*', 12],
44174         ['line', 'waterway', '*', 12],
44175         ['area', 'aeroway', '*', 12],
44176         ['area', 'amenity', '*', 12],
44177         ['area', 'building', '*', 12],
44178         ['area', 'historic', '*', 12],
44179         ['area', 'leisure', '*', 12],
44180         ['area', 'man_made', '*', 12],
44181         ['area', 'natural', '*', 12],
44182         ['area', 'shop', '*', 12],
44183         ['area', 'tourism', '*', 12],
44184         ['area', 'camp_site', '*', 12],
44185         ['point', 'aeroway', '*', 10],
44186         ['point', 'amenity', '*', 10],
44187         ['point', 'building', '*', 10],
44188         ['point', 'historic', '*', 10],
44189         ['point', 'leisure', '*', 10],
44190         ['point', 'man_made', '*', 10],
44191         ['point', 'natural', '*', 10],
44192         ['point', 'shop', '*', 10],
44193         ['point', 'tourism', '*', 10],
44194         ['point', 'camp_site', '*', 10],
44195         ['line', 'name', '*', 12],
44196         ['area', 'name', '*', 12],
44197         ['point', 'name', '*', 10]
44198     ];
44199
44200
44201     function blacklisted(preset) {
44202         var noIcons = ['building', 'landuse', 'natural'];
44203         return some(noIcons, function(s) {
44204             return preset.id.indexOf(s) >= 0;
44205         });
44206     }
44207
44208
44209     function get(array, prop) {
44210         return function(d, i) { return array[i][prop]; };
44211     }
44212
44213
44214     function textWidth(text, size, elem) {
44215         var c = _textWidthCache[size];
44216         if (!c) c = _textWidthCache[size] = {};
44217
44218         if (c[text]) {
44219             return c[text];
44220
44221         } else if (elem) {
44222             c[text] = elem.getComputedTextLength();
44223             return c[text];
44224
44225         } else {
44226             var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
44227             if (str === null) {
44228                 return size / 3 * 2 * text.length;
44229             } else {
44230                 return size / 3 * (2 * text.length + str.length);
44231             }
44232         }
44233     }
44234
44235
44236     function drawLinePaths(selection, entities, filter, classes, labels) {
44237         var paths = selection.selectAll('path')
44238             .filter(filter)
44239             .data(entities, osmEntity$$1.key);
44240
44241         // exit
44242         paths.exit()
44243             .remove();
44244
44245         // enter/update
44246         paths.enter()
44247             .append('path')
44248             .style('stroke-width', get(labels, 'font-size'))
44249             .attr('id', function(d) { return 'labelpath-' + d.id; })
44250             .attr('class', classes)
44251             .merge(paths)
44252             .attr('d', get(labels, 'lineString'));
44253     }
44254
44255
44256     function drawLineLabels(selection, entities, filter, classes, labels) {
44257         var texts = selection.selectAll('text.' + classes)
44258             .filter(filter)
44259             .data(entities, osmEntity$$1.key);
44260
44261         // exit
44262         texts.exit()
44263             .remove();
44264
44265         // enter
44266         texts.enter()
44267             .append('text')
44268             .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
44269             .attr('dy', baselineHack ? '0.35em' : null)
44270             .append('textPath')
44271             .attr('class', 'textpath');
44272
44273         // update
44274         selection.selectAll('text.' + classes).selectAll('.textpath')
44275             .filter(filter)
44276             .data(entities, osmEntity$$1.key)
44277             .attr('startOffset', '50%')
44278             .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
44279             .text(utilDisplayNameForPath);
44280     }
44281
44282
44283     function drawPointLabels(selection, entities, filter, classes, labels) {
44284         var texts = selection.selectAll('text.' + classes)
44285             .filter(filter)
44286             .data(entities, osmEntity$$1.key);
44287
44288         // exit
44289         texts.exit()
44290             .remove();
44291
44292         // enter/update
44293         texts.enter()
44294             .append('text')
44295             .attr('class', function(d, i) {
44296                 return classes + ' ' + labels[i].classes + ' ' + d.id;
44297             })
44298             .merge(texts)
44299             .attr('x', get(labels, 'x'))
44300             .attr('y', get(labels, 'y'))
44301             .style('text-anchor', get(labels, 'textAnchor'))
44302             .text(utilDisplayName)
44303             .each(function(d, i) {
44304                 textWidth(utilDisplayName(d), labels[i].height, this);
44305             });
44306     }
44307
44308
44309     function drawAreaLabels(selection, entities, filter, classes, labels) {
44310         entities = entities.filter(hasText);
44311         labels = labels.filter(hasText);
44312         drawPointLabels(selection, entities, filter, classes, labels);
44313
44314         function hasText(d, i) {
44315             return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
44316         }
44317     }
44318
44319
44320     function drawAreaIcons(selection, entities, filter, classes, labels) {
44321         var icons = selection.selectAll('use.' + classes)
44322             .filter(filter)
44323             .data(entities, osmEntity$$1.key);
44324
44325         // exit
44326         icons.exit()
44327             .remove();
44328
44329         // enter/update
44330         icons.enter()
44331             .append('use')
44332             .attr('class', 'icon ' + classes)
44333             .attr('width', '17px')
44334             .attr('height', '17px')
44335             .merge(icons)
44336             .attr('transform', get(labels, 'transform'))
44337             .attr('xlink:href', function(d) {
44338                 var preset = context.presets().match(d, context.graph());
44339                 var picon = preset && preset.icon;
44340
44341                 if (!picon) {
44342                     return '';
44343                 } else {
44344                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
44345                     return '#' + picon + (isMaki ? '-15' : '');
44346                 }
44347             });
44348     }
44349
44350
44351     function drawCollisionBoxes(selection, rtree, which) {
44352         var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
44353
44354         var gj = [];
44355         if (context.getDebug('collision')) {
44356             gj = rtree.all().map(function(d) {
44357                 return { type: 'Polygon', coordinates: [[
44358                     [d.minX, d.minY],
44359                     [d.maxX, d.minY],
44360                     [d.maxX, d.maxY],
44361                     [d.minX, d.maxY],
44362                     [d.minX, d.minY]
44363                 ]]};
44364             });
44365         }
44366
44367         var boxes = selection.selectAll('.' + which)
44368             .data(gj);
44369
44370         // exit
44371         boxes.exit()
44372             .remove();
44373
44374         // enter/update
44375         boxes.enter()
44376             .append('path')
44377             .attr('class', classes)
44378             .merge(boxes)
44379             .attr('d', d3_geoPath());
44380     }
44381
44382
44383     function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
44384         var wireframe = context.surface().classed('fill-wireframe');
44385         var zoom = geoScaleToZoom(projection$$1.scale());
44386
44387         var labelable = [];
44388         var renderNodeAs = {};
44389         var i, j, k, entity, geometry;
44390
44391         for (i = 0; i < labelStack.length; i++) {
44392             labelable.push([]);
44393         }
44394
44395         if (fullRedraw) {
44396             _rdrawn.clear();
44397             _rskipped.clear();
44398             _entitybboxes = {};
44399
44400         } else {
44401             for (i = 0; i < entities.length; i++) {
44402                 entity = entities[i];
44403                 var toRemove = []
44404                     .concat(_entitybboxes[entity.id] || [])
44405                     .concat(_entitybboxes[entity.id + 'I'] || []);
44406
44407                 for (j = 0; j < toRemove.length; j++) {
44408                     _rdrawn.remove(toRemove[j]);
44409                     _rskipped.remove(toRemove[j]);
44410                 }
44411             }
44412         }
44413
44414         // Loop through all the entities to do some preprocessing
44415         for (i = 0; i < entities.length; i++) {
44416             entity = entities[i];
44417             geometry = entity.geometry(graph);
44418
44419             // Insert collision boxes around interesting points/vertices
44420             if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
44421                 var hasDirections = entity.directions(graph, projection$$1).length;
44422                 var markerPadding;
44423
44424                 if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
44425                     renderNodeAs[entity.id] = 'point';
44426                     markerPadding = 20;   // extra y for marker height
44427                 } else {
44428                     renderNodeAs[entity.id] = 'vertex';
44429                     markerPadding = 0;
44430                 }
44431
44432                 var coord = projection$$1(entity.loc);
44433                 var nodePadding = 10;
44434                 var bbox = {
44435                     minX: coord[0] - nodePadding,
44436                     minY: coord[1] - nodePadding - markerPadding,
44437                     maxX: coord[0] + nodePadding,
44438                     maxY: coord[1] + nodePadding
44439                 };
44440
44441                 doInsert(bbox, entity.id + 'P');
44442             }
44443
44444             // From here on, treat vertices like points
44445             if (geometry === 'vertex') {
44446                 geometry = 'point';
44447             }
44448
44449             // Determine which entities are label-able
44450             var preset = geometry === 'area' && context.presets().match(entity, graph);
44451             var icon = preset && !blacklisted(preset) && preset.icon;
44452
44453             if (!icon && !utilDisplayName(entity))
44454                 continue;
44455
44456             for (k = 0; k < labelStack.length; k++) {
44457                 var matchGeom = labelStack[k][0];
44458                 var matchKey = labelStack[k][1];
44459                 var matchVal = labelStack[k][2];
44460                 var hasVal = entity.tags[matchKey];
44461
44462                 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
44463                     labelable[k].push(entity);
44464                     break;
44465                 }
44466             }
44467         }
44468
44469         var positions = {
44470             point: [],
44471             line: [],
44472             area: []
44473         };
44474
44475         var labelled = {
44476             point: [],
44477             line: [],
44478             area: []
44479         };
44480
44481         // Try and find a valid label for labellable entities
44482         for (k = 0; k < labelable.length; k++) {
44483             var fontSize = labelStack[k][3];
44484
44485             for (i = 0; i < labelable[k].length; i++) {
44486                 entity = labelable[k][i];
44487                 geometry = entity.geometry(graph);
44488
44489                 var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
44490                 var name = getName(entity);
44491                 var width = name && textWidth(name, fontSize);
44492                 var p = null;
44493
44494                 if (geometry === 'point' || geometry === 'vertex') {
44495                     // no point or vertex labels in wireframe mode
44496                     // no vertex labels at low zooms (vertices have no icons)
44497                     if (wireframe) continue;
44498                     var renderAs = renderNodeAs[entity.id];
44499                     if (renderAs === 'vertex' && zoom < 17) continue;
44500
44501                     p = getPointLabel(entity, width, fontSize, renderAs);
44502
44503                 } else if (geometry === 'line') {
44504                     p = getLineLabel(entity, width, fontSize);
44505
44506                 } else if (geometry === 'area') {
44507                     p = getAreaLabel(entity, width, fontSize);
44508                 }
44509
44510                 if (p) {
44511                     if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
44512                     p.classes = geometry + ' tag-' + labelStack[k][1];
44513                     positions[geometry].push(p);
44514                     labelled[geometry].push(entity);
44515                 }
44516             }
44517         }
44518
44519
44520         function isInterestingVertex(entity) {
44521             var selectedIDs = context.selectedIDs();
44522
44523             return entity.hasInterestingTags() ||
44524                 entity.isEndpoint(graph) ||
44525                 entity.isConnected(graph) ||
44526                 selectedIDs.indexOf(entity.id) !== -1 ||
44527                 some(graph.parentWays(entity), function(parent) {
44528                     return selectedIDs.indexOf(parent.id) !== -1;
44529                 });
44530         }
44531
44532
44533         function getPointLabel(entity, width, height, geometry) {
44534             var y = (geometry === 'point' ? -12 : 0);
44535             var pointOffsets = {
44536                 ltr: [15, y, 'start'],
44537                 rtl: [-15, y, 'end']
44538             };
44539
44540             var coord = projection$$1(entity.loc);
44541             var textPadding = 2;
44542             var offset = pointOffsets[textDirection];
44543             var p = {
44544                 height: height,
44545                 width: width,
44546                 x: coord[0] + offset[0],
44547                 y: coord[1] + offset[1],
44548                 textAnchor: offset[2]
44549             };
44550
44551             // insert a collision box for the text label..
44552             var bbox;
44553             if (textDirection === 'rtl') {
44554                 bbox = {
44555                     minX: p.x - width - textPadding,
44556                     minY: p.y - (height / 2) - textPadding,
44557                     maxX: p.x + textPadding,
44558                     maxY: p.y + (height / 2) + textPadding
44559                 };
44560             } else {
44561                 bbox = {
44562                     minX: p.x - textPadding,
44563                     minY: p.y - (height / 2) - textPadding,
44564                     maxX: p.x + width + textPadding,
44565                     maxY: p.y + (height / 2) + textPadding
44566                 };
44567             }
44568
44569             if (tryInsert([bbox], entity.id, true)) {
44570                 return p;
44571             }
44572         }
44573
44574
44575         function getLineLabel(entity, width, height) {
44576             var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
44577             var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
44578             var length = geoPathLength(points);
44579
44580             if (length < width + 20) return;
44581
44582             // todo: properly clip points to viewport
44583
44584             // % along the line to attempt to place the label
44585             var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
44586                                25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
44587             var padding = 3;
44588
44589             for (var i = 0; i < lineOffsets.length; i++) {
44590                 var offset = lineOffsets[i];
44591                 var middle = offset / 100 * length;
44592                 var start = middle - width / 2;
44593
44594                 if (start < 0 || start + width > length) continue;
44595
44596                 // generate subpath and ignore paths that are invalid or don't cross viewport.
44597                 var sub = subpath(points, start, start + width);
44598                 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
44599                     continue;
44600                 }
44601
44602                 var isReverse = reverse(sub);
44603                 if (isReverse) {
44604                     sub = sub.reverse();
44605                 }
44606
44607                 var bboxes = [];
44608                 var boxsize = (height + 2) / 2;
44609
44610                 for (var j = 0; j < sub.length - 1; j++) {
44611                     var a = sub[j];
44612                     var b = sub[j + 1];
44613
44614                     // split up the text into small collision boxes
44615                     var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
44616
44617                     for (var box = 0; box < num; box++) {
44618                         var p = geoVecInterp(a, b, box / num);
44619                         var x0 = p[0] - boxsize - padding;
44620                         var y0 = p[1] - boxsize - padding;
44621                         var x1 = p[0] + boxsize + padding;
44622                         var y1 = p[1] + boxsize + padding;
44623
44624                         bboxes.push({
44625                             minX: Math.min(x0, x1),
44626                             minY: Math.min(y0, y1),
44627                             maxX: Math.max(x0, x1),
44628                             maxY: Math.max(y0, y1)
44629                         });
44630                     }
44631                 }
44632
44633                 if (tryInsert(bboxes, entity.id, false)) {   // accept this one
44634                     return {
44635                         'font-size': height + 2,
44636                         lineString: lineString(sub),
44637                         startOffset: offset + '%'
44638                     };
44639                 }
44640             }
44641
44642             function reverse(p) {
44643                 var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
44644                 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
44645             }
44646
44647             function lineString(points) {
44648                 return 'M' + points.join('L');
44649             }
44650
44651             function subpath(points, from, to) {
44652                 var sofar = 0;
44653                 var start, end, i0, i1;
44654
44655                 for (var i = 0; i < points.length - 1; i++) {
44656                     var a = points[i];
44657                     var b = points[i + 1];
44658                     var current = geoVecLength(a, b);
44659                     var portion;
44660                     if (!start && sofar + current >= from) {
44661                         portion = (from - sofar) / current;
44662                         start = [
44663                             a[0] + portion * (b[0] - a[0]),
44664                             a[1] + portion * (b[1] - a[1])
44665                         ];
44666                         i0 = i + 1;
44667                     }
44668                     if (!end && sofar + current >= to) {
44669                         portion = (to - sofar) / current;
44670                         end = [
44671                             a[0] + portion * (b[0] - a[0]),
44672                             a[1] + portion * (b[1] - a[1])
44673                         ];
44674                         i1 = i + 1;
44675                     }
44676                     sofar += current;
44677                 }
44678
44679                 var result = points.slice(i0, i1);
44680                 result.unshift(start);
44681                 result.push(end);
44682                 return result;
44683             }
44684         }
44685
44686
44687         function getAreaLabel(entity, width, height) {
44688             var centroid = path.centroid(entity.asGeoJSON(graph, true));
44689             var extent = entity.extent(graph);
44690             var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
44691
44692             if (isNaN(centroid[0]) || areaWidth < 20) return;
44693
44694             var preset = context.presets().match(entity, context.graph());
44695             var picon = preset && preset.icon;
44696             var iconSize = 17;
44697             var padding = 2;
44698             var p = {};
44699
44700             if (picon) {  // icon and label..
44701                 if (addIcon()) {
44702                     addLabel(iconSize + padding);
44703                     return p;
44704                 }
44705             } else {   // label only..
44706                 if (addLabel(0)) {
44707                     return p;
44708                 }
44709             }
44710
44711
44712             function addIcon() {
44713                 var iconX = centroid[0] - (iconSize / 2);
44714                 var iconY = centroid[1] - (iconSize / 2);
44715                 var bbox = {
44716                     minX: iconX,
44717                     minY: iconY,
44718                     maxX: iconX + iconSize,
44719                     maxY: iconY + iconSize
44720                 };
44721
44722                 if (tryInsert([bbox], entity.id + 'I', true)) {
44723                     p.transform = 'translate(' + iconX + ',' + iconY + ')';
44724                     return true;
44725                 }
44726                 return false;
44727             }
44728
44729             function addLabel(yOffset) {
44730                 if (width && areaWidth >= width + 20) {
44731                     var labelX = centroid[0];
44732                     var labelY = centroid[1] + yOffset;
44733                     var bbox = {
44734                         minX: labelX - (width / 2) - padding,
44735                         minY: labelY - (height / 2) - padding,
44736                         maxX: labelX + (width / 2) + padding,
44737                         maxY: labelY + (height / 2) + padding
44738                     };
44739
44740                     if (tryInsert([bbox], entity.id, true)) {
44741                         p.x = labelX;
44742                         p.y = labelY;
44743                         p.textAnchor = 'middle';
44744                         p.height = height;
44745                         return true;
44746                     }
44747                 }
44748                 return false;
44749             }
44750         }
44751
44752
44753         // force insert a singular bounding box
44754         // singular box only, no array, id better be unique
44755         function doInsert(bbox, id) {
44756             bbox.id = id;
44757
44758             var oldbox = _entitybboxes[id];
44759             if (oldbox) {
44760                 _rdrawn.remove(oldbox);
44761             }
44762             _entitybboxes[id] = bbox;
44763             _rdrawn.insert(bbox);
44764         }
44765
44766
44767         function tryInsert(bboxes, id, saveSkipped) {
44768             var skipped = false;
44769
44770             for (var i = 0; i < bboxes.length; i++) {
44771                 var bbox = bboxes[i];
44772                 bbox.id = id;
44773
44774                 // Check that label is visible
44775                 if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
44776                     skipped = true;
44777                     break;
44778                 }
44779                 if (_rdrawn.collides(bbox)) {
44780                     skipped = true;
44781                     break;
44782                 }
44783             }
44784
44785             _entitybboxes[id] = bboxes;
44786
44787             if (skipped) {
44788                 if (saveSkipped) {
44789                     _rskipped.load(bboxes);
44790                 }
44791             } else {
44792                 _rdrawn.load(bboxes);
44793             }
44794
44795             return !skipped;
44796         }
44797
44798
44799         var layer = selection.selectAll('.layer-labels');
44800         var halo = layer.selectAll('.layer-labels-halo');
44801         var label = layer.selectAll('.layer-labels-label');
44802         var debug = layer.selectAll('.layer-labels-debug');
44803
44804         // points
44805         drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
44806         drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
44807
44808         // lines
44809         drawLinePaths(halo, labelled.line, filter, '', positions.line);
44810         drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
44811         drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
44812
44813         // areas
44814         drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
44815         drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
44816         drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
44817         drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
44818
44819         // debug
44820         drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
44821         drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
44822
44823         layer.call(filterLabels);
44824     }
44825
44826
44827     function filterLabels(selection) {
44828         var layers = selection
44829             .selectAll('.layer-labels-label, .layer-labels-halo');
44830
44831         layers.selectAll('.nolabel')
44832             .classed('nolabel', false);
44833
44834         var mouse = context.mouse();
44835         var graph = context.graph();
44836         var selectedIDs = context.selectedIDs();
44837         var ids = [];
44838         var pad, bbox;
44839
44840         // hide labels near the mouse
44841         if (mouse) {
44842             pad = 20;
44843             bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
44844             ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
44845         }
44846
44847         // hide labels on selected nodes (they look weird when dragging / haloed)
44848         for (var i = 0; i < selectedIDs.length; i++) {
44849             var entity = graph.hasEntity(selectedIDs[i]);
44850             if (entity && entity.type === 'node') {
44851                 ids.push(selectedIDs[i]);
44852             }
44853         }
44854
44855         layers.selectAll(utilEntitySelector(ids))
44856             .classed('nolabel', true);
44857
44858
44859         // draw the mouse bbox if debugging is on..
44860         var debug = selection.selectAll('.layer-labels-debug');
44861         var gj = [];
44862         if (context.getDebug('collision')) {
44863             gj = bbox ? [{
44864                 type: 'Polygon',
44865                 coordinates: [[
44866                     [bbox.minX, bbox.minY],
44867                     [bbox.maxX, bbox.minY],
44868                     [bbox.maxX, bbox.maxY],
44869                     [bbox.minX, bbox.maxY],
44870                     [bbox.minX, bbox.minY]
44871                 ]]
44872             }] : [];
44873         }
44874
44875         var box = debug.selectAll('.debug-mouse')
44876             .data(gj);
44877
44878         // exit
44879         box.exit()
44880             .remove();
44881
44882         // enter/update
44883         box.enter()
44884             .append('path')
44885             .attr('class', 'debug debug-mouse yellow')
44886             .merge(box)
44887             .attr('d', d3_geoPath());
44888     }
44889
44890
44891     var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
44892
44893
44894     drawLabels.observe = function(selection) {
44895         var listener = function() { throttleFilterLabels(selection); };
44896         selection.on('mousemove.hidelabels', listener);
44897         context.on('enter.hidelabels', listener);
44898     };
44899
44900
44901     drawLabels.off = function(selection) {
44902         throttleFilterLabels.cancel();
44903         selection.on('mousemove.hidelabels', null);
44904         context.on('enter.hidelabels', null);
44905     };
44906
44907
44908     return drawLabels;
44909 }
44910
44911 function svgMapillaryImages$$1(projection, context, dispatch) {
44912     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
44913     var minZoom = 12;
44914     var minMarkerZoom = 16;
44915     var minViewfieldZoom = 18;
44916     var layer = d3_select(null);
44917     var _mapillary;
44918
44919
44920     function init() {
44921         if (svgMapillaryImages$$1.initialized) return;  // run once
44922         svgMapillaryImages$$1.enabled = false;
44923         svgMapillaryImages$$1.initialized = true;
44924     }
44925
44926
44927     function getService() {
44928         if (services.mapillary && !_mapillary) {
44929             _mapillary = services.mapillary;
44930             _mapillary.event.on('loadedImages', throttledRedraw);
44931         } else if (!services.mapillary && _mapillary) {
44932             _mapillary = null;
44933         }
44934
44935         return _mapillary;
44936     }
44937
44938
44939     function showLayer() {
44940         var service = getService();
44941         if (!service) return;
44942
44943         service.loadViewer(context);
44944         editOn();
44945
44946         layer
44947             .style('opacity', 0)
44948             .transition()
44949             .duration(250)
44950             .style('opacity', 1)
44951             .on('end', function () { dispatch.call('change'); });
44952     }
44953
44954
44955     function hideLayer() {
44956         var service = getService();
44957         if (service) {
44958             service.hideViewer();
44959         }
44960
44961         throttledRedraw.cancel();
44962
44963         layer
44964             .transition()
44965             .duration(250)
44966             .style('opacity', 0)
44967             .on('end', editOff);
44968     }
44969
44970
44971     function editOn() {
44972         layer.style('display', 'block');
44973     }
44974
44975
44976     function editOff() {
44977         layer.selectAll('.viewfield-group').remove();
44978         layer.style('display', 'none');
44979     }
44980
44981
44982     function click(d) {
44983         var service = getService();
44984         if (!service) return;
44985
44986         service
44987             .selectImage(d)
44988             .updateViewer(d.key, context)
44989             .showViewer();
44990
44991         context.map().centerEase(d.loc);
44992     }
44993
44994
44995     function mouseover(d) {
44996         var service = getService();
44997         if (service) service.setStyles(d);
44998     }
44999
45000
45001     function mouseout() {
45002         var service = getService();
45003         if (service) service.setStyles(null);
45004     }
45005
45006
45007     function transform(d) {
45008         var t = svgPointTransform(projection)(d);
45009         if (d.ca) {
45010             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
45011         }
45012         return t;
45013     }
45014
45015
45016     function update() {
45017         var viewer = d3_select('#photoviewer');
45018         var selected = viewer.empty() ? undefined : viewer.datum();
45019
45020         var z = ~~context.map().zoom();
45021         var showMarkers = (z >= minMarkerZoom);
45022         var showViewfields = (z >= minViewfieldZoom);
45023
45024         var service = getService();
45025         var sequences = (service ? service.sequences(projection) : []);
45026         var images = (service && showMarkers ? service.images(projection) : []);
45027
45028         var traces = layer.selectAll('.sequences').selectAll('.sequence')
45029             .data(sequences, function(d) { return d.properties.key; });
45030
45031         // exit
45032         traces.exit()
45033             .remove();
45034
45035         // enter/update
45036         traces = traces.enter()
45037             .append('path')
45038             .attr('class', 'sequence')
45039             .merge(traces)
45040             .attr('d', svgPath(projection).geojson);
45041
45042
45043         var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
45044             .data(images, function(d) { return d.key; });
45045
45046         // exit
45047         groups.exit()
45048             .remove();
45049
45050         // enter
45051         var groupsEnter = groups.enter()
45052             .append('g')
45053             .attr('class', 'viewfield-group')
45054             .on('mouseover', mouseover)
45055             .on('mouseout', mouseout)
45056             .on('click', click);
45057
45058         groupsEnter
45059             .append('g')
45060             .attr('class', 'viewfield-scale');
45061
45062         // update
45063         var markers = groups
45064             .merge(groupsEnter)
45065             .sort(function(a, b) {
45066                 return (a === selected) ? 1
45067                     : (b === selected) ? -1
45068                     : b.loc[1] - a.loc[1];  // sort Y
45069             })
45070             .attr('transform', transform)
45071             .select('.viewfield-scale');
45072
45073
45074         markers.selectAll('circle')
45075             .data([0])
45076             .enter()
45077             .append('circle')
45078             .attr('dx', '0')
45079             .attr('dy', '0')
45080             .attr('r', '6');
45081
45082         var viewfields = markers.selectAll('.viewfield')
45083             .data(showViewfields ? [0] : []);
45084
45085         viewfields.exit()
45086             .remove();
45087
45088         viewfields.enter()               // viewfields may or may not be drawn...
45089             .insert('path', 'circle')    // but if they are, draw below the circles
45090             .attr('class', 'viewfield')
45091             .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
45092             .attr('d', viewfieldPath);
45093
45094         function viewfieldPath() {
45095             var d = this.parentNode.__data__;
45096             if (d.pano) {
45097                 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
45098             } else {
45099                 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
45100             }
45101         }
45102     }
45103
45104
45105     function drawImages(selection$$1) {
45106         var enabled = svgMapillaryImages$$1.enabled,
45107             service = getService();
45108
45109         layer = selection$$1.selectAll('.layer-mapillary-images')
45110             .data(service ? [0] : []);
45111
45112         layer.exit()
45113             .remove();
45114
45115         var layerEnter = layer.enter()
45116             .append('g')
45117             .attr('class', 'layer-mapillary-images')
45118             .style('display', enabled ? 'block' : 'none');
45119
45120         layerEnter
45121             .append('g')
45122             .attr('class', 'sequences');
45123
45124         layerEnter
45125             .append('g')
45126             .attr('class', 'markers');
45127
45128         layer = layerEnter
45129             .merge(layer);
45130
45131         if (enabled) {
45132             if (service && ~~context.map().zoom() >= minZoom) {
45133                 editOn();
45134                 update();
45135                 service.loadImages(projection);
45136             } else {
45137                 editOff();
45138             }
45139         }
45140     }
45141
45142
45143     drawImages.enabled = function(_) {
45144         if (!arguments.length) return svgMapillaryImages$$1.enabled;
45145         svgMapillaryImages$$1.enabled = _;
45146         if (svgMapillaryImages$$1.enabled) {
45147             showLayer();
45148         } else {
45149             hideLayer();
45150         }
45151         dispatch.call('change');
45152         return this;
45153     };
45154
45155
45156     drawImages.supported = function() {
45157         return !!getService();
45158     };
45159
45160
45161     init();
45162     return drawImages;
45163 }
45164
45165 function svgMapillarySigns(projection, context, dispatch) {
45166     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45167     var minZoom = 12;
45168     var layer = d3_select(null);
45169     var _mapillary;
45170
45171
45172     function init() {
45173         if (svgMapillarySigns.initialized) return;  // run once
45174         svgMapillarySigns.enabled = false;
45175         svgMapillarySigns.initialized = true;
45176     }
45177
45178
45179     function getService() {
45180         if (services.mapillary && !_mapillary) {
45181             _mapillary = services.mapillary;
45182             _mapillary.event.on('loadedSigns', throttledRedraw);
45183         } else if (!services.mapillary && _mapillary) {
45184             _mapillary = null;
45185         }
45186         return _mapillary;
45187     }
45188
45189
45190     function showLayer() {
45191         var service = getService();
45192         if (!service) return;
45193
45194         service.loadViewer(context);
45195         editOn();
45196     }
45197
45198
45199     function hideLayer() {
45200         throttledRedraw.cancel();
45201         editOff();
45202     }
45203
45204
45205     function editOn() {
45206         layer.style('display', 'block');
45207     }
45208
45209
45210     function editOff() {
45211         layer.selectAll('.icon-sign').remove();
45212         layer.style('display', 'none');
45213     }
45214
45215
45216     function click(d) {
45217         var service = getService();
45218         if (!service) return;
45219
45220         context.map().centerEase(d.loc);
45221
45222         var selected = service.getSelectedImage();
45223         var selectedImageKey = selected && selected.key;
45224         var imageKey;
45225
45226         // Pick one of the images the sign was detected in,
45227         // preference given to an image already selected.
45228         d.detections.forEach(function(detection) {
45229             if (!imageKey || selectedImageKey === detection.image_key) {
45230                 imageKey = detection.image_key;
45231             }
45232         });
45233
45234         service
45235             .selectImage(null, imageKey)
45236             .updateViewer(imageKey, context)
45237             .showViewer();
45238     }
45239
45240
45241     function update() {
45242         var service = getService();
45243         var data = (service ? service.signs(projection) : []);
45244         var viewer = d3_select('#photoviewer');
45245         var selected = viewer.empty() ? undefined : viewer.datum();
45246         var selectedImageKey = selected && selected.key;
45247
45248         var signs = layer.selectAll('.icon-sign')
45249             .data(data, function(d) { return d.key; });
45250
45251         signs.exit()
45252             .remove();
45253
45254         var enter = signs.enter()
45255             .append('foreignObject')
45256             .attr('class', 'icon-sign')
45257             .attr('width', '24px')      // for Firefox
45258             .attr('height', '24px')     // for Firefox
45259             .classed('selected', function(d) {
45260                 return some(d.detections, function(detection) {
45261                     return detection.image_key === selectedImageKey;
45262                 });
45263             })
45264             .on('click', click);
45265
45266         enter
45267             .append('xhtml:body')
45268             .attr('class', 'icon-sign-body')
45269             .html(service.signHTML);
45270
45271         signs
45272             .merge(enter)
45273             .attr('x', function(d) { return projection(d.loc)[0] - 12; })   // offset by -12px to
45274             .attr('y', function(d) { return projection(d.loc)[1] - 12; });  // center signs on loc
45275     }
45276
45277
45278     function drawSigns(selection$$1) {
45279         var enabled = svgMapillarySigns.enabled,
45280             service = getService();
45281
45282         layer = selection$$1.selectAll('.layer-mapillary-signs')
45283             .data(service ? [0] : []);
45284
45285         layer.exit()
45286             .remove();
45287
45288         layer = layer.enter()
45289             .append('g')
45290             .attr('class', 'layer-mapillary-signs')
45291             .style('display', enabled ? 'block' : 'none')
45292             .merge(layer);
45293
45294         if (enabled) {
45295             if (service && ~~context.map().zoom() >= minZoom) {
45296                 editOn();
45297                 update();
45298                 service.loadSigns(context, projection);
45299             } else {
45300                 editOff();
45301             }
45302         }
45303     }
45304
45305
45306     drawSigns.enabled = function(_) {
45307         if (!arguments.length) return svgMapillarySigns.enabled;
45308         svgMapillarySigns.enabled = _;
45309         if (svgMapillarySigns.enabled) {
45310             showLayer();
45311         } else {
45312             hideLayer();
45313         }
45314         dispatch.call('change');
45315         return this;
45316     };
45317
45318
45319     drawSigns.supported = function() {
45320         var service = getService();
45321         return (service && service.signsSupported());
45322     };
45323
45324
45325     init();
45326     return drawSigns;
45327 }
45328
45329 function svgOpenstreetcamImages$$1(projection, context, dispatch) {
45330     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45331     var minZoom = 12;
45332     var minMarkerZoom = 16;
45333     var minViewfieldZoom = 18;
45334     var layer = d3_select(null);
45335     var _openstreetcam;
45336
45337
45338     function init() {
45339         if (svgOpenstreetcamImages$$1.initialized) return;  // run once
45340         svgOpenstreetcamImages$$1.enabled = false;
45341         svgOpenstreetcamImages$$1.initialized = true;
45342     }
45343
45344
45345     function getService() {
45346         if (services.openstreetcam && !_openstreetcam) {
45347             _openstreetcam = services.openstreetcam;
45348             _openstreetcam.event.on('loadedImages', throttledRedraw);
45349         } else if (!services.openstreetcam && _openstreetcam) {
45350             _openstreetcam = null;
45351         }
45352
45353         return _openstreetcam;
45354     }
45355
45356
45357     function showLayer() {
45358         var service = getService();
45359         if (!service) return;
45360
45361         service.loadViewer(context);
45362         editOn();
45363
45364         layer
45365             .style('opacity', 0)
45366             .transition()
45367             .duration(250)
45368             .style('opacity', 1)
45369             .on('end', function () { dispatch.call('change'); });
45370     }
45371
45372
45373     function hideLayer() {
45374         var service = getService();
45375         if (service) {
45376             service.hideViewer();
45377         }
45378
45379         throttledRedraw.cancel();
45380
45381         layer
45382             .transition()
45383             .duration(250)
45384             .style('opacity', 0)
45385             .on('end', editOff);
45386     }
45387
45388
45389     function editOn() {
45390         layer.style('display', 'block');
45391     }
45392
45393
45394     function editOff() {
45395         layer.selectAll('.viewfield-group').remove();
45396         layer.style('display', 'none');
45397     }
45398
45399
45400     function click(d) {
45401         var service = getService();
45402         if (!service) return;
45403
45404         service
45405             .selectImage(d)
45406             .updateViewer(d)
45407             .showViewer();
45408
45409         context.map().centerEase(d.loc);
45410     }
45411
45412
45413     function mouseover(d) {
45414         var service = getService();
45415         if (service) service.setStyles(d);
45416     }
45417
45418
45419     function mouseout() {
45420         var service = getService();
45421         if (service) service.setStyles(null);
45422     }
45423
45424
45425     function transform(d) {
45426         var t = svgPointTransform(projection)(d);
45427         if (d.ca) {
45428             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
45429         }
45430         return t;
45431     }
45432
45433
45434     function update() {
45435         var viewer = d3_select('#photoviewer');
45436         var selected = viewer.empty() ? undefined : viewer.datum();
45437
45438         var z = ~~context.map().zoom();
45439         var showMarkers = (z >= minMarkerZoom);
45440         var showViewfields = (z >= minViewfieldZoom);
45441
45442         var service = getService();
45443         var sequences = (service ? service.sequences(projection) : []);
45444         var images = (service && showMarkers ? service.images(projection) : []);
45445
45446         var traces = layer.selectAll('.sequences').selectAll('.sequence')
45447             .data(sequences, function(d) { return d.properties.key; });
45448
45449         // exit
45450         traces.exit()
45451             .remove();
45452
45453         // enter/update
45454         traces = traces.enter()
45455             .append('path')
45456             .attr('class', 'sequence')
45457             .merge(traces)
45458             .attr('d', svgPath(projection).geojson);
45459
45460
45461         var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
45462             .data(images, function(d) { return d.key; });
45463
45464         // exit
45465         groups.exit()
45466             .remove();
45467
45468         // enter
45469         var groupsEnter = groups.enter()
45470             .append('g')
45471             .attr('class', 'viewfield-group')
45472             .on('mouseover', mouseover)
45473             .on('mouseout', mouseout)
45474             .on('click', click);
45475
45476         groupsEnter
45477             .append('g')
45478             .attr('class', 'viewfield-scale');
45479
45480         // update
45481         var markers = groups
45482             .merge(groupsEnter)
45483             .sort(function(a, b) {
45484                 return (a === selected) ? 1
45485                     : (b === selected) ? -1
45486                     : b.loc[1] - a.loc[1];  // sort Y
45487             })
45488             .attr('transform', transform)
45489             .select('.viewfield-scale');
45490
45491
45492         markers.selectAll('circle')
45493             .data([0])
45494             .enter()
45495             .append('circle')
45496             .attr('dx', '0')
45497             .attr('dy', '0')
45498             .attr('r', '6');
45499
45500         var viewfields = markers.selectAll('.viewfield')
45501             .data(showViewfields ? [0] : []);
45502
45503         viewfields.exit()
45504             .remove();
45505
45506         viewfields.enter()               // viewfields may or may not be drawn...
45507             .insert('path', 'circle')    // but if they are, draw below the circles
45508             .attr('class', 'viewfield')
45509             .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
45510             .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');
45511     }
45512
45513
45514     function drawImages(selection$$1) {
45515         var enabled = svgOpenstreetcamImages$$1.enabled,
45516             service = getService();
45517
45518         layer = selection$$1.selectAll('.layer-openstreetcam-images')
45519             .data(service ? [0] : []);
45520
45521         layer.exit()
45522             .remove();
45523
45524         var layerEnter = layer.enter()
45525             .append('g')
45526             .attr('class', 'layer-openstreetcam-images')
45527             .style('display', enabled ? 'block' : 'none');
45528
45529         layerEnter
45530             .append('g')
45531             .attr('class', 'sequences');
45532
45533         layerEnter
45534             .append('g')
45535             .attr('class', 'markers');
45536
45537         layer = layerEnter
45538             .merge(layer);
45539
45540         if (enabled) {
45541             if (service && ~~context.map().zoom() >= minZoom) {
45542                 editOn();
45543                 update();
45544                 service.loadImages(projection);
45545             } else {
45546                 editOff();
45547             }
45548         }
45549     }
45550
45551
45552     drawImages.enabled = function(_) {
45553         if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
45554         svgOpenstreetcamImages$$1.enabled = _;
45555         if (svgOpenstreetcamImages$$1.enabled) {
45556             showLayer();
45557         } else {
45558             hideLayer();
45559         }
45560         dispatch.call('change');
45561         return this;
45562     };
45563
45564
45565     drawImages.supported = function() {
45566         return !!getService();
45567     };
45568
45569
45570     init();
45571     return drawImages;
45572 }
45573
45574 function svgOsm(projection, context, dispatch) {
45575     var enabled = true;
45576
45577
45578     function drawOsm(selection) {
45579         selection.selectAll('.layer-osm')
45580             .data(['covered', 'areas', 'lines', 'points', 'labels'])
45581             .enter()
45582             .append('g')
45583             .attr('class', function(d) { return 'layer-osm layer-' + d; });
45584
45585         selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
45586             .data(['areas', 'targets'])
45587             .enter()
45588             .append('g')
45589             .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
45590
45591         selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
45592             .data(['lines', 'targets'])
45593             .enter()
45594             .append('g')
45595             .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
45596
45597         selection.selectAll('.layer-points').selectAll('.layer-points-group')
45598             .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
45599             .enter()
45600             .append('g')
45601             .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
45602
45603         selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
45604             .data(['halo', 'label', 'debug'])
45605             .enter()
45606             .append('g')
45607             .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
45608     }
45609
45610
45611     function showLayer() {
45612         var layer = context.surface().selectAll('.data-layer-osm');
45613         layer.interrupt();
45614
45615         layer
45616             .classed('disabled', false)
45617             .style('opacity', 0)
45618             .transition()
45619             .duration(250)
45620             .style('opacity', 1)
45621             .on('end interrupt', function () {
45622                 dispatch.call('change');
45623             });
45624     }
45625
45626
45627     function hideLayer() {
45628         var layer = context.surface().selectAll('.data-layer-osm');
45629         layer.interrupt();
45630
45631         layer
45632             .transition()
45633             .duration(250)
45634             .style('opacity', 0)
45635             .on('end interrupt', function () {
45636                 layer.classed('disabled', true);
45637                 dispatch.call('change');
45638             });
45639     }
45640
45641
45642     drawOsm.enabled = function(_) {
45643         if (!arguments.length) return enabled;
45644         enabled = _;
45645
45646         if (enabled) {
45647             showLayer();
45648         } else {
45649             hideLayer();
45650         }
45651
45652         dispatch.call('change');
45653         return this;
45654     };
45655
45656
45657     return drawOsm;
45658 }
45659
45660 function svgLayers(projection, context) {
45661     var dispatch$$1 = dispatch('change'),
45662         svg = d3_select(null),
45663         layers = [
45664             { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
45665             { id: 'gpx', layer: svgGpx$$1(projection, context, dispatch$$1) },
45666             { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
45667             { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$$1) },
45668             { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
45669             { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) }
45670         ];
45671
45672
45673     function drawLayers(selection$$1) {
45674         svg = selection$$1.selectAll('.surface')
45675             .data([0]);
45676
45677         svg = svg.enter()
45678             .append('svg')
45679             .attr('class', 'surface')
45680             .merge(svg);
45681
45682         var defs = svg.selectAll('.surface-defs')
45683             .data([0]);
45684
45685         defs.enter()
45686             .append('defs')
45687             .attr('class', 'surface-defs');
45688
45689         var groups = svg.selectAll('.data-layer')
45690             .data(layers);
45691
45692         groups.exit()
45693             .remove();
45694
45695         groups.enter()
45696             .append('g')
45697             .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
45698             .merge(groups)
45699             .each(function(d) { d3_select(this).call(d.layer); });
45700     }
45701
45702
45703     drawLayers.all = function() {
45704         return layers;
45705     };
45706
45707
45708     drawLayers.layer = function(id) {
45709         var obj = find$1(layers, function(o) {return o.id === id;});
45710         return obj && obj.layer;
45711     };
45712
45713
45714     drawLayers.only = function(what) {
45715         var arr = [].concat(what);
45716         drawLayers.remove(difference(map$3(layers, 'id'), arr));
45717         return this;
45718     };
45719
45720
45721     drawLayers.remove = function(what) {
45722         var arr = [].concat(what);
45723         arr.forEach(function(id) {
45724             layers = reject(layers, function(o) {return o.id === id;});
45725         });
45726         dispatch$$1.call('change');
45727         return this;
45728     };
45729
45730
45731     drawLayers.add = function(what) {
45732         var arr = [].concat(what);
45733         arr.forEach(function(obj) {
45734             if ('id' in obj && 'layer' in obj) {
45735                 layers.push(obj);
45736             }
45737         });
45738         dispatch$$1.call('change');
45739         return this;
45740     };
45741
45742
45743     drawLayers.dimensions = function(_) {
45744         if (!arguments.length) return utilGetDimensions(svg);
45745         utilSetDimensions(svg, _);
45746         return this;
45747     };
45748
45749
45750     return utilRebind(drawLayers, dispatch$$1, 'on');
45751 }
45752
45753 function svgLines$$1(projection, context) {
45754     var detected = utilDetect();
45755
45756     var highway_stack = {
45757         motorway: 0,
45758         motorway_link: 1,
45759         trunk: 2,
45760         trunk_link: 3,
45761         primary: 4,
45762         primary_link: 5,
45763         secondary: 6,
45764         tertiary: 7,
45765         unclassified: 8,
45766         residential: 9,
45767         service: 10,
45768         footway: 11
45769     };
45770
45771
45772     function drawTargets(selection, graph, entities, filter$$1) {
45773         var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
45774         var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
45775         var getPath = svgPath(projection).geojson;
45776         var activeID = context.activeID();
45777
45778         // The targets and nopes will be MultiLineString sub-segments of the ways
45779         var data = { targets: [], nopes: [] };
45780
45781         entities.forEach(function(way) {
45782             var features = svgSegmentWay(way, graph, activeID);
45783             data.targets.push.apply(data.targets, features.passive);
45784             data.nopes.push.apply(data.nopes, features.active);
45785         });
45786
45787
45788         // Targets allow hover and vertex snapping
45789         var targetData = data.targets.filter(getPath);
45790         var targets = selection.selectAll('.line.target-allowed')
45791             .filter(function(d) { return filter$$1(d.properties.entity); })
45792             .data(targetData, function key(d) { return d.id; });
45793
45794         // exit
45795         targets.exit()
45796             .remove();
45797
45798         // enter/update
45799         targets.enter()
45800             .append('path')
45801             .merge(targets)
45802             .attr('d', getPath)
45803             .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
45804
45805
45806         // NOPE
45807         var nopeData = data.nopes.filter(getPath);
45808         var nopes = selection.selectAll('.line.target-nope')
45809             .filter(function(d) { return filter$$1(d.properties.entity); })
45810             .data(nopeData, function key(d) { return d.id; });
45811
45812         // exit
45813         nopes.exit()
45814             .remove();
45815
45816         // enter/update
45817         nopes.enter()
45818             .append('path')
45819             .merge(nopes)
45820             .attr('d', getPath)
45821             .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
45822     }
45823
45824
45825     function drawLines(selection, graph, entities, filter$$1) {
45826
45827         function waystack(a, b) {
45828             var selected = context.selectedIDs();
45829             var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
45830             var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
45831
45832             if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
45833             if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
45834             return scoreA - scoreB;
45835         }
45836
45837
45838         function drawLineGroup(selection, klass, isSelected) {
45839             // Note: Don't add `.selected` class in draw modes
45840             var mode = context.mode();
45841             var isDrawing = mode && /^draw/.test(mode.id);
45842             var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
45843
45844             var lines = selection
45845                 .selectAll('path')
45846                 .filter(filter$$1)
45847                 .data(getPathData(isSelected), osmEntity$$1.key);
45848
45849             lines.exit()
45850                 .remove();
45851
45852             // Optimization: Call expensive TagClasses only on enter selection. This
45853             // works because osmEntity.key is defined to include the entity v attribute.
45854             lines.enter()
45855                 .append('path')
45856                 .attr('class', function(d) {
45857                     var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
45858                     return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
45859                 })
45860                 .call(svgTagClasses())
45861                 .merge(lines)
45862                 .sort(waystack)
45863                 .attr('d', getPath)
45864                 .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
45865
45866             return selection;
45867         }
45868
45869
45870         function getPathData(isSelected) {
45871             return function() {
45872                 var layer = this.parentNode.__data__;
45873                 var data = pathdata[layer] || [];
45874                 return data.filter(function(d) {
45875                     if (isSelected)
45876                         return context.selectedIDs().indexOf(d.id) !== -1;
45877                     else
45878                         return context.selectedIDs().indexOf(d.id) === -1;
45879                 });
45880             };
45881         }
45882
45883
45884         var getPath = svgPath(projection, graph);
45885         var ways = [];
45886         var pathdata = {};
45887         var onewaydata = {};
45888         var oldMultiPolygonOuters = {};
45889
45890         for (var i = 0; i < entities.length; i++) {
45891             var entity = entities[i];
45892             var outer = osmSimpleMultipolygonOuterMember(entity, graph);
45893             if (outer) {
45894                 ways.push(entity.mergeTags(outer.tags));
45895                 oldMultiPolygonOuters[outer.id] = true;
45896             } else if (entity.geometry(graph) === 'line') {
45897                 ways.push(entity);
45898             }
45899         }
45900
45901         ways = ways.filter(getPath);
45902         pathdata = groupBy(ways, function(way) { return way.layer(); });
45903
45904         forOwn(pathdata, function(v, k) {
45905             var arr = filter(v, function(d) { return d.isOneWay(); });
45906             onewaydata[k] = flatten(map$3(arr, svgOneWaySegments(projection, graph, 35)));
45907         });
45908
45909
45910         var covered = selection.selectAll('.layer-covered');                      // under areas
45911         var uncovered = selection.selectAll('.layer-lines .layer-lines-lines');   // over areas
45912
45913         [covered, uncovered].forEach(function(selection) {
45914             var range$$1 = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
45915             var layergroup = selection
45916                 .selectAll('g.layergroup')
45917                 .data(range$$1);
45918
45919             layergroup = layergroup.enter()
45920                 .append('g')
45921                 .attr('class', function(d) { return 'layergroup layer' + String(d); })
45922                 .merge(layergroup);
45923
45924             layergroup
45925                 .selectAll('g.linegroup')
45926                 .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
45927                 .enter()
45928                 .append('g')
45929                 .attr('class', function(d) { return 'linegroup line-' + d; });
45930
45931             layergroup.selectAll('g.line-shadow')
45932                 .call(drawLineGroup, 'shadow', false);
45933             layergroup.selectAll('g.line-casing')
45934                 .call(drawLineGroup, 'casing', false);
45935             layergroup.selectAll('g.line-stroke')
45936                 .call(drawLineGroup, 'stroke', false);
45937
45938             layergroup.selectAll('g.line-shadow-highlighted')
45939                 .call(drawLineGroup, 'shadow', true);
45940             layergroup.selectAll('g.line-casing-highlighted')
45941                 .call(drawLineGroup, 'casing', true);
45942             layergroup.selectAll('g.line-stroke-highlighted')
45943                 .call(drawLineGroup, 'stroke', true);
45944
45945
45946             var onewaygroup = layergroup
45947                 .selectAll('g.onewaygroup')
45948                 .data(['oneway']);
45949
45950             onewaygroup = onewaygroup.enter()
45951                 .append('g')
45952                 .attr('class', 'onewaygroup')
45953                 .merge(onewaygroup);
45954
45955             var oneways = onewaygroup
45956                 .selectAll('path')
45957                 .filter(filter$$1)
45958                 .data(
45959                     function data() { return onewaydata[this.parentNode.__data__] || []; },
45960                     function key(d) { return [d.id, d.index]; }
45961                 );
45962
45963             oneways.exit()
45964                 .remove();
45965
45966             oneways = oneways.enter()
45967                 .append('path')
45968                 .attr('class', 'oneway')
45969                 .attr('marker-mid', 'url(#oneway-marker)')
45970                 .merge(oneways)
45971                 .attr('d', function(d) { return d.d; });
45972
45973             if (detected.ie) {
45974                 oneways.each(function() { this.parentNode.insertBefore(this, this); });
45975             }
45976         });
45977
45978         // touch targets
45979         selection.selectAll('.layer-lines .layer-lines-targets')
45980             .call(drawTargets, graph, ways, filter$$1);
45981     }
45982
45983
45984     return drawLines;
45985 }
45986
45987 function svgMidpoints$$1(projection, context) {
45988     var targetRadius = 8;
45989
45990     function drawTargets(selection, graph, entities, filter) {
45991         var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
45992         var getTransform = svgPointTransform(projection).geojson;
45993
45994         var data = entities.map(function(midpoint) {
45995             return {
45996                 type: 'Feature',
45997                 id: midpoint.id,
45998                 properties: {
45999                     target: true,
46000                     entity: midpoint
46001                 },
46002                 geometry: {
46003                     type: 'Point',
46004                     coordinates: midpoint.loc
46005                 }
46006             };
46007         });
46008
46009         var targets = selection.selectAll('.midpoint.target')
46010             .filter(function(d) { return filter(d.properties.entity); })
46011             .data(data, function key(d) { return d.id; });
46012
46013         // exit
46014         targets.exit()
46015             .remove();
46016
46017         // enter/update
46018         targets.enter()
46019             .append('circle')
46020             .attr('r', targetRadius)
46021             .merge(targets)
46022             .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
46023             .attr('transform', getTransform);
46024     }
46025
46026
46027     function drawMidpoints(selection, graph, entities, filter, extent) {
46028         var layer = selection.selectAll('.layer-points .layer-points-midpoints');
46029
46030         var mode = context.mode();
46031         if (mode && mode.id !== 'select') {
46032             layer.selectAll('g.midpoint')
46033                 .remove();
46034
46035             selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
46036                 .remove();
46037
46038             return;
46039         }
46040
46041         var poly = extent.polygon();
46042         var midpoints = {};
46043
46044         for (var i = 0; i < entities.length; i++) {
46045             var entity = entities[i];
46046
46047             if (entity.type !== 'way')
46048                 continue;
46049             if (!filter(entity))
46050                 continue;
46051             if (context.selectedIDs().indexOf(entity.id) < 0)
46052                 continue;
46053
46054             var nodes = graph.childNodes(entity);
46055             for (var j = 0; j < nodes.length - 1; j++) {
46056
46057                 var a = nodes[j];
46058                 var b = nodes[j + 1];
46059                 var id = [a.id, b.id].sort().join('-');
46060
46061                 if (midpoints[id]) {
46062                     midpoints[id].parents.push(entity);
46063                 } else {
46064                     if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
46065                         var point = geoVecInterp(a.loc, b.loc, 0.5);
46066                         var loc = null;
46067
46068                         if (extent.intersects(point)) {
46069                             loc = point;
46070                         } else {
46071                             for (var k = 0; k < 4; k++) {
46072                                 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
46073                                 if (point &&
46074                                     geoVecLength(projection(a.loc), projection(point)) > 20 &&
46075                                     geoVecLength(projection(b.loc), projection(point)) > 20)
46076                                 {
46077                                     loc = point;
46078                                     break;
46079                                 }
46080                             }
46081                         }
46082
46083                         if (loc) {
46084                             midpoints[id] = {
46085                                 type: 'midpoint',
46086                                 id: id,
46087                                 loc: loc,
46088                                 edge: [a.id, b.id],
46089                                 parents: [entity]
46090                             };
46091                         }
46092                     }
46093                 }
46094             }
46095         }
46096
46097
46098         function midpointFilter(d) {
46099             if (midpoints[d.id])
46100                 return true;
46101
46102             for (var i = 0; i < d.parents.length; i++) {
46103                 if (filter(d.parents[i])) {
46104                     return true;
46105                 }
46106             }
46107
46108             return false;
46109         }
46110
46111
46112         var groups = layer
46113             .selectAll('g.midpoint')
46114             .filter(midpointFilter)
46115             .data(values$1(midpoints), function(d) { return d.id; });
46116
46117         groups.exit()
46118             .remove();
46119
46120         var enter = groups.enter()
46121             .insert('g', ':first-child')
46122             .attr('class', 'midpoint');
46123
46124         enter
46125             .append('polygon')
46126             .attr('points', '-6,8 10,0 -6,-8')
46127             .attr('class', 'shadow');
46128
46129         enter
46130             .append('polygon')
46131             .attr('points', '-3,4 5,0 -3,-4')
46132             .attr('class', 'fill');
46133
46134         groups = groups
46135             .merge(enter)
46136             .attr('transform', function(d) {
46137                 var translate = svgPointTransform(projection);
46138                 var a = graph.entity(d.edge[0]);
46139                 var b = graph.entity(d.edge[1]);
46140                 var angle = geoAngle(a, b, projection) * (180 / Math.PI);
46141                 return translate(d) + ' rotate(' + angle + ')';
46142             })
46143             .call(svgTagClasses().tags(
46144                 function(d) { return d.parents[0].tags; }
46145             ));
46146
46147         // Propagate data bindings.
46148         groups.select('polygon.shadow');
46149         groups.select('polygon.fill');
46150
46151
46152         // Draw touch targets..
46153         selection.selectAll('.layer-points .layer-points-targets')
46154             .call(drawTargets, graph, values$1(midpoints), midpointFilter);
46155     }
46156
46157     return drawMidpoints;
46158 }
46159
46160 // Touch targets control which other vertices we can drag a vertex onto.
46161 //
46162 // - the activeID - nope
46163 // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
46164 // - 2 away from the activeID - nope (would create a self intersecting segment)
46165 // - all others on a linear way - yes
46166 // - all others on a closed way - nope (would create a self intersecting polygon)
46167 //
46168 // returns
46169 // 0 = active vertex - no touch/connect
46170 // 1 = passive vertex - yes touch/connect
46171 // 2 = adjacent vertex - yes but pay attention segmenting a line here
46172 //
46173 function svgPassiveVertex(node, graph, activeID) {
46174     if (!activeID) return 1;
46175     if (activeID === node.id) return 0;
46176
46177     var parents = graph.parentWays(node);
46178
46179     for (var i = 0; i < parents.length; i++) {
46180         var nodes = parents[i].nodes;
46181         var isClosed = parents[i].isClosed();
46182         for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
46183             if (nodes[j] === node.id) {
46184                 var ix1 = j - 2;
46185                 var ix2 = j - 1;
46186                 var ix3 = j + 1;
46187                 var ix4 = j + 2;
46188
46189                 if (isClosed) {  // wraparound if needed
46190                     var max = nodes.length - 1;
46191                     if (ix1 < 0)   ix1 = max + ix1;
46192                     if (ix2 < 0)   ix2 = max + ix2;
46193                     if (ix3 > max) ix3 = ix3 - max;
46194                     if (ix4 > max) ix4 = ix4 - max;
46195                 }
46196
46197                 if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
46198                 else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
46199                 else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
46200                 else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
46201                 else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
46202             }
46203         }
46204     }
46205
46206     return 1;   // ok
46207 }
46208
46209
46210 function svgOneWaySegments(projection$$1, graph, dt) {
46211     return function(entity) {
46212         var i = 0;
46213         var offset = dt;
46214         var segments = [];
46215         var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
46216         var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
46217         var a, b;
46218
46219         if (entity.tags.oneway === '-1') {
46220             coordinates.reverse();
46221         }
46222
46223         var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
46224
46225         d3_geoStream({
46226             type: 'LineString',
46227             coordinates: coordinates
46228         }, projection$$1.stream(clip({
46229             lineStart: function() {},
46230             lineEnd: function() { a = null; },
46231             point: function(x, y) {
46232                 b = [x, y];
46233
46234                 if (a) {
46235                     var span = geoVecLength(a, b) - offset;
46236
46237                     if (span >= 0) {
46238                         var heading = geoVecAngle(a, b);
46239                         var dx = dt * Math.cos(heading);
46240                         var dy = dt * Math.sin(heading);
46241                         var p = [
46242                             a[0] + offset * Math.cos(heading),
46243                             a[1] + offset * Math.sin(heading)
46244                         ];
46245
46246                         // gather coordinates
46247                         var coord = [a, p];
46248                         for (span -= dt; span >= 0; span -= dt) {
46249                             p = geoVecAdd(p, [dx, dy]);
46250                             coord.push(p);
46251                         }
46252                         coord.push(b);
46253
46254                         // generate svg paths
46255                         var segment = '';
46256                         var j;
46257
46258                         for (j = 0; j < coord.length; j++) {
46259                             segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
46260                         }
46261                         segments.push({ id: entity.id, index: i++, d: segment });
46262
46263                         if (isReversible) {
46264                             segment = '';
46265                             for (j = coord.length - 1; j >= 0; j--) {
46266                                 segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
46267                             }
46268                             segments.push({ id: entity.id, index: i++, d: segment });
46269                         }
46270                     }
46271
46272                     offset = -span;
46273                 }
46274
46275                 a = b;
46276             }
46277         })));
46278
46279         return segments;
46280     };
46281 }
46282
46283
46284 function svgPath(projection$$1, graph, isArea) {
46285
46286     // Explanation of magic numbers:
46287     // "padding" here allows space for strokes to extend beyond the viewport,
46288     // so that the stroke isn't drawn along the edge of the viewport when
46289     // the shape is clipped.
46290     //
46291     // When drawing lines, pad viewport by 5px.
46292     // When drawing areas, pad viewport by 65px in each direction to allow
46293     // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
46294
46295     var cache = {};
46296     var padding = isArea ? 65 : 5;
46297     var viewport = projection$$1.clipExtent();
46298     var paddedExtent = [
46299         [viewport[0][0] - padding, viewport[0][1] - padding],
46300         [viewport[1][0] + padding, viewport[1][1] + padding]
46301     ];
46302     var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
46303     var project = projection$$1.stream;
46304     var path = d3_geoPath()
46305         .projection({stream: function(output) { return project(clip(output)); }});
46306
46307     var svgpath = function(entity) {
46308         if (entity.id in cache) {
46309             return cache[entity.id];
46310         } else {
46311             return cache[entity.id] = path(entity.asGeoJSON(graph));
46312         }
46313     };
46314
46315     svgpath.geojson = path;
46316
46317     return svgpath;
46318 }
46319
46320
46321 function svgPointTransform(projection$$1) {
46322     var svgpoint = function(entity) {
46323         // http://jsperf.com/short-array-join
46324         var pt = projection$$1(entity.loc);
46325         return 'translate(' + pt[0] + ',' + pt[1] + ')';
46326     };
46327
46328     svgpoint.geojson = function(d) {
46329         return svgpoint(d.properties.entity);
46330     };
46331
46332     return svgpoint;
46333 }
46334
46335
46336 function svgRelationMemberTags(graph) {
46337     return function(entity) {
46338         var tags = entity.tags;
46339         graph.parentRelations(entity).forEach(function(relation) {
46340             var type = relation.tags.type;
46341             if (type === 'multipolygon' || type === 'boundary') {
46342                 tags = assignIn({}, relation.tags, tags);
46343             }
46344         });
46345         return tags;
46346     };
46347 }
46348
46349
46350 function svgSegmentWay(way, graph, activeID) {
46351     var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
46352     var features = { passive: [], active: [] };
46353     var start = {};
46354     var end = {};
46355     var node, type;
46356
46357     for (var i = 0; i < way.nodes.length; i++) {
46358         node = graph.entity(way.nodes[i]);
46359         type = svgPassiveVertex(node, graph, activeID);
46360         end = { node: node, type: type };
46361
46362         if (start.type !== undefined) {
46363             if (start.node.id === activeID || end.node.id === activeID) {
46364                 // push nothing
46365             } else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
46366                 pushActive(start, end, i);
46367             } else if (start.type === 0 && end.type === 0) {   // both active vertices
46368                 pushActive(start, end, i);
46369             } else {
46370                 pushPassive(start, end, i);
46371             }
46372         }
46373
46374         start = end;
46375     }
46376
46377     return features;
46378
46379
46380     function pushActive(start, end, index) {
46381         features.active.push({
46382             type: 'Feature',
46383             id: way.id + '-' + index + '-nope',
46384             properties: {
46385                 nope: true,
46386                 target: true,
46387                 entity: way,
46388                 nodes: [start.node, end.node],
46389                 index: index
46390             },
46391             geometry: {
46392                 type: 'LineString',
46393                 coordinates: [start.node.loc, end.node.loc]
46394             }
46395         });
46396     }
46397
46398     function pushPassive(start, end, index) {
46399         features.passive.push({
46400             type: 'Feature',
46401             id: way.id + '-' + index,
46402             properties: {
46403                 target: true,
46404                 entity: way,
46405                 nodes: [start.node, end.node],
46406                 index: index
46407             },
46408             geometry: {
46409                 type: 'LineString',
46410                 coordinates: [start.node.loc, end.node.loc]
46411             }
46412         });
46413     }
46414 }
46415
46416 function svgPoints$$1(projection, context) {
46417
46418     function markerPath(selection, klass) {
46419         selection
46420             .attr('class', klass)
46421             .attr('transform', 'translate(-8, -23)')
46422             .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');
46423     }
46424
46425     function sortY(a, b) {
46426         return b.loc[1] - a.loc[1];
46427     }
46428
46429
46430     // Avoid exit/enter if we're just moving stuff around.
46431     // The node will get a new version but we only need to run the update selection.
46432     function fastEntityKey(d) {
46433         var mode = context.mode();
46434         var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
46435         return isMoving ? d.id : osmEntity$$1.key(d);
46436     }
46437
46438
46439     function drawTargets(selection, graph, entities, filter) {
46440         var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46441         var getTransform = svgPointTransform(projection).geojson;
46442         var activeID = context.activeID();
46443         var data$$1 = [];
46444
46445         entities.forEach(function(node) {
46446             if (activeID === node.id) return;   // draw no target on the activeID
46447
46448             data$$1.push({
46449                 type: 'Feature',
46450                 id: node.id,
46451                 properties: {
46452                     target: true,
46453                     entity: node
46454                 },
46455                 geometry: node.asGeoJSON()
46456             });
46457         });
46458
46459         var targets = selection.selectAll('.point.target')
46460             .filter(function(d) { return filter(d.properties.entity); })
46461             .data(data$$1, function key(d) { return d.id; });
46462
46463         // exit
46464         targets.exit()
46465             .remove();
46466
46467         // enter/update
46468         targets.enter()
46469             .append('rect')
46470             .attr('x', -10)
46471             .attr('y', -26)
46472             .attr('width', 20)
46473             .attr('height', 30)
46474             .merge(targets)
46475             .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
46476             .attr('transform', getTransform);
46477     }
46478
46479
46480     function drawPoints(selection, graph, entities, filter) {
46481         var wireframe = context.surface().classed('fill-wireframe');
46482         var zoom = geoScaleToZoom(projection.scale());
46483
46484         // points with a direction will render as vertices at higher zooms
46485         function renderAsPoint(entity) {
46486             return entity.geometry(graph) === 'point' &&
46487                 !(zoom >= 18 && entity.directions(graph, projection).length);
46488         }
46489
46490         // all points will render as vertices in wireframe mode too
46491         var points = wireframe ? [] : entities.filter(renderAsPoint);
46492
46493         points.sort(sortY);
46494
46495
46496         var layer = selection.selectAll('.layer-points .layer-points-points');
46497
46498         var groups = layer.selectAll('g.point')
46499             .filter(filter)
46500             .data(points, fastEntityKey);
46501
46502         groups.exit()
46503             .remove();
46504
46505         var enter = groups.enter()
46506             .append('g')
46507             .attr('class', function(d) { return 'node point ' + d.id; })
46508             .order();
46509
46510         enter
46511             .append('path')
46512             .call(markerPath, 'shadow');
46513
46514         enter
46515             .append('ellipse')
46516             .attr('cx', 0.5)
46517             .attr('cy', 1)
46518             .attr('rx', 6.5)
46519             .attr('ry', 3)
46520             .attr('class', 'stroke');
46521
46522         enter
46523             .append('path')
46524             .call(markerPath, 'stroke');
46525
46526         enter
46527             .append('use')
46528             .attr('transform', 'translate(-5, -19)')
46529             .attr('class', 'icon')
46530             .attr('width', '11px')
46531             .attr('height', '11px');
46532
46533         groups = groups
46534             .merge(enter)
46535             .attr('transform', svgPointTransform(projection))
46536             .call(svgTagClasses());
46537
46538         // Selecting the following implicitly
46539         // sets the data (point entity) on the element
46540         groups.select('.shadow');
46541         groups.select('.stroke');
46542         groups.select('.icon')
46543             .attr('xlink:href', function(entity) {
46544                 var preset = context.presets().match(entity, graph);
46545                 var picon = preset && preset.icon;
46546
46547                 if (!picon)
46548                     return '';
46549                 else {
46550                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
46551                     return '#' + picon + (isMaki ? '-11' : '');
46552                 }
46553             });
46554
46555
46556         // touch targets
46557         selection.selectAll('.layer-points .layer-points-targets')
46558             .call(drawTargets, graph, points, filter);
46559     }
46560
46561
46562     return drawPoints;
46563 }
46564
46565 function svgTagClasses() {
46566     var primaries = [
46567             'building', 'highway', 'railway', 'waterway', 'aeroway',
46568             'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
46569             'leisure', 'military', 'place'
46570         ],
46571         statuses = [
46572             'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
46573             'razed', 'demolished', 'obliterated', 'intermittent'
46574         ],
46575         secondaries = [
46576             'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
46577             'surface', 'tracktype', 'crossing', 'service', 'sport'
46578         ],
46579         tagClassRe = /^tag-/,
46580         tags = function(entity) { return entity.tags; };
46581
46582
46583     var tagClasses = function(selection$$1) {
46584         selection$$1.each(function tagClassesEach(entity) {
46585             var value = this.className,
46586                 classes, primary, status;
46587
46588             if (value.baseVal !== undefined) value = value.baseVal;
46589
46590             classes = value.trim().split(/\s+/).filter(function(name) {
46591                 return name.length && !tagClassRe.test(name);
46592             }).join(' ');
46593
46594             var t = tags(entity), i, k, v;
46595
46596             // pick at most one primary classification tag..
46597             for (i = 0; i < primaries.length; i++) {
46598                 k = primaries[i];
46599                 v = t[k];
46600                 if (!v || v === 'no') continue;
46601
46602                 primary = k;
46603                 if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
46604                     status = v;
46605                     classes += ' tag-' + k;
46606                 } else {
46607                     classes += ' tag-' + k + ' tag-' + k + '-' + v;
46608                 }
46609
46610                 break;
46611             }
46612
46613             // add at most one status tag, only if relates to primary tag..
46614             if (!status) {
46615                 for (i = 0; i < statuses.length; i++) {
46616                     k = statuses[i];
46617                     v = t[k];
46618                     if (!v || v === 'no') continue;
46619
46620                     if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
46621                         status = k;
46622                     }
46623                     else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
46624                         status = k;
46625                     } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
46626                         status = k;
46627                         primary = v;
46628                         classes += ' tag-' + v;
46629                     }  // else ignore e.g.  `highway=path + abandoned=railway`
46630
46631                     if (status) break;
46632                 }
46633             }
46634
46635             if (status) {
46636                 classes += ' tag-status tag-status-' + status;
46637             }
46638
46639             // add any secondary (structure) tags
46640             for (i = 0; i < secondaries.length; i++) {
46641                 k = secondaries[i];
46642                 v = t[k];
46643                 if (!v || v === 'no') continue;
46644                 classes += ' tag-' + k + ' tag-' + k + '-' + v;
46645             }
46646
46647             // For highways, look for surface tagging..
46648             if (primary === 'highway') {
46649                 var paved = (t.highway !== 'track');
46650                 for (k in t) {
46651                     v = t[k];
46652                     if (k in osmPavedTags) {
46653                         paved = !!osmPavedTags[k][v];
46654                         break;
46655                     }
46656                 }
46657                 if (!paved) {
46658                     classes += ' tag-unpaved';
46659                 }
46660             }
46661
46662             classes = classes.trim();
46663
46664             if (classes !== value) {
46665                 d3_select(this).attr('class', classes);
46666             }
46667         });
46668     };
46669
46670
46671     tagClasses.tags = function(_) {
46672         if (!arguments.length) return tags;
46673         tags = _;
46674         return tagClasses;
46675     };
46676
46677     return tagClasses;
46678 }
46679
46680 function svgTurns(projection) {
46681
46682     return function drawTurns(selection, graph, turns) {
46683
46684         function icon(turn) {
46685             var u = turn.u ? '-u' : '';
46686             if (turn.no) return '#turn-no' + u;
46687             if (turn.only) return '#turn-only' + u;
46688             return '#turn-yes' + u;
46689         }
46690
46691         var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns')
46692             .data([0]);
46693
46694         layer = layer.enter()
46695             .append('g')
46696             .attr('class', 'layer-osm layer-turns')
46697             .merge(layer);
46698
46699
46700         var groups = layer.selectAll('g.turn')
46701             .data(turns, function(d) { return d.key; });
46702
46703         groups.exit()
46704             .remove();
46705
46706
46707         var enter = groups.enter()
46708             .append('g')
46709             .attr('class', function(d) { return 'turn ' + d.key; });
46710
46711         var nEnter = enter
46712             .filter(function(d) { return !d.u; });
46713
46714         nEnter.append('rect')
46715             .attr('transform', 'translate(-22, -12)')
46716             .attr('width', '44')
46717             .attr('height', '24');
46718
46719         nEnter.append('use')
46720             .attr('transform', 'translate(-22, -12)')
46721             .attr('width', '44')
46722             .attr('height', '24');
46723
46724
46725         var uEnter = enter
46726             .filter(function(d) { return d.u; });
46727
46728         uEnter.append('circle')
46729             .attr('r', '16');
46730
46731         uEnter.append('use')
46732             .attr('transform', 'translate(-16, -16)')
46733             .attr('width', '32')
46734             .attr('height', '32');
46735
46736
46737         groups = groups
46738             .merge(enter);
46739
46740         groups
46741             .attr('opacity', function(d) {
46742                 return d.direct === false ? '0.7' : null;
46743             })
46744             .attr('transform', function(d) {
46745                 var pxRadius = 50;
46746                 var toWay = graph.entity(d.to.way);
46747                 var toPoints = graph.childNodes(toWay)
46748                     .map(function (n) { return n.loc; })
46749                     .map(projection);
46750                 var toLength = geoPathLength(toPoints);
46751                 var mid = toLength / 2;    // midpoint of destination way
46752
46753                 var toNode = graph.entity(d.to.node);
46754                 var toVertex = graph.entity(d.to.vertex);
46755                 var a = geoAngle(toVertex, toNode, projection);
46756                 var o = projection(toVertex.loc);
46757                 var r = d.u ? 0                  // u-turn: no radius
46758                     : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
46759                     : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
46760
46761                 return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
46762                     'rotate(' + a * 180 / Math.PI + ')';
46763             });
46764
46765         groups.select('use')
46766             .attr('xlink:href', icon);
46767
46768         groups.select('rect');
46769         groups.select('circle');
46770
46771         return this;
46772     };
46773 }
46774
46775 function svgVertices$$1(projection, context) {
46776     var radiuses = {
46777         //       z16-, z17,   z18+,  w/icon
46778         shadow: [6,    7.5,   7.5,   12],
46779         stroke: [2.5,  3.5,   3.5,   8],
46780         fill:   [1,    1.5,   1.5,   1.5]
46781     };
46782
46783     var _currHoverTarget;
46784     var _currPersistent = {};
46785     var _currHover = {};
46786     var _prevHover = {};
46787     var _currSelected = {};
46788     var _prevSelected = {};
46789     var _radii = {};
46790
46791
46792     function sortY(a, b) {
46793         return b.loc[1] - a.loc[1];
46794     }
46795
46796     // Avoid exit/enter if we're just moving stuff around.
46797     // The node will get a new version but we only need to run the update selection.
46798     function fastEntityKey(d) {
46799         var mode = context.mode();
46800         var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
46801         return isMoving ? d.id : osmEntity$$1.key(d);
46802     }
46803
46804
46805     function draw(selection$$1, graph, vertices, sets, filter) {
46806         sets = sets || { selected: {}, important: {}, hovered: {} };
46807
46808         var icons = {};
46809         var directions = {};
46810         var wireframe = context.surface().classed('fill-wireframe');
46811         var zoom = geoScaleToZoom(projection.scale());
46812         var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
46813
46814
46815         function getIcon(entity) {
46816             if (entity.id in icons) return icons[entity.id];
46817
46818             icons[entity.id] =
46819                 entity.hasInterestingTags() &&
46820                 context.presets().match(entity, graph).icon;
46821             return icons[entity.id];
46822         }
46823
46824
46825         // memoize directions results, return false for empty arrays (for use in filter)
46826         function getDirections(entity) {
46827             if (entity.id in directions) return directions[entity.id];
46828
46829             var angles = entity.directions(graph, projection);
46830             directions[entity.id] = angles.length ? angles : false;
46831             return angles;
46832         }
46833
46834
46835         function updateAttributes(selection$$1) {
46836             ['shadow', 'stroke', 'fill'].forEach(function(klass) {
46837                 var rads = radiuses[klass];
46838                 selection$$1.selectAll('.' + klass)
46839                     .each(function(entity) {
46840                         var i = z && getIcon(entity);
46841                         var r = rads[i ? 3 : z];
46842
46843                         // slightly increase the size of unconnected endpoints #3775
46844                         if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
46845                             r += 1.5;
46846                         }
46847
46848                         if (klass === 'shadow') {   // remember this value, so we don't need to
46849                             _radii[entity.id] = r;  // recompute it when we draw the touch targets
46850                         }
46851
46852                         d3_select(this)
46853                             .attr('r', r)
46854                             .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
46855                     });
46856             });
46857
46858             selection$$1.selectAll('use')
46859                 .attr('visibility', (z === 0 ? 'hidden' : null));
46860         }
46861
46862         vertices.sort(sortY);
46863
46864         var groups = selection$$1.selectAll('g.vertex')
46865             .filter(filter)
46866             .data(vertices, fastEntityKey);
46867
46868         // exit
46869         groups.exit()
46870             .remove();
46871
46872         // enter
46873         var enter = groups.enter()
46874             .append('g')
46875             .attr('class', function(d) { return 'node vertex ' + d.id; })
46876             .order();
46877
46878         enter
46879             .append('circle')
46880             .attr('class', 'shadow');
46881
46882         enter
46883             .append('circle')
46884             .attr('class', 'stroke');
46885
46886         // Vertices with icons get a `use`.
46887         enter.filter(function(d) { return getIcon(d); })
46888             .append('use')
46889             .attr('class', 'icon')
46890             .attr('width', '11px')
46891             .attr('height', '11px')
46892             .attr('transform', 'translate(-5.5, -5.5)')
46893             .attr('xlink:href', function(d) {
46894                 var picon = getIcon(d);
46895                 var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
46896                 return '#' + picon + (isMaki ? '-11' : '');
46897             });
46898
46899         // Vertices with tags get a fill.
46900         enter.filter(function(d) { return d.hasInterestingTags(); })
46901             .append('circle')
46902             .attr('class', 'fill');
46903
46904         // update
46905         groups = groups
46906             .merge(enter)
46907             .attr('transform', svgPointTransform(projection))
46908             .classed('sibling', function(d) { return d.id in sets.selected; })
46909             .classed('shared', function(d) { return graph.isShared(d); })
46910             .classed('endpoint', function(d) { return d.isEndpoint(graph); })
46911             .call(updateAttributes);
46912
46913
46914         // Directional vertices get viewfields
46915         var dgroups = groups.filter(function(d) { return getDirections(d); })
46916             .selectAll('.viewfieldgroup')
46917             .data(function data$$1(d) { return zoom >= 18 ? [d] : []; }, osmEntity$$1.key);
46918
46919         // exit
46920         dgroups.exit()
46921             .remove();
46922
46923         // enter/update
46924         dgroups = dgroups.enter()
46925             .insert('g', '.shadow')
46926             .attr('class', 'viewfieldgroup')
46927             .merge(dgroups);
46928
46929         var viewfields = dgroups.selectAll('.viewfield')
46930             .data(getDirections, function key(d) { return d; });
46931
46932         // exit
46933         viewfields.exit()
46934             .remove();
46935
46936         // enter/update
46937         viewfields.enter()
46938             .append('path')
46939             .attr('class', 'viewfield')
46940             .attr('d', 'M0,0H0')
46941             .merge(viewfields)
46942             .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
46943             .attr('transform', function(d) { return 'rotate(' + d + ')'; });
46944     }
46945
46946
46947     function drawTargets(selection$$1, graph, entities, filter) {
46948         var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46949         var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
46950         var getTransform = svgPointTransform(projection).geojson;
46951         var activeID = context.activeID();
46952         var data$$1 = { targets: [], nopes: [] };
46953
46954         entities.forEach(function(node) {
46955             if (activeID === node.id) return;   // draw no target on the activeID
46956
46957             var vertexType = svgPassiveVertex(node, graph, activeID);
46958             if (vertexType !== 0) {     // passive or adjacent - allow to connect
46959                 data$$1.targets.push({
46960                     type: 'Feature',
46961                     id: node.id,
46962                     properties: {
46963                         target: true,
46964                         entity: node
46965                     },
46966                     geometry: node.asGeoJSON()
46967                 });
46968             } else {
46969                 data$$1.nopes.push({
46970                     type: 'Feature',
46971                     id: node.id + '-nope',
46972                     properties: {
46973                         nope: true,
46974                         target: true,
46975                         entity: node
46976                     },
46977                     geometry: node.asGeoJSON()
46978                 });
46979             }
46980         });
46981
46982
46983         // Targets allow hover and vertex snapping
46984         var targets = selection$$1.selectAll('.vertex.target-allowed')
46985             .filter(function(d) { return filter(d.properties.entity); })
46986             .data(data$$1.targets, function key(d) { return d.id; });
46987
46988         // exit
46989         targets.exit()
46990             .remove();
46991
46992         // enter/update
46993         targets.enter()
46994             .append('circle')
46995             .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
46996             .merge(targets)
46997             .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
46998             .attr('transform', getTransform);
46999
47000
47001         // NOPE
47002         var nopes = selection$$1.selectAll('.vertex.target-nope')
47003             .filter(function(d) { return filter(d.properties.entity); })
47004             .data(data$$1.nopes, function key(d) { return d.id; });
47005
47006         // exit
47007         nopes.exit()
47008             .remove();
47009
47010         // enter/update
47011         nopes.enter()
47012             .append('circle')
47013             .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
47014             .merge(nopes)
47015             .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
47016             .attr('transform', getTransform);
47017     }
47018
47019
47020     // Points can also render as vertices:
47021     // 1. in wireframe mode or
47022     // 2. at higher zooms if they have a direction
47023     function renderAsVertex(entity, graph, wireframe, zoom) {
47024         var geometry = entity.geometry(graph);
47025         return geometry === 'vertex' || (geometry === 'point' && (
47026             wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
47027         ));
47028     }
47029
47030
47031     function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
47032         var results = {};
47033
47034         function addChildVertices(entity) {
47035             var geometry = entity.geometry(graph);
47036             if (!context.features().isHiddenFeature(entity, graph, geometry)) {
47037                 var i;
47038                 if (entity.type === 'way') {
47039                     for (i = 0; i < entity.nodes.length; i++) {
47040                         var child = graph.hasEntity(entity.nodes[i]);
47041                         if (child) {
47042                             addChildVertices(child);
47043                         }
47044                     }
47045                 } else if (entity.type === 'relation') {
47046                     for (i = 0; i < entity.members.length; i++) {
47047                         var member = graph.hasEntity(entity.members[i].id);
47048                         if (member) {
47049                             addChildVertices(member);
47050                         }
47051                     }
47052                 } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
47053                     results[entity.id] = entity;
47054                 }
47055             }
47056         }
47057
47058         ids.forEach(function(id) {
47059             var entity = graph.hasEntity(id);
47060             if (!entity) return;
47061
47062             if (entity.type === 'node') {
47063                 if (renderAsVertex(entity, graph, wireframe, zoom)) {
47064                     results[entity.id] = entity;
47065                     graph.parentWays(entity).forEach(function(entity) {
47066                         addChildVertices(entity);
47067                     });
47068                 }
47069             } else {  // way, relation
47070                 addChildVertices(entity);
47071             }
47072         });
47073
47074         return results;
47075     }
47076
47077
47078     function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
47079         var wireframe = context.surface().classed('fill-wireframe');
47080         var zoom = geoScaleToZoom(projection.scale());
47081         var mode = context.mode();
47082         var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
47083
47084         if (fullRedraw) {
47085             _currPersistent = {};
47086             _radii = {};
47087         }
47088
47089         // Collect important vertices from the `entities` list..
47090         // (during a paritial redraw, it will not contain everything)
47091         for (var i = 0; i < entities.length; i++) {
47092             var entity = entities[i];
47093             var geometry = entity.geometry(graph);
47094             var keep = false;
47095
47096             // a point that looks like a vertex..
47097             if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
47098                 _currPersistent[entity.id] = entity;
47099                 keep = true;
47100
47101             // a vertex of some importance..
47102             } else if (geometry === 'vertex' &&
47103                 (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
47104                 _currPersistent[entity.id] = entity;
47105                 keep = true;
47106             }
47107
47108             // whatever this is, it's not a persistent vertex..
47109             if (!keep && !fullRedraw) {
47110                 delete _currPersistent[entity.id];
47111             }
47112         }
47113
47114         // 3 sets of vertices to consider:
47115         var sets = {
47116             persistent: _currPersistent,  // persistent = important vertices (render always)
47117             selected: _currSelected,      // selected + siblings of selected (render always)
47118             hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
47119         };
47120
47121         var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
47122
47123         // Draw the vertices..
47124         // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
47125         // Adjust the filter function to expand the scope beyond whatever entities were passed in.
47126         var filterRendered = function(d) {
47127             return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
47128         };
47129         selection$$1.selectAll('.layer-points .layer-points-vertices')
47130             .call(draw, graph, currentVisible(all), sets, filterRendered);
47131
47132         // Draw touch targets..
47133         // When drawing, render all targets (not just those affected by a partial redraw)
47134         var filterTouch = function(d) {
47135             return isMoving ? true : filterRendered(d);
47136         };
47137         selection$$1.selectAll('.layer-points .layer-points-targets')
47138             .call(drawTargets, graph, currentVisible(all), filterTouch);
47139
47140
47141         function currentVisible(which) {
47142             return Object.keys(which)
47143                 .map(graph.hasEntity, graph)     // the current version of this entity
47144                 .filter(function (entity) { return entity && entity.intersects(extent, graph); });
47145         }
47146     }
47147
47148
47149     // partial redraw - only update the selected items..
47150     drawVertices.drawSelected = function(selection$$1, graph, extent) {
47151         var wireframe = context.surface().classed('fill-wireframe');
47152         var zoom = geoScaleToZoom(projection.scale());
47153
47154         _prevSelected = _currSelected || {};
47155         _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
47156
47157         // note that drawVertices will add `_currSelected` automatically if needed..
47158         var filter = function(d) { return d.id in _prevSelected; };
47159         drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
47160     };
47161
47162
47163     // partial redraw - only update the hovered items..
47164     drawVertices.drawHover = function(selection$$1, graph, target, extent) {
47165         if (target === _currHoverTarget) return;  // continue only if something changed
47166
47167         var wireframe = context.surface().classed('fill-wireframe');
47168         var zoom = geoScaleToZoom(projection.scale());
47169
47170         _prevHover = _currHover || {};
47171         _currHoverTarget = target;
47172         var entity = target && target.properties && target.properties.entity;
47173
47174         if (entity) {
47175             _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
47176         } else {
47177             _currHover = {};
47178         }
47179
47180         // note that drawVertices will add `_currHover` automatically if needed..
47181         var filter = function(d) { return d.id in _prevHover; };
47182         drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
47183     };
47184
47185     return drawVertices;
47186 }
47187
47188 function uiAccount(context) {
47189     var osm = context.connection();
47190
47191
47192     function update(selection$$1) {
47193         if (!osm) return;
47194
47195         if (!osm.authenticated()) {
47196             selection$$1.selectAll('#userLink, #logoutLink')
47197                 .classed('hide', true);
47198             return;
47199         }
47200
47201         osm.userDetails(function(err, details) {
47202             var userLink = selection$$1.select('#userLink'),
47203                 logoutLink = selection$$1.select('#logoutLink');
47204
47205             userLink.html('');
47206             logoutLink.html('');
47207
47208             if (err) return;
47209
47210             selection$$1.selectAll('#userLink, #logoutLink')
47211                 .classed('hide', false);
47212
47213             // Link
47214             userLink.append('a')
47215                 .attr('href', osm.userURL(details.display_name))
47216                 .attr('target', '_blank');
47217
47218             // Add thumbnail or dont
47219             if (details.image_url) {
47220                 userLink.append('img')
47221                     .attr('class', 'icon pre-text user-icon')
47222                     .attr('src', details.image_url);
47223             } else {
47224                 userLink
47225                     .call(svgIcon('#icon-avatar', 'pre-text light'));
47226             }
47227
47228             // Add user name
47229             userLink.append('span')
47230                 .attr('class', 'label')
47231                 .text(details.display_name);
47232
47233             logoutLink.append('a')
47234                 .attr('class', 'logout')
47235                 .attr('href', '#')
47236                 .text(t('logout'))
47237                 .on('click.logout', function() {
47238                     event.preventDefault();
47239                     osm.logout();
47240                 });
47241         });
47242     }
47243
47244
47245     return function(selection$$1) {
47246         selection$$1.append('li')
47247             .attr('id', 'logoutLink')
47248             .classed('hide', true);
47249
47250         selection$$1.append('li')
47251             .attr('id', 'userLink')
47252             .classed('hide', true);
47253
47254         if (osm) {
47255             osm.on('change.account', function() { update(selection$$1); });
47256             update(selection$$1);
47257         }
47258     };
47259 }
47260
47261 function uiAttribution(context) {
47262     var selection$$1;
47263
47264
47265     function attribution(data, klass) {
47266         var div = selection$$1.selectAll('.' + klass)
47267             .data([0]);
47268
47269         div = div.enter()
47270             .append('div')
47271             .attr('class', klass)
47272             .merge(div);
47273
47274
47275         var background = div.selectAll('.attribution')
47276             .data(data, function(d) { return d.name(); });
47277
47278         background.exit()
47279             .remove();
47280
47281         background = background.enter()
47282             .append('span')
47283             .attr('class', 'attribution')
47284             .each(function(d) {
47285                 if (d.terms_html) {
47286                     d3_select(this)
47287                         .html(d.terms_html);
47288                     return;
47289                 }
47290
47291                 var selection$$1;
47292                 if (d.terms_url) {
47293                     selection$$1 = d3_select(this)
47294                         .append('a')
47295                         .attr('href', d.terms_url)
47296                         .attr('target', '_blank');
47297                 } else {
47298                     selection$$1 = d3_select(this);
47299                 }
47300
47301
47302                 var id_safe = d.id.replace('.', '<TX_DOT>');
47303                 var terms_text = t('imagery.' + id_safe + '.attribution.text',
47304                     { default: d.terms_text || d.id || d.name() }
47305                 );
47306
47307                 if (d.icon && !d.overlay) {
47308                     selection$$1
47309                         .append('img')
47310                         .attr('class', 'source-image')
47311                         .attr('src', d.icon);
47312                 }
47313
47314                 selection$$1
47315                     .append('span')
47316                     .attr('class', 'attribution-text')
47317                     .text(terms_text);
47318             })
47319             .merge(background);
47320
47321
47322         var copyright = background.selectAll('.copyright-notice')
47323             .data(function(d) {
47324                 var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
47325                 return notice ? [notice] : [];
47326             });
47327
47328         copyright.exit()
47329             .remove();
47330
47331         copyright = copyright.enter()
47332             .append('span')
47333             .attr('class', 'copyright-notice')
47334             .merge(copyright);
47335
47336         copyright
47337             .text(String);
47338     }
47339
47340
47341     function update() {
47342         attribution([context.background().baseLayerSource()], 'base-layer-attribution');
47343         attribution(context.background().overlayLayerSources().filter(function (s) {
47344             return s.validZoom(context.map().zoom());
47345         }), 'overlay-layer-attribution');
47346     }
47347
47348
47349     return function(select$$1) {
47350         selection$$1 = select$$1;
47351
47352         context.background()
47353             .on('change.attribution', update);
47354
47355         context.map()
47356             .on('move.attribution', throttle(update, 400, {leading: false}));
47357
47358         update();
47359     };
47360 }
47361
47362 // toggles the visibility of ui elements, using a combination of the
47363 // hide class, which sets display=none, and a d3 transition for opacity.
47364 // this will cause blinking when called repeatedly, so check that the
47365 // value actually changes between calls.
47366 function uiToggle(show, callback) {
47367     return function(selection$$1) {
47368         selection$$1
47369             .style('opacity', show ? 0 : 1)
47370             .classed('hide', false)
47371             .transition()
47372             .style('opacity', show ? 1 : 0)
47373             .on('end', function() {
47374                 d3_select(this)
47375                     .classed('hide', !show)
47376                     .style('opacity', null);
47377                 if (callback) callback.apply(this);
47378             });
47379     };
47380 }
47381
47382 function uiDisclosure(context, key, expandedDefault) {
47383     var dispatch$$1 = dispatch('toggled'),
47384         _preference = (context.storage('disclosure.' + key + '.expanded')),
47385         _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true')),
47386         _title,
47387         _updatePreference = true,
47388         _content = function () {};
47389
47390
47391     var disclosure = function(selection$$1) {
47392         var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
47393             .data([0]);
47394
47395         // enter
47396         var hideToggleEnter = hideToggle.enter()
47397             .append('a')
47398             .attr('href', '#')
47399             .attr('class', 'hide-toggle hide-toggle-' + key)
47400             .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
47401
47402         hideToggleEnter
47403             .append('span')
47404             .attr('class', 'hide-toggle-text');
47405
47406         // update
47407         hideToggle = hideToggleEnter
47408             .merge(hideToggle);
47409
47410         hideToggle
47411             .on('click', toggle)
47412             .classed('expanded', _expanded);
47413
47414         hideToggle.selectAll('.hide-toggle-text')
47415             .text(_title);
47416
47417         hideToggle.selectAll('.hide-toggle-icon')
47418             .attr('xlink:href', _expanded ? '#icon-down'
47419                 : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
47420             );
47421
47422
47423         var wrap = selection$$1.selectAll('.disclosure-wrap')
47424             .data([0]);
47425
47426         wrap = wrap.enter()
47427             .append('div')
47428             .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
47429             .merge(wrap);
47430
47431         wrap
47432             .classed('hide', !_expanded)
47433             .call(_content);
47434
47435
47436         function toggle() {
47437             event.preventDefault();
47438
47439             _expanded = !_expanded;
47440
47441             if (_updatePreference) {
47442                 context.storage('disclosure.' + key + '.expanded', _expanded);
47443             }
47444
47445             hideToggle
47446                 .classed('expanded', _expanded);
47447
47448             hideToggle.selectAll('.hide-toggle-icon')
47449                 .attr('xlink:href', _expanded ? '#icon-down'
47450                     : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
47451                 );
47452
47453             wrap
47454                 .call(uiToggle(_expanded));
47455
47456             dispatch$$1.call('toggled', this, _expanded);
47457         }
47458     };
47459
47460
47461     disclosure.title = function(_) {
47462         if (!arguments.length) return _title;
47463         _title = _;
47464         return disclosure;
47465     };
47466
47467
47468     disclosure.expanded = function(_) {
47469         if (!arguments.length) return _expanded;
47470         _expanded = _;
47471         return disclosure;
47472     };
47473
47474
47475     disclosure.updatePreference = function(_) {
47476         if (!arguments.length) return _updatePreference;
47477         _updatePreference = _;
47478         return disclosure;
47479     };
47480
47481
47482     disclosure.content = function(_) {
47483         if (!arguments.length) return _content;
47484         _content = _;
47485         return disclosure;
47486     };
47487
47488
47489     return utilRebind(disclosure, dispatch$$1, 'on');
47490 }
47491
47492 function uiBackgroundDisplayOptions(context) {
47493     var detected = utilDetect();
47494     var storedOpacity = context.storage('background-opacity');
47495     var minVal = 0.25;
47496     var maxVal = detected.cssfilters ? 2 : 1;
47497
47498     var sliders = detected.cssfilters
47499         ? ['brightness', 'contrast', 'saturation', 'sharpness']
47500         : ['brightness'];
47501
47502     var _options = {
47503         brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
47504         contrast: 1,
47505         saturation: 1,
47506         sharpness: 1
47507     };
47508
47509     var _selection = d3_select(null);
47510
47511
47512     function clamp(x, min, max) {
47513         return Math.max(min, Math.min(x, max));
47514     }
47515
47516
47517     function updateValue(d, val) {
47518         if (!val && event && event.target) {
47519             val = event.target.value;
47520         }
47521
47522         val = clamp(val, minVal, maxVal);
47523
47524         _options[d] = val;
47525         context.background()[d](val);
47526
47527         if (d === 'brightness') {
47528             context.storage('background-opacity', val);
47529         }
47530
47531         _selection
47532             .call(render);
47533     }
47534
47535
47536     function render(selection$$1) {
47537         var container = selection$$1.selectAll('.display-options-container')
47538             .data([0]);
47539
47540         var containerEnter = container.enter()
47541             .append('div')
47542             .attr('class', 'display-options-container controls-list');
47543
47544         // add slider controls
47545         var slidersEnter = containerEnter.selectAll('.display-control')
47546             .data(sliders)
47547             .enter()
47548             .append('div')
47549             .attr('class', function(d) { return 'display-control display-control-' + d; });
47550
47551         slidersEnter
47552             .append('h5')
47553             .text(function(d) { return t('background.' + d); })
47554             .append('span')
47555             .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
47556
47557         slidersEnter
47558             .append('input')
47559             .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
47560             .attr('type', 'range')
47561             .attr('min', minVal)
47562             .attr('max', maxVal)
47563             .attr('step', '0.05')
47564             .on('input', function(d) {
47565                 var val = d3_select(this).property('value');
47566                 updateValue(d, val);
47567             });
47568
47569         slidersEnter
47570             .append('button')
47571             .attr('title', t('background.reset'))
47572             .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
47573             .on('click', function(d) {
47574                 if (event.button !== 0) return;
47575                 updateValue(d, 1);
47576             })
47577             .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
47578
47579
47580         // update
47581         container = containerEnter
47582             .merge(container);
47583
47584         container.selectAll('.display-option-input')
47585             .property('value', function(d) { return _options[d]; });
47586
47587         container.selectAll('.display-option-value')
47588             .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
47589
47590         container.selectAll('.display-option-reset')
47591             .classed('disabled', function(d) { return _options[d] === 1; });
47592
47593         // first time only, set brightness if needed
47594         if (containerEnter.size() && _options.brightness !== 1) {
47595             context.background().brightness(_options.brightness);
47596         }
47597     }
47598
47599
47600     function backgroundDisplayOptions(selection$$1) {
47601         _selection = selection$$1;
47602
47603         selection$$1
47604             .call(uiDisclosure(context, 'background_display_options', true)
47605                 .title(t('background.display_options'))
47606                 .content(render)
47607             );
47608     }
47609
47610
47611     return backgroundDisplayOptions;
47612 }
47613
47614 function uiBackgroundOffset(context) {
47615     var directions = [
47616         ['right', [0.5, 0]],
47617         ['top', [0, -0.5]],
47618         ['left', [-0.5, 0]],
47619         ['bottom', [0, 0.5]]
47620     ];
47621
47622
47623     function d3_eventCancel() {
47624         event.stopPropagation();
47625         event.preventDefault();
47626     }
47627
47628
47629     function updateValue() {
47630         var meters = geoOffsetToMeters(context.background().offset());
47631         var x = +meters[0].toFixed(2);
47632         var y = +meters[1].toFixed(2);
47633
47634         d3_selectAll('.nudge-inner-rect')
47635             .select('input')
47636             .classed('error', false)
47637             .property('value', x + ', ' + y);
47638
47639         d3_selectAll('.nudge-reset')
47640             .classed('disabled', function() {
47641                 return (x === 0 && y === 0);
47642             });
47643     }
47644
47645
47646     function resetOffset() {
47647         context.background().offset([0, 0]);
47648         updateValue();
47649     }
47650
47651
47652     function nudge(d) {
47653         context.background().nudge(d, context.map().zoom());
47654         updateValue();
47655     }
47656
47657
47658     function clickNudgeButton(d) {
47659         var interval;
47660         var timeout = window.setTimeout(function() {
47661                 interval = window.setInterval(nudge.bind(null, d), 100);
47662             }, 500);
47663
47664         function doneNudge() {
47665             window.clearTimeout(timeout);
47666             window.clearInterval(interval);
47667             d3_select(window)
47668                 .on('mouseup.buttonoffset', null, true)
47669                 .on('mousedown.buttonoffset', null, true);
47670         }
47671
47672         d3_select(window)
47673             .on('mouseup.buttonoffset', doneNudge, true)
47674             .on('mousedown.buttonoffset', doneNudge, true);
47675
47676         nudge(d);
47677     }
47678
47679
47680     function inputOffset() {
47681         var input = d3_select(this);
47682         var d = input.node().value;
47683
47684         if (d === '') return resetOffset();
47685
47686         d = d.replace(/;/g, ',').split(',').map(function(n) {
47687             // if n is NaN, it will always get mapped to false.
47688             return !isNaN(n) && n;
47689         });
47690
47691         if (d.length !== 2 || !d[0] || !d[1]) {
47692             input.classed('error', true);
47693             return;
47694         }
47695
47696         context.background().offset(geoMetersToOffset(d));
47697         updateValue();
47698     }
47699
47700
47701     function dragOffset() {
47702         event.preventDefault();
47703         if (event.button !== 0) return;
47704
47705         var origin = [event.clientX, event.clientY];
47706
47707         context.container()
47708             .append('div')
47709             .attr('class', 'nudge-surface');
47710
47711         d3_select(window)
47712             .on('mousemove.offset', function() {
47713                 var latest = [event.clientX, event.clientY];
47714                 var d = [
47715                     -(origin[0] - latest[0]) / 4,
47716                     -(origin[1] - latest[1]) / 4
47717                 ];
47718
47719                 origin = latest;
47720                 nudge(d);
47721             })
47722             .on('mouseup.offset', function() {
47723                 if (event.button !== 0) return;
47724                 d3_selectAll('.nudge-surface')
47725                     .remove();
47726
47727                 d3_select(window)
47728                     .on('mousemove.offset', null)
47729                     .on('mouseup.offset', null);
47730             });
47731     }
47732
47733
47734     function render(selection$$1) {
47735         var container = selection$$1.selectAll('.nudge-container')
47736             .data([0]);
47737
47738         var containerEnter = container.enter()
47739             .append('div')
47740             .attr('class', 'nudge-container cf');
47741
47742         containerEnter
47743             .append('div')
47744             .attr('class', 'nudge-instructions')
47745             .text(t('background.offset'));
47746
47747         var nudgeEnter = containerEnter
47748             .append('div')
47749             .attr('class', 'nudge-outer-rect')
47750             .on('mousedown', dragOffset);
47751
47752         nudgeEnter
47753             .append('div')
47754             .attr('class', 'nudge-inner-rect')
47755             .append('input')
47756             .on('change', inputOffset);
47757
47758         containerEnter
47759             .append('div')
47760             .selectAll('button')
47761             .data(directions).enter()
47762             .append('button')
47763             .attr('class', function(d) { return d[0] + ' nudge'; })
47764             .on('contextmenu', d3_eventCancel)
47765             .on('mousedown', function(d) {
47766                 if (event.button !== 0) return;
47767                 clickNudgeButton(d[1]);
47768             });
47769
47770         containerEnter
47771             .append('button')
47772             .attr('title', t('background.reset'))
47773             .attr('class', 'nudge-reset disabled')
47774             .on('contextmenu', d3_eventCancel)
47775             .on('click', function() {
47776                 if (event.button !== 0) return;
47777                 resetOffset();
47778             })
47779             .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
47780
47781         updateValue();
47782     }
47783
47784
47785     function backgroundOffset(selection$$1) {
47786         selection$$1
47787             .call(uiDisclosure(context, 'background_offset', false)
47788                 .title(t('background.fix_misalignment'))
47789                 .content(render)
47790             );
47791     }
47792
47793
47794     context.background()
47795         .on('change.backgroundOffset-update', updateValue);
47796
47797     return backgroundOffset;
47798 }
47799
47800 var marked = createCommonjsModule(function (module, exports) {
47801 (function(root) {
47802
47803 /**
47804  * Block-Level Grammar
47805  */
47806
47807 var block = {
47808   newline: /^\n+/,
47809   code: /^( {4}[^\n]+\n*)+/,
47810   fences: noop,
47811   hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
47812   heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
47813   nptable: noop,
47814   blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
47815   list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
47816   html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
47817   def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
47818   table: noop,
47819   lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
47820   paragraph: /^([^\n]+(?:\n?(?!hr|heading|lheading| {0,3}>|tag)[^\n]+)+)/,
47821   text: /^[^\n]+/
47822 };
47823
47824 block._label = /(?:\\[\[\]]|[^\[\]])+/;
47825 block._title = /(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/;
47826 block.def = edit(block.def)
47827   .replace('label', block._label)
47828   .replace('title', block._title)
47829   .getRegex();
47830
47831 block.bullet = /(?:[*+-]|\d+\.)/;
47832 block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
47833 block.item = edit(block.item, 'gm')
47834   .replace(/bull/g, block.bullet)
47835   .getRegex();
47836
47837 block.list = edit(block.list)
47838   .replace(/bull/g, block.bullet)
47839   .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
47840   .replace('def', '\\n+(?=' + block.def.source + ')')
47841   .getRegex();
47842
47843 block._tag = '(?!(?:'
47844   + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
47845   + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
47846   + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b';
47847
47848 block.html = edit(block.html)
47849   .replace('comment', /<!--[\s\S]*?-->/)
47850   .replace('closed', /<(tag)[\s\S]+?<\/\1>/)
47851   .replace('closing', /<tag(?:"[^"]*"|'[^']*'|\s[^'"\/>\s]*)*?\/?>/)
47852   .replace(/tag/g, block._tag)
47853   .getRegex();
47854
47855 block.paragraph = edit(block.paragraph)
47856   .replace('hr', block.hr)
47857   .replace('heading', block.heading)
47858   .replace('lheading', block.lheading)
47859   .replace('tag', '<' + block._tag)
47860   .getRegex();
47861
47862 block.blockquote = edit(block.blockquote)
47863   .replace('paragraph', block.paragraph)
47864   .getRegex();
47865
47866 /**
47867  * Normal Block Grammar
47868  */
47869
47870 block.normal = merge({}, block);
47871
47872 /**
47873  * GFM Block Grammar
47874  */
47875
47876 block.gfm = merge({}, block.normal, {
47877   fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
47878   paragraph: /^/,
47879   heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
47880 });
47881
47882 block.gfm.paragraph = edit(block.paragraph)
47883   .replace('(?!', '(?!'
47884     + block.gfm.fences.source.replace('\\1', '\\2') + '|'
47885     + block.list.source.replace('\\1', '\\3') + '|')
47886   .getRegex();
47887
47888 /**
47889  * GFM + Tables Block Grammar
47890  */
47891
47892 block.tables = merge({}, block.gfm, {
47893   nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
47894   table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
47895 });
47896
47897 /**
47898  * Block Lexer
47899  */
47900
47901 function Lexer(options) {
47902   this.tokens = [];
47903   this.tokens.links = {};
47904   this.options = options || marked.defaults;
47905   this.rules = block.normal;
47906
47907   if (this.options.gfm) {
47908     if (this.options.tables) {
47909       this.rules = block.tables;
47910     } else {
47911       this.rules = block.gfm;
47912     }
47913   }
47914 }
47915
47916 /**
47917  * Expose Block Rules
47918  */
47919
47920 Lexer.rules = block;
47921
47922 /**
47923  * Static Lex Method
47924  */
47925
47926 Lexer.lex = function(src, options) {
47927   var lexer = new Lexer(options);
47928   return lexer.lex(src);
47929 };
47930
47931 /**
47932  * Preprocessing
47933  */
47934
47935 Lexer.prototype.lex = function(src) {
47936   src = src
47937     .replace(/\r\n|\r/g, '\n')
47938     .replace(/\t/g, '    ')
47939     .replace(/\u00a0/g, ' ')
47940     .replace(/\u2424/g, '\n');
47941
47942   return this.token(src, true);
47943 };
47944
47945 /**
47946  * Lexing
47947  */
47948
47949 Lexer.prototype.token = function(src, top) {
47950   src = src.replace(/^ +$/gm, '');
47951   var next,
47952       loose,
47953       cap,
47954       bull,
47955       b,
47956       item,
47957       space,
47958       i,
47959       tag,
47960       l;
47961
47962   while (src) {
47963     // newline
47964     if (cap = this.rules.newline.exec(src)) {
47965       src = src.substring(cap[0].length);
47966       if (cap[0].length > 1) {
47967         this.tokens.push({
47968           type: 'space'
47969         });
47970       }
47971     }
47972
47973     // code
47974     if (cap = this.rules.code.exec(src)) {
47975       src = src.substring(cap[0].length);
47976       cap = cap[0].replace(/^ {4}/gm, '');
47977       this.tokens.push({
47978         type: 'code',
47979         text: !this.options.pedantic
47980           ? cap.replace(/\n+$/, '')
47981           : cap
47982       });
47983       continue;
47984     }
47985
47986     // fences (gfm)
47987     if (cap = this.rules.fences.exec(src)) {
47988       src = src.substring(cap[0].length);
47989       this.tokens.push({
47990         type: 'code',
47991         lang: cap[2],
47992         text: cap[3] || ''
47993       });
47994       continue;
47995     }
47996
47997     // heading
47998     if (cap = this.rules.heading.exec(src)) {
47999       src = src.substring(cap[0].length);
48000       this.tokens.push({
48001         type: 'heading',
48002         depth: cap[1].length,
48003         text: cap[2]
48004       });
48005       continue;
48006     }
48007
48008     // table no leading pipe (gfm)
48009     if (top && (cap = this.rules.nptable.exec(src))) {
48010       src = src.substring(cap[0].length);
48011
48012       item = {
48013         type: 'table',
48014         header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48015         align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48016         cells: cap[3].replace(/\n$/, '').split('\n')
48017       };
48018
48019       for (i = 0; i < item.align.length; i++) {
48020         if (/^ *-+: *$/.test(item.align[i])) {
48021           item.align[i] = 'right';
48022         } else if (/^ *:-+: *$/.test(item.align[i])) {
48023           item.align[i] = 'center';
48024         } else if (/^ *:-+ *$/.test(item.align[i])) {
48025           item.align[i] = 'left';
48026         } else {
48027           item.align[i] = null;
48028         }
48029       }
48030
48031       for (i = 0; i < item.cells.length; i++) {
48032         item.cells[i] = item.cells[i].split(/ *\| */);
48033       }
48034
48035       this.tokens.push(item);
48036
48037       continue;
48038     }
48039
48040     // hr
48041     if (cap = this.rules.hr.exec(src)) {
48042       src = src.substring(cap[0].length);
48043       this.tokens.push({
48044         type: 'hr'
48045       });
48046       continue;
48047     }
48048
48049     // blockquote
48050     if (cap = this.rules.blockquote.exec(src)) {
48051       src = src.substring(cap[0].length);
48052
48053       this.tokens.push({
48054         type: 'blockquote_start'
48055       });
48056
48057       cap = cap[0].replace(/^ *> ?/gm, '');
48058
48059       // Pass `top` to keep the current
48060       // "toplevel" state. This is exactly
48061       // how markdown.pl works.
48062       this.token(cap, top);
48063
48064       this.tokens.push({
48065         type: 'blockquote_end'
48066       });
48067
48068       continue;
48069     }
48070
48071     // list
48072     if (cap = this.rules.list.exec(src)) {
48073       src = src.substring(cap[0].length);
48074       bull = cap[2];
48075
48076       this.tokens.push({
48077         type: 'list_start',
48078         ordered: bull.length > 1
48079       });
48080
48081       // Get each top-level item.
48082       cap = cap[0].match(this.rules.item);
48083
48084       next = false;
48085       l = cap.length;
48086       i = 0;
48087
48088       for (; i < l; i++) {
48089         item = cap[i];
48090
48091         // Remove the list item's bullet
48092         // so it is seen as the next token.
48093         space = item.length;
48094         item = item.replace(/^ *([*+-]|\d+\.) +/, '');
48095
48096         // Outdent whatever the
48097         // list item contains. Hacky.
48098         if (~item.indexOf('\n ')) {
48099           space -= item.length;
48100           item = !this.options.pedantic
48101             ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
48102             : item.replace(/^ {1,4}/gm, '');
48103         }
48104
48105         // Determine whether the next list item belongs here.
48106         // Backpedal if it does not belong in this list.
48107         if (this.options.smartLists && i !== l - 1) {
48108           b = block.bullet.exec(cap[i + 1])[0];
48109           if (bull !== b && !(bull.length > 1 && b.length > 1)) {
48110             src = cap.slice(i + 1).join('\n') + src;
48111             i = l - 1;
48112           }
48113         }
48114
48115         // Determine whether item is loose or not.
48116         // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
48117         // for discount behavior.
48118         loose = next || /\n\n(?!\s*$)/.test(item);
48119         if (i !== l - 1) {
48120           next = item.charAt(item.length - 1) === '\n';
48121           if (!loose) loose = next;
48122         }
48123
48124         this.tokens.push({
48125           type: loose
48126             ? 'loose_item_start'
48127             : 'list_item_start'
48128         });
48129
48130         // Recurse.
48131         this.token(item, false);
48132
48133         this.tokens.push({
48134           type: 'list_item_end'
48135         });
48136       }
48137
48138       this.tokens.push({
48139         type: 'list_end'
48140       });
48141
48142       continue;
48143     }
48144
48145     // html
48146     if (cap = this.rules.html.exec(src)) {
48147       src = src.substring(cap[0].length);
48148       this.tokens.push({
48149         type: this.options.sanitize
48150           ? 'paragraph'
48151           : 'html',
48152         pre: !this.options.sanitizer
48153           && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
48154         text: cap[0]
48155       });
48156       continue;
48157     }
48158
48159     // def
48160     if (top && (cap = this.rules.def.exec(src))) {
48161       src = src.substring(cap[0].length);
48162       if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
48163       tag = cap[1].toLowerCase();
48164       if (!this.tokens.links[tag]) {
48165         this.tokens.links[tag] = {
48166           href: cap[2],
48167           title: cap[3]
48168         };
48169       }
48170       continue;
48171     }
48172
48173     // table (gfm)
48174     if (top && (cap = this.rules.table.exec(src))) {
48175       src = src.substring(cap[0].length);
48176
48177       item = {
48178         type: 'table',
48179         header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48180         align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48181         cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
48182       };
48183
48184       for (i = 0; i < item.align.length; i++) {
48185         if (/^ *-+: *$/.test(item.align[i])) {
48186           item.align[i] = 'right';
48187         } else if (/^ *:-+: *$/.test(item.align[i])) {
48188           item.align[i] = 'center';
48189         } else if (/^ *:-+ *$/.test(item.align[i])) {
48190           item.align[i] = 'left';
48191         } else {
48192           item.align[i] = null;
48193         }
48194       }
48195
48196       for (i = 0; i < item.cells.length; i++) {
48197         item.cells[i] = item.cells[i]
48198           .replace(/^ *\| *| *\| *$/g, '')
48199           .split(/ *\| */);
48200       }
48201
48202       this.tokens.push(item);
48203
48204       continue;
48205     }
48206
48207     // lheading
48208     if (cap = this.rules.lheading.exec(src)) {
48209       src = src.substring(cap[0].length);
48210       this.tokens.push({
48211         type: 'heading',
48212         depth: cap[2] === '=' ? 1 : 2,
48213         text: cap[1]
48214       });
48215       continue;
48216     }
48217
48218     // top-level paragraph
48219     if (top && (cap = this.rules.paragraph.exec(src))) {
48220       src = src.substring(cap[0].length);
48221       this.tokens.push({
48222         type: 'paragraph',
48223         text: cap[1].charAt(cap[1].length - 1) === '\n'
48224           ? cap[1].slice(0, -1)
48225           : cap[1]
48226       });
48227       continue;
48228     }
48229
48230     // text
48231     if (cap = this.rules.text.exec(src)) {
48232       // Top-level should never reach here.
48233       src = src.substring(cap[0].length);
48234       this.tokens.push({
48235         type: 'text',
48236         text: cap[0]
48237       });
48238       continue;
48239     }
48240
48241     if (src) {
48242       throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
48243     }
48244   }
48245
48246   return this.tokens;
48247 };
48248
48249 /**
48250  * Inline-Level Grammar
48251  */
48252
48253 var inline = {
48254   escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
48255   autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
48256   url: noop,
48257   tag: /^<!--[\s\S]*?-->|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/\s]*)*?\/?>/,
48258   link: /^!?\[(inside)\]\(href\)/,
48259   reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
48260   nolink: /^!?\[((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\]/,
48261   strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
48262   em: /^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/,
48263   code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
48264   br: /^ {2,}\n(?!\s*$)/,
48265   del: noop,
48266   text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
48267 };
48268
48269 inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
48270 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])?)+(?![-_])/;
48271
48272 inline.autolink = edit(inline.autolink)
48273   .replace('scheme', inline._scheme)
48274   .replace('email', inline._email)
48275   .getRegex();
48276
48277 inline._inside = /(?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/;
48278 inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
48279
48280 inline.link = edit(inline.link)
48281   .replace('inside', inline._inside)
48282   .replace('href', inline._href)
48283   .getRegex();
48284
48285 inline.reflink = edit(inline.reflink)
48286   .replace('inside', inline._inside)
48287   .getRegex();
48288
48289 /**
48290  * Normal Inline Grammar
48291  */
48292
48293 inline.normal = merge({}, inline);
48294
48295 /**
48296  * Pedantic Inline Grammar
48297  */
48298
48299 inline.pedantic = merge({}, inline.normal, {
48300   strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
48301   em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
48302 });
48303
48304 /**
48305  * GFM Inline Grammar
48306  */
48307
48308 inline.gfm = merge({}, inline.normal, {
48309   escape: edit(inline.escape).replace('])', '~|])').getRegex(),
48310   url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
48311     .replace('email', inline._email)
48312     .getRegex(),
48313   _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
48314   del: /^~~(?=\S)([\s\S]*?\S)~~/,
48315   text: edit(inline.text)
48316     .replace(']|', '~]|')
48317     .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
48318     .getRegex()
48319 });
48320
48321 /**
48322  * GFM + Line Breaks Inline Grammar
48323  */
48324
48325 inline.breaks = merge({}, inline.gfm, {
48326   br: edit(inline.br).replace('{2,}', '*').getRegex(),
48327   text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
48328 });
48329
48330 /**
48331  * Inline Lexer & Compiler
48332  */
48333
48334 function InlineLexer(links, options) {
48335   this.options = options || marked.defaults;
48336   this.links = links;
48337   this.rules = inline.normal;
48338   this.renderer = this.options.renderer || new Renderer();
48339   this.renderer.options = this.options;
48340
48341   if (!this.links) {
48342     throw new Error('Tokens array requires a `links` property.');
48343   }
48344
48345   if (this.options.gfm) {
48346     if (this.options.breaks) {
48347       this.rules = inline.breaks;
48348     } else {
48349       this.rules = inline.gfm;
48350     }
48351   } else if (this.options.pedantic) {
48352     this.rules = inline.pedantic;
48353   }
48354 }
48355
48356 /**
48357  * Expose Inline Rules
48358  */
48359
48360 InlineLexer.rules = inline;
48361
48362 /**
48363  * Static Lexing/Compiling Method
48364  */
48365
48366 InlineLexer.output = function(src, links, options) {
48367   var inline = new InlineLexer(links, options);
48368   return inline.output(src);
48369 };
48370
48371 /**
48372  * Lexing/Compiling
48373  */
48374
48375 InlineLexer.prototype.output = function(src) {
48376   var out = '',
48377       link,
48378       text,
48379       href,
48380       cap;
48381
48382   while (src) {
48383     // escape
48384     if (cap = this.rules.escape.exec(src)) {
48385       src = src.substring(cap[0].length);
48386       out += cap[1];
48387       continue;
48388     }
48389
48390     // autolink
48391     if (cap = this.rules.autolink.exec(src)) {
48392       src = src.substring(cap[0].length);
48393       if (cap[2] === '@') {
48394         text = escape(this.mangle(cap[1]));
48395         href = 'mailto:' + text;
48396       } else {
48397         text = escape(cap[1]);
48398         href = text;
48399       }
48400       out += this.renderer.link(href, null, text);
48401       continue;
48402     }
48403
48404     // url (gfm)
48405     if (!this.inLink && (cap = this.rules.url.exec(src))) {
48406       cap[0] = this.rules._backpedal.exec(cap[0])[0];
48407       src = src.substring(cap[0].length);
48408       if (cap[2] === '@') {
48409         text = escape(cap[0]);
48410         href = 'mailto:' + text;
48411       } else {
48412         text = escape(cap[0]);
48413         if (cap[1] === 'www.') {
48414           href = 'http://' + text;
48415         } else {
48416           href = text;
48417         }
48418       }
48419       out += this.renderer.link(href, null, text);
48420       continue;
48421     }
48422
48423     // tag
48424     if (cap = this.rules.tag.exec(src)) {
48425       if (!this.inLink && /^<a /i.test(cap[0])) {
48426         this.inLink = true;
48427       } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
48428         this.inLink = false;
48429       }
48430       src = src.substring(cap[0].length);
48431       out += this.options.sanitize
48432         ? this.options.sanitizer
48433           ? this.options.sanitizer(cap[0])
48434           : escape(cap[0])
48435         : cap[0];
48436       continue;
48437     }
48438
48439     // link
48440     if (cap = this.rules.link.exec(src)) {
48441       src = src.substring(cap[0].length);
48442       this.inLink = true;
48443       out += this.outputLink(cap, {
48444         href: cap[2],
48445         title: cap[3]
48446       });
48447       this.inLink = false;
48448       continue;
48449     }
48450
48451     // reflink, nolink
48452     if ((cap = this.rules.reflink.exec(src))
48453         || (cap = this.rules.nolink.exec(src))) {
48454       src = src.substring(cap[0].length);
48455       link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
48456       link = this.links[link.toLowerCase()];
48457       if (!link || !link.href) {
48458         out += cap[0].charAt(0);
48459         src = cap[0].substring(1) + src;
48460         continue;
48461       }
48462       this.inLink = true;
48463       out += this.outputLink(cap, link);
48464       this.inLink = false;
48465       continue;
48466     }
48467
48468     // strong
48469     if (cap = this.rules.strong.exec(src)) {
48470       src = src.substring(cap[0].length);
48471       out += this.renderer.strong(this.output(cap[2] || cap[1]));
48472       continue;
48473     }
48474
48475     // em
48476     if (cap = this.rules.em.exec(src)) {
48477       src = src.substring(cap[0].length);
48478       out += this.renderer.em(this.output(cap[2] || cap[1]));
48479       continue;
48480     }
48481
48482     // code
48483     if (cap = this.rules.code.exec(src)) {
48484       src = src.substring(cap[0].length);
48485       out += this.renderer.codespan(escape(cap[2].trim(), true));
48486       continue;
48487     }
48488
48489     // br
48490     if (cap = this.rules.br.exec(src)) {
48491       src = src.substring(cap[0].length);
48492       out += this.renderer.br();
48493       continue;
48494     }
48495
48496     // del (gfm)
48497     if (cap = this.rules.del.exec(src)) {
48498       src = src.substring(cap[0].length);
48499       out += this.renderer.del(this.output(cap[1]));
48500       continue;
48501     }
48502
48503     // text
48504     if (cap = this.rules.text.exec(src)) {
48505       src = src.substring(cap[0].length);
48506       out += this.renderer.text(escape(this.smartypants(cap[0])));
48507       continue;
48508     }
48509
48510     if (src) {
48511       throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
48512     }
48513   }
48514
48515   return out;
48516 };
48517
48518 /**
48519  * Compile Link
48520  */
48521
48522 InlineLexer.prototype.outputLink = function(cap, link) {
48523   var href = escape(link.href),
48524       title = link.title ? escape(link.title) : null;
48525
48526   return cap[0].charAt(0) !== '!'
48527     ? this.renderer.link(href, title, this.output(cap[1]))
48528     : this.renderer.image(href, title, escape(cap[1]));
48529 };
48530
48531 /**
48532  * Smartypants Transformations
48533  */
48534
48535 InlineLexer.prototype.smartypants = function(text) {
48536   if (!this.options.smartypants) return text;
48537   return text
48538     // em-dashes
48539     .replace(/---/g, '\u2014')
48540     // en-dashes
48541     .replace(/--/g, '\u2013')
48542     // opening singles
48543     .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
48544     // closing singles & apostrophes
48545     .replace(/'/g, '\u2019')
48546     // opening doubles
48547     .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
48548     // closing doubles
48549     .replace(/"/g, '\u201d')
48550     // ellipses
48551     .replace(/\.{3}/g, '\u2026');
48552 };
48553
48554 /**
48555  * Mangle Links
48556  */
48557
48558 InlineLexer.prototype.mangle = function(text) {
48559   if (!this.options.mangle) return text;
48560   var out = '',
48561       l = text.length,
48562       i = 0,
48563       ch;
48564
48565   for (; i < l; i++) {
48566     ch = text.charCodeAt(i);
48567     if (Math.random() > 0.5) {
48568       ch = 'x' + ch.toString(16);
48569     }
48570     out += '&#' + ch + ';';
48571   }
48572
48573   return out;
48574 };
48575
48576 /**
48577  * Renderer
48578  */
48579
48580 function Renderer(options) {
48581   this.options = options || {};
48582 }
48583
48584 Renderer.prototype.code = function(code, lang, escaped) {
48585   if (this.options.highlight) {
48586     var out = this.options.highlight(code, lang);
48587     if (out != null && out !== code) {
48588       escaped = true;
48589       code = out;
48590     }
48591   }
48592
48593   if (!lang) {
48594     return '<pre><code>'
48595       + (escaped ? code : escape(code, true))
48596       + '\n</code></pre>';
48597   }
48598
48599   return '<pre><code class="'
48600     + this.options.langPrefix
48601     + escape(lang, true)
48602     + '">'
48603     + (escaped ? code : escape(code, true))
48604     + '\n</code></pre>\n';
48605 };
48606
48607 Renderer.prototype.blockquote = function(quote) {
48608   return '<blockquote>\n' + quote + '</blockquote>\n';
48609 };
48610
48611 Renderer.prototype.html = function(html) {
48612   return html;
48613 };
48614
48615 Renderer.prototype.heading = function(text, level, raw) {
48616   return '<h'
48617     + level
48618     + ' id="'
48619     + this.options.headerPrefix
48620     + raw.toLowerCase().replace(/[^\w]+/g, '-')
48621     + '">'
48622     + text
48623     + '</h'
48624     + level
48625     + '>\n';
48626 };
48627
48628 Renderer.prototype.hr = function() {
48629   return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
48630 };
48631
48632 Renderer.prototype.list = function(body, ordered) {
48633   var type = ordered ? 'ol' : 'ul';
48634   return '<' + type + '>\n' + body + '</' + type + '>\n';
48635 };
48636
48637 Renderer.prototype.listitem = function(text) {
48638   return '<li>' + text + '</li>\n';
48639 };
48640
48641 Renderer.prototype.paragraph = function(text) {
48642   return '<p>' + text + '</p>\n';
48643 };
48644
48645 Renderer.prototype.table = function(header, body) {
48646   return '<table>\n'
48647     + '<thead>\n'
48648     + header
48649     + '</thead>\n'
48650     + '<tbody>\n'
48651     + body
48652     + '</tbody>\n'
48653     + '</table>\n';
48654 };
48655
48656 Renderer.prototype.tablerow = function(content) {
48657   return '<tr>\n' + content + '</tr>\n';
48658 };
48659
48660 Renderer.prototype.tablecell = function(content, flags) {
48661   var type = flags.header ? 'th' : 'td';
48662   var tag = flags.align
48663     ? '<' + type + ' style="text-align:' + flags.align + '">'
48664     : '<' + type + '>';
48665   return tag + content + '</' + type + '>\n';
48666 };
48667
48668 // span level renderer
48669 Renderer.prototype.strong = function(text) {
48670   return '<strong>' + text + '</strong>';
48671 };
48672
48673 Renderer.prototype.em = function(text) {
48674   return '<em>' + text + '</em>';
48675 };
48676
48677 Renderer.prototype.codespan = function(text) {
48678   return '<code>' + text + '</code>';
48679 };
48680
48681 Renderer.prototype.br = function() {
48682   return this.options.xhtml ? '<br/>' : '<br>';
48683 };
48684
48685 Renderer.prototype.del = function(text) {
48686   return '<del>' + text + '</del>';
48687 };
48688
48689 Renderer.prototype.link = function(href, title, text) {
48690   if (this.options.sanitize) {
48691     try {
48692       var prot = decodeURIComponent(unescape(href))
48693         .replace(/[^\w:]/g, '')
48694         .toLowerCase();
48695     } catch (e) {
48696       return text;
48697     }
48698     if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
48699       return text;
48700     }
48701   }
48702   if (this.options.baseUrl && !originIndependentUrl.test(href)) {
48703     href = resolveUrl(this.options.baseUrl, href);
48704   }
48705   var out = '<a href="' + href + '"';
48706   if (title) {
48707     out += ' title="' + title + '"';
48708   }
48709   out += '>' + text + '</a>';
48710   return out;
48711 };
48712
48713 Renderer.prototype.image = function(href, title, text) {
48714   if (this.options.baseUrl && !originIndependentUrl.test(href)) {
48715     href = resolveUrl(this.options.baseUrl, href);
48716   }
48717   var out = '<img src="' + href + '" alt="' + text + '"';
48718   if (title) {
48719     out += ' title="' + title + '"';
48720   }
48721   out += this.options.xhtml ? '/>' : '>';
48722   return out;
48723 };
48724
48725 Renderer.prototype.text = function(text) {
48726   return text;
48727 };
48728
48729 /**
48730  * TextRenderer
48731  * returns only the textual part of the token
48732  */
48733
48734 function TextRenderer() {}
48735
48736 // no need for block level renderers
48737
48738 TextRenderer.prototype.strong =
48739 TextRenderer.prototype.em =
48740 TextRenderer.prototype.codespan =
48741 TextRenderer.prototype.del =
48742 TextRenderer.prototype.text = function (text) {
48743   return text;
48744 };
48745
48746 TextRenderer.prototype.link =
48747 TextRenderer.prototype.image = function(href, title, text) {
48748   return '' + text;
48749 };
48750
48751 TextRenderer.prototype.br = function() {
48752   return '';
48753 };
48754
48755 /**
48756  * Parsing & Compiling
48757  */
48758
48759 function Parser(options) {
48760   this.tokens = [];
48761   this.token = null;
48762   this.options = options || marked.defaults;
48763   this.options.renderer = this.options.renderer || new Renderer();
48764   this.renderer = this.options.renderer;
48765   this.renderer.options = this.options;
48766 }
48767
48768 /**
48769  * Static Parse Method
48770  */
48771
48772 Parser.parse = function(src, options) {
48773   var parser = new Parser(options);
48774   return parser.parse(src);
48775 };
48776
48777 /**
48778  * Parse Loop
48779  */
48780
48781 Parser.prototype.parse = function(src) {
48782   this.inline = new InlineLexer(src.links, this.options);
48783   // use an InlineLexer with a TextRenderer to extract pure text
48784   this.inlineText = new InlineLexer(
48785     src.links,
48786     merge({}, this.options, {renderer: new TextRenderer()})
48787   );
48788   this.tokens = src.reverse();
48789
48790   var out = '';
48791   while (this.next()) {
48792     out += this.tok();
48793   }
48794
48795   return out;
48796 };
48797
48798 /**
48799  * Next Token
48800  */
48801
48802 Parser.prototype.next = function() {
48803   return this.token = this.tokens.pop();
48804 };
48805
48806 /**
48807  * Preview Next Token
48808  */
48809
48810 Parser.prototype.peek = function() {
48811   return this.tokens[this.tokens.length - 1] || 0;
48812 };
48813
48814 /**
48815  * Parse Text Tokens
48816  */
48817
48818 Parser.prototype.parseText = function() {
48819   var body = this.token.text;
48820
48821   while (this.peek().type === 'text') {
48822     body += '\n' + this.next().text;
48823   }
48824
48825   return this.inline.output(body);
48826 };
48827
48828 /**
48829  * Parse Current Token
48830  */
48831
48832 Parser.prototype.tok = function() {
48833   switch (this.token.type) {
48834     case 'space': {
48835       return '';
48836     }
48837     case 'hr': {
48838       return this.renderer.hr();
48839     }
48840     case 'heading': {
48841       return this.renderer.heading(
48842         this.inline.output(this.token.text),
48843         this.token.depth,
48844         unescape(this.inlineText.output(this.token.text)));
48845     }
48846     case 'code': {
48847       return this.renderer.code(this.token.text,
48848         this.token.lang,
48849         this.token.escaped);
48850     }
48851     case 'table': {
48852       var header = '',
48853           body = '',
48854           i,
48855           row,
48856           cell,
48857           j;
48858
48859       // header
48860       cell = '';
48861       for (i = 0; i < this.token.header.length; i++) {
48862         cell += this.renderer.tablecell(
48863           this.inline.output(this.token.header[i]),
48864           { header: true, align: this.token.align[i] }
48865         );
48866       }
48867       header += this.renderer.tablerow(cell);
48868
48869       for (i = 0; i < this.token.cells.length; i++) {
48870         row = this.token.cells[i];
48871
48872         cell = '';
48873         for (j = 0; j < row.length; j++) {
48874           cell += this.renderer.tablecell(
48875             this.inline.output(row[j]),
48876             { header: false, align: this.token.align[j] }
48877           );
48878         }
48879
48880         body += this.renderer.tablerow(cell);
48881       }
48882       return this.renderer.table(header, body);
48883     }
48884     case 'blockquote_start': {
48885       body = '';
48886
48887       while (this.next().type !== 'blockquote_end') {
48888         body += this.tok();
48889       }
48890
48891       return this.renderer.blockquote(body);
48892     }
48893     case 'list_start': {
48894       body = '';
48895       var ordered = this.token.ordered;
48896
48897       while (this.next().type !== 'list_end') {
48898         body += this.tok();
48899       }
48900
48901       return this.renderer.list(body, ordered);
48902     }
48903     case 'list_item_start': {
48904       body = '';
48905
48906       while (this.next().type !== 'list_item_end') {
48907         body += this.token.type === 'text'
48908           ? this.parseText()
48909           : this.tok();
48910       }
48911
48912       return this.renderer.listitem(body);
48913     }
48914     case 'loose_item_start': {
48915       body = '';
48916
48917       while (this.next().type !== 'list_item_end') {
48918         body += this.tok();
48919       }
48920
48921       return this.renderer.listitem(body);
48922     }
48923     case 'html': {
48924       var html = !this.token.pre && !this.options.pedantic
48925         ? this.inline.output(this.token.text)
48926         : this.token.text;
48927       return this.renderer.html(html);
48928     }
48929     case 'paragraph': {
48930       return this.renderer.paragraph(this.inline.output(this.token.text));
48931     }
48932     case 'text': {
48933       return this.renderer.paragraph(this.parseText());
48934     }
48935   }
48936 };
48937
48938 /**
48939  * Helpers
48940  */
48941
48942 function escape(html, encode) {
48943   return html
48944     .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
48945     .replace(/</g, '&lt;')
48946     .replace(/>/g, '&gt;')
48947     .replace(/"/g, '&quot;')
48948     .replace(/'/g, '&#39;');
48949 }
48950
48951 function unescape(html) {
48952   // explicitly match decimal, hex, and named HTML entities
48953   return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
48954     n = n.toLowerCase();
48955     if (n === 'colon') return ':';
48956     if (n.charAt(0) === '#') {
48957       return n.charAt(1) === 'x'
48958         ? String.fromCharCode(parseInt(n.substring(2), 16))
48959         : String.fromCharCode(+n.substring(1));
48960     }
48961     return '';
48962   });
48963 }
48964
48965 function edit(regex, opt) {
48966   regex = regex.source;
48967   opt = opt || '';
48968   return {
48969     replace: function(name, val) {
48970       val = val.source || val;
48971       val = val.replace(/(^|[^\[])\^/g, '$1');
48972       regex = regex.replace(name, val);
48973       return this;
48974     },
48975     getRegex: function() {
48976       return new RegExp(regex, opt);
48977     }
48978   };
48979 }
48980
48981 function resolveUrl(base, href) {
48982   if (!baseUrls[' ' + base]) {
48983     // we can ignore everything in base after the last slash of its path component,
48984     // but we might need to add _that_
48985     // https://tools.ietf.org/html/rfc3986#section-3
48986     if (/^[^:]+:\/*[^/]*$/.test(base)) {
48987       baseUrls[' ' + base] = base + '/';
48988     } else {
48989       baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
48990     }
48991   }
48992   base = baseUrls[' ' + base];
48993
48994   if (href.slice(0, 2) === '//') {
48995     return base.replace(/:[\s\S]*/, ':') + href;
48996   } else if (href.charAt(0) === '/') {
48997     return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
48998   } else {
48999     return base + href;
49000   }
49001 }
49002 var baseUrls = {};
49003 var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
49004
49005 function noop() {}
49006 noop.exec = noop;
49007
49008 function merge(obj) {
49009   var i = 1,
49010       target,
49011       key;
49012
49013   for (; i < arguments.length; i++) {
49014     target = arguments[i];
49015     for (key in target) {
49016       if (Object.prototype.hasOwnProperty.call(target, key)) {
49017         obj[key] = target[key];
49018       }
49019     }
49020   }
49021
49022   return obj;
49023 }
49024
49025 /**
49026  * Marked
49027  */
49028
49029 function marked(src, opt, callback) {
49030   // throw error in case of non string input
49031   if (typeof src === 'undefined' || src === null) {
49032     throw new Error('marked(): input parameter is undefined or null');
49033   }
49034   if (typeof src !== 'string') {
49035     throw new Error('marked(): input parameter is of type '
49036       + Object.prototype.toString.call(src) + ', string expected');
49037   }
49038
49039   if (callback || typeof opt === 'function') {
49040     if (!callback) {
49041       callback = opt;
49042       opt = null;
49043     }
49044
49045     opt = merge({}, marked.defaults, opt || {});
49046
49047     var highlight = opt.highlight,
49048         tokens,
49049         pending,
49050         i = 0;
49051
49052     try {
49053       tokens = Lexer.lex(src, opt);
49054     } catch (e) {
49055       return callback(e);
49056     }
49057
49058     pending = tokens.length;
49059
49060     var done = function(err) {
49061       if (err) {
49062         opt.highlight = highlight;
49063         return callback(err);
49064       }
49065
49066       var out;
49067
49068       try {
49069         out = Parser.parse(tokens, opt);
49070       } catch (e) {
49071         err = e;
49072       }
49073
49074       opt.highlight = highlight;
49075
49076       return err
49077         ? callback(err)
49078         : callback(null, out);
49079     };
49080
49081     if (!highlight || highlight.length < 3) {
49082       return done();
49083     }
49084
49085     delete opt.highlight;
49086
49087     if (!pending) return done();
49088
49089     for (; i < tokens.length; i++) {
49090       (function(token) {
49091         if (token.type !== 'code') {
49092           return --pending || done();
49093         }
49094         return highlight(token.text, token.lang, function(err, code) {
49095           if (err) return done(err);
49096           if (code == null || code === token.text) {
49097             return --pending || done();
49098           }
49099           token.text = code;
49100           token.escaped = true;
49101           --pending || done();
49102         });
49103       })(tokens[i]);
49104     }
49105
49106     return;
49107   }
49108   try {
49109     if (opt) opt = merge({}, marked.defaults, opt);
49110     return Parser.parse(Lexer.lex(src, opt), opt);
49111   } catch (e) {
49112     e.message += '\nPlease report this to https://github.com/chjj/marked.';
49113     if ((opt || marked.defaults).silent) {
49114       return '<p>An error occurred:</p><pre>'
49115         + escape(e.message + '', true)
49116         + '</pre>';
49117     }
49118     throw e;
49119   }
49120 }
49121
49122 /**
49123  * Options
49124  */
49125
49126 marked.options =
49127 marked.setOptions = function(opt) {
49128   merge(marked.defaults, opt);
49129   return marked;
49130 };
49131
49132 marked.defaults = {
49133   gfm: true,
49134   tables: true,
49135   breaks: false,
49136   pedantic: false,
49137   sanitize: false,
49138   sanitizer: null,
49139   mangle: true,
49140   smartLists: false,
49141   silent: false,
49142   highlight: null,
49143   langPrefix: 'lang-',
49144   smartypants: false,
49145   headerPrefix: '',
49146   renderer: new Renderer(),
49147   xhtml: false,
49148   baseUrl: null
49149 };
49150
49151 /**
49152  * Expose
49153  */
49154
49155 marked.Parser = Parser;
49156 marked.parser = Parser.parse;
49157
49158 marked.Renderer = Renderer;
49159 marked.TextRenderer = TextRenderer;
49160
49161 marked.Lexer = Lexer;
49162 marked.lexer = Lexer.lex;
49163
49164 marked.InlineLexer = InlineLexer;
49165 marked.inlineLexer = InlineLexer.output;
49166
49167 marked.parse = marked;
49168
49169 {
49170   module.exports = marked;
49171 }
49172 })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
49173 });
49174
49175 function pointBox(loc, context) {
49176     var rect = context.surfaceRect();
49177     var point$$1 = context.curtainProjection(loc);
49178     return {
49179         left: point$$1[0] + rect.left - 40,
49180         top: point$$1[1] + rect.top - 60,
49181         width: 80,
49182         height: 90
49183     };
49184 }
49185
49186
49187 function pad$1(locOrBox, padding, context) {
49188     var box;
49189     if (locOrBox instanceof Array) {
49190         var rect = context.surfaceRect();
49191         var point$$1 = context.curtainProjection(locOrBox);
49192         box = {
49193             left: point$$1[0] + rect.left,
49194             top: point$$1[1] + rect.top
49195         };
49196     } else {
49197         box = locOrBox;
49198     }
49199
49200     return {
49201         left: box.left - padding,
49202         top: box.top - padding,
49203         width: (box.width || 0) + 2 * padding,
49204         height: (box.width || 0) + 2 * padding
49205     };
49206 }
49207
49208
49209 function icon(name, svgklass, useklass) {
49210     return '<svg class="icon ' + (svgklass || '') + '">' +
49211          '<use xlink:href="' + name + '"' +
49212          (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
49213 }
49214
49215
49216 function slugify(text) {
49217     return text.toString().toLowerCase()
49218         .replace(/\s+/g, '-')           // Replace spaces with -
49219         .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
49220         .replace(/\-\-+/g, '-')         // Replace multiple - with single -
49221         .replace(/^-+/, '')             // Trim - from start of text
49222         .replace(/-+$/, '');            // Trim - from end of text
49223 }
49224
49225
49226 // console warning for missing walkthrough names
49227 var missingStrings = {};
49228 function checkKey(key, text) {
49229     if (t(key, { default: undefined}) === undefined) {
49230         if (missingStrings.hasOwnProperty(key)) return;  // warn once
49231         missingStrings[key] = text;
49232         var missing = key + ': ' + text;
49233         if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
49234     }
49235 }
49236
49237
49238 function localize(obj) {
49239     var key;
49240
49241     // Assign name if entity has one..
49242     var name = obj.tags && obj.tags.name;
49243     if (name) {
49244         key = 'intro.graph.name.' + slugify(name);
49245         obj.tags.name = t(key, { default: name });
49246         checkKey(key, name);
49247     }
49248
49249     // Assign street name if entity has one..
49250     var street = obj.tags && obj.tags['addr:street'];
49251     if (street) {
49252         key = 'intro.graph.name.' + slugify(street);
49253         obj.tags['addr:street'] = t(key, { default: street });
49254         checkKey(key, street);
49255
49256         // Add address details common across walkthrough..
49257         var addrTags = [
49258             'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
49259             'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
49260         ];
49261         addrTags.forEach(function(k) {
49262             var key = 'intro.graph.' + k,
49263                 tag = 'addr:' + k,
49264                 val = obj.tags && obj.tags[tag],
49265                 str = t(key, { default: val });
49266
49267             if (str) {
49268                 if (str.match(/^<.*>$/) !== null) {
49269                     delete obj.tags[tag];
49270                 } else {
49271                     obj.tags[tag] = str;
49272                 }
49273             }
49274         });
49275     }
49276
49277     return obj;
49278 }
49279
49280
49281 // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
49282 function isMostlySquare(points) {
49283     // note: uses 15 here instead of the 12 from actionOrthogonalize because
49284     // actionOrthogonalize can actually straighten some larger angles as it iterates
49285     var threshold = 15, // degrees within right or straight
49286         lowerBound = Math.cos((90 - threshold) * Math.PI / 180),  // near right
49287         upperBound = Math.cos(threshold * Math.PI / 180),         // near straight
49288         mag;
49289
49290     for (var i = 0; i < points.length; i++) {
49291         mag = Math.abs(normalizedDotProduct(i, points));
49292         if (mag > lowerBound && mag < upperBound) {
49293             return false;
49294         }
49295     }
49296
49297     return true;
49298
49299
49300     function normalizedDotProduct(i, points) {
49301         var a = points[(i - 1 + points.length) % points.length],
49302             b = points[i],
49303             c = points[(i + 1) % points.length],
49304             p = subtractPoints(a, b),
49305             q = subtractPoints(c, b);
49306
49307         p = normalizePoint(p);
49308         q = normalizePoint(q);
49309
49310         return p[0] * q[0] + p[1] * q[1];
49311
49312
49313         function subtractPoints(a, b) {
49314             return [a[0] - b[0], a[1] - b[1]];
49315         }
49316
49317         function normalizePoint(point$$1) {
49318             var vector = [0, 0];
49319             var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
49320             if (length !== 0) {
49321                 vector[0] = point$$1[0] / length;
49322                 vector[1] = point$$1[1] / length;
49323             }
49324             return vector;
49325         }
49326     }
49327 }
49328
49329
49330 function selectMenuItem(operation) {
49331     var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
49332         ', .radial-menu .radial-menu-item-' + operation;
49333     return d3_select(selector$$1);
49334 }
49335
49336
49337 function transitionTime(point1, point2) {
49338     var distance = geoSphericalDistance(point1, point2);
49339     if (distance === 0)
49340         return 0;
49341     else if (distance < 80)
49342         return 500;
49343     else
49344         return 1000;
49345 }
49346
49347 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":"zebra","highway":"crossing"}},"n1027":{"id":"n1027","loc":[-85.634767,41.946172]},"n1028":{"id":"n1028","loc":[-85.634622,41.946175],"tags":{"crossing":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","highway":"crossing"}},"n4687":{"id":"n4687","loc":[-85.635883,41.94006]},"n4688":{"id":"n4688","loc":[-85.635768,41.940051],"tags":{"crossing":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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"}},"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":"zebra","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":"zebra","footway":"crossing","highway":"footway"}},"w162":{"id":"w162","nodes":["n727","n2411","n728"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w163":{"id":"w163","nodes":["n729","n730","n731"],"tags":{"crossing":"zebra","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":"zebra","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":"zebra","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","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","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","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","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","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","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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":"zebra","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","shelter_type":"picnic_shelters"}},"w815":{"id":"w815","nodes":["n4678","n4679","n4680","n1889"],"tags":{"highway":"service"}},"w816":{"id":"w816","nodes":["n239","n4686","n4687"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w817":{"id":"w817","nodes":["n4687","n4688","n4689"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w818":{"id":"w818","nodes":["n4689","n4690","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w819":{"id":"w819","nodes":["n2266","n4743"],"tags":{"highway":"path"}},"w82":{"id":"w82","nodes":["n724","n368","n369"],"tags":{"crossing":"zebra","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]}};
49348
49349 // Tooltips and svg mask used to highlight certain features
49350 function uiCurtain() {
49351
49352     var surface = d3_select(null),
49353         tooltip = d3_select(null),
49354         darkness = d3_select(null);
49355
49356     function curtain(selection$$1) {
49357         surface = selection$$1
49358             .append('svg')
49359             .attr('id', 'curtain')
49360             .style('z-index', 1000)
49361             .style('pointer-events', 'none')
49362             .style('position', 'absolute')
49363             .style('top', 0)
49364             .style('left', 0);
49365
49366         darkness = surface.append('path')
49367             .attr('x', 0)
49368             .attr('y', 0)
49369             .attr('class', 'curtain-darkness');
49370
49371         d3_select(window).on('resize.curtain', resize);
49372
49373         tooltip = selection$$1.append('div')
49374             .attr('class', 'tooltip')
49375             .style('z-index', 1002);
49376
49377         tooltip
49378             .append('div')
49379             .attr('class', 'tooltip-arrow');
49380
49381         tooltip
49382             .append('div')
49383             .attr('class', 'tooltip-inner');
49384
49385         resize();
49386
49387
49388         function resize() {
49389             surface
49390                 .attr('width', window.innerWidth)
49391                 .attr('height', window.innerHeight);
49392             curtain.cut(darkness.datum());
49393         }
49394     }
49395
49396
49397     /**
49398      * Reveal cuts the curtain to highlight the given box,
49399      * and shows a tooltip with instructions next to the box.
49400      *
49401      * @param  {String|ClientRect} [box]   box used to cut the curtain
49402      * @param  {String}    [text]          text for a tooltip
49403      * @param  {Object}    [options]
49404      * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
49405      * @param  {integer}   [options.duration]        transition time in milliseconds
49406      * @param  {string}    [options.buttonText]      if set, create a button with this text label
49407      * @param  {function}  [options.buttonCallback]  if set, the callback for the button
49408      * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
49409      */
49410     curtain.reveal = function(box, text, options) {
49411         if (typeof box === 'string') {
49412             box = d3_select(box).node();
49413         }
49414         if (box && box.getBoundingClientRect) {
49415             box = copyBox(box.getBoundingClientRect());
49416         }
49417
49418         options = options || {};
49419
49420         var tooltipBox;
49421         if (options.tooltipBox) {
49422             tooltipBox = options.tooltipBox;
49423             if (typeof tooltipBox === 'string') {
49424                 tooltipBox = d3_select(tooltipBox).node();
49425             }
49426             if (tooltipBox && tooltipBox.getBoundingClientRect) {
49427                 tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
49428             }
49429         } else {
49430             tooltipBox = box;
49431         }
49432
49433         if (tooltipBox && text) {
49434             // pseudo markdown bold text for the instruction section..
49435             var parts = text.split('**');
49436             var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
49437             if (parts[1]) {
49438                 html += '<span class="instruction">' + parts[1] + '</span>';
49439             }
49440
49441             html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
49442             html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
49443
49444             if (options.buttonText && options.buttonCallback) {
49445                 html += '<div class="button-section">' +
49446                     '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
49447             }
49448
49449             var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
49450             tooltip
49451                 .classed(classes, true)
49452                 .selectAll('.tooltip-inner')
49453                 .html(html);
49454
49455             if (options.buttonText && options.buttonCallback) {
49456                 var button = tooltip.selectAll('.button-section .button.action');
49457                 button
49458                     .on('click', function() {
49459                         event.preventDefault();
49460                         options.buttonCallback();
49461                     });
49462             }
49463
49464             var tip = copyBox(tooltip.node().getBoundingClientRect()),
49465                 w = window.innerWidth,
49466                 h = window.innerHeight,
49467                 tooltipWidth = 200,
49468                 tooltipArrow = 5,
49469                 side, pos;
49470
49471
49472             // hack: this will have bottom placement,
49473             // so need to reserve extra space for the tooltip illustration.
49474             if (options.tooltipClass === 'intro-mouse') {
49475                 tip.height += 80;
49476             }
49477
49478             // trim box dimensions to just the portion that fits in the window..
49479             if (tooltipBox.top + tooltipBox.height > h) {
49480                 tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
49481             }
49482             if (tooltipBox.left + tooltipBox.width > w) {
49483                 tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
49484             }
49485
49486             // determine tooltip placement..
49487
49488             if (tooltipBox.top + tooltipBox.height < 100) {
49489                 // tooltip below box..
49490                 side = 'bottom';
49491                 pos = [
49492                     tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
49493                     tooltipBox.top + tooltipBox.height
49494                 ];
49495
49496             } else if (tooltipBox.top > h - 140) {
49497                 // tooltip above box..
49498                 side = 'top';
49499                 pos = [
49500                     tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
49501                     tooltipBox.top - tip.height
49502                 ];
49503
49504             } else {
49505                 // tooltip to the side of the tooltipBox..
49506                 var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
49507
49508                 if (textDirection === 'rtl') {
49509                     if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
49510                         side = 'right';
49511                         pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
49512
49513                     } else {
49514                         side = 'left';
49515                         pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
49516                     }
49517
49518                 } else {
49519                     if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
49520                         side = 'left';
49521                         pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
49522                     }
49523                     else {
49524                         side = 'right';
49525                         pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
49526                     }
49527                 }
49528             }
49529
49530             if (options.duration !== 0 || !tooltip.classed(side)) {
49531                 tooltip.call(uiToggle(true));
49532             }
49533
49534             tooltip
49535                 .style('top', pos[1] + 'px')
49536                 .style('left', pos[0] + 'px')
49537                 .attr('class', classes + ' ' + side);
49538
49539
49540             // shift tooltip-inner if it is very close to the top or bottom edge
49541             // (doesn't affect the placement of the tooltip-arrow)
49542             var shiftY = 0;
49543             if (side === 'left' || side === 'right') {
49544                 if (pos[1] < 60) {
49545                     shiftY = 60 - pos[1];
49546                 }
49547                 else if (pos[1] + tip.height > h - 100) {
49548                     shiftY = h - pos[1] - tip.height - 100;
49549                 }
49550             }
49551             tooltip.selectAll('.tooltip-inner')
49552                 .style('top', shiftY + 'px');
49553
49554         } else {
49555             tooltip
49556                 .classed('in', false)
49557                 .call(uiToggle(false));
49558         }
49559
49560         curtain.cut(box, options.duration);
49561
49562         return tooltip;
49563     };
49564
49565
49566     curtain.cut = function(datum, duration) {
49567         darkness.datum(datum)
49568             .interrupt();
49569
49570         var selection$$1;
49571         if (duration === 0) {
49572             selection$$1 = darkness;
49573         } else {
49574             selection$$1 = darkness
49575                 .transition()
49576                 .duration(duration || 600)
49577                 .ease(linear$1);
49578         }
49579
49580         selection$$1
49581             .attr('d', function(d) {
49582                 var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
49583                     window.innerWidth + ',' + window.innerHeight + 'L' +
49584                     window.innerWidth + ',0 Z';
49585
49586                 if (!d) return string;
49587                 return string + 'M' +
49588                     d.left + ',' + d.top + 'L' +
49589                     d.left + ',' + (d.top + d.height) + 'L' +
49590                     (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
49591                     (d.left + d.width) + ',' + (d.top) + 'Z';
49592
49593             });
49594     };
49595
49596
49597     curtain.remove = function() {
49598         surface.remove();
49599         tooltip.remove();
49600         d3_select(window).on('resize.curtain', null);
49601     };
49602
49603
49604     // ClientRects are immutable, so copy them to an object,
49605     // in case we need to trim the height/width.
49606     function copyBox(src) {
49607         return {
49608             top: src.top,
49609             right: src.right,
49610             bottom: src.bottom,
49611             left: src.left,
49612             width: src.width,
49613             height: src.height
49614         };
49615     }
49616
49617
49618     return curtain;
49619 }
49620
49621 function uiIntroWelcome(context, reveal) {
49622     var dispatch$$1 = dispatch('done'),
49623         listener = clickListener();
49624
49625     var chapter = {
49626         title: 'intro.welcome.title'
49627     };
49628
49629
49630     function welcome() {
49631         context.map().centerZoom([-85.63591, 41.94285], 19);
49632         reveal('.intro-nav-wrap .chapter-welcome',
49633             t('intro.welcome.welcome'),
49634             { buttonText: t('intro.ok'), buttonCallback: practice }
49635         );
49636     }
49637
49638     function practice() {
49639         reveal('.intro-nav-wrap .chapter-welcome',
49640             t('intro.welcome.practice'),
49641             { buttonText: t('intro.ok'), buttonCallback: words }
49642         );
49643     }
49644
49645     function words() {
49646         reveal('.intro-nav-wrap .chapter-welcome',
49647             t('intro.welcome.words'),
49648             { buttonText: t('intro.ok'), buttonCallback: mouse }
49649         );
49650     }
49651
49652
49653     function mouse() {
49654         reveal('.intro-nav-wrap .chapter-welcome',
49655             t('intro.welcome.mouse'),
49656             { buttonText: t('intro.ok'), buttonCallback: leftClick }
49657         );
49658     }
49659
49660
49661     function leftClick() {
49662         var counter = 0,
49663             times = 5;
49664
49665         var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
49666             t('intro.welcome.leftclick', { num: times }),
49667             { tooltipClass: 'intro-mouse' }
49668         );
49669
49670         tooltip.selectAll('.tooltip-inner')
49671             .insert('svg', 'span')
49672             .attr('class', 'tooltip-illustration')
49673             .append('use')
49674             .attr('xlink:href', '#walkthrough-mouse');
49675
49676         tooltip
49677             .append('div')
49678             .attr('class', 'counter');
49679
49680         tooltip.call(listener);
49681
49682         listener.on('click', function(which) {
49683             if (which === 'left') {
49684                 d3_select('.curtain-tooltip.intro-mouse .counter')
49685                     .text(String(++counter));
49686
49687                 if (counter === times) {
49688                     window.setTimeout(function() { continueTo(rightClick); }, 1000);
49689                 }
49690             }
49691         });
49692
49693         function continueTo(nextStep) {
49694             listener.on('click', null);
49695             tooltip.call(listener.off);
49696             tooltip.select('.counter').remove();
49697             nextStep();
49698         }
49699     }
49700
49701
49702     function rightClick() {
49703         var counter = 0,
49704             times = 5;
49705
49706         var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
49707             t('intro.welcome.rightclick', { num: times }),
49708             { tooltipClass: 'intro-mouse' }
49709         );
49710
49711         tooltip.selectAll('.tooltip-inner')
49712             .insert('svg', 'span')
49713             .attr('class', 'tooltip-illustration')
49714             .append('use')
49715             .attr('xlink:href', '#walkthrough-mouse');
49716
49717         tooltip
49718             .append('div')
49719             .attr('class', 'counter');
49720
49721         tooltip.call(listener);
49722
49723         listener.on('click', function(which) {
49724             if (which === 'right') {
49725                 d3_select('.curtain-tooltip.intro-mouse .counter')
49726                     .text(String(++counter));
49727
49728                 if (counter === times) {
49729                     window.setTimeout(function() { continueTo(chapters); }, 1000);
49730                 }
49731             }
49732         });
49733
49734         function continueTo(nextStep) {
49735             listener.on('click', null);
49736             tooltip.call(listener.off);
49737             tooltip.select('.counter').remove();
49738             nextStep();
49739         }
49740     }
49741
49742
49743     function chapters() {
49744         dispatch$$1.call('done');
49745         reveal('.intro-nav-wrap .chapter-navigation',
49746             t('intro.welcome.chapters', { next: t('intro.navigation.title') })
49747         );
49748     }
49749
49750
49751     chapter.enter = function() {
49752         welcome();
49753     };
49754
49755
49756     chapter.exit = function() {
49757         listener.off();
49758         d3_select('.curtain-tooltip.intro-mouse')
49759             .selectAll('.counter')
49760             .remove();
49761     };
49762
49763
49764     chapter.restart = function() {
49765         chapter.exit();
49766         chapter.enter();
49767     };
49768
49769
49770     return utilRebind(chapter, dispatch$$1, 'on');
49771 }
49772
49773
49774
49775 function clickListener() {
49776     var dispatch$$1 = dispatch('click'),
49777         minTime = 120,
49778         tooltip = d3_select(null),
49779         down = {};
49780
49781     // `down` keeps track of which buttons/keys are down.
49782     // Setting a property in `down` happens immediately.
49783     // Unsetting a property in `down` is delayed because
49784     //   on Windows a contextmenu event happens after keyup/mouseup
49785
49786     function keydown() {
49787         if (event.keyCode === 93)  {   // context menu
49788             event.preventDefault();
49789             event.stopPropagation();
49790             down.menu = event.timeStamp;
49791             tooltip.classed('rightclick', true);
49792         }
49793     }
49794
49795
49796     function keyup() {
49797         if (event.keyCode === 93)  {   // context menu
49798             event.preventDefault();
49799             event.stopPropagation();
49800             var endTime = event.timeStamp,
49801                 startTime = down.menu || endTime,
49802                 delay = (endTime - startTime < minTime) ? minTime : 0;
49803
49804             window.setTimeout(function() {
49805                 tooltip.classed('rightclick', false);
49806                 down.menu = undefined;  // delayed, for Windows
49807             }, delay);
49808
49809             dispatch$$1.call('click', this, 'right');
49810         }
49811     }
49812
49813
49814     function mousedown() {
49815         var button = event.button;
49816         if (button === 0 && !event.ctrlKey) {
49817             tooltip.classed('leftclick', true);
49818         } else if (button === 2) {
49819             tooltip.classed('rightclick', true);
49820         }
49821         down[button] = event.timeStamp;
49822     }
49823
49824
49825     function mouseup() {
49826         var button = event.button,
49827             endTime = event.timeStamp,
49828             startTime = down[button] || endTime,
49829             delay = (endTime - startTime < minTime) ? minTime : 0;
49830
49831         if (button === 0 && !event.ctrlKey) {
49832             window.setTimeout(function() {
49833                 tooltip.classed('leftclick', false);
49834                 down[button] = undefined;  // delayed, for Windows
49835             }, delay);
49836
49837             dispatch$$1.call('click', this, 'left');
49838
49839         } else if (button === 2) {
49840             window.setTimeout(function() {
49841                 tooltip.classed('rightclick', false);
49842                 down[button] = undefined;  // delayed, for Windows
49843             }, delay);
49844
49845             dispatch$$1.call('click', this, 'right');
49846
49847         } else {
49848             window.setTimeout(function() {
49849                 down[button] = undefined;  // delayed, for Windows
49850             }, delay);
49851         }
49852     }
49853
49854
49855     function contextmenu() {
49856         event.preventDefault();
49857         event.stopPropagation();
49858         if (!down[2] && !down.menu) {
49859             tooltip.classed('rightclick', true);
49860             window.setTimeout(function() {
49861                 tooltip.classed('rightclick', false);
49862             }, minTime);
49863             dispatch$$1.call('click', this, 'right');
49864         }
49865     }
49866
49867
49868     var behavior = function(selection$$1) {
49869         tooltip = selection$$1;
49870         down = {};
49871
49872         d3_select(window)
49873             .on('keydown.intro', keydown)
49874             .on('keyup.intro', keyup)
49875             .on('mousedown.intro', mousedown)
49876             .on('mouseup.intro', mouseup)
49877             .on('contextmenu.intro', contextmenu);
49878     };
49879
49880
49881     behavior.off = function() {
49882         d3_select(window)
49883             .on('keydown.intro', null)
49884             .on('keyup.intro', null)
49885             .on('mousedown.intro', null)
49886             .on('mouseup.intro', null)
49887             .on('contextmenu.intro', null);
49888
49889         tooltip
49890             .classed('leftclick', false)
49891             .classed('rightclick', false);
49892     };
49893
49894     return utilRebind(behavior, dispatch$$1, 'on');
49895 }
49896
49897 function uiIntroNavigation(context, reveal) {
49898     var dispatch$$1 = dispatch('done'),
49899         timeouts = [],
49900         hallId = 'n2061',
49901         townHall = [-85.63591, 41.94285],
49902         springStreetId = 'w397',
49903         springStreetEndId = 'n1834',
49904         springStreet = [-85.63582, 41.94255],
49905         onewayField = context.presets().field('oneway'),
49906         maxspeedField = context.presets().field('maxspeed');
49907
49908
49909     var chapter = {
49910         title: 'intro.navigation.title'
49911     };
49912
49913
49914     function timeout(f, t$$1) {
49915         timeouts.push(window.setTimeout(f, t$$1));
49916     }
49917
49918
49919     function eventCancel() {
49920         event.stopPropagation();
49921         event.preventDefault();
49922     }
49923
49924
49925     function isTownHallSelected() {
49926         var ids = context.selectedIDs();
49927         return ids.length === 1 && ids[0] === hallId;
49928     }
49929
49930
49931     function dragMap() {
49932         context.enter(modeBrowse(context));
49933         context.history().reset('initial');
49934
49935         var msec = transitionTime(townHall, context.map().center());
49936         if (msec) { reveal(null, null, { duration: 0 }); }
49937         context.map().zoom(19).centerEase(townHall, msec);
49938
49939         timeout(function() {
49940             var centerStart = context.map().center();
49941
49942             reveal('#surface', t('intro.navigation.drag'));
49943             context.map().on('drawn.intro', function() {
49944                 reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
49945             });
49946
49947             context.map().on('move.intro', function() {
49948                 var centerNow = context.map().center();
49949                 if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
49950                     context.map().on('move.intro', null);
49951                     timeout(function() { continueTo(zoomMap); }, 3000);
49952                 }
49953             });
49954
49955         }, msec + 100);
49956
49957         function continueTo(nextStep) {
49958             context.map().on('move.intro drawn.intro', null);
49959             nextStep();
49960         }
49961     }
49962
49963
49964     function zoomMap() {
49965         var zoomStart = context.map().zoom();
49966
49967         reveal('#surface',
49968             t('intro.navigation.zoom', {
49969                 plus: icon('#icon-plus', 'pre-text'),
49970                 minus: icon('#icon-minus', 'pre-text')
49971             })
49972         );
49973
49974         context.map().on('drawn.intro', function() {
49975             reveal('#surface',
49976                 t('intro.navigation.zoom', {
49977                     plus: icon('#icon-plus', 'pre-text'),
49978                     minus: icon('#icon-minus', 'pre-text')
49979                 }), { duration: 0 }
49980             );
49981         });
49982
49983         context.map().on('move.intro', function() {
49984             if (context.map().zoom() !== zoomStart) {
49985                 context.map().on('move.intro', null);
49986                 timeout(function() { continueTo(features); }, 3000);
49987             }
49988         });
49989
49990         function continueTo(nextStep) {
49991             context.map().on('move.intro drawn.intro', null);
49992             nextStep();
49993         }
49994     }
49995
49996
49997     function features() {
49998         var onClick = function() { continueTo(pointsLinesAreas); };
49999
50000         reveal('#surface', t('intro.navigation.features'),
50001             { buttonText: t('intro.ok'), buttonCallback: onClick }
50002         );
50003
50004         context.map().on('drawn.intro', function() {
50005             reveal('#surface', t('intro.navigation.features'),
50006                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50007             );
50008         });
50009
50010         function continueTo(nextStep) {
50011             context.map().on('drawn.intro', null);
50012             nextStep();
50013         }
50014     }
50015
50016     function pointsLinesAreas() {
50017         var onClick = function() { continueTo(nodesWays); };
50018
50019         reveal('#surface', t('intro.navigation.points_lines_areas'),
50020             { buttonText: t('intro.ok'), buttonCallback: onClick }
50021         );
50022
50023         context.map().on('drawn.intro', function() {
50024             reveal('#surface', t('intro.navigation.points_lines_areas'),
50025                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50026             );
50027         });
50028
50029         function continueTo(nextStep) {
50030             context.map().on('drawn.intro', null);
50031             nextStep();
50032         }
50033     }
50034
50035     function nodesWays() {
50036         var onClick = function() { continueTo(clickTownHall); };
50037
50038         reveal('#surface', t('intro.navigation.nodes_ways'),
50039             { buttonText: t('intro.ok'), buttonCallback: onClick }
50040         );
50041
50042         context.map().on('drawn.intro', function() {
50043             reveal('#surface', t('intro.navigation.nodes_ways'),
50044                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50045             );
50046         });
50047
50048         function continueTo(nextStep) {
50049             context.map().on('drawn.intro', null);
50050             nextStep();
50051         }
50052     }
50053
50054     function clickTownHall() {
50055         context.enter(modeBrowse(context));
50056         context.history().reset('initial');
50057
50058         reveal(null, null, { duration: 0 });
50059         context.map().zoomEase(19, 500);
50060
50061         timeout(function() {
50062             var entity = context.hasEntity(hallId);
50063             if (!entity) return;
50064             context.map().centerEase(entity.loc, 500);
50065
50066             timeout(function() {
50067                 var entity = context.hasEntity(hallId);
50068                 if (!entity) return;
50069                 var box = pointBox(entity.loc, context);
50070                 reveal(box, t('intro.navigation.click_townhall'));
50071
50072                 context.map().on('move.intro drawn.intro', function() {
50073                     var entity = context.hasEntity(hallId);
50074                     if (!entity) return;
50075                     var box = pointBox(entity.loc, context);
50076                     reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
50077                 });
50078
50079                 context.on('enter.intro', function() {
50080                     if (isTownHallSelected()) continueTo(selectedTownHall);
50081                 });
50082
50083             }, 550);  // after centerEase
50084
50085         }, 550); // after zoomEase
50086
50087         context.history().on('change.intro', function() {
50088             if (!context.hasEntity(hallId)) {
50089                 continueTo(clickTownHall);
50090             }
50091         });
50092
50093         function continueTo(nextStep) {
50094             context.on('enter.intro', null);
50095             context.map().on('move.intro drawn.intro', null);
50096             context.history().on('change.intro', null);
50097             nextStep();
50098         }
50099     }
50100
50101
50102     function selectedTownHall() {
50103         if (!isTownHallSelected()) return clickTownHall();
50104
50105         var entity = context.hasEntity(hallId);
50106         if (!entity) return clickTownHall();
50107
50108         var box = pointBox(entity.loc, context);
50109         var onClick = function() { continueTo(editorTownHall); };
50110
50111         reveal(box, t('intro.navigation.selected_townhall'),
50112             { buttonText: t('intro.ok'), buttonCallback: onClick }
50113         );
50114
50115         context.map().on('move.intro drawn.intro', function() {
50116             var entity = context.hasEntity(hallId);
50117             if (!entity) return;
50118             var box = pointBox(entity.loc, context);
50119             reveal(box, t('intro.navigation.selected_townhall'),
50120                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50121             );
50122         });
50123
50124         context.history().on('change.intro', function() {
50125             if (!context.hasEntity(hallId)) {
50126                 continueTo(clickTownHall);
50127             }
50128         });
50129
50130         function continueTo(nextStep) {
50131             context.map().on('move.intro drawn.intro', null);
50132             context.history().on('change.intro', null);
50133             nextStep();
50134         }
50135     }
50136
50137
50138     function editorTownHall() {
50139         if (!isTownHallSelected()) return clickTownHall();
50140
50141         // disallow scrolling
50142         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50143
50144         var onClick = function() { continueTo(presetTownHall); };
50145
50146         reveal('.entity-editor-pane',
50147             t('intro.navigation.editor_townhall'),
50148             { buttonText: t('intro.ok'), buttonCallback: onClick }
50149         );
50150
50151         context.on('exit.intro', function() {
50152             continueTo(clickTownHall);
50153         });
50154
50155         context.history().on('change.intro', function() {
50156             if (!context.hasEntity(hallId)) {
50157                 continueTo(clickTownHall);
50158             }
50159         });
50160
50161         function continueTo(nextStep) {
50162             context.on('exit.intro', null);
50163             context.history().on('change.intro', null);
50164             d3_select('.inspector-wrap').on('wheel.intro', null);
50165             nextStep();
50166         }
50167     }
50168
50169
50170     function presetTownHall() {
50171         if (!isTownHallSelected()) return clickTownHall();
50172
50173         // reset pane, in case user happened to change it..
50174         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50175         // disallow scrolling
50176         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50177
50178         // preset match, in case the user happened to change it.
50179         var entity = context.entity(context.selectedIDs()[0]);
50180         var preset = context.presets().match(entity, context.graph());
50181
50182         var onClick = function() { continueTo(fieldsTownHall); };
50183
50184         context.on('exit.intro', function() {
50185             continueTo(clickTownHall);
50186         });
50187
50188         context.history().on('change.intro', function() {
50189             if (!context.hasEntity(hallId)) {
50190                 continueTo(clickTownHall);
50191             }
50192         });
50193
50194         reveal('.inspector-body .preset-list-item.inspector-inner',
50195             t('intro.navigation.preset_townhall', { preset: preset.name() }),
50196             { buttonText: t('intro.ok'), buttonCallback: onClick }
50197         );
50198
50199         function continueTo(nextStep) {
50200             context.on('exit.intro', null);
50201             context.history().on('change.intro', null);
50202             d3_select('.inspector-wrap').on('wheel.intro', null);
50203             nextStep();
50204         }
50205     }
50206
50207
50208     function fieldsTownHall() {
50209         if (!isTownHallSelected()) return clickTownHall();
50210
50211         // reset pane, in case user happened to change it..
50212         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50213         // disallow scrolling
50214         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50215
50216         var onClick = function() { continueTo(closeTownHall); };
50217
50218         reveal('.inspector-body .preset-editor',
50219             t('intro.navigation.fields_townhall'),
50220             { buttonText: t('intro.ok'), buttonCallback: onClick }
50221         );
50222
50223         context.on('exit.intro', function() {
50224             continueTo(clickTownHall);
50225         });
50226
50227         context.history().on('change.intro', function() {
50228             if (!context.hasEntity(hallId)) {
50229                 continueTo(clickTownHall);
50230             }
50231         });
50232
50233         function continueTo(nextStep) {
50234             context.on('exit.intro', null);
50235             context.history().on('change.intro', null);
50236             d3_select('.inspector-wrap').on('wheel.intro', null);
50237             nextStep();
50238         }
50239     }
50240
50241
50242     function closeTownHall() {
50243         if (!isTownHallSelected()) return clickTownHall();
50244
50245         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50246         var href = d3_select(selector$$1).attr('href') || '#icon-close';
50247
50248         reveal('.entity-editor-pane',
50249             t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
50250         );
50251
50252         context.on('exit.intro', function() {
50253             continueTo(searchStreet);
50254         });
50255
50256         context.history().on('change.intro', function() {
50257             // update the close icon in the tooltip if the user edits something.
50258             var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50259             var href = d3_select(selector$$1).attr('href') || '#icon-close';
50260
50261             reveal('.entity-editor-pane',
50262                 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
50263                 { duration: 0 }
50264             );
50265         });
50266
50267         function continueTo(nextStep) {
50268             context.on('exit.intro', null);
50269             context.history().on('change.intro', null);
50270             nextStep();
50271         }
50272     }
50273
50274
50275     function searchStreet() {
50276         context.enter(modeBrowse(context));
50277         context.history().reset('initial');  // ensure spring street exists
50278
50279         var msec = transitionTime(springStreet, context.map().center());
50280         if (msec) { reveal(null, null, { duration: 0 }); }
50281         context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
50282
50283         timeout(function() {
50284             reveal('.search-header input',
50285                 t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
50286             );
50287
50288             d3_select('.search-header input')
50289                 .on('keyup.intro', checkSearchResult);
50290         }, msec + 100);
50291     }
50292
50293
50294     function checkSearchResult() {
50295         var first = d3_select('.feature-list-item:nth-child(0n+2)'),  // skip "No Results" item
50296             firstName = first.select('.entity-name'),
50297             name = t('intro.graph.name.spring-street');
50298
50299         if (!firstName.empty() && firstName.text() === name) {
50300             reveal(first.node(),
50301                 t('intro.navigation.choose_street', { name: name }),
50302                 { duration: 300 }
50303             );
50304
50305             context.on('exit.intro', function() {
50306                 continueTo(selectedStreet);
50307             });
50308
50309             d3_select('.search-header input')
50310                 .on('keydown.intro', eventCancel, true)
50311                 .on('keyup.intro', null);
50312         }
50313
50314         function continueTo(nextStep) {
50315             context.on('exit.intro', null);
50316             d3_select('.search-header input')
50317                 .on('keydown.intro', null)
50318                 .on('keyup.intro', null);
50319             nextStep();
50320         }
50321     }
50322
50323
50324     function selectedStreet() {
50325         if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
50326             return searchStreet();
50327         }
50328
50329         var onClick = function() { continueTo(editorStreet); };
50330         var entity = context.entity(springStreetEndId);
50331         var box = pointBox(entity.loc, context);
50332         box.height = 500;
50333
50334         reveal(box,
50335             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
50336             { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
50337         );
50338
50339         timeout(function() {
50340             context.map().on('move.intro drawn.intro', function() {
50341                 var entity = context.hasEntity(springStreetEndId);
50342                 if (!entity) return;
50343                 var box = pointBox(entity.loc, context);
50344                 box.height = 500;
50345                 reveal(box,
50346                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
50347                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50348                 );
50349             });
50350         }, 600);  // after reveal.
50351
50352         context.on('enter.intro', function(mode) {
50353             if (!context.hasEntity(springStreetId)) {
50354                 return continueTo(searchStreet);
50355             }
50356             var ids = context.selectedIDs();
50357             if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
50358                 // keep Spring Street selected..
50359                 context.enter(modeSelect(context, [springStreetId]));
50360             }
50361         });
50362
50363         context.history().on('change.intro', function() {
50364             if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
50365                 timeout(function() {
50366                     continueTo(searchStreet);
50367                 }, 300);  // after any transition (e.g. if user deleted intersection)
50368             }
50369         });
50370
50371         function continueTo(nextStep) {
50372             context.map().on('move.intro drawn.intro', null);
50373             context.on('enter.intro', null);
50374             context.history().on('change.intro', null);
50375             nextStep();
50376         }
50377     }
50378
50379
50380     function editorStreet() {
50381         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50382         var href = d3_select(selector$$1).attr('href') || '#icon-close';
50383
50384         reveal('.entity-editor-pane',
50385             t('intro.navigation.editor_street', {
50386                 button: icon(href, 'pre-text'),
50387                 field1: onewayField.label(),
50388                 field2: maxspeedField.label()
50389             })
50390         );
50391
50392         context.on('exit.intro', function() {
50393             continueTo(play);
50394         });
50395
50396         context.history().on('change.intro', function() {
50397             // update the close icon in the tooltip if the user edits something.
50398             var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50399             var href = d3_select(selector$$1).attr('href') || '#icon-close';
50400
50401             reveal('.entity-editor-pane',
50402                 t('intro.navigation.editor_street', {
50403                     button: icon(href, 'pre-text'),
50404                     field1: onewayField.label().toLowerCase(),
50405                     field2: maxspeedField.label().toLowerCase()
50406                 }), { duration: 0 }
50407             );
50408         });
50409
50410         function continueTo(nextStep) {
50411             context.on('exit.intro', null);
50412             context.history().on('change.intro', null);
50413             nextStep();
50414         }
50415     }
50416
50417
50418     function play() {
50419         dispatch$$1.call('done');
50420         reveal('#id-container',
50421             t('intro.navigation.play', { next: t('intro.points.title') }), {
50422                 tooltipBox: '.intro-nav-wrap .chapter-point',
50423                 buttonText: t('intro.ok'),
50424                 buttonCallback: function() { reveal('#id-container'); }
50425             }
50426         );
50427     }
50428
50429
50430     chapter.enter = function() {
50431         dragMap();
50432     };
50433
50434
50435     chapter.exit = function() {
50436         timeouts.forEach(window.clearTimeout);
50437         context.on('enter.intro exit.intro', null);
50438         context.map().on('move.intro drawn.intro', null);
50439         context.history().on('change.intro', null);
50440         d3_select('.inspector-wrap').on('wheel.intro', null);
50441         d3_select('.search-header input').on('keydown.intro keyup.intro', null);
50442     };
50443
50444
50445     chapter.restart = function() {
50446         chapter.exit();
50447         chapter.enter();
50448     };
50449
50450
50451     return utilRebind(chapter, dispatch$$1, 'on');
50452 }
50453
50454 function uiIntroPoint(context, reveal) {
50455     var dispatch$$1 = dispatch('done'),
50456         timeouts = [],
50457         intersection = [-85.63279, 41.94394],
50458         building = [-85.632422, 41.944045],
50459         cafePreset = context.presets().item('amenity/cafe'),
50460         pointId = null;
50461
50462
50463     var chapter = {
50464         title: 'intro.points.title'
50465     };
50466
50467
50468     function timeout(f, t$$1) {
50469         timeouts.push(window.setTimeout(f, t$$1));
50470     }
50471
50472
50473     function revealEditMenu(loc, text, options) {
50474         var rect = context.surfaceRect();
50475         var point$$1 = context.curtainProjection(loc);
50476         var pad = 40;
50477         var width = 250 + (2 * pad);
50478         var height = 250;
50479         var startX = rect.left + point$$1[0];
50480         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
50481         var box = {
50482             left: left,
50483             top: point$$1[1] + rect.top - 60,
50484             width: width,
50485             height: height
50486         };
50487         reveal(box, text, options);
50488     }
50489
50490
50491     function eventCancel() {
50492         event.stopPropagation();
50493         event.preventDefault();
50494     }
50495
50496
50497     function addPoint() {
50498         context.enter(modeBrowse(context));
50499         context.history().reset('initial');
50500
50501         var msec = transitionTime(intersection, context.map().center());
50502         if (msec) { reveal(null, null, { duration: 0 }); }
50503         context.map().zoom(19).centerEase(intersection, msec);
50504
50505         timeout(function() {
50506             var tooltip = reveal('button.add-point',
50507                 t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
50508
50509             pointId = null;
50510
50511             tooltip.selectAll('.tooltip-inner')
50512                 .insert('svg', 'span')
50513                 .attr('class', 'tooltip-illustration')
50514                 .append('use')
50515                 .attr('xlink:href', '#poi-images');
50516
50517             context.on('enter.intro', function(mode) {
50518                 if (mode.id !== 'add-point') return;
50519                 continueTo(placePoint);
50520             });
50521         }, msec + 100);
50522
50523         function continueTo(nextStep) {
50524             context.on('enter.intro', null);
50525             nextStep();
50526         }
50527     }
50528
50529
50530     function placePoint() {
50531         if (context.mode().id !== 'add-point') {
50532             return chapter.restart();
50533         }
50534
50535         var pointBox$$1 = pad$1(building, 150, context);
50536         reveal(pointBox$$1, t('intro.points.place_point'));
50537
50538         context.map().on('move.intro drawn.intro', function() {
50539             pointBox$$1 = pad$1(building, 150, context);
50540             reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
50541         });
50542
50543         context.on('enter.intro', function(mode) {
50544             if (mode.id !== 'select') return chapter.restart();
50545             pointId = context.mode().selectedIDs()[0];
50546             continueTo(searchPreset);
50547         });
50548
50549         function continueTo(nextStep) {
50550             context.map().on('move.intro drawn.intro', null);
50551             context.on('enter.intro', null);
50552             nextStep();
50553         }
50554     }
50555
50556
50557     function searchPreset() {
50558         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50559             return addPoint();
50560         }
50561
50562         // disallow scrolling
50563         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50564
50565         d3_select('.preset-search-input')
50566             .on('keydown.intro', null)
50567             .on('keyup.intro', checkPresetSearch);
50568
50569         reveal('.preset-search-input',
50570             t('intro.points.search_cafe', { preset: cafePreset.name() })
50571         );
50572
50573         context.on('enter.intro', function(mode) {
50574             if (!pointId || !context.hasEntity(pointId)) {
50575                 return continueTo(addPoint);
50576             }
50577
50578             var ids = context.selectedIDs();
50579             if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
50580                 // keep the user's point selected..
50581                 context.enter(modeSelect(context, [pointId]));
50582
50583                 // disallow scrolling
50584                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50585
50586                 d3_select('.preset-search-input')
50587                     .on('keydown.intro', null)
50588                     .on('keyup.intro', checkPresetSearch);
50589
50590                 reveal('.preset-search-input',
50591                     t('intro.points.search_cafe', { preset: cafePreset.name() })
50592                 );
50593
50594                 context.history().on('change.intro', null);
50595             }
50596         });
50597
50598
50599         function checkPresetSearch() {
50600             var first = d3_select('.preset-list-item:first-child');
50601
50602             if (first.classed('preset-amenity-cafe')) {
50603                 d3_select('.preset-search-input')
50604                     .on('keydown.intro', eventCancel, true)
50605                     .on('keyup.intro', null);
50606
50607                 reveal(first.select('.preset-list-button').node(),
50608                     t('intro.points.choose_cafe', { preset: cafePreset.name() }),
50609                     { duration: 300 }
50610                 );
50611
50612                 context.history().on('change.intro', function() {
50613                     continueTo(aboutFeatureEditor);
50614                 });
50615             }
50616         }
50617
50618         function continueTo(nextStep) {
50619             context.on('enter.intro', null);
50620             context.history().on('change.intro', null);
50621             d3_select('.inspector-wrap').on('wheel.intro', null);
50622             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
50623             nextStep();
50624         }
50625     }
50626
50627
50628     function aboutFeatureEditor() {
50629         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50630             return addPoint();
50631         }
50632
50633         timeout(function() {
50634             reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
50635                 tooltipClass: 'intro-points-describe',
50636                 buttonText: t('intro.ok'),
50637                 buttonCallback: function() { continueTo(addName); }
50638             });
50639         }, 400);
50640
50641         context.on('exit.intro', function() {
50642             // if user leaves select mode here, just continue with the tutorial.
50643             continueTo(reselectPoint);
50644         });
50645
50646         function continueTo(nextStep) {
50647             context.on('exit.intro', null);
50648             nextStep();
50649         }
50650     }
50651
50652
50653     function addName() {
50654         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50655             return addPoint();
50656         }
50657
50658         // reset pane, in case user happened to change it..
50659         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50660
50661         timeout(function() {
50662             // It's possible for the user to add a name in a previous step..
50663             // If so, don't tell them to add the name in this step.
50664             // Give them an OK button instead.
50665             var entity = context.entity(pointId);
50666             if (entity.tags.name) {
50667                 var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
50668                     tooltipClass: 'intro-points-describe',
50669                     buttonText: t('intro.ok'),
50670                     buttonCallback: function() { continueTo(addCloseEditor); }
50671                 });
50672                 tooltip.select('.instruction').style('display', 'none');
50673
50674             } else {
50675                 reveal('.entity-editor-pane', t('intro.points.add_name'),
50676                     { tooltipClass: 'intro-points-describe' }
50677                 );
50678             }
50679         }, 400);
50680
50681         context.history().on('change.intro', function() {
50682             continueTo(addCloseEditor);
50683         });
50684
50685         context.on('exit.intro', function() {
50686             // if user leaves select mode here, just continue with the tutorial.
50687             continueTo(reselectPoint);
50688         });
50689
50690         function continueTo(nextStep) {
50691             context.on('exit.intro', null);
50692             context.history().on('change.intro', null);
50693             nextStep();
50694         }
50695     }
50696
50697
50698     function addCloseEditor() {
50699         // reset pane, in case user happened to change it..
50700         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50701
50702         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50703         var href = d3_select(selector$$1).attr('href') || '#icon-close';
50704
50705         context.on('exit.intro', function() {
50706             continueTo(reselectPoint);
50707         });
50708
50709         reveal('.entity-editor-pane',
50710             t('intro.points.add_close', { button: icon(href, 'pre-text') })
50711         );
50712
50713         function continueTo(nextStep) {
50714             context.on('exit.intro', null);
50715             nextStep();
50716         }
50717     }
50718
50719
50720     function reselectPoint() {
50721         if (!pointId) return chapter.restart();
50722         var entity = context.hasEntity(pointId);
50723         if (!entity) return chapter.restart();
50724
50725         // make sure it's still a cafe, in case user somehow changed it..
50726         var oldPreset = context.presets().match(entity, context.graph());
50727         context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
50728
50729         context.enter(modeBrowse(context));
50730
50731         var msec = transitionTime(entity.loc, context.map().center());
50732         if (msec) { reveal(null, null, { duration: 0 }); }
50733         context.map().centerEase(entity.loc, msec);
50734
50735         timeout(function() {
50736             var box = pointBox(entity.loc, context);
50737             reveal(box, t('intro.points.reselect'), { duration: 600 });
50738
50739             timeout(function() {
50740                 context.map().on('move.intro drawn.intro', function() {
50741                     var entity = context.hasEntity(pointId);
50742                     if (!entity) return chapter.restart();
50743                     var box = pointBox(entity.loc, context);
50744                     reveal(box, t('intro.points.reselect'), { duration: 0 });
50745                 });
50746             }, 600); // after reveal..
50747
50748             context.on('enter.intro', function(mode) {
50749                 if (mode.id !== 'select') return;
50750                 continueTo(updatePoint);
50751             });
50752
50753         }, msec + 100);
50754
50755         function continueTo(nextStep) {
50756             context.map().on('move.intro drawn.intro', null);
50757             context.on('enter.intro', null);
50758             nextStep();
50759         }
50760     }
50761
50762
50763     function updatePoint() {
50764         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50765             return continueTo(reselectPoint);
50766         }
50767
50768         // reset pane, in case user happened to untag the point..
50769         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50770
50771         context.on('exit.intro', function() {
50772             continueTo(reselectPoint);
50773         });
50774
50775         context.history().on('change.intro', function() {
50776             continueTo(updateCloseEditor);
50777         });
50778
50779         timeout(function() {
50780             reveal('.entity-editor-pane', t('intro.points.update'),
50781                 { tooltipClass: 'intro-points-describe' }
50782             );
50783         }, 400);
50784
50785         function continueTo(nextStep) {
50786             context.on('exit.intro', null);
50787             context.history().on('change.intro', null);
50788             nextStep();
50789         }
50790     }
50791
50792
50793     function updateCloseEditor() {
50794         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50795             return continueTo(reselectPoint);
50796         }
50797
50798         // reset pane, in case user happened to change it..
50799         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50800
50801         context.on('exit.intro', function() {
50802             continueTo(rightClickPoint);
50803         });
50804
50805         timeout(function() {
50806             reveal('.entity-editor-pane',
50807                 t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
50808             );
50809         }, 500);
50810
50811         function continueTo(nextStep) {
50812             context.on('exit.intro', null);
50813             nextStep();
50814         }
50815     }
50816
50817
50818     function rightClickPoint() {
50819         if (!pointId) return chapter.restart();
50820         var entity = context.hasEntity(pointId);
50821         if (!entity) return chapter.restart();
50822
50823         context.enter(modeBrowse(context));
50824
50825         var box = pointBox(entity.loc, context);
50826         reveal(box, t('intro.points.rightclick'), { duration: 600 });
50827
50828         timeout(function() {
50829             context.map().on('move.intro drawn.intro', function() {
50830                 var entity = context.hasEntity(pointId);
50831                 if (!entity) return chapter.restart();
50832                 var box = pointBox(entity.loc, context);
50833                 reveal(box, t('intro.points.rightclick'), { duration: 0 });
50834             });
50835         }, 600); // after reveal
50836
50837         context.on('enter.intro', function(mode) {
50838             if (mode.id !== 'select') return;
50839             var ids = context.selectedIDs();
50840             if (ids.length !== 1 || ids[0] !== pointId) return;
50841
50842             timeout(function() {
50843                 var node = selectMenuItem('delete').node();
50844                 if (!node) return;
50845                 continueTo(enterDelete);
50846             }, 300);  // after menu visible
50847         });
50848
50849         function continueTo(nextStep) {
50850             context.on('enter.intro', null);
50851             context.map().on('move.intro drawn.intro', null);
50852             nextStep();
50853         }
50854     }
50855
50856
50857     function enterDelete() {
50858         if (!pointId) return chapter.restart();
50859         var entity = context.hasEntity(pointId);
50860         if (!entity) return chapter.restart();
50861
50862         var node = selectMenuItem('delete').node();
50863         if (!node) { return continueTo(rightClickPoint); }
50864
50865         revealEditMenu(entity.loc,
50866             t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
50867         );
50868
50869         timeout(function() {
50870             context.map().on('move.intro drawn.intro', function() {
50871                 revealEditMenu(entity.loc,
50872                     t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
50873                     { duration: 0}
50874                 );
50875             });
50876         }, 300); // after menu visible
50877
50878         context.on('exit.intro', function() {
50879             if (!pointId) return chapter.restart();
50880             var entity = context.hasEntity(pointId);
50881             if (entity) return continueTo(rightClickPoint);  // point still exists
50882         });
50883
50884         context.history().on('change.intro', function(changed) {
50885             if (changed.deleted().length) {
50886                 continueTo(undo);
50887             }
50888         });
50889
50890         function continueTo(nextStep) {
50891             context.map().on('move.intro drawn.intro', null);
50892             context.history().on('change.intro', null);
50893             context.on('exit.intro', null);
50894             nextStep();
50895         }
50896     }
50897
50898
50899     function undo() {
50900         context.history().on('change.intro', function() {
50901             continueTo(play);
50902         });
50903
50904         var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
50905         reveal('#bar button.undo-button',
50906             t('intro.points.undo', { button: icon(iconName, 'pre-text') })
50907         );
50908
50909         function continueTo(nextStep) {
50910             context.history().on('change.intro', null);
50911             nextStep();
50912         }
50913     }
50914
50915
50916     function play() {
50917         dispatch$$1.call('done');
50918         reveal('#id-container',
50919             t('intro.points.play', { next: t('intro.areas.title') }), {
50920                 tooltipBox: '.intro-nav-wrap .chapter-area',
50921                 buttonText: t('intro.ok'),
50922                 buttonCallback: function() { reveal('#id-container'); }
50923             }
50924         );
50925     }
50926
50927
50928     chapter.enter = function() {
50929         addPoint();
50930     };
50931
50932
50933     chapter.exit = function() {
50934         timeouts.forEach(window.clearTimeout);
50935         context.on('enter.intro exit.intro', null);
50936         context.map().on('move.intro drawn.intro', null);
50937         context.history().on('change.intro', null);
50938         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50939         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
50940     };
50941
50942
50943     chapter.restart = function() {
50944         chapter.exit();
50945         chapter.enter();
50946     };
50947
50948
50949     return utilRebind(chapter, dispatch$$1, 'on');
50950 }
50951
50952 function uiIntroArea(context, reveal) {
50953     var dispatch$$1 = dispatch('done'),
50954         playground = [-85.63552, 41.94159],
50955         playgroundPreset = context.presets().item('leisure/playground'),
50956         descriptionField = context.presets().field('description'),
50957         timeouts = [],
50958         areaId;
50959
50960
50961     var chapter = {
50962         title: 'intro.areas.title'
50963     };
50964
50965
50966     function timeout(f, t$$1) {
50967         timeouts.push(window.setTimeout(f, t$$1));
50968     }
50969
50970
50971     function eventCancel() {
50972         event.stopPropagation();
50973         event.preventDefault();
50974     }
50975
50976
50977     function revealPlayground(center, text, options) {
50978         var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
50979         var box = pad$1(center, padding, context);
50980         reveal(box, text, options);
50981     }
50982
50983
50984     function addArea() {
50985         context.enter(modeBrowse(context));
50986         context.history().reset('initial');
50987         areaId = null;
50988
50989         var msec = transitionTime(playground, context.map().center());
50990         if (msec) { reveal(null, null, { duration: 0 }); }
50991         context.map().zoom(19).centerEase(playground, msec);
50992
50993         timeout(function() {
50994             var tooltip = reveal('button.add-area',
50995                 t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
50996
50997             tooltip.selectAll('.tooltip-inner')
50998                 .insert('svg', 'span')
50999                 .attr('class', 'tooltip-illustration')
51000                 .append('use')
51001                 .attr('xlink:href', '#landuse-images');
51002
51003             context.on('enter.intro', function(mode) {
51004                 if (mode.id !== 'add-area') return;
51005                 continueTo(startPlayground);
51006             });
51007         }, msec + 100);
51008
51009         function continueTo(nextStep) {
51010             context.on('enter.intro', null);
51011             nextStep();
51012         }
51013     }
51014
51015
51016     function startPlayground() {
51017         if (context.mode().id !== 'add-area') {
51018             return chapter.restart();
51019         }
51020
51021         areaId = null;
51022         context.map().zoomEase(19.5, 500);
51023
51024         timeout(function() {
51025             revealPlayground(playground,
51026                 t('intro.areas.start_playground'), { duration: 250 }
51027             );
51028
51029             timeout(function() {
51030                 context.map().on('move.intro drawn.intro', function() {
51031                     revealPlayground(playground,
51032                         t('intro.areas.start_playground'), { duration: 0 }
51033                     );
51034                 });
51035                 context.on('enter.intro', function(mode) {
51036                     if (mode.id !== 'draw-area') return chapter.restart();
51037                     continueTo(continuePlayground);
51038                 });
51039             }, 250);  // after reveal
51040
51041         }, 550);  // after easing
51042
51043         function continueTo(nextStep) {
51044             context.map().on('move.intro drawn.intro', null);
51045             context.on('enter.intro', null);
51046             nextStep();
51047         }
51048     }
51049
51050
51051     function continuePlayground() {
51052         if (context.mode().id !== 'draw-area') {
51053             return chapter.restart();
51054         }
51055
51056         areaId = null;
51057         revealPlayground(playground,
51058             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51059             { duration: 250 }
51060         );
51061
51062         timeout(function() {
51063             context.map().on('move.intro drawn.intro', function() {
51064                 revealPlayground(playground,
51065                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51066                     { duration: 0 }
51067                 );
51068             });
51069         }, 250);  // after reveal
51070
51071         context.on('enter.intro', function(mode) {
51072             if (mode.id === 'draw-area') {
51073                 var entity = context.hasEntity(context.selectedIDs()[0]);
51074                 if (entity && entity.nodes.length >= 6) {
51075                     return continueTo(finishPlayground);
51076                 } else {
51077                     return;
51078                 }
51079             } else if (mode.id === 'select') {
51080                 areaId = context.selectedIDs()[0];
51081                 return continueTo(searchPresets);
51082             } else {
51083                 return chapter.restart();
51084             }
51085         });
51086
51087         function continueTo(nextStep) {
51088             context.map().on('move.intro drawn.intro', null);
51089             context.on('enter.intro', null);
51090             nextStep();
51091         }
51092     }
51093
51094
51095     function finishPlayground() {
51096         if (context.mode().id !== 'draw-area') {
51097             return chapter.restart();
51098         }
51099
51100         areaId = null;
51101         revealPlayground(playground,
51102             t('intro.areas.finish_playground'), { duration: 250 }
51103         );
51104
51105         timeout(function() {
51106             context.map().on('move.intro drawn.intro', function() {
51107                 revealPlayground(playground,
51108                     t('intro.areas.finish_playground'), { duration: 0 }
51109                 );
51110             });
51111         }, 250);  // after reveal
51112
51113         context.on('enter.intro', function(mode) {
51114             if (mode.id === 'draw-area') {
51115                 return;
51116             } else if (mode.id === 'select') {
51117                 areaId = context.selectedIDs()[0];
51118                 return continueTo(searchPresets);
51119             } else {
51120                 return chapter.restart();
51121             }
51122         });
51123
51124         function continueTo(nextStep) {
51125             context.map().on('move.intro drawn.intro', null);
51126             context.on('enter.intro', null);
51127             nextStep();
51128         }
51129     }
51130
51131
51132     function searchPresets() {
51133         if (!areaId || !context.hasEntity(areaId)) {
51134             return addArea();
51135         }
51136         var ids = context.selectedIDs();
51137         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51138             context.enter(modeSelect(context, [areaId]));
51139         }
51140
51141         // disallow scrolling
51142         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51143
51144         timeout(function() {
51145             // reset pane, in case user somehow happened to change it..
51146             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51147
51148             d3_select('.preset-search-input')
51149                 .on('keydown.intro', null)
51150                 .on('keyup.intro', checkPresetSearch);
51151
51152             reveal('.preset-search-input',
51153                 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51154             );
51155         }, 400);  // after preset list pane visible..
51156
51157         context.on('enter.intro', function(mode) {
51158             if (!areaId || !context.hasEntity(areaId)) {
51159                 return continueTo(addArea);
51160             }
51161
51162             var ids = context.selectedIDs();
51163             if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
51164                 // keep the user's area selected..
51165                 context.enter(modeSelect(context, [areaId]));
51166
51167                 // reset pane, in case user somehow happened to change it..
51168                 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51169                 // disallow scrolling
51170                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51171
51172                 d3_select('.preset-search-input')
51173                     .on('keydown.intro', null)
51174                     .on('keyup.intro', checkPresetSearch);
51175
51176                 reveal('.preset-search-input',
51177                     t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51178                 );
51179
51180                 context.history().on('change.intro', null);
51181             }
51182         });
51183
51184         function checkPresetSearch() {
51185             var first = d3_select('.preset-list-item:first-child');
51186
51187             if (first.classed('preset-leisure-playground')) {
51188                 reveal(first.select('.preset-list-button').node(),
51189                     t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
51190                     { duration: 300 }
51191                 );
51192
51193                 d3_select('.preset-search-input')
51194                     .on('keydown.intro', eventCancel, true)
51195                     .on('keyup.intro', null);
51196
51197                 context.history().on('change.intro', function() {
51198                     continueTo(clickAddField);
51199                 });
51200             }
51201         }
51202
51203         function continueTo(nextStep) {
51204             d3_select('.inspector-wrap').on('wheel.intro', null);
51205             context.on('enter.intro', null);
51206             context.history().on('change.intro', null);
51207             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51208             nextStep();
51209         }
51210     }
51211
51212
51213     function clickAddField() {
51214         if (!areaId || !context.hasEntity(areaId)) {
51215             return addArea();
51216         }
51217         var ids = context.selectedIDs();
51218         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51219             return searchPresets();
51220         }
51221
51222         if (!d3_select('.form-field-description').empty()) {
51223             return continueTo(describePlayground);
51224         }
51225
51226         // disallow scrolling
51227         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51228
51229         timeout(function() {
51230             // reset pane, in case user somehow happened to change it..
51231             d3_select('.inspector-wrap .panewrap').style('right', '0%');
51232
51233             // It's possible for the user to add a description in a previous step..
51234             // If they did this already, just continue to next step.
51235             var entity = context.entity(areaId);
51236             if (entity.tags.description) {
51237                 return continueTo(play);
51238             }
51239
51240             // scroll "Add field" into view
51241             var box = d3_select('.more-fields').node().getBoundingClientRect();
51242             if (box.top > 300) {
51243                 var pane = d3_select('.entity-editor-pane .inspector-body');
51244                 var start = pane.node().scrollTop;
51245                 var end = start + (box.top - 300);
51246
51247                 pane
51248                     .transition()
51249                     .duration(250)
51250                     .tween('scroll.inspector', function() {
51251                         var node = this;
51252                         var i = d3_interpolateNumber(start, end);
51253                         return function(t$$1) {
51254                             node.scrollTop = i(t$$1);
51255                         };
51256                     });
51257             }
51258
51259             timeout(function() {
51260                 reveal('.more-fields .combobox-input',
51261                     t('intro.areas.add_field'),
51262                     { duration: 300 }
51263                 );
51264
51265                 d3_select('.more-fields .combobox-input')
51266                     .on('click.intro', function() {
51267                         continueTo(chooseDescriptionField);
51268                     });
51269             }, 300);  // after "Add Field" visible
51270
51271         }, 400);  // after editor pane visible
51272
51273         context.on('exit.intro', function() {
51274             return continueTo(searchPresets);
51275         });
51276
51277         function continueTo(nextStep) {
51278             d3_select('.inspector-wrap').on('wheel.intro', null);
51279             d3_select('.more-fields .combobox-input').on('click.intro', null);
51280             context.on('exit.intro', null);
51281             nextStep();
51282         }
51283     }
51284
51285
51286     function chooseDescriptionField() {
51287         if (!areaId || !context.hasEntity(areaId)) {
51288             return addArea();
51289         }
51290         var ids = context.selectedIDs();
51291         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51292             return searchPresets();
51293         }
51294
51295         if (!d3_select('.form-field-description').empty()) {
51296             return continueTo(describePlayground);
51297         }
51298
51299         // Make sure combobox is ready..
51300         if (d3_select('div.combobox').empty()) {
51301             return continueTo(clickAddField);
51302         }
51303         // Watch for the combobox to go away..
51304         var watcher;
51305         watcher = window.setInterval(function() {
51306             if (d3_select('div.combobox').empty()) {
51307                 window.clearInterval(watcher);
51308                 timeout(function() {
51309                     if (d3_select('.form-field-description').empty()) {
51310                         continueTo(retryChooseDescription);
51311                     } else {
51312                         continueTo(describePlayground);
51313                     }
51314                 }, 300);  // after description field added.
51315             }
51316         }, 300);
51317
51318         reveal('div.combobox',
51319             t('intro.areas.choose_field', { field: descriptionField.label() }),
51320             { duration: 300 }
51321         );
51322
51323         context.on('exit.intro', function() {
51324             return continueTo(searchPresets);
51325         });
51326
51327         function continueTo(nextStep) {
51328             if (watcher) window.clearInterval(watcher);
51329             context.on('exit.intro', null);
51330             nextStep();
51331         }
51332     }
51333
51334
51335     function describePlayground() {
51336         if (!areaId || !context.hasEntity(areaId)) {
51337             return addArea();
51338         }
51339         var ids = context.selectedIDs();
51340         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51341             return searchPresets();
51342         }
51343
51344         // reset pane, in case user happened to change it..
51345         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51346
51347         if (d3_select('.form-field-description').empty()) {
51348             return continueTo(retryChooseDescription);
51349         }
51350
51351         context.on('exit.intro', function() {
51352             continueTo(play);
51353         });
51354
51355         reveal('.entity-editor-pane',
51356             t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
51357             { duration: 300 }
51358         );
51359
51360         function continueTo(nextStep) {
51361             context.on('exit.intro', null);
51362             nextStep();
51363         }
51364     }
51365
51366
51367     function retryChooseDescription() {
51368         if (!areaId || !context.hasEntity(areaId)) {
51369             return addArea();
51370         }
51371         var ids = context.selectedIDs();
51372         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51373             return searchPresets();
51374         }
51375
51376         // reset pane, in case user happened to change it..
51377         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51378
51379         reveal('.entity-editor-pane',
51380             t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
51381             buttonText: t('intro.ok'),
51382             buttonCallback: function() { continueTo(clickAddField); }
51383         });
51384
51385         context.on('exit.intro', function() {
51386             return continueTo(searchPresets);
51387         });
51388
51389         function continueTo(nextStep) {
51390             context.on('exit.intro', null);
51391             nextStep();
51392         }
51393     }
51394
51395
51396     function play() {
51397         dispatch$$1.call('done');
51398         reveal('#id-container',
51399             t('intro.areas.play', { next: t('intro.lines.title') }), {
51400                 tooltipBox: '.intro-nav-wrap .chapter-line',
51401                 buttonText: t('intro.ok'),
51402                 buttonCallback: function() { reveal('#id-container'); }
51403             }
51404         );
51405     }
51406
51407
51408     chapter.enter = function() {
51409         addArea();
51410     };
51411
51412
51413     chapter.exit = function() {
51414         timeouts.forEach(window.clearTimeout);
51415         context.on('enter.intro exit.intro', null);
51416         context.map().on('move.intro drawn.intro', null);
51417         context.history().on('change.intro', null);
51418         d3_select('.inspector-wrap').on('wheel.intro', null);
51419         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51420         d3_select('.more-fields .combobox-input').on('click.intro', null);
51421     };
51422
51423
51424     chapter.restart = function() {
51425         chapter.exit();
51426         chapter.enter();
51427     };
51428
51429
51430     return utilRebind(chapter, dispatch$$1, 'on');
51431 }
51432
51433 function uiIntroLine(context, reveal) {
51434     var dispatch$$1 = dispatch('done'),
51435         timeouts = [],
51436         tulipRoadId = null,
51437         flowerRoadId = 'w646',
51438         tulipRoadStart = [-85.6297754121684, 41.95805253325314],
51439         tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
51440         tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
51441         roadCategory = context.presets().item('category-road'),
51442         residentialPreset = context.presets().item('highway/residential'),
51443         woodRoadId = 'w525',
51444         woodRoadEndId = 'n2862',
51445         woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
51446         woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
51447         woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
51448         washingtonStreetId = 'w522',
51449         twelfthAvenueId = 'w1',
51450         eleventhAvenueEndId = 'n3550',
51451         twelfthAvenueEndId = 'n5',
51452         washingtonSegmentId = null,
51453         eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
51454         twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
51455         deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
51456         twelfthAvenue = [-85.62219310052491, 41.952505413152956];
51457
51458
51459     var chapter = {
51460         title: 'intro.lines.title'
51461     };
51462
51463
51464     function timeout(f, t$$1) {
51465         timeouts.push(window.setTimeout(f, t$$1));
51466     }
51467
51468
51469     function eventCancel() {
51470         event.stopPropagation();
51471         event.preventDefault();
51472     }
51473
51474
51475     function revealEditMenu(loc, text, options) {
51476         var rect = context.surfaceRect();
51477         var point$$1 = context.curtainProjection(loc);
51478         var pad = 40;
51479         var width = 250 + (2 * pad);
51480         var height = 350;
51481         var startX = rect.left + point$$1[0];
51482         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
51483         var box = {
51484             left: left,
51485             top: point$$1[1] + rect.top - 60,
51486             width: width,
51487             height: height
51488         };
51489         reveal(box, text, options);
51490     }
51491
51492
51493     function addLine() {
51494         context.enter(modeBrowse(context));
51495         context.history().reset('initial');
51496
51497         var msec = transitionTime(tulipRoadStart, context.map().center());
51498         if (msec) { reveal(null, null, { duration: 0 }); }
51499         context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
51500
51501         timeout(function() {
51502             var tooltip = reveal('button.add-line',
51503                 t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
51504
51505             tooltip.selectAll('.tooltip-inner')
51506                 .insert('svg', 'span')
51507                 .attr('class', 'tooltip-illustration')
51508                 .append('use')
51509                 .attr('xlink:href', '#feature-images');
51510
51511             context.on('enter.intro', function(mode) {
51512                 if (mode.id !== 'add-line') return;
51513                 continueTo(startLine);
51514             });
51515         }, msec + 100);
51516
51517         function continueTo(nextStep) {
51518             context.on('enter.intro', null);
51519             nextStep();
51520         }
51521     }
51522
51523
51524     function startLine() {
51525         if (context.mode().id !== 'add-line') {
51526             return chapter.restart();
51527         }
51528
51529         tulipRoadId = null;
51530
51531         var padding = 70 * Math.pow(2, context.map().zoom() - 18);
51532         var box = pad$1(tulipRoadStart, padding, context);
51533         box.height = box.height + 100;
51534         reveal(box, t('intro.lines.start_line'));
51535
51536         context.map().on('move.intro drawn.intro', function() {
51537             padding = 70 * Math.pow(2, context.map().zoom() - 18);
51538             box = pad$1(tulipRoadStart, padding, context);
51539             box.height = box.height + 100;
51540             reveal(box, t('intro.lines.start_line'), { duration: 0 });
51541         });
51542
51543         context.on('enter.intro', function(mode) {
51544             if (mode.id !== 'draw-line') return chapter.restart();
51545             continueTo(drawLine);
51546         });
51547
51548         function continueTo(nextStep) {
51549             context.map().on('move.intro drawn.intro', null);
51550             context.on('enter.intro', null);
51551             nextStep();
51552         }
51553     }
51554
51555
51556     function drawLine() {
51557         if (context.mode().id !== 'draw-line') {
51558             return chapter.restart();
51559         }
51560
51561         tulipRoadId = context.mode().selectedIDs()[0];
51562         context.map().centerEase(tulipRoadMidpoint, 500);
51563
51564         timeout(function() {
51565             var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
51566             var box = pad$1(tulipRoadMidpoint, padding, context);
51567             box.height = box.height * 2;
51568             reveal(box,
51569                 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
51570             );
51571
51572             context.map().on('move.intro drawn.intro', function() {
51573                 padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
51574                 box = pad$1(tulipRoadMidpoint, padding, context);
51575                 box.height = box.height * 2;
51576                 reveal(box,
51577                     t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
51578                     { duration: 0 }
51579                 );
51580             });
51581         }, 550);  // after easing..
51582
51583         context.history().on('change.intro', function() {
51584             var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51585             if (!entity) return chapter.restart();
51586
51587             if (isLineConnected()) {
51588                 continueTo(continueLine);
51589             }
51590         });
51591
51592         context.on('enter.intro', function(mode) {
51593             if (mode.id === 'draw-line')
51594                 return;
51595             else if (mode.id === 'select') {
51596                 continueTo(retryIntersect);
51597                 return;
51598             }
51599             else
51600                 return chapter.restart();
51601         });
51602
51603         function continueTo(nextStep) {
51604             context.map().on('move.intro drawn.intro', null);
51605             context.history().on('change.intro', null);
51606             context.on('enter.intro', null);
51607             nextStep();
51608         }
51609     }
51610
51611
51612     function isLineConnected() {
51613         var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51614         if (!entity) return false;
51615
51616         var drawNodes = context.graph().childNodes(entity);
51617         return some(drawNodes, function(node) {
51618             return some(context.graph().parentWays(node), function(parent) {
51619                 return parent.id === flowerRoadId;
51620             });
51621         });
51622     }
51623
51624
51625     function retryIntersect() {
51626         d3_select(window).on('mousedown.intro', eventCancel, true);
51627
51628         var box = pad$1(tulipRoadIntersection, 80, context);
51629         reveal(box,
51630             t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
51631         );
51632
51633         timeout(chapter.restart, 3000);
51634     }
51635
51636
51637     function continueLine() {
51638         if (context.mode().id !== 'draw-line') return chapter.restart();
51639         var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51640         if (!entity) return chapter.restart();
51641
51642         context.map().centerEase(tulipRoadIntersection, 500);
51643
51644         reveal('#surface', t('intro.lines.continue_line'));
51645
51646         context.on('enter.intro', function(mode) {
51647             if (mode.id === 'draw-line')
51648                 return;
51649             else if (mode.id === 'select')
51650                 return continueTo(chooseCategoryRoad);
51651             else
51652                 return chapter.restart();
51653         });
51654
51655         function continueTo(nextStep) {
51656             context.on('enter.intro', null);
51657             nextStep();
51658         }
51659     }
51660
51661
51662     function chooseCategoryRoad() {
51663         if (context.mode().id !== 'select') {
51664             return chapter.restart();
51665         }
51666
51667         context.on('exit.intro', function() {
51668             return chapter.restart();
51669         });
51670
51671         var button = d3_select('.preset-category-road .preset-list-button');
51672         if (button.empty()) return chapter.restart();
51673
51674         // disallow scrolling
51675         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51676
51677         timeout(function() {
51678             // reset pane, in case user somehow happened to change it..
51679             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51680
51681             reveal(button.node(),
51682                 t('intro.lines.choose_category_road', { category: roadCategory.name() })
51683             );
51684
51685             button.on('click.intro', function() {
51686                 continueTo(choosePresetResidential);
51687             });
51688
51689         }, 400);  // after editor pane visible
51690
51691         function continueTo(nextStep) {
51692             d3_select('.inspector-wrap').on('wheel.intro', null);
51693             d3_select('.preset-list-button').on('click.intro', null);
51694             context.on('exit.intro', null);
51695             nextStep();
51696         }
51697     }
51698
51699
51700     function choosePresetResidential() {
51701         if (context.mode().id !== 'select') {
51702             return chapter.restart();
51703         }
51704
51705         context.on('exit.intro', function() {
51706             return chapter.restart();
51707         });
51708
51709         var subgrid = d3_select('.preset-category-road .subgrid');
51710         if (subgrid.empty()) return chapter.restart();
51711
51712         subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
51713             .on('click.intro', function() {
51714                 continueTo(retryPresetResidential);
51715             });
51716
51717         subgrid.selectAll('.preset-highway-residential .preset-list-button')
51718             .on('click.intro', function() {
51719                 continueTo(nameRoad);
51720             });
51721
51722         timeout(function() {
51723             reveal(subgrid.node(),
51724                 t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
51725                 { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
51726             );
51727         }, 300);
51728
51729         function continueTo(nextStep) {
51730             d3_select('.preset-list-button').on('click.intro', null);
51731             context.on('exit.intro', null);
51732             nextStep();
51733         }
51734     }
51735
51736
51737     // selected wrong road type
51738     function retryPresetResidential() {
51739         if (context.mode().id !== 'select') {
51740             return chapter.restart();
51741         }
51742
51743         context.on('exit.intro', function() {
51744             return chapter.restart();
51745         });
51746
51747         // disallow scrolling
51748         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51749
51750         timeout(function() {
51751             var button = d3_select('.entity-editor-pane .preset-list-button');
51752
51753             reveal(button.node(),
51754                 t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
51755             );
51756
51757             button.on('click.intro', function() {
51758                 continueTo(chooseCategoryRoad);
51759             });
51760
51761         }, 500);
51762
51763         function continueTo(nextStep) {
51764             d3_select('.inspector-wrap').on('wheel.intro', null);
51765             d3_select('.preset-list-button').on('click.intro', null);
51766             context.on('exit.intro', null);
51767             nextStep();
51768         }
51769     }
51770
51771
51772     function nameRoad() {
51773         context.on('exit.intro', function() {
51774             continueTo(didNameRoad);
51775         });
51776
51777         timeout(function() {
51778             reveal('.entity-editor-pane',
51779                 t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
51780                 { tooltipClass: 'intro-lines-name_road' }
51781             );
51782         }, 500);
51783
51784         function continueTo(nextStep) {
51785             context.on('exit.intro', null);
51786             nextStep();
51787         }
51788     }
51789
51790
51791     function didNameRoad() {
51792         context.history().checkpoint('doneAddLine');
51793
51794         timeout(function() {
51795             reveal('#surface', t('intro.lines.did_name_road'), {
51796                 buttonText: t('intro.ok'),
51797                 buttonCallback: function() { continueTo(updateLine); }
51798             });
51799         }, 500);
51800
51801         function continueTo(nextStep) {
51802             nextStep();
51803         }
51804     }
51805
51806
51807     function updateLine() {
51808         context.history().reset('doneAddLine');
51809         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51810             return chapter.restart();
51811         }
51812
51813         var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
51814         if (msec) { reveal(null, null, { duration: 0 }); }
51815         context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
51816
51817         timeout(function() {
51818             var padding = 250 * Math.pow(2, context.map().zoom() - 19);
51819             var box = pad$1(woodRoadDragMidpoint, padding, context);
51820             var advance = function() { continueTo(addNode); };
51821
51822             reveal(box, t('intro.lines.update_line'),
51823                 { buttonText: t('intro.ok'), buttonCallback: advance }
51824             );
51825
51826             context.map().on('move.intro drawn.intro', function() {
51827                 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
51828                 var box = pad$1(woodRoadDragMidpoint, padding, context);
51829                 reveal(box, t('intro.lines.update_line'),
51830                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
51831                 );
51832             });
51833         }, msec + 100);
51834
51835         function continueTo(nextStep) {
51836             context.map().on('move.intro drawn.intro', null);
51837             nextStep();
51838         }
51839     }
51840
51841
51842     function addNode() {
51843         context.history().reset('doneAddLine');
51844         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51845             return chapter.restart();
51846         }
51847
51848         var padding = 40 * Math.pow(2, context.map().zoom() - 19);
51849         var box = pad$1(woodRoadAddNode, padding, context);
51850         reveal(box, t('intro.lines.add_node'));
51851
51852         context.map().on('move.intro drawn.intro', function() {
51853             var padding = 40 * Math.pow(2, context.map().zoom() - 19);
51854             var box = pad$1(woodRoadAddNode, padding, context);
51855             reveal(box, t('intro.lines.add_node'), { duration: 0 });
51856         });
51857
51858         context.history().on('change.intro', function(changed) {
51859             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51860                 return continueTo(updateLine);
51861             }
51862             if (changed.created().length === 1) {
51863                 timeout(function() { continueTo(startDragEndpoint); }, 500);
51864             }
51865         });
51866
51867         context.on('enter.intro', function(mode) {
51868             if (mode.id !== 'select') {
51869                 continueTo(updateLine);
51870             }
51871         });
51872
51873         function continueTo(nextStep) {
51874             context.map().on('move.intro drawn.intro', null);
51875             context.history().on('change.intro', null);
51876             context.on('enter.intro', null);
51877             nextStep();
51878         }
51879     }
51880
51881
51882     function startDragEndpoint() {
51883         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51884             return continueTo(updateLine);
51885         }
51886         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51887         var box = pad$1(woodRoadDragEndpoint, padding, context);
51888         reveal(box, t('intro.lines.start_drag_endpoint'));
51889
51890         context.map().on('move.intro drawn.intro', function() {
51891             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51892                 return continueTo(updateLine);
51893             }
51894             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51895             var box = pad$1(woodRoadDragEndpoint, padding, context);
51896             reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
51897
51898             var entity = context.entity(woodRoadEndId);
51899             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
51900                 continueTo(finishDragEndpoint);
51901             }
51902         });
51903
51904         function continueTo(nextStep) {
51905             context.map().on('move.intro drawn.intro', null);
51906             nextStep();
51907         }
51908     }
51909
51910
51911     function finishDragEndpoint() {
51912         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51913             return continueTo(updateLine);
51914         }
51915
51916         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51917         var box = pad$1(woodRoadDragEndpoint, padding, context);
51918         reveal(box, t('intro.lines.finish_drag_endpoint'));
51919
51920         context.map().on('move.intro drawn.intro', function() {
51921             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51922                 return continueTo(updateLine);
51923             }
51924             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51925             var box = pad$1(woodRoadDragEndpoint, padding, context);
51926             reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
51927
51928             var entity = context.entity(woodRoadEndId);
51929             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
51930                 continueTo(startDragEndpoint);
51931             }
51932         });
51933
51934         context.on('enter.intro', function() {
51935             continueTo(startDragMidpoint);
51936         });
51937
51938         function continueTo(nextStep) {
51939             context.map().on('move.intro drawn.intro', null);
51940             context.on('enter.intro', null);
51941             nextStep();
51942         }
51943     }
51944
51945
51946     function startDragMidpoint() {
51947         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51948             return continueTo(updateLine);
51949         }
51950         if (context.selectedIDs().indexOf(woodRoadId) === -1) {
51951             context.enter(modeSelect(context, [woodRoadId]));
51952         }
51953
51954         var padding = 80 * Math.pow(2, context.map().zoom() - 19);
51955         var box = pad$1(woodRoadDragMidpoint, padding, context);
51956         reveal(box, t('intro.lines.start_drag_midpoint'));
51957
51958         context.map().on('move.intro drawn.intro', function() {
51959             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51960                 return continueTo(updateLine);
51961             }
51962             var padding = 80 * Math.pow(2, context.map().zoom() - 19);
51963             var box = pad$1(woodRoadDragMidpoint, padding, context);
51964             reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
51965         });
51966
51967         context.history().on('change.intro', function(changed) {
51968             if (changed.created().length === 1) {
51969                 continueTo(continueDragMidpoint);
51970             }
51971         });
51972
51973         context.on('enter.intro', function(mode) {
51974             if (mode.id !== 'select') {
51975                 // keep Wood Road selected so midpoint triangles are drawn..
51976                 context.enter(modeSelect(context, [woodRoadId]));
51977             }
51978         });
51979
51980         function continueTo(nextStep) {
51981             context.map().on('move.intro drawn.intro', null);
51982             context.history().on('change.intro', null);
51983             context.on('enter.intro', null);
51984             nextStep();
51985         }
51986     }
51987
51988
51989     function continueDragMidpoint() {
51990         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51991             return continueTo(updateLine);
51992         }
51993
51994         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51995         var box = pad$1(woodRoadDragEndpoint, padding, context);
51996         box.height += 400;
51997
51998         var advance = function() {
51999             context.history().checkpoint('doneUpdateLine');
52000             continueTo(deleteLines);
52001         };
52002
52003         reveal(box, t('intro.lines.continue_drag_midpoint'),
52004             { buttonText: t('intro.ok'), buttonCallback: advance }
52005         );
52006
52007         context.map().on('move.intro drawn.intro', function() {
52008             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52009                 return continueTo(updateLine);
52010             }
52011             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52012             var box = pad$1(woodRoadDragEndpoint, padding, context);
52013             box.height += 400;
52014             reveal(box, t('intro.lines.continue_drag_midpoint'),
52015                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52016             );
52017         });
52018
52019         function continueTo(nextStep) {
52020             context.map().on('move.intro drawn.intro', null);
52021             nextStep();
52022         }
52023     }
52024
52025
52026     function deleteLines() {
52027         context.history().reset('doneUpdateLine');
52028         context.enter(modeBrowse(context));
52029
52030         if (!context.hasEntity(washingtonStreetId) ||
52031             !context.hasEntity(twelfthAvenueId) ||
52032             !context.hasEntity(eleventhAvenueEndId)) {
52033             return chapter.restart();
52034         }
52035
52036         var msec = transitionTime(deleteLinesLoc, context.map().center());
52037         if (msec) { reveal(null, null, { duration: 0 }); }
52038         context.map().zoom(18).centerEase(deleteLinesLoc, msec);
52039
52040         timeout(function() {
52041             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52042             var box = pad$1(deleteLinesLoc, padding, context);
52043             box.top -= 200;
52044             box.height += 400;
52045             var advance = function() { continueTo(rightClickIntersection); };
52046
52047             reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52048                 { buttonText: t('intro.ok'), buttonCallback: advance }
52049             );
52050
52051             context.map().on('move.intro drawn.intro', function() {
52052                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52053                 var box = pad$1(deleteLinesLoc, padding, context);
52054                 box.top -= 200;
52055                 box.height += 400;
52056                 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52057                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52058                 );
52059             });
52060
52061             context.history().on('change.intro', function() {
52062                 timeout(function() {
52063                     continueTo(deleteLines);
52064                 }, 500);  // after any transition (e.g. if user deleted intersection)
52065             });
52066
52067         }, msec + 100);
52068
52069         function continueTo(nextStep) {
52070             context.map().on('move.intro drawn.intro', null);
52071             context.history().on('change.intro', null);
52072             nextStep();
52073         }
52074     }
52075
52076
52077     function rightClickIntersection() {
52078         context.history().reset('doneUpdateLine');
52079         context.enter(modeBrowse(context));
52080
52081         context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52082
52083         timeout(function() {
52084             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52085             var box = pad$1(eleventhAvenueEnd, padding, context);
52086             reveal(box, t('intro.lines.rightclick_intersection',
52087                 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
52088             );
52089
52090             context.map().on('move.intro drawn.intro', function() {
52091                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52092                 var box = pad$1(eleventhAvenueEnd, padding, context);
52093                 reveal(box, t('intro.lines.rightclick_intersection',
52094                     { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
52095                     { duration: 0 }
52096                 );
52097             });
52098
52099             context.on('enter.intro', function(mode) {
52100                 if (mode.id !== 'select') return;
52101                 var ids = context.selectedIDs();
52102                 if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
52103
52104                 timeout(function() {
52105                     var node = selectMenuItem('split').node();
52106                     if (!node) return;
52107                     continueTo(splitIntersection);
52108                 }, 300);  // after menu visible
52109             });
52110
52111             context.history().on('change.intro', function() {
52112                 timeout(function() {
52113                     continueTo(deleteLines);
52114                 }, 300);  // after any transition (e.g. if user deleted intersection)
52115             });
52116
52117         }, 600);
52118
52119         function continueTo(nextStep) {
52120             context.map().on('move.intro drawn.intro', null);
52121             context.on('enter.intro', null);
52122             context.history().on('change.intro', null);
52123             nextStep();
52124         }
52125     }
52126
52127
52128     function splitIntersection() {
52129         if (!context.hasEntity(washingtonStreetId) ||
52130             !context.hasEntity(twelfthAvenueId) ||
52131             !context.hasEntity(eleventhAvenueEndId)) {
52132             return continueTo(deleteLines);
52133         }
52134
52135         var node = selectMenuItem('split').node();
52136         if (!node) { return continueTo(rightClickIntersection); }
52137
52138         var wasChanged = false;
52139         var menuCoords = context.map().mouseCoordinates();
52140         washingtonSegmentId = null;
52141
52142         revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52143             { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
52144         );
52145
52146         context.map().on('move.intro drawn.intro', function() {
52147             var node = selectMenuItem('split').node();
52148             if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
52149
52150             revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52151                 { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
52152                 { duration: 0 }
52153             );
52154         });
52155
52156         context.history().on('change.intro', function(changed) {
52157             wasChanged = true;
52158             timeout(function() {
52159                 if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
52160                     washingtonSegmentId = changed.created()[0].id;
52161                     continueTo(didSplit);
52162                 } else {
52163                     washingtonSegmentId = null;
52164                     continueTo(retrySplit);
52165                 }
52166             }, 300);  // after any transition (e.g. if user deleted intersection)
52167         });
52168
52169         function continueTo(nextStep) {
52170             context.map().on('move.intro drawn.intro', null);
52171             context.history().on('change.intro', null);
52172             nextStep();
52173         }
52174     }
52175
52176
52177     function retrySplit() {
52178         context.enter(modeBrowse(context));
52179         context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52180         var advance = function() { continueTo(rightClickIntersection); };
52181
52182         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52183         var box = pad$1(eleventhAvenueEnd, padding, context);
52184         reveal(box, t('intro.lines.retry_split'),
52185             { buttonText: t('intro.ok'), buttonCallback: advance }
52186         );
52187
52188         context.map().on('move.intro drawn.intro', function() {
52189             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52190             var box = pad$1(eleventhAvenueEnd, padding, context);
52191             reveal(box, t('intro.lines.retry_split'),
52192                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52193             );
52194         });
52195
52196         function continueTo(nextStep) {
52197             context.map().on('move.intro drawn.intro', null);
52198             nextStep();
52199         }
52200     }
52201
52202
52203     function didSplit() {
52204         if (!washingtonSegmentId ||
52205             !context.hasEntity(washingtonSegmentId) ||
52206             !context.hasEntity(washingtonStreetId) ||
52207             !context.hasEntity(twelfthAvenueId) ||
52208             !context.hasEntity(eleventhAvenueEndId)) {
52209             return continueTo(rightClickIntersection);
52210         }
52211
52212         var ids = context.selectedIDs();
52213         var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
52214         var street = t('intro.graph.name.washington-street');
52215
52216         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52217         var box = pad$1(twelfthAvenue, padding, context);
52218         box.width = box.width / 2;
52219         reveal(box, t(string, { street1: street, street2: street }),
52220             { duration: 500 }
52221         );
52222
52223         timeout(function() {
52224             context.map().zoom(18).centerEase(twelfthAvenue, 500);
52225
52226             context.map().on('move.intro drawn.intro', function() {
52227                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52228                 var box = pad$1(twelfthAvenue, padding, context);
52229                 box.width = box.width / 2;
52230                 reveal(box, t(string, { street1: street, street2: street }),
52231                     { duration: 0 }
52232                 );
52233             });
52234         }, 600);  // after initial reveal and curtain cut
52235
52236         context.on('enter.intro', function() {
52237             var ids = context.selectedIDs();
52238             if (ids.length === 1 && ids[0] === washingtonSegmentId) {
52239                 continueTo(multiSelect);
52240             }
52241         });
52242
52243         context.history().on('change.intro', function() {
52244             if (!washingtonSegmentId ||
52245                 !context.hasEntity(washingtonSegmentId) ||
52246                 !context.hasEntity(washingtonStreetId) ||
52247                 !context.hasEntity(twelfthAvenueId) ||
52248                 !context.hasEntity(eleventhAvenueEndId)) {
52249                 return continueTo(rightClickIntersection);
52250             }
52251         });
52252
52253         function continueTo(nextStep) {
52254             context.map().on('move.intro drawn.intro', null);
52255             context.on('enter.intro', null);
52256             context.history().on('change.intro', null);
52257             nextStep();
52258         }
52259     }
52260
52261
52262     function multiSelect() {
52263         if (!washingtonSegmentId ||
52264             !context.hasEntity(washingtonSegmentId) ||
52265             !context.hasEntity(washingtonStreetId) ||
52266             !context.hasEntity(twelfthAvenueId) ||
52267             !context.hasEntity(eleventhAvenueEndId)) {
52268             return continueTo(rightClickIntersection);
52269         }
52270
52271         var ids = context.selectedIDs();
52272         var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
52273         var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
52274
52275         if (hasWashington && hasTwelfth) {
52276             return continueTo(multiRightClick);
52277         } else if (!hasWashington && !hasTwelfth) {
52278             return continueTo(didSplit);
52279         }
52280
52281         context.map().zoom(18).centerEase(twelfthAvenue, 500);
52282
52283         timeout(function() {
52284             var selected, other, padding, box;
52285             if (hasWashington) {
52286                 selected = t('intro.graph.name.washington-street');
52287                 other = t('intro.graph.name.12th-avenue');
52288                 padding = 60 * Math.pow(2, context.map().zoom() - 18);
52289                 box = pad$1(twelfthAvenueEnd, padding, context);
52290                 box.width *= 3;
52291             } else {
52292                 selected = t('intro.graph.name.12th-avenue');
52293                 other = t('intro.graph.name.washington-street');
52294                 padding = 200 * Math.pow(2, context.map().zoom() - 18);
52295                 box = pad$1(twelfthAvenue, padding, context);
52296                 box.width /= 2;
52297             }
52298
52299             reveal(box,
52300                 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
52301             );
52302
52303             context.map().on('move.intro drawn.intro', function() {
52304                 if (hasWashington) {
52305                     selected = t('intro.graph.name.washington-street');
52306                     other = t('intro.graph.name.12th-avenue');
52307                     padding = 60 * Math.pow(2, context.map().zoom() - 18);
52308                     box = pad$1(twelfthAvenueEnd, padding, context);
52309                     box.width *= 3;
52310                 } else {
52311                     selected = t('intro.graph.name.12th-avenue');
52312                     other = t('intro.graph.name.washington-street');
52313                     padding = 200 * Math.pow(2, context.map().zoom() - 18);
52314                     box = pad$1(twelfthAvenue, padding, context);
52315                     box.width /= 2;
52316                 }
52317
52318                 reveal(box,
52319                     t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
52320                     { duration: 0 }
52321                 );
52322             });
52323
52324             context.on('enter.intro', function() {
52325                 continueTo(multiSelect);
52326             });
52327
52328             context.history().on('change.intro', function() {
52329                 if (!washingtonSegmentId ||
52330                     !context.hasEntity(washingtonSegmentId) ||
52331                     !context.hasEntity(washingtonStreetId) ||
52332                     !context.hasEntity(twelfthAvenueId) ||
52333                     !context.hasEntity(eleventhAvenueEndId)) {
52334                     return continueTo(rightClickIntersection);
52335                 }
52336             });
52337         }, 600);
52338
52339         function continueTo(nextStep) {
52340             context.map().on('move.intro drawn.intro', null);
52341             context.on('enter.intro', null);
52342             context.history().on('change.intro', null);
52343             nextStep();
52344         }
52345     }
52346
52347
52348     function multiRightClick() {
52349         if (!washingtonSegmentId ||
52350             !context.hasEntity(washingtonSegmentId) ||
52351             !context.hasEntity(washingtonStreetId) ||
52352             !context.hasEntity(twelfthAvenueId) ||
52353             !context.hasEntity(eleventhAvenueEndId)) {
52354             return continueTo(rightClickIntersection);
52355         }
52356
52357         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52358         var box = pad$1(twelfthAvenue, padding, context);
52359         reveal(box, t('intro.lines.multi_rightclick'));
52360
52361         context.map().on('move.intro drawn.intro', function() {
52362             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52363             var box = pad$1(twelfthAvenue, padding, context);
52364             reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
52365         });
52366
52367         d3_select(window).on('click.intro contextmenu.intro', function() {
52368             timeout(function() {
52369                 var ids = context.selectedIDs();
52370                 if (ids.length === 2 &&
52371                     ids.indexOf(twelfthAvenueId) !== -1 &&
52372                     ids.indexOf(washingtonSegmentId) !== -1) {
52373                         var node = selectMenuItem('delete').node();
52374                         if (!node) return;
52375                         continueTo(multiDelete);
52376                 } else if (ids.length === 1 &&
52377                     ids.indexOf(washingtonSegmentId) !== -1) {
52378                     return continueTo(multiSelect);
52379                 } else {
52380                     return continueTo(didSplit);
52381                 }
52382             }, 300);  // after edit menu visible
52383         }, true);
52384
52385         context.history().on('change.intro', function() {
52386             if (!washingtonSegmentId ||
52387                 !context.hasEntity(washingtonSegmentId) ||
52388                 !context.hasEntity(washingtonStreetId) ||
52389                 !context.hasEntity(twelfthAvenueId) ||
52390                 !context.hasEntity(eleventhAvenueEndId)) {
52391                 return continueTo(rightClickIntersection);
52392             }
52393         });
52394
52395         function continueTo(nextStep) {
52396             context.map().on('move.intro drawn.intro', null);
52397             d3_select(window).on('click.intro contextmenu.intro', null, true);
52398             context.history().on('change.intro', null);
52399             nextStep();
52400         }
52401     }
52402
52403
52404     function multiDelete() {
52405         if (!washingtonSegmentId ||
52406             !context.hasEntity(washingtonSegmentId) ||
52407             !context.hasEntity(washingtonStreetId) ||
52408             !context.hasEntity(twelfthAvenueId) ||
52409             !context.hasEntity(eleventhAvenueEndId)) {
52410             return continueTo(rightClickIntersection);
52411         }
52412
52413         var node = selectMenuItem('delete').node();
52414         if (!node) return continueTo(multiRightClick);
52415
52416         var menuCoords = context.map().mouseCoordinates();
52417         revealEditMenu(menuCoords,
52418             t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
52419         );
52420
52421         context.map().on('move.intro drawn.intro', function() {
52422             revealEditMenu(menuCoords,
52423                 t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
52424                 { duration: 0 }
52425             );
52426         });
52427
52428         context.on('exit.intro', function() {
52429             if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
52430                 return continueTo(multiSelect);  // left select mode but roads still exist
52431             }
52432         });
52433
52434         context.history().on('change.intro', function() {
52435             if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
52436                 continueTo(retryDelete);         // changed something but roads still exist
52437             } else {
52438                 continueTo(play);
52439             }
52440         });
52441
52442         function continueTo(nextStep) {
52443             context.map().on('move.intro drawn.intro', null);
52444             context.on('exit.intro', null);
52445             context.history().on('change.intro', null);
52446             nextStep();
52447         }
52448     }
52449
52450
52451     function retryDelete() {
52452         context.enter(modeBrowse(context));
52453
52454         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52455         var box = pad$1(twelfthAvenue, padding, context);
52456         reveal(box, t('intro.lines.retry_delete'), {
52457             buttonText: t('intro.ok'),
52458             buttonCallback: function() { continueTo(multiSelect); }
52459         });
52460
52461         function continueTo(nextStep) {
52462             nextStep();
52463         }
52464     }
52465
52466
52467     function play() {
52468         dispatch$$1.call('done');
52469         reveal('#id-container',
52470             t('intro.lines.play', { next: t('intro.buildings.title') }), {
52471                 tooltipBox: '.intro-nav-wrap .chapter-building',
52472                 buttonText: t('intro.ok'),
52473                 buttonCallback: function() { reveal('#id-container'); }
52474             }
52475         );
52476    }
52477
52478
52479     chapter.enter = function() {
52480         addLine();
52481     };
52482
52483
52484     chapter.exit = function() {
52485         timeouts.forEach(window.clearTimeout);
52486         d3_select(window).on('mousedown.intro', null, true);
52487         context.on('enter.intro exit.intro', null);
52488         context.map().on('move.intro drawn.intro', null);
52489         context.history().on('change.intro', null);
52490         d3_select('.inspector-wrap').on('wheel.intro', null);
52491         d3_select('.preset-list-button').on('click.intro', null);
52492     };
52493
52494
52495     chapter.restart = function() {
52496         chapter.exit();
52497         chapter.enter();
52498     };
52499
52500
52501     return utilRebind(chapter, dispatch$$1, 'on');
52502 }
52503
52504 function uiIntroBuilding(context, reveal) {
52505     var dispatch$$1 = dispatch('done'),
52506         house = [-85.62815, 41.95638],
52507         tank = [-85.62732, 41.95347],
52508         buildingCatetory = context.presets().item('category-building'),
52509         housePreset = context.presets().item('building/house'),
52510         tankPreset = context.presets().item('man_made/storage_tank'),
52511         timeouts = [],
52512         houseId = null,
52513         tankId = null;
52514
52515
52516     var chapter = {
52517         title: 'intro.buildings.title'
52518     };
52519
52520
52521     function timeout(f, t$$1) {
52522         timeouts.push(window.setTimeout(f, t$$1));
52523     }
52524
52525
52526     function eventCancel() {
52527         event.stopPropagation();
52528         event.preventDefault();
52529     }
52530
52531
52532     function revealHouse(center, text, options) {
52533         var padding = 160 * Math.pow(2, context.map().zoom() - 20);
52534         var box = pad$1(center, padding, context);
52535         reveal(box, text, options);
52536     }
52537
52538
52539     function revealTank(center, text, options) {
52540         var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
52541         var box = pad$1(center, padding, context);
52542         reveal(box, text, options);
52543     }
52544
52545
52546     function revealEditMenu(loc, text, options) {
52547         var rect = context.surfaceRect();
52548         var point$$1 = context.curtainProjection(loc);
52549         var pad = 40;
52550         var width = 250 + (2 * pad);
52551         var height = 350;
52552         var startX = rect.left + point$$1[0];
52553         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
52554         var box = {
52555             left: left,
52556             top: point$$1[1] + rect.top - 60,
52557             width: width,
52558             height: height
52559         };
52560         reveal(box, text, options);
52561     }
52562
52563
52564     function addHouse() {
52565         context.enter(modeBrowse(context));
52566         context.history().reset('initial');
52567         houseId = null;
52568
52569         var msec = transitionTime(house, context.map().center());
52570         if (msec) { reveal(null, null, { duration: 0 }); }
52571         context.map().zoom(19).centerEase(house, msec);
52572
52573         timeout(function() {
52574             var tooltip = reveal('button.add-area',
52575                 t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
52576
52577             tooltip.selectAll('.tooltip-inner')
52578                 .insert('svg', 'span')
52579                 .attr('class', 'tooltip-illustration')
52580                 .append('use')
52581                 .attr('xlink:href', '#building-images');
52582
52583             context.on('enter.intro', function(mode) {
52584                 if (mode.id !== 'add-area') return;
52585                 continueTo(startHouse);
52586             });
52587         }, msec + 100);
52588
52589         function continueTo(nextStep) {
52590             context.on('enter.intro', null);
52591             nextStep();
52592         }
52593     }
52594
52595
52596     function startHouse() {
52597         if (context.mode().id !== 'add-area') {
52598             return continueTo(addHouse);
52599         }
52600
52601         houseId = null;
52602         context.map().zoomEase(20, 500);
52603
52604         timeout(function() {
52605             revealHouse(house, t('intro.buildings.start_building'));
52606
52607             context.map().on('move.intro drawn.intro', function() {
52608                 revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
52609             });
52610
52611             context.on('enter.intro', function(mode) {
52612                 if (mode.id !== 'draw-area') return chapter.restart();
52613                 continueTo(continueHouse);
52614             });
52615
52616         }, 550);  // after easing
52617
52618         function continueTo(nextStep) {
52619             context.map().on('move.intro drawn.intro', null);
52620             context.on('enter.intro', null);
52621             nextStep();
52622         }
52623     }
52624
52625
52626     function continueHouse() {
52627         if (context.mode().id !== 'draw-area') {
52628             return continueTo(addHouse);
52629         }
52630
52631         houseId = null;
52632
52633         revealHouse(house, t('intro.buildings.continue_building'));
52634
52635         context.map().on('move.intro drawn.intro', function() {
52636             revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
52637         });
52638
52639         context.on('enter.intro', function(mode) {
52640             if (mode.id === 'draw-area') {
52641                 return;
52642             } else if (mode.id === 'select') {
52643                 var graph = context.graph(),
52644                     way = context.entity(context.selectedIDs()[0]),
52645                     nodes = graph.childNodes(way),
52646                     points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
52647
52648                 if (isMostlySquare(points)) {
52649                     houseId = way.id;
52650                     return continueTo(chooseCategoryBuilding);
52651                 } else {
52652                     return continueTo(retryHouse);
52653                 }
52654
52655             } else {
52656                 return chapter.restart();
52657             }
52658         });
52659
52660         function continueTo(nextStep) {
52661             context.map().on('move.intro drawn.intro', null);
52662             context.on('enter.intro', null);
52663             nextStep();
52664         }
52665     }
52666
52667
52668     function retryHouse() {
52669         var onClick = function() { continueTo(addHouse); };
52670
52671         revealHouse(house, t('intro.buildings.retry_building'),
52672             { buttonText: t('intro.ok'), buttonCallback: onClick }
52673         );
52674
52675         context.map().on('move.intro drawn.intro', function() {
52676             revealHouse(house, t('intro.buildings.retry_building'),
52677                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
52678             );
52679         });
52680
52681         function continueTo(nextStep) {
52682             context.map().on('move.intro drawn.intro', null);
52683             nextStep();
52684         }
52685     }
52686
52687
52688     function chooseCategoryBuilding() {
52689         if (!houseId || !context.hasEntity(houseId)) {
52690             return addHouse();
52691         }
52692         var ids = context.selectedIDs();
52693         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52694             context.enter(modeSelect(context, [houseId]));
52695         }
52696
52697         // disallow scrolling
52698         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52699
52700         timeout(function() {
52701             // reset pane, in case user somehow happened to change it..
52702             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52703
52704             var button = d3_select('.preset-category-building .preset-list-button');
52705
52706             reveal(button.node(),
52707                 t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
52708             );
52709
52710             button.on('click.intro', function() {
52711                 button.on('click.intro', null);
52712                 continueTo(choosePresetHouse);
52713             });
52714
52715         }, 400);  // after preset list pane visible..
52716
52717
52718         context.on('enter.intro', function(mode) {
52719             if (!houseId || !context.hasEntity(houseId)) {
52720                 return continueTo(addHouse);
52721             }
52722             var ids = context.selectedIDs();
52723             if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
52724                 return continueTo(chooseCategoryBuilding);
52725             }
52726         });
52727
52728         function continueTo(nextStep) {
52729             d3_select('.inspector-wrap').on('wheel.intro', null);
52730             d3_select('.preset-list-button').on('click.intro', null);
52731             context.on('enter.intro', null);
52732             nextStep();
52733         }
52734     }
52735
52736
52737     function choosePresetHouse() {
52738         if (!houseId || !context.hasEntity(houseId)) {
52739             return addHouse();
52740         }
52741         var ids = context.selectedIDs();
52742         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52743             context.enter(modeSelect(context, [houseId]));
52744         }
52745
52746         // disallow scrolling
52747         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52748
52749         timeout(function() {
52750             // reset pane, in case user somehow happened to change it..
52751             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52752
52753             var button = d3_select('.preset-building-house .preset-list-button');
52754
52755             reveal(button.node(),
52756                 t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
52757                 { duration: 300 }
52758             );
52759
52760             button.on('click.intro', function() {
52761                 button.on('click.intro', null);
52762                 continueTo(closeEditorHouse);
52763             });
52764
52765
52766         }, 400);  // after preset list pane visible..
52767
52768         context.on('enter.intro', function(mode) {
52769             if (!houseId || !context.hasEntity(houseId)) {
52770                 return continueTo(addHouse);
52771             }
52772             var ids = context.selectedIDs();
52773             if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
52774                 return continueTo(chooseCategoryBuilding);
52775             }
52776         });
52777
52778         function continueTo(nextStep) {
52779             d3_select('.inspector-wrap').on('wheel.intro', null);
52780             d3_select('.preset-list-button').on('click.intro', null);
52781             context.on('enter.intro', null);
52782             nextStep();
52783         }
52784     }
52785
52786
52787     function closeEditorHouse() {
52788         if (!houseId || !context.hasEntity(houseId)) {
52789             return addHouse();
52790         }
52791         var ids = context.selectedIDs();
52792         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52793             context.enter(modeSelect(context, [houseId]));
52794         }
52795
52796         context.history().checkpoint('hasHouse');
52797
52798         context.on('exit.intro', function() {
52799             continueTo(rightClickHouse);
52800         });
52801
52802         timeout(function() {
52803             reveal('.entity-editor-pane',
52804                 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
52805             );
52806         }, 500);
52807
52808         function continueTo(nextStep) {
52809             context.on('exit.intro', null);
52810             nextStep();
52811         }
52812     }
52813
52814
52815     function rightClickHouse() {
52816         if (!houseId) return chapter.restart();
52817
52818         context.enter(modeBrowse(context));
52819         context.history().reset('hasHouse');
52820         context.map().centerEase(house, 500);
52821
52822         timeout(function() {
52823             if (context.map().zoom() < 20) {
52824                 context.map().zoomEase(20, 500);
52825             }
52826         }, 520);
52827
52828         context.on('enter.intro', function(mode) {
52829             if (mode.id !== 'select') return;
52830             var ids = context.selectedIDs();
52831             if (ids.length !== 1 || ids[0] !== houseId) return;
52832
52833             timeout(function() {
52834                 var node = selectMenuItem('orthogonalize').node();
52835                 if (!node) return;
52836                 continueTo(clickSquare);
52837             }, 300);  // after menu visible
52838         });
52839
52840         context.map().on('move.intro drawn.intro', function() {
52841             revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
52842         });
52843
52844         context.history().on('change.intro', function() {
52845             continueTo(rightClickHouse);
52846         });
52847
52848         function continueTo(nextStep) {
52849             context.on('enter.intro', null);
52850             context.map().on('move.intro drawn.intro', null);
52851             context.history().on('change.intro', null);
52852             nextStep();
52853         }
52854     }
52855
52856
52857     function clickSquare() {
52858         if (!houseId) return chapter.restart();
52859         var entity = context.hasEntity(houseId);
52860         if (!entity) return continueTo(rightClickHouse);
52861
52862         var node = selectMenuItem('orthogonalize').node();
52863         if (!node) { return continueTo(rightClickHouse); }
52864
52865         var wasChanged = false;
52866         var menuCoords = context.map().mouseCoordinates();
52867
52868         revealEditMenu(menuCoords,
52869             t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
52870         );
52871
52872         context.on('enter.intro', function(mode) {
52873             if (mode.id === 'browse') {
52874                 continueTo(rightClickHouse);
52875             } else if (mode.id === 'move' || mode.id === 'rotate') {
52876                 continueTo(retryClickSquare);
52877             }
52878         });
52879
52880         context.map().on('move.intro drawn.intro', function() {
52881             var node = selectMenuItem('orthogonalize').node();
52882             if (!wasChanged && !node) { return continueTo(rightClickHouse); }
52883
52884             revealEditMenu(menuCoords,
52885                 t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
52886                 { duration: 0 }
52887             );
52888         });
52889
52890         context.history().on('change.intro', function() {
52891             wasChanged = true;
52892             context.history().on('change.intro', null);
52893
52894             // Something changed.  Wait for transition to complete and check undo annotation.
52895             timeout(function() {
52896                 if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
52897                     continueTo(doneSquare);
52898                 } else {
52899                     continueTo(retryClickSquare);
52900                 }
52901             }, 500);  // after transitioned actions
52902         });
52903
52904         function continueTo(nextStep) {
52905             context.on('enter.intro', null);
52906             context.map().on('move.intro drawn.intro', null);
52907             context.history().on('change.intro', null);
52908             nextStep();
52909         }
52910     }
52911
52912
52913     function retryClickSquare() {
52914         context.enter(modeBrowse(context));
52915
52916         revealHouse(house, t('intro.buildings.retry_square'), {
52917             buttonText: t('intro.ok'),
52918             buttonCallback: function() { continueTo(rightClickHouse); }
52919         });
52920
52921         function continueTo(nextStep) {
52922             nextStep();
52923         }
52924     }
52925
52926
52927     function doneSquare() {
52928         context.history().checkpoint('doneSquare');
52929
52930         revealHouse(house, t('intro.buildings.done_square'), {
52931             buttonText: t('intro.ok'),
52932             buttonCallback: function() { continueTo(addTank); }
52933         });
52934
52935         function continueTo(nextStep) {
52936             nextStep();
52937         }
52938     }
52939
52940
52941     function addTank() {
52942         context.enter(modeBrowse(context));
52943         context.history().reset('doneSquare');
52944         tankId = null;
52945
52946         var msec = transitionTime(tank, context.map().center());
52947         if (msec) { reveal(null, null, { duration: 0 }); }
52948         context.map().zoom(19.5).centerEase(tank, msec);
52949
52950         timeout(function() {
52951             reveal('button.add-area',
52952                 t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
52953             );
52954
52955             context.on('enter.intro', function(mode) {
52956                 if (mode.id !== 'add-area') return;
52957                 continueTo(startTank);
52958             });
52959         }, msec + 100);
52960
52961         function continueTo(nextStep) {
52962             context.on('enter.intro', null);
52963             nextStep();
52964         }
52965     }
52966
52967
52968     function startTank() {
52969         if (context.mode().id !== 'add-area') {
52970             return continueTo(addTank);
52971         }
52972
52973         tankId = null;
52974
52975         timeout(function() {
52976             revealTank(tank, t('intro.buildings.start_tank'));
52977
52978             context.map().on('move.intro drawn.intro', function() {
52979                 revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
52980             });
52981
52982             context.on('enter.intro', function(mode) {
52983                 if (mode.id !== 'draw-area') return chapter.restart();
52984                 continueTo(continueTank);
52985             });
52986
52987         }, 550);  // after easing
52988
52989         function continueTo(nextStep) {
52990             context.map().on('move.intro drawn.intro', null);
52991             context.on('enter.intro', null);
52992             nextStep();
52993         }
52994     }
52995
52996
52997     function continueTank() {
52998         if (context.mode().id !== 'draw-area') {
52999             return continueTo(addTank);
53000         }
53001
53002         tankId = null;
53003
53004         revealTank(tank, t('intro.buildings.continue_tank'));
53005
53006         context.map().on('move.intro drawn.intro', function() {
53007             revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
53008         });
53009
53010         context.on('enter.intro', function(mode) {
53011             if (mode.id === 'draw-area') {
53012                 return;
53013             } else if (mode.id === 'select') {
53014                 tankId = context.selectedIDs()[0];
53015                 return continueTo(searchPresetTank);
53016             } else {
53017                 return continueTo(addTank);
53018             }
53019         });
53020
53021         function continueTo(nextStep) {
53022             context.map().on('move.intro drawn.intro', null);
53023             context.on('enter.intro', null);
53024             nextStep();
53025         }
53026     }
53027
53028
53029     function searchPresetTank() {
53030         if (!tankId || !context.hasEntity(tankId)) {
53031             return addTank();
53032         }
53033         var ids = context.selectedIDs();
53034         if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53035             context.enter(modeSelect(context, [tankId]));
53036         }
53037
53038         // disallow scrolling
53039         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53040
53041         timeout(function() {
53042             // reset pane, in case user somehow happened to change it..
53043             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53044
53045             d3_select('.preset-search-input')
53046                 .on('keydown.intro', null)
53047                 .on('keyup.intro', checkPresetSearch);
53048
53049             reveal('.preset-search-input',
53050                 t('intro.buildings.search_tank', { preset: tankPreset.name() })
53051             );
53052         }, 400);  // after preset list pane visible..
53053
53054         context.on('enter.intro', function(mode) {
53055             if (!tankId || !context.hasEntity(tankId)) {
53056                 return continueTo(addTank);
53057             }
53058
53059             var ids = context.selectedIDs();
53060             if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
53061                 // keep the user's area selected..
53062                 context.enter(modeSelect(context, [tankId]));
53063
53064                 // reset pane, in case user somehow happened to change it..
53065                 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53066                 // disallow scrolling
53067                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53068
53069                 d3_select('.preset-search-input')
53070                     .on('keydown.intro', null)
53071                     .on('keyup.intro', checkPresetSearch);
53072
53073                 reveal('.preset-search-input',
53074                     t('intro.buildings.search_tank', { preset: tankPreset.name() })
53075                 );
53076
53077                 context.history().on('change.intro', null);
53078             }
53079         });
53080
53081         function checkPresetSearch() {
53082             var first = d3_select('.preset-list-item:first-child');
53083
53084             if (first.classed('preset-man_made-storage_tank')) {
53085                 reveal(first.select('.preset-list-button').node(),
53086                     t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
53087                     { duration: 300 }
53088                 );
53089
53090                 d3_select('.preset-search-input')
53091                     .on('keydown.intro', eventCancel, true)
53092                     .on('keyup.intro', null);
53093
53094                 context.history().on('change.intro', function() {
53095                     continueTo(closeEditorTank);
53096                 });
53097             }
53098         }
53099
53100         function continueTo(nextStep) {
53101             d3_select('.inspector-wrap').on('wheel.intro', null);
53102             context.on('enter.intro', null);
53103             context.history().on('change.intro', null);
53104             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53105             nextStep();
53106         }
53107     }
53108
53109
53110     function closeEditorTank() {
53111         if (!tankId || !context.hasEntity(tankId)) {
53112             return addTank();
53113         }
53114         var ids = context.selectedIDs();
53115         if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53116             context.enter(modeSelect(context, [tankId]));
53117         }
53118
53119         context.history().checkpoint('hasTank');
53120
53121         context.on('exit.intro', function() {
53122             continueTo(rightClickTank);
53123         });
53124
53125         timeout(function() {
53126             reveal('.entity-editor-pane',
53127                 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53128             );
53129         }, 500);
53130
53131         function continueTo(nextStep) {
53132             context.on('exit.intro', null);
53133             nextStep();
53134         }
53135     }
53136
53137
53138     function rightClickTank() {
53139         if (!tankId) return continueTo(addTank);
53140
53141         context.enter(modeBrowse(context));
53142         context.history().reset('hasTank');
53143         context.map().centerEase(tank, 500);
53144
53145         timeout(function() {
53146             context.on('enter.intro', function(mode) {
53147                 if (mode.id !== 'select') return;
53148                 var ids = context.selectedIDs();
53149                 if (ids.length !== 1 || ids[0] !== tankId) return;
53150
53151                 timeout(function() {
53152                     var node = selectMenuItem('circularize').node();
53153                     if (!node) return;
53154                     continueTo(clickCircle);
53155                 }, 300);  // after menu visible
53156             });
53157
53158             revealTank(tank, t('intro.buildings.rightclick_tank'));
53159
53160             context.map().on('move.intro drawn.intro', function() {
53161                 revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
53162             });
53163
53164             context.history().on('change.intro', function() {
53165                 continueTo(rightClickTank);
53166             });
53167
53168         }, 600);
53169
53170         function continueTo(nextStep) {
53171             context.on('enter.intro', null);
53172             context.map().on('move.intro drawn.intro', null);
53173             context.history().on('change.intro', null);
53174             nextStep();
53175         }
53176     }
53177
53178
53179     function clickCircle() {
53180         if (!tankId) return chapter.restart();
53181         var entity = context.hasEntity(tankId);
53182         if (!entity) return continueTo(rightClickTank);
53183
53184         var node = selectMenuItem('circularize').node();
53185         if (!node) { return continueTo(rightClickTank); }
53186
53187         var wasChanged = false;
53188         var menuCoords = context.map().mouseCoordinates();
53189
53190         revealEditMenu(menuCoords,
53191             t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
53192         );
53193
53194         context.on('enter.intro', function(mode) {
53195             if (mode.id === 'browse') {
53196                 continueTo(rightClickTank);
53197             } else if (mode.id === 'move' || mode.id === 'rotate') {
53198                 continueTo(retryClickCircle);
53199             }
53200         });
53201
53202         context.map().on('move.intro drawn.intro', function() {
53203             var node = selectMenuItem('circularize').node();
53204             if (!wasChanged && !node) { return continueTo(rightClickTank); }
53205
53206             revealEditMenu(menuCoords,
53207                 t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
53208                 { duration: 0 }
53209             );
53210         });
53211
53212         context.history().on('change.intro', function() {
53213             wasChanged = true;
53214             context.history().on('change.intro', null);
53215
53216             // Something changed.  Wait for transition to complete and check undo annotation.
53217             timeout(function() {
53218                 if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
53219                     continueTo(play);
53220                 } else {
53221                     continueTo(retryClickCircle);
53222                 }
53223             }, 500);  // after transitioned actions
53224         });
53225
53226         function continueTo(nextStep) {
53227             context.on('enter.intro', null);
53228             context.map().on('move.intro drawn.intro', null);
53229             context.history().on('change.intro', null);
53230             nextStep();
53231         }
53232     }
53233
53234
53235     function retryClickCircle() {
53236         context.enter(modeBrowse(context));
53237
53238         revealTank(tank, t('intro.buildings.retry_circle'), {
53239             buttonText: t('intro.ok'),
53240             buttonCallback: function() { continueTo(rightClickTank); }
53241         });
53242
53243         function continueTo(nextStep) {
53244             nextStep();
53245         }
53246     }
53247
53248
53249     function play() {
53250         dispatch$$1.call('done');
53251         reveal('#id-container',
53252             t('intro.buildings.play', { next: t('intro.startediting.title') }), {
53253                 tooltipBox: '.intro-nav-wrap .chapter-startEditing',
53254                 buttonText: t('intro.ok'),
53255                 buttonCallback: function() { reveal('#id-container'); }
53256             }
53257         );
53258     }
53259
53260
53261     chapter.enter = function() {
53262         addHouse();
53263     };
53264
53265
53266     chapter.exit = function() {
53267         timeouts.forEach(window.clearTimeout);
53268         context.on('enter.intro exit.intro', null);
53269         context.map().on('move.intro drawn.intro', null);
53270         context.history().on('change.intro', null);
53271         d3_select('.inspector-wrap').on('wheel.intro', null);
53272         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53273         d3_select('.more-fields .combobox-input').on('click.intro', null);
53274     };
53275
53276
53277     chapter.restart = function() {
53278         chapter.exit();
53279         chapter.enter();
53280     };
53281
53282
53283     return utilRebind(chapter, dispatch$$1, 'on');
53284 }
53285
53286 function uiModal(selection$$1, blocking) {
53287     var keybinding = d3keybinding('modal');
53288     var previous = selection$$1.select('div.modal');
53289     var animate = previous.empty();
53290
53291     previous.transition()
53292         .duration(200)
53293         .style('opacity', 0)
53294         .remove();
53295
53296     var shaded = selection$$1
53297         .append('div')
53298         .attr('class', 'shaded')
53299         .style('opacity', 0);
53300
53301     shaded.close = function() {
53302         shaded
53303             .transition()
53304             .duration(200)
53305             .style('opacity',0)
53306             .remove();
53307
53308         modal
53309             .transition()
53310             .duration(200)
53311             .style('top','0px');
53312
53313         keybinding.off();
53314     };
53315
53316
53317     var modal = shaded
53318         .append('div')
53319         .attr('class', 'modal fillL col6');
53320
53321     if (!blocking) {
53322         shaded.on('click.remove-modal', function() {
53323             if (event.target === this) {
53324                 shaded.close();
53325             }
53326         });
53327
53328         modal.append('button')
53329             .attr('class', 'close')
53330             .on('click', shaded.close)
53331             .call(svgIcon('#icon-close'));
53332
53333         keybinding
53334             .on('⌫', shaded.close)
53335             .on('⎋', shaded.close);
53336
53337         d3_select(document)
53338             .call(keybinding);
53339     }
53340
53341     modal
53342         .append('div')
53343         .attr('class', 'content');
53344
53345     if (animate) {
53346         shaded.transition().style('opacity', 1);
53347     } else {
53348         shaded.style('opacity', 1);
53349     }
53350
53351
53352     return shaded;
53353 }
53354
53355 function uiIntroStartEditing(context, reveal) {
53356     var dispatch$$1 = dispatch('done', 'startEditing'),
53357         modalSelection = d3_select(null);
53358
53359
53360     var chapter = {
53361         title: 'intro.startediting.title'
53362     };
53363
53364     function showHelp() {
53365         reveal('.map-control.help-control',
53366             t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
53367                 buttonText: t('intro.ok'),
53368                 buttonCallback: function() { shortcuts(); }
53369             }
53370         );
53371     }
53372
53373     function shortcuts() {
53374         reveal('.map-control.help-control',
53375             t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
53376                 buttonText: t('intro.ok'),
53377                 buttonCallback: function() { showSave(); }
53378             }
53379         );
53380     }
53381
53382     function showSave() {
53383         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53384         reveal('#bar button.save',
53385             t('intro.startediting.save'), {
53386                 buttonText: t('intro.ok'),
53387                 buttonCallback: function() { showStart(); }
53388             }
53389         );
53390     }
53391
53392     function showStart() {
53393         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53394
53395         modalSelection = uiModal(context.container());
53396
53397         modalSelection.select('.modal')
53398             .attr('class', 'modal-splash modal col6');
53399
53400         modalSelection.selectAll('.close').remove();
53401
53402         var startbutton = modalSelection.select('.content')
53403             .attr('class', 'fillL')
53404             .append('button')
53405                 .attr('class', 'modal-section huge-modal-button')
53406                 .on('click', function() {
53407                     modalSelection.remove();
53408                 });
53409
53410             startbutton
53411                 .append('svg')
53412                 .attr('class', 'illustration')
53413                 .append('use')
53414                 .attr('xlink:href', '#logo-walkthrough');
53415
53416             startbutton
53417                 .append('h2')
53418                 .text(t('intro.startediting.start'));
53419
53420         dispatch$$1.call('startEditing');
53421     }
53422
53423
53424     chapter.enter = function() {
53425         showHelp();
53426     };
53427
53428
53429     chapter.exit = function() {
53430         modalSelection.remove();
53431         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
53432     };
53433
53434
53435     return utilRebind(chapter, dispatch$$1, 'on');
53436 }
53437
53438 var chapterUi = {
53439     welcome: uiIntroWelcome,
53440     navigation: uiIntroNavigation,
53441     point: uiIntroPoint,
53442     area: uiIntroArea,
53443     line: uiIntroLine,
53444     building: uiIntroBuilding,
53445     startEditing: uiIntroStartEditing
53446 };
53447
53448 var chapterFlow = [
53449     'welcome',
53450     'navigation',
53451     'point',
53452     'area',
53453     'line',
53454     'building',
53455     'startEditing'
53456 ];
53457
53458
53459 function uiIntro(context) {
53460     var introGraph = {},
53461         currChapter;
53462
53463
53464     // create entities for intro graph and localize names
53465     for (var id in dataIntroGraph) {
53466         introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
53467     }
53468
53469
53470     function intro(selection$$1) {
53471         context.enter(modeBrowse(context));
53472
53473         // Save current map state
53474         var osm = context.connection(),
53475             history = context.history().toJSON(),
53476             hash = window.location.hash,
53477             center = context.map().center(),
53478             zoom = context.map().zoom(),
53479             background = context.background().baseLayerSource(),
53480             overlays = context.background().overlayLayerSources(),
53481             opacity = d3_selectAll('#map .layer-background').style('opacity'),
53482             loadedTiles = osm && osm.loadedTiles(),
53483             baseEntities = context.history().graph().base().entities,
53484             countryCode = services.geocoder.countryCode;
53485
53486         // Block saving
53487         context.inIntro(true);
53488
53489         // Load semi-real data used in intro
53490         if (osm) { osm.toggle(false).reset(); }
53491         context.history().reset();
53492         context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
53493         context.history().checkpoint('initial');
53494
53495         var esri = context.background().findSource('EsriWorldImagery');
53496         if (esri) {
53497             context.background().baseLayerSource(esri);
53498         } else {
53499             context.background().bing();
53500         }
53501         overlays.forEach(function (d) {
53502             context.background().toggleOverlayLayer(d);
53503         });
53504
53505         // Mock geocoder
53506         services.geocoder.countryCode = function(location, callback) {
53507             callback(null, t('intro.graph.countrycode'));
53508         };
53509
53510         d3_selectAll('#map .layer-background').style('opacity', 1);
53511
53512         var curtain = uiCurtain();
53513         selection$$1.call(curtain);
53514
53515         // store that the user started the walkthrough..
53516         context.storage('walkthrough_started', 'yes');
53517
53518         // restore previous walkthrough progress..
53519         var storedProgress = context.storage('walkthrough_progress') || '';
53520         var progress = storedProgress.split(';').filter(Boolean);
53521
53522         var chapters = chapterFlow.map(function(chapter, i) {
53523             var s = chapterUi[chapter](context, curtain.reveal)
53524                 .on('done', function() {
53525                     context.presets().init();  // clear away "recent" presets
53526
53527                     buttons.filter(function(d) {
53528                         return d.title === s.title;
53529                     }).classed('finished', true);
53530
53531                     if (i < chapterFlow.length - 1) {
53532                         var next = chapterFlow[i + 1];
53533                         d3_select('button.chapter-' + next)
53534                             .classed('next', true);
53535                     }
53536
53537                     // store walkthrough progress..
53538                     progress.push(chapter);
53539                     context.storage('walkthrough_progress', uniq(progress).join(';'));
53540                 });
53541             return s;
53542         });
53543
53544         chapters[chapters.length - 1].on('startEditing', function() {
53545             // store walkthrough progress..
53546             progress.push('startEditing');
53547             context.storage('walkthrough_progress', uniq(progress).join(';'));
53548
53549             // store if walkthrough is completed..
53550             var incomplete = difference(chapterFlow, progress);
53551             if (!incomplete.length) {
53552                 context.storage('walkthrough_completed', 'yes');
53553             }
53554
53555             curtain.remove();
53556             navwrap.remove();
53557             d3_selectAll('#map .layer-background').style('opacity', opacity);
53558             if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
53559             context.history().reset().merge(values$1(baseEntities));
53560             context.background().baseLayerSource(background);
53561             overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
53562             if (history) { context.history().fromJSON(history, false); }
53563             context.map().centerZoom(center, zoom);
53564             window.location.replace(hash);
53565             services.geocoder.countryCode = countryCode;
53566             context.inIntro(false);
53567         });
53568
53569         var navwrap = selection$$1
53570             .append('div')
53571             .attr('class', 'intro-nav-wrap fillD');
53572
53573         navwrap
53574             .append('svg')
53575             .attr('class', 'intro-nav-wrap-logo')
53576             .append('use')
53577             .attr('xlink:href', '#logo-walkthrough');
53578
53579         var buttonwrap = navwrap
53580             .append('div')
53581             .attr('class', 'joined')
53582             .selectAll('button.chapter');
53583
53584         var buttons = buttonwrap
53585             .data(chapters)
53586             .enter()
53587             .append('button')
53588             .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
53589             .on('click', enterChapter);
53590
53591         buttons
53592             .append('span')
53593             .text(function(d) { return t(d.title); });
53594
53595         buttons
53596             .append('span')
53597             .attr('class', 'status')
53598             .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
53599
53600         enterChapter(chapters[0]);
53601
53602
53603         function enterChapter(newChapter) {
53604             if (currChapter) { currChapter.exit(); }
53605             context.enter(modeBrowse(context));
53606
53607             currChapter = newChapter;
53608             currChapter.enter();
53609
53610             buttons
53611                 .classed('next', false)
53612                 .classed('active', function(d) {
53613                     return d.title === currChapter.title;
53614                 });
53615         }
53616     }
53617
53618
53619     return intro;
53620 }
53621
53622 function uiTooltipHtml(text, key, heading) {
53623     var s = '';
53624
53625     if (heading) {
53626         s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
53627     }
53628     if (text) {
53629         s += '<div class="tooltip-text"><span>' + text + '</span></div>';
53630     }
53631     if (key) {
53632         s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
53633             '<span class="keyhint">' + key + '</span></div>';
53634     }
53635
53636     return s;
53637 }
53638
53639 function uiMapData(context) {
53640     var key = t('map_data.key');
53641     var features = context.features().keys();
53642     var layers = context.layers();
53643     var fills = ['wireframe', 'partial', 'full'];
53644
53645     var _fillSelected = context.storage('area-fill') || 'partial';
53646     var _shown = false;
53647     var _dataLayerContainer = d3_select(null);
53648     var _fillList = d3_select(null);
53649     var _featureList = d3_select(null);
53650
53651
53652     function showsFeature(d) {
53653         return context.features().enabled(d);
53654     }
53655
53656
53657     function autoHiddenFeature(d) {
53658         return context.features().autoHidden(d);
53659     }
53660
53661
53662     function clickFeature(d) {
53663         context.features().toggle(d);
53664         update();
53665     }
53666
53667
53668     function showsFill(d) {
53669         return _fillSelected === d;
53670     }
53671
53672
53673     function setFill(d) {
53674         fills.forEach(function(opt) {
53675             context.surface().classed('fill-' + opt, Boolean(opt === d));
53676         });
53677
53678         _fillSelected = d;
53679         context.storage('area-fill', d);
53680         if (d !== 'wireframe') {
53681             context.storage('area-fill-toggle', d);
53682         }
53683         update();
53684     }
53685
53686
53687     function showsLayer(which) {
53688         var layer = layers.layer(which);
53689         if (layer) {
53690             return layer.enabled();
53691         }
53692         return false;
53693     }
53694
53695
53696     function setLayer(which, enabled) {
53697         var layer = layers.layer(which);
53698         if (layer) {
53699             layer.enabled(enabled);
53700             update();
53701         }
53702     }
53703
53704
53705     function toggleLayer(which) {
53706         setLayer(which, !showsLayer(which));
53707     }
53708
53709
53710     function drawPhotoItems(selection$$1) {
53711         var photoKeys = ['mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
53712         var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
53713         var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
53714
53715         function layerSupported(d) {
53716             return d.layer && d.layer.supported();
53717         }
53718         function layerEnabled(d) {
53719             return layerSupported(d) && d.layer.enabled();
53720         }
53721
53722         var ul = selection$$1
53723             .selectAll('.layer-list-photos')
53724             .data([0]);
53725
53726         ul = ul.enter()
53727             .append('ul')
53728             .attr('class', 'layer-list layer-list-photos')
53729             .merge(ul);
53730
53731         var li = ul.selectAll('.list-item-photos')
53732             .data(data);
53733
53734         li.exit()
53735             .remove();
53736
53737         var liEnter = li.enter()
53738             .append('li')
53739             .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
53740
53741         var labelEnter = liEnter
53742             .append('label')
53743             .each(function(d) {
53744                 d3_select(this)
53745                     .call(tooltip()
53746                         .title(t(d.id.replace('-', '_') + '.tooltip'))
53747                         .placement('top')
53748                     );
53749             });
53750
53751         labelEnter
53752             .append('input')
53753             .attr('type', 'checkbox')
53754             .on('change', function(d) { toggleLayer(d.id); });
53755
53756         labelEnter
53757             .append('span')
53758             .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
53759
53760
53761         // Update
53762         li = li
53763             .merge(liEnter);
53764
53765         li
53766             .classed('active', layerEnabled)
53767             .selectAll('input')
53768             .property('checked', layerEnabled);
53769     }
53770
53771
53772     function drawOsmItem(selection$$1) {
53773         var osm = layers.layer('osm'),
53774             showsOsm = osm.enabled();
53775
53776         var ul = selection$$1
53777             .selectAll('.layer-list-osm')
53778             .data(osm ? [0] : []);
53779
53780         // Exit
53781         ul.exit()
53782             .remove();
53783
53784         // Enter
53785         var ulEnter = ul.enter()
53786             .append('ul')
53787             .attr('class', 'layer-list layer-list-osm');
53788
53789         var liEnter = ulEnter
53790             .append('li')
53791             .attr('class', 'list-item-osm');
53792
53793         var labelEnter = liEnter
53794             .append('label')
53795             .call(tooltip()
53796                 .title(t('map_data.layers.osm.tooltip'))
53797                 .placement('top')
53798             );
53799
53800         labelEnter
53801             .append('input')
53802             .attr('type', 'checkbox')
53803             .on('change', function() { toggleLayer('osm'); });
53804
53805         labelEnter
53806             .append('span')
53807             .text(t('map_data.layers.osm.title'));
53808
53809         // Update
53810         ul = ul
53811             .merge(ulEnter);
53812
53813         ul.selectAll('.list-item-osm')
53814             .classed('active', showsOsm)
53815             .selectAll('input')
53816             .property('checked', showsOsm);
53817     }
53818
53819
53820     function drawGpxItem(selection$$1) {
53821         var gpx = layers.layer('gpx'),
53822             hasGpx = gpx && gpx.hasGpx(),
53823             showsGpx = hasGpx && gpx.enabled();
53824
53825         var ul = selection$$1
53826             .selectAll('.layer-list-gpx')
53827             .data(gpx ? [0] : []);
53828
53829         // Exit
53830         ul.exit()
53831             .remove();
53832
53833         // Enter
53834         var ulEnter = ul.enter()
53835             .append('ul')
53836             .attr('class', 'layer-list layer-list-gpx');
53837
53838         var liEnter = ulEnter
53839             .append('li')
53840             .attr('class', 'list-item-gpx');
53841
53842         liEnter
53843             .append('button')
53844             .attr('class', 'list-item-gpx-extent')
53845             .call(tooltip()
53846                 .title(t('gpx.zoom'))
53847                 .placement((textDirection === 'rtl') ? 'right' : 'left')
53848             )
53849             .on('click', function() {
53850                 event.preventDefault();
53851                 event.stopPropagation();
53852                 gpx.fitZoom();
53853             })
53854             .call(svgIcon('#icon-search'));
53855
53856         liEnter
53857             .append('button')
53858             .attr('class', 'list-item-gpx-browse')
53859             .call(tooltip()
53860                 .title(t('gpx.browse'))
53861                 .placement((textDirection === 'rtl') ? 'right' : 'left')
53862             )
53863             .on('click', function() {
53864                 d3_select(document.createElement('input'))
53865                     .attr('type', 'file')
53866                     .on('change', function() {
53867                         gpx.files(event.target.files);
53868                     })
53869                     .node().click();
53870             })
53871             .call(svgIcon('#icon-geolocate'));
53872
53873         var labelEnter = liEnter
53874             .append('label')
53875             .call(tooltip()
53876                 .title(t('gpx.drag_drop'))
53877                 .placement('top')
53878             );
53879
53880         labelEnter
53881             .append('input')
53882             .attr('type', 'checkbox')
53883             .on('change', function() { toggleLayer('gpx'); });
53884
53885         labelEnter
53886             .append('span')
53887             .text(t('gpx.local_layer'));
53888
53889         // Update
53890         ul = ul
53891             .merge(ulEnter);
53892
53893         ul.selectAll('.list-item-gpx')
53894             .classed('active', showsGpx)
53895             .selectAll('label')
53896             .classed('deemphasize', !hasGpx)
53897             .selectAll('input')
53898             .property('disabled', !hasGpx)
53899             .property('checked', showsGpx);
53900     }
53901
53902
53903     function drawListItems(selection$$1, data, type, name, change, active) {
53904         var items = selection$$1.selectAll('li')
53905             .data(data);
53906
53907         // Exit
53908         items.exit()
53909             .remove();
53910
53911         // Enter
53912         var enter = items.enter()
53913             .append('li')
53914             .attr('class', 'layer')
53915             .call(tooltip()
53916                 .html(true)
53917                 .title(function(d) {
53918                     var tip = t(name + '.' + d + '.tooltip'),
53919                         key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
53920
53921                     if (name === 'feature' && autoHiddenFeature(d)) {
53922                         var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
53923                         tip += '<div>' + msg + '</div>';
53924                     }
53925                     return uiTooltipHtml(tip, key);
53926                 })
53927                 .placement('top')
53928             );
53929
53930         var label = enter
53931             .append('label');
53932
53933         label
53934             .append('input')
53935             .attr('type', type)
53936             .attr('name', name)
53937             .on('change', change);
53938
53939         label
53940             .append('span')
53941             .text(function(d) { return t(name + '.' + d + '.description'); });
53942
53943         // Update
53944         items = items
53945             .merge(enter);
53946
53947         items
53948             .classed('active', active)
53949             .selectAll('input')
53950             .property('checked', active)
53951             .property('indeterminate', function(d) {
53952                 return (name === 'feature' && autoHiddenFeature(d));
53953             });
53954     }
53955
53956
53957     function renderDataLayers(selection$$1) {
53958         var container = selection$$1.selectAll('data-layer-container')
53959             .data([0]);
53960
53961         _dataLayerContainer = container.enter()
53962             .append('div')
53963             .attr('class', 'data-layer-container')
53964             .merge(container);
53965     }
53966
53967
53968     function renderFillList(selection$$1) {
53969         var container = selection$$1.selectAll('layer-fill-list')
53970             .data([0]);
53971
53972         _fillList = container.enter()
53973             .append('ul')
53974             .attr('class', 'layer-list layer-fill-list')
53975             .merge(container);
53976     }
53977
53978
53979     function renderFeatureList(selection$$1) {
53980         var container = selection$$1.selectAll('layer-feature-list')
53981             .data([0]);
53982
53983         _featureList = container.enter()
53984             .append('ul')
53985             .attr('class', 'layer-list layer-feature-list')
53986             .merge(container);
53987     }
53988
53989
53990     function update() {
53991         _dataLayerContainer
53992             .call(drawOsmItem)
53993             .call(drawPhotoItems)
53994             .call(drawGpxItem);
53995
53996         _fillList
53997             .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
53998
53999         _featureList
54000             .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
54001     }
54002
54003
54004     function toggleWireframe() {
54005         if (event) {
54006             event.preventDefault();
54007             event.stopPropagation();
54008         }
54009
54010         if (_fillSelected === 'wireframe') {
54011             _fillSelected = context.storage('area-fill-toggle') || 'partial';
54012         } else {
54013             _fillSelected = 'wireframe';
54014         }
54015
54016         setFill(_fillSelected);
54017         context.map().pan([0,0]);  // trigger a redraw
54018     }
54019
54020
54021     function mapData(selection$$1) {
54022
54023         function hidePane() {
54024             setVisible(false);
54025         }
54026
54027         function togglePane() {
54028             if (event) event.preventDefault();
54029             paneTooltip.hide(button);
54030             setVisible(!button.classed('active'));
54031         }
54032
54033         function setVisible(show) {
54034             if (show !== _shown) {
54035                 button.classed('active', show);
54036                 _shown = show;
54037
54038                 if (show) {
54039                     uiBackground.hidePane();
54040                     uiHelp.hidePane();
54041                     update();
54042
54043                     pane
54044                         .style('display', 'block')
54045                         .style('right', '-300px')
54046                         .transition()
54047                         .duration(200)
54048                         .style('right', '0px');
54049
54050                 } else {
54051                     pane
54052                         .style('display', 'block')
54053                         .style('right', '0px')
54054                         .transition()
54055                         .duration(200)
54056                         .style('right', '-300px')
54057                         .on('end', function() {
54058                             d3_select(this).style('display', 'none');
54059                         });
54060                 }
54061             }
54062         }
54063
54064
54065         var pane = selection$$1
54066             .append('div')
54067             .attr('class', 'fillL map-overlay col3 content hide');
54068
54069         var paneTooltip = tooltip()
54070             .placement((textDirection === 'rtl') ? 'right' : 'left')
54071             .html(true)
54072             .title(uiTooltipHtml(t('map_data.description'), key));
54073
54074         var button = selection$$1
54075             .append('button')
54076             .attr('tabindex', -1)
54077             .on('click', togglePane)
54078             .call(svgIcon('#icon-data', 'light'))
54079             .call(paneTooltip);
54080
54081
54082         pane
54083             .append('h2')
54084             .text(t('map_data.title'));
54085
54086
54087         // data layers
54088         pane
54089             .append('div')
54090             .attr('class', 'map-data-data-layers')
54091             .call(uiDisclosure(context, 'data_layers', true)
54092                 .title(t('map_data.data_layers'))
54093                 .content(renderDataLayers)
54094             );
54095
54096         // area fills
54097         pane
54098             .append('div')
54099             .attr('class', 'map-data-area-fills')
54100             .call(uiDisclosure(context, 'fill_area', false)
54101                 .title(t('map_data.fill_area'))
54102                 .content(renderFillList)
54103             );
54104
54105         // feature filters
54106         pane
54107             .append('div')
54108             .attr('class', 'map-data-feature-filters')
54109             .call(uiDisclosure(context, 'map_features', false)
54110                 .title(t('map_data.map_features'))
54111                 .content(renderFeatureList)
54112             );
54113
54114
54115         // add listeners
54116         context.features()
54117             .on('change.map_data-update', update);
54118
54119         update();
54120         setFill(_fillSelected);
54121
54122         var keybinding = d3keybinding('features')
54123             .on(key, togglePane)
54124             .on(t('area_fill.wireframe.key'), toggleWireframe)
54125             .on([t('background.key'), t('help.key')], hidePane);
54126
54127         d3_select(document)
54128             .call(keybinding);
54129
54130         uiMapData.hidePane = hidePane;
54131         uiMapData.togglePane = togglePane;
54132         uiMapData.setVisible = setVisible;
54133     }
54134
54135     return mapData;
54136 }
54137
54138 function uiShortcuts() {
54139     var detected = utilDetect();
54140     var activeTab = 0;
54141     var modalSelection;
54142     var savedSelection;
54143
54144
54145     var keybinding = d3keybinding('shortcuts')
54146         .on(t('shortcuts.toggle.key'), function () {
54147             if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
54148                 if (modalSelection) {
54149                     modalSelection.close();
54150                     modalSelection = null;
54151                 }
54152             } else {
54153                 modalSelection = uiModal(savedSelection);
54154                 shortcutsModal(modalSelection);
54155             }
54156         });
54157
54158     d3_select(document)
54159         .call(keybinding);
54160
54161
54162
54163     function shortcutsModal(modalSelection) {
54164         modalSelection.select('.modal')
54165             .classed('modal-shortcuts', true);
54166
54167         var shortcutsModal = modalSelection.select('.content');
54168
54169         shortcutsModal
54170             .append('div')
54171             .attr('class', 'modal-section')
54172             .append('h3')
54173             .text(t('shortcuts.title'));
54174
54175         shortcutsModal
54176             .call(render);
54177     }
54178
54179
54180     function render(selection$$1) {
54181         var wrapper = selection$$1
54182             .selectAll('.wrapper')
54183             .data([0]);
54184
54185         var wrapperEnter = wrapper
54186             .enter()
54187             .append('div')
54188             .attr('class', 'wrapper modal-section');
54189
54190         var tabsBar = wrapperEnter
54191             .append('div')
54192             .attr('class', 'tabs-bar');
54193
54194         var shortcutsList = wrapperEnter
54195             .append('div')
54196             .attr('class', 'shortcuts-list');
54197
54198         wrapper = wrapper.merge(wrapperEnter);
54199
54200         var tabs = tabsBar
54201             .selectAll('.tab')
54202             .data(dataShortcuts);
54203
54204         var tabsEnter = tabs
54205             .enter()
54206             .append('div')
54207             .attr('class', 'tab')
54208             .on('click', function (d, i) {
54209                 activeTab = i;
54210                 render(selection$$1);
54211             });
54212
54213         tabsEnter
54214             .append('span')
54215             .text(function (d) { return t(d.text); });
54216
54217         tabs = tabs
54218             .merge(tabsEnter);
54219
54220         // Update
54221         wrapper.selectAll('.tab')
54222             .classed('active', function (d, i) {
54223                 return i === activeTab;
54224             });
54225
54226
54227         var shortcuts = shortcutsList
54228             .selectAll('.shortcut-tab')
54229             .data(dataShortcuts);
54230
54231         var shortcutsEnter = shortcuts
54232             .enter()
54233             .append('div')
54234             .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
54235
54236         var columnsEnter = shortcutsEnter
54237             .selectAll('.shortcut-column')
54238             .data(function (d) { return d.columns; })
54239             .enter()
54240             .append('table')
54241             .attr('class', 'shortcut-column');
54242
54243         var rowsEnter = columnsEnter
54244             .selectAll('.shortcut-row')
54245             .data(function (d) { return d.rows; })
54246             .enter()
54247             .append('tr')
54248             .attr('class', 'shortcut-row');
54249
54250
54251         var sectionRows = rowsEnter
54252             .filter(function (d) { return !d.shortcuts; });
54253
54254         sectionRows
54255             .append('td');
54256
54257         sectionRows
54258             .append('td')
54259             .attr('class', 'shortcut-section')
54260             .append('h3')
54261             .text(function (d) { return t(d.text); });
54262
54263
54264         var shortcutRows = rowsEnter
54265             .filter(function (d) { return d.shortcuts; });
54266
54267         var shortcutKeys = shortcutRows
54268             .append('td')
54269             .attr('class', 'shortcut-keys');
54270
54271         var modifierKeys = shortcutKeys
54272             .filter(function (d) { return d.modifiers; });
54273
54274         modifierKeys
54275             .selectAll('kbd.modifier')
54276             .data(function (d) {
54277                 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54278                     return ['⌘'];
54279                 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54280                     return [];
54281                 } else {
54282                     return d.modifiers;
54283                 }
54284             })
54285             .enter()
54286             .each(function () {
54287                 var selection$$1 = d3_select(this);
54288
54289                 selection$$1
54290                     .append('kbd')
54291                     .attr('class', 'modifier')
54292                     .text(function (d) { return uiCmd.display(d); });
54293
54294                 selection$$1
54295                     .append('span')
54296                     .text('+');
54297             });
54298
54299
54300         shortcutKeys
54301             .selectAll('kbd.shortcut')
54302             .data(function (d) {
54303                 var arr = d.shortcuts;
54304                 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54305                     arr = ['Y'];
54306                 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54307                     arr = ['F11'];
54308                 }
54309
54310                 return arr.map(function(s) {
54311                     return {
54312                         shortcut: s,
54313                         separator: d.separator
54314                     };
54315                 });
54316             })
54317             .enter()
54318             .each(function (d, i, nodes) {
54319                 var selection$$1 = d3_select(this);
54320                 var click = d.shortcut.toLowerCase().match(/(.*).click/);
54321
54322                 if (click && click[1]) {
54323                     selection$$1
54324                         .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
54325                 } else {
54326                     selection$$1
54327                         .append('kbd')
54328                         .attr('class', 'shortcut')
54329                         .text(function (d) {
54330                             var key = d.shortcut;
54331                             return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
54332                         });
54333                 }
54334
54335                 if (i < nodes.length - 1) {
54336                     selection$$1
54337                         .append('span')
54338                         .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
54339                 }
54340             });
54341
54342
54343         shortcutKeys
54344             .filter(function(d) { return d.gesture; })
54345             .each(function () {
54346                 var selection$$1 = d3_select(this);
54347
54348                 selection$$1
54349                     .append('span')
54350                     .text('+');
54351
54352                 selection$$1
54353                     .append('span')
54354                     .attr('class', 'gesture')
54355                     .text(function (d) { return t(d.gesture); });
54356             });
54357
54358
54359         shortcutRows
54360             .append('td')
54361             .attr('class', 'shortcut-desc')
54362             .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
54363
54364
54365         shortcuts = shortcuts
54366             .merge(shortcutsEnter);
54367
54368         // Update
54369         wrapper.selectAll('.shortcut-tab')
54370             .style('display', function (d, i) {
54371                 return i === activeTab ? 'flex' : 'none';
54372             });
54373     }
54374
54375
54376     return function(selection$$1, show) {
54377         savedSelection = selection$$1;
54378         if (show) {
54379             modalSelection = uiModal(selection$$1);
54380             shortcutsModal(modalSelection);
54381         }
54382     };
54383 }
54384
54385 function uiHelp(context) {
54386     var key = t('help.key');
54387
54388     var docKeys = [
54389         ['help', [
54390             'welcome',
54391             'open_data_h',
54392             'open_data',
54393             'before_start_h',
54394             'before_start',
54395             'open_source_h',
54396             'open_source',
54397             'open_source_help'
54398         ]],
54399         ['overview', [
54400             'navigation_h',
54401             'navigation_drag',
54402             'navigation_zoom',
54403             'features_h',
54404             'features',
54405             'nodes_ways'
54406         ]],
54407         ['editing', [
54408             'select_h',
54409             'select_left_click',
54410             'select_right_click',
54411             'multiselect_h',
54412             'multiselect_shift_click',
54413             'multiselect_lasso',
54414             'undo_redo_h',
54415             'undo_redo',
54416             'save_h',
54417             'save',
54418             'save_validation',
54419             'upload_h',
54420             'upload',
54421             'backups_h',
54422             'backups',
54423             'keyboard_h',
54424             'keyboard'
54425         ]],
54426         ['feature_editor', [
54427             'intro',
54428             'definitions',
54429             'type_h',
54430             'type',
54431             'type_picker',
54432             'fields_h',
54433             'fields_all_fields',
54434             'fields_example',
54435             'fields_add_field',
54436             'tags_h',
54437             'tags_all_tags',
54438             'tags_resources'
54439         ]],
54440         ['points', [
54441             'intro',
54442             'add_point_h',
54443             'add_point',
54444             'add_point_finish',
54445             'move_point_h',
54446             'move_point',
54447             'delete_point_h',
54448             'delete_point',
54449             'delete_point_command'
54450         ]],
54451         ['lines', [
54452             'intro',
54453             'add_line_h',
54454             'add_line',
54455             'add_line_draw',
54456             'add_line_finish',
54457             'modify_line_h',
54458             'modify_line_dragnode',
54459             'modify_line_addnode',
54460             'connect_line_h',
54461             'connect_line',
54462             'connect_line_display',
54463             'connect_line_drag',
54464             'connect_line_tag',
54465             'disconnect_line_h',
54466             'disconnect_line_command',
54467             'move_line_h',
54468             'move_line_command',
54469             'move_line_connected',
54470             'delete_line_h',
54471             'delete_line',
54472             'delete_line_command'
54473         ]],
54474         ['areas', [
54475             'intro',
54476             'point_or_area_h',
54477             'point_or_area',
54478             'add_area_h',
54479             'add_area_command',
54480             'add_area_draw',
54481             'add_area_finish',
54482             'square_area_h',
54483             'square_area_command',
54484             'modify_area_h',
54485             'modify_area_dragnode',
54486             'modify_area_addnode',
54487             'delete_area_h',
54488             'delete_area',
54489             'delete_area_command'
54490         ]],
54491         ['relations', [
54492             'intro',
54493             'edit_relation_h',
54494             'edit_relation',
54495             'edit_relation_add',
54496             'edit_relation_delete',
54497             'maintain_relation_h',
54498             'maintain_relation',
54499             'relation_types_h',
54500             'multipolygon_h',
54501             'multipolygon',
54502             'multipolygon_create',
54503             'multipolygon_merge',
54504             'turn_restriction_h',
54505             'turn_restriction',
54506             'turn_restriction_field',
54507             'turn_restriction_editing',
54508             'route_h',
54509             'route',
54510             'route_add',
54511             'boundary_h',
54512             'boundary',
54513             'boundary_add'
54514         ]],
54515         ['imagery', [
54516             'intro',
54517             'sources_h',
54518             'choosing',
54519             'sources',
54520             'offsets_h',
54521             'offset',
54522             'offset_change'
54523         ]],
54524         ['streetlevel', [
54525             'intro',
54526             'using_h',
54527             'using',
54528             'photos',
54529             'viewer'
54530         ]],
54531         ['gps', [
54532             'intro',
54533             'survey',
54534             'using_h',
54535             'using',
54536             'tracing',
54537             'upload'
54538         ]]
54539     ];
54540
54541     var headings = {
54542         'help.help.open_data_h': 3,
54543         'help.help.before_start_h': 3,
54544         'help.help.open_source_h': 3,
54545         'help.overview.navigation_h': 3,
54546         'help.overview.features_h': 3,
54547         'help.editing.select_h': 3,
54548         'help.editing.multiselect_h': 3,
54549         'help.editing.undo_redo_h': 3,
54550         'help.editing.save_h': 3,
54551         'help.editing.upload_h': 3,
54552         'help.editing.backups_h': 3,
54553         'help.editing.keyboard_h': 3,
54554         'help.feature_editor.type_h': 3,
54555         'help.feature_editor.fields_h': 3,
54556         'help.feature_editor.tags_h': 3,
54557         'help.points.add_point_h': 3,
54558         'help.points.move_point_h': 3,
54559         'help.points.delete_point_h': 3,
54560         'help.lines.add_line_h': 3,
54561         'help.lines.modify_line_h': 3,
54562         'help.lines.connect_line_h': 3,
54563         'help.lines.disconnect_line_h': 3,
54564         'help.lines.move_line_h': 3,
54565         'help.lines.delete_line_h': 3,
54566         'help.areas.point_or_area_h': 3,
54567         'help.areas.add_area_h': 3,
54568         'help.areas.square_area_h': 3,
54569         'help.areas.modify_area_h': 3,
54570         'help.areas.delete_area_h': 3,
54571         'help.relations.edit_relation_h': 3,
54572         'help.relations.maintain_relation_h': 3,
54573         'help.relations.relation_types_h': 2,
54574         'help.relations.multipolygon_h': 3,
54575         'help.relations.turn_restriction_h': 3,
54576         'help.relations.route_h': 3,
54577         'help.relations.boundary_h': 3,
54578         'help.imagery.sources_h': 3,
54579         'help.imagery.offsets_h': 3,
54580         'help.streetlevel.using_h': 3,
54581         'help.gps.using_h': 3,
54582     };
54583
54584     var replacements = {
54585         point: icon('#icon-point', 'pre-text'),
54586         line: icon('#icon-line', 'pre-text'),
54587         area: icon('#icon-area', 'pre-text'),
54588         plus: icon('#icon-plus', 'pre-text'),
54589         minus: icon('#icon-minus', 'pre-text'),
54590         orthogonalize: icon('#operation-orthogonalize', 'pre-text'),
54591         disconnect: icon('#operation-disconnect', 'pre-text'),
54592         layers: icon('#icon-layers', 'pre-text'),
54593         data: icon('#icon-data', 'pre-text'),
54594         inspect: icon('#icon-inspect', 'pre-text'),
54595         move: icon('#operation-move', 'pre-text'),
54596         merge: icon('#operation-merge', 'pre-text'),
54597         delete: icon('#operation-delete', 'pre-text'),
54598         close: icon('#icon-close', 'pre-text'),
54599         undo: icon(textDirection === 'rtl' ? '#icon-redo' : '#icon-undo', 'pre-text'),
54600         redo: icon(textDirection === 'rtl' ? '#icon-undo' : '#icon-redo', 'pre-text'),
54601         save: icon('#icon-save', 'pre-text'),
54602         leftclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'left'),
54603         rightclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'right'),
54604         shift: uiCmd.display('⇧'),
54605         alt: uiCmd.display('⌥'),
54606         return: uiCmd.display('↵'),
54607         version: context.version
54608     };
54609
54610     // For each section, squash all the texts into a single markdown document
54611     var docs = docKeys.map(function(key) {
54612         var helpkey = 'help.' + key[0];
54613         var text = key[1].reduce(function(all, part) {
54614             var subkey = helpkey + '.' + part;
54615             var depth = headings[subkey];                              // is this subkey a heading?
54616             var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
54617             return all + hhh + t(subkey, replacements) + '\n\n';
54618         }, '');
54619
54620         return {
54621             title: t(helpkey + '.title'),
54622             html: marked(text.trim())
54623         };
54624     });
54625
54626
54627     function help(selection$$1) {
54628
54629         function hidePane() {
54630             setVisible(false);
54631         }
54632
54633
54634         function togglePane() {
54635             if (event) event.preventDefault();
54636             tooltipBehavior.hide(button);
54637             setVisible(!button.classed('active'));
54638         }
54639
54640
54641         function setVisible(show) {
54642             if (show !== shown) {
54643                 button.classed('active', show);
54644                 shown = show;
54645
54646                 if (show) {
54647                     uiBackground.hidePane();
54648                     uiMapData.hidePane();
54649
54650                     pane.style('display', 'block')
54651                         .style('right', '-500px')
54652                         .transition()
54653                         .duration(200)
54654                         .style('right', '0px');
54655
54656                 } else {
54657                     pane.style('right', '0px')
54658                         .transition()
54659                         .duration(200)
54660                         .style('right', '-500px')
54661                         .on('end', function() {
54662                             d3_select(this).style('display', 'none');
54663                         });
54664                 }
54665             }
54666         }
54667
54668
54669         function clickHelp(d, i) {
54670             var rtl = (textDirection === 'rtl');
54671             pane.property('scrollTop', 0);
54672             doctitle.html(d.title);
54673
54674             body.html(d.html);
54675             body.selectAll('a')
54676                 .attr('target', '_blank');
54677             menuItems.classed('selected', function(m) {
54678                 return m.title === d.title;
54679             });
54680
54681             nav.html('');
54682             if (rtl) {
54683                 nav.call(drawNext).call(drawPrevious);
54684             } else {
54685                 nav.call(drawPrevious).call(drawNext);
54686             }
54687
54688
54689             function drawNext(selection$$1) {
54690                 if (i < docs.length - 1) {
54691                     var nextLink = selection$$1
54692                         .append('a')
54693                         .attr('class', 'next')
54694                         .on('click', function() {
54695                             clickHelp(docs[i + 1], i + 1);
54696                         });
54697
54698                     nextLink
54699                         .append('span')
54700                         .text(docs[i + 1].title)
54701                         .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
54702                 }
54703             }
54704
54705
54706             function drawPrevious(selection$$1) {
54707                 if (i > 0) {
54708                     var prevLink = selection$$1
54709                         .append('a')
54710                         .attr('class', 'previous')
54711                         .on('click', function() {
54712                             clickHelp(docs[i - 1], i - 1);
54713                         });
54714
54715                     prevLink
54716                         .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
54717                         .append('span')
54718                         .text(docs[i - 1].title);
54719                 }
54720             }
54721         }
54722
54723
54724         function clickWalkthrough() {
54725             if (context.inIntro()) return;
54726             context.container().call(uiIntro(context));
54727             setVisible(false);
54728         }
54729
54730
54731         function clickShortcuts() {
54732             context.container().call(uiShortcuts(context), true);
54733         }
54734
54735
54736         var pane = selection$$1.append('div')
54737             .attr('class', 'help-wrap map-overlay fillL col6 content hide');
54738         var tooltipBehavior = tooltip()
54739             .placement((textDirection === 'rtl') ? 'right' : 'left')
54740             .html(true)
54741             .title(uiTooltipHtml(t('help.title'), key));
54742         var button = selection$$1.append('button')
54743             .attr('tabindex', -1)
54744             .on('click', togglePane)
54745             .call(svgIcon('#icon-help', 'light'))
54746             .call(tooltipBehavior);
54747         var shown = false;
54748
54749
54750         var toc = pane
54751             .append('ul')
54752             .attr('class', 'toc');
54753
54754         var menuItems = toc.selectAll('li')
54755             .data(docs)
54756             .enter()
54757             .append('li')
54758             .append('a')
54759             .html(function(d) { return d.title; })
54760             .on('click', clickHelp);
54761
54762         var shortcuts = toc
54763             .append('li')
54764             .attr('class', 'shortcuts')
54765             .call(tooltip()
54766                 .html(true)
54767                 .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
54768                 .placement('top')
54769             )
54770             .append('a')
54771             .on('click', clickShortcuts);
54772
54773         shortcuts
54774             .append('div')
54775             .text(t('shortcuts.title'));
54776
54777         var walkthrough = toc
54778             .append('li')
54779             .attr('class', 'walkthrough')
54780             .append('a')
54781             .on('click', clickWalkthrough);
54782
54783         walkthrough
54784             .append('svg')
54785             .attr('class', 'logo logo-walkthrough')
54786             .append('use')
54787             .attr('xlink:href', '#logo-walkthrough');
54788
54789         walkthrough
54790             .append('div')
54791             .text(t('splash.walkthrough'));
54792
54793
54794         var content = pane
54795             .append('div')
54796             .attr('class', 'left-content');
54797
54798         var doctitle = content
54799             .append('h2')
54800             .text(t('help.title'));
54801
54802         var body = content
54803             .append('div')
54804             .attr('class', 'body');
54805
54806         var nav = content
54807             .append('div')
54808             .attr('class', 'nav');
54809
54810         clickHelp(docs[0], 0);
54811
54812         var keybinding = d3keybinding('help')
54813             .on(key, togglePane)
54814             .on([t('background.key'), t('map_data.key')], hidePane);
54815
54816         d3_select(document)
54817             .call(keybinding);
54818
54819         uiHelp.hidePane = hidePane;
54820         uiHelp.togglePane = togglePane;
54821         uiHelp.setVisible = setVisible;
54822     }
54823
54824     return help;
54825 }
54826
54827 function localeDateString(s) {
54828     if (!s) return null;
54829     var detected = utilDetect();
54830     var options = { day: 'numeric', month: 'short', year: 'numeric' };
54831     var d = new Date(s);
54832     if (isNaN(d.getTime())) return null;
54833     return d.toLocaleDateString(detected.locale, options);
54834 }
54835
54836 function vintageRange(vintage) {
54837     var s;
54838     if (vintage.start || vintage.end) {
54839         s = (vintage.start || '?');
54840         if (vintage.start !== vintage.end) {
54841             s += ' - ' + (vintage.end || '?');
54842         }
54843     }
54844     return s;
54845 }
54846
54847 function getEPSG3857XY(x, y, z) {
54848     //polyfill for IE11, PhantomJS
54849     var sinh = Math.sinh || function(x) {
54850         var y = Math.exp(x);
54851         return (y - 1 / y) / 2;
54852     };
54853
54854     var zoomSize = Math.pow(2, z);
54855     var lon = x / zoomSize * Math.PI * 2 - Math.PI;
54856     var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
54857     var mercCoords = mercatorRaw(lon, lat);
54858     return {
54859         x: 20037508.34 / Math.PI * mercCoords[0],
54860         y: 20037508.34 / Math.PI * mercCoords[1]
54861     };
54862 }
54863
54864
54865 function rendererBackgroundSource(data) {
54866     var source = clone(data);
54867     var offset = [0, 0];
54868     var name = source.name;
54869     var description = source.description;
54870     var best = !!source.best;
54871     var template = source.template;
54872
54873     source.scaleExtent = data.scaleExtent || [0, 22];
54874     source.overzoom = data.overzoom !== false;
54875
54876
54877     source.offset = function(_) {
54878         if (!arguments.length) return offset;
54879         offset = _;
54880         return source;
54881     };
54882
54883
54884     source.nudge = function(_, zoomlevel) {
54885         offset[0] += _[0] / Math.pow(2, zoomlevel);
54886         offset[1] += _[1] / Math.pow(2, zoomlevel);
54887         return source;
54888     };
54889
54890
54891     source.name = function() {
54892         var id_safe = source.id.replace('.', '<TX_DOT>');
54893         return t('imagery.' + id_safe + '.name', { default: name });
54894     };
54895
54896
54897     source.description = function() {
54898         var id_safe = source.id.replace('.', '<TX_DOT>');
54899         return t('imagery.' + id_safe + '.description', { default: description });
54900     };
54901
54902
54903     source.best = function() {
54904         return best;
54905     };
54906
54907
54908     source.area = function() {
54909         if (!data.polygon) return Number.MAX_VALUE;  // worldwide
54910         var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
54911         return isNaN(area) ? 0 : area;
54912     };
54913
54914
54915     source.imageryUsed = function() {
54916         return name || source.id;
54917     };
54918
54919
54920     source.template = function(_) {
54921         if (!arguments.length) return template;
54922         if (source.id === 'custom') template = _;
54923         return source;
54924     };
54925
54926
54927     source.url = function(coord) {
54928         if (this.type === 'wms') {
54929             var minXmaxY = getEPSG3857XY(coord[0], coord[1], coord[2]);
54930             var maxXminY = getEPSG3857XY(coord[0]+1, coord[1]+1, coord[2]);
54931             return template
54932                 .replace('{width}', 256)
54933                 .replace('{height}', 256)
54934                 .replace('{proj}', this.projection)
54935                 .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
54936         }
54937         return template
54938             .replace('{x}', coord[0])
54939             .replace('{y}', coord[1])
54940             // TMS-flipped y coordinate
54941             .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
54942             .replace(/\{z(oom)?\}/, coord[2])
54943             .replace(/\{switch:([^}]+)\}/, function(s, r) {
54944                 var subdomains = r.split(',');
54945                 return subdomains[(coord[0] + coord[1]) % subdomains.length];
54946             })
54947             .replace('{u}', function() {
54948                 var u = '';
54949                 for (var zoom = coord[2]; zoom > 0; zoom--) {
54950                     var b = 0;
54951                     var mask = 1 << (zoom - 1);
54952                     if ((coord[0] & mask) !== 0) b++;
54953                     if ((coord[1] & mask) !== 0) b += 2;
54954                     u += b.toString();
54955                 }
54956                 return u;
54957             });
54958     };
54959
54960
54961     source.intersects = function(extent) {
54962         extent = extent.polygon();
54963         return !data.polygon || data.polygon.some(function(polygon) {
54964             return geoPolygonIntersectsPolygon(polygon, extent, true);
54965         });
54966     };
54967
54968
54969     source.validZoom = function(z) {
54970         return source.scaleExtent[0] <= z &&
54971             (source.overzoom || source.scaleExtent[1] > z);
54972     };
54973
54974
54975     source.isLocatorOverlay = function() {
54976         return source.id === 'mapbox_locator_overlay';
54977     };
54978
54979
54980     /* hides a source from the list, but leaves it available for use */
54981     source.isHidden = function() {
54982         return source.id === 'DigitalGlobe-Premium-vintage' ||
54983             source.id === 'DigitalGlobe-Standard-vintage';
54984     };
54985
54986
54987     source.copyrightNotices = function() {};
54988
54989
54990     source.getMetadata = function(center, tileCoord, callback) {
54991         var vintage = {
54992             start: localeDateString(source.startDate),
54993             end: localeDateString(source.endDate)
54994         };
54995         vintage.range = vintageRange(vintage);
54996
54997         var metadata = { vintage: vintage };
54998         callback(null, metadata);
54999     };
55000
55001
55002     return source;
55003 }
55004
55005
55006 rendererBackgroundSource.Bing = function(data, dispatch) {
55007     // http://msdn.microsoft.com/en-us/library/ff701716.aspx
55008     // http://msdn.microsoft.com/en-us/library/ff701701.aspx
55009
55010     data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
55011
55012     var bing = rendererBackgroundSource(data),
55013         key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
55014         url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
55015             key + '&jsonp={callback}',
55016         cache = {},
55017         inflight = {},
55018         providers = [];
55019
55020     jsonpRequest(url, function(json) {
55021         providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
55022             return {
55023                 attribution: provider.attribution,
55024                 areas: provider.coverageAreas.map(function(area) {
55025                     return {
55026                         zoom: [area.zoomMin, area.zoomMax],
55027                         extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
55028                     };
55029                 })
55030             };
55031         });
55032         dispatch.call('change');
55033     });
55034
55035
55036     bing.copyrightNotices = function(zoom, extent) {
55037         zoom = Math.min(zoom, 21);
55038         return providers.filter(function(provider) {
55039             return some(provider.areas, function(area) {
55040                 return extent.intersects(area.extent) &&
55041                     area.zoom[0] <= zoom &&
55042                     area.zoom[1] >= zoom;
55043             });
55044         }).map(function(provider) {
55045             return provider.attribution;
55046         }).join(', ');
55047     };
55048
55049
55050     bing.getMetadata = function(center, tileCoord, callback) {
55051         var tileId = tileCoord.slice(0, 3).join('/'),
55052             zoom = Math.min(tileCoord[2], 21),
55053             centerPoint = center[1] + ',' + center[0],  // lat,lng
55054             url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
55055                 '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
55056
55057         if (inflight[tileId]) return;
55058
55059         if (!cache[tileId]) {
55060             cache[tileId] = {};
55061         }
55062         if (cache[tileId] && cache[tileId].metadata) {
55063             return callback(null, cache[tileId].metadata);
55064         }
55065
55066         inflight[tileId] = true;
55067         jsonpRequest(url, function(result) {
55068             delete inflight[tileId];
55069
55070             var err = (!result && 'Unknown Error') || result.errorDetails;
55071             if (err) {
55072                 return callback(err);
55073             } else {
55074                 var vintage = {
55075                     start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
55076                     end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
55077                 };
55078                 vintage.range = vintageRange(vintage);
55079
55080                 var metadata = { vintage: vintage };
55081                 cache[tileId].metadata = metadata;
55082                 return callback(null, metadata);
55083             }
55084         });
55085     };
55086
55087
55088     bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
55089
55090
55091     return bing;
55092 };
55093
55094
55095
55096 rendererBackgroundSource.Esri = function(data) {
55097
55098     // don't request blank tiles, instead overzoom real tiles - #4327
55099     // deprecated technique, but it works (for now)
55100     if (data.template.match(/blankTile/) === null) {
55101         data.template = data.template + '?blankTile=false';
55102     }
55103
55104     var esri = rendererBackgroundSource(data),
55105         cache = {},
55106         inflight = {};
55107
55108     esri.getMetadata = function(center, tileCoord, callback) {
55109         var tileId = tileCoord.slice(0, 3).join('/'),
55110             zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
55111             centerPoint = center[0] + ',' + center[1],  // long, lat (as it should be)
55112             unknown = t('info_panels.background.unknown'),
55113             metadataLayer,
55114             vintage = {},
55115             metadata = {};
55116
55117         if (inflight[tileId]) return;
55118
55119         switch (true) {
55120             case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
55121                 metadataLayer = 4;
55122                 break;
55123             case zoom >= 19:
55124                 metadataLayer = 3;
55125                 break;
55126             case zoom >= 17:
55127                 metadataLayer = 2;
55128                 break;
55129             case zoom >= 13:
55130                 metadataLayer = 0;
55131                 break;
55132             default:
55133                 metadataLayer = 99;
55134         }
55135
55136         var url;
55137         // build up query using the layer appropriate to the current zoom
55138         if (esri.id === 'EsriWorldImagery') {
55139             url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
55140         } else if (esri.id === 'EsriWorldImageryClarity') {
55141             url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
55142         }
55143
55144         url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
55145
55146         if (!cache[tileId]) {
55147             cache[tileId] = {};
55148         }
55149         if (cache[tileId] && cache[tileId].metadata) {
55150             return callback(null, cache[tileId].metadata);
55151         }
55152
55153         // accurate metadata is only available >= 13
55154         if (metadataLayer === 99) {
55155             vintage = {
55156                 start: null,
55157                 end: null,
55158                 range: null
55159             };
55160             metadata = {
55161                 vintage: null,
55162                 source: unknown,
55163                 description: unknown,
55164                 resolution: unknown,
55165                 accuracy: unknown
55166             };
55167
55168             callback(null, metadata);
55169
55170         } else {
55171             inflight[tileId] = true;
55172             jsonpRequest(url, function(result) {
55173                 delete inflight[tileId];
55174
55175                 var err;
55176                 if (!result) {
55177                     err = 'Unknown Error';
55178                 } else if (result.features && result.features.length < 1) {
55179                     err = 'No Results';
55180                 } else if (result.error && result.error.message) {
55181                     err = result.error.message;
55182                 }
55183
55184                 if (err) {
55185                     return callback(err);
55186                 } else {
55187                     // pass through the discrete capture date from metadata
55188                     var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
55189                     vintage = {
55190                         start: captureDate,
55191                         end: captureDate,
55192                         range: captureDate
55193                     };
55194                     metadata = {
55195                         vintage: vintage,
55196                         source: clean(result.features[0].attributes.NICE_NAME),
55197                         description: clean(result.features[0].attributes.NICE_DESC),
55198                         resolution: clean(result.features[0].attributes.SRC_RES),
55199                         accuracy: clean(result.features[0].attributes.SRC_ACC)
55200                     };
55201
55202                     // append units - meters
55203                     if (isFinite(metadata.resolution)) {
55204                         metadata.resolution += ' m';
55205                     }
55206                     if (isFinite(metadata.accuracy)) {
55207                         metadata.accuracy += ' m';
55208                     }
55209
55210                     cache[tileId].metadata = metadata;
55211                     return callback(null, metadata);
55212                 }
55213             });
55214         }
55215
55216
55217         function clean(val) {
55218             return String(val).trim() || unknown;
55219         }
55220     };
55221
55222     return esri;
55223 };
55224
55225
55226 rendererBackgroundSource.None = function() {
55227     var source = rendererBackgroundSource({ id: 'none', template: '' });
55228
55229
55230     source.name = function() {
55231         return t('background.none');
55232     };
55233
55234
55235     source.imageryUsed = function() {
55236         return 'None';
55237     };
55238
55239
55240     source.area = function() {
55241         return -1;  // sources in background pane are sorted by area
55242     };
55243
55244
55245     return source;
55246 };
55247
55248
55249 rendererBackgroundSource.Custom = function(template) {
55250     var source = rendererBackgroundSource({ id: 'custom', template: template });
55251
55252
55253     source.name = function() {
55254         return t('background.custom');
55255     };
55256
55257
55258     source.imageryUsed = function() {
55259         return 'Custom (' + source.template() + ')';
55260     };
55261
55262
55263     source.area = function() {
55264         return -2;  // sources in background pane are sorted by area
55265     };
55266
55267
55268     return source;
55269 };
55270
55271 function rendererTileLayer(context) {
55272     var tileSize = 256;
55273     var transformProp = utilPrefixCSSProperty('Transform');
55274     var geotile = d3geoTile();
55275
55276     var _projection;
55277     var _cache = {};
55278     var _tileOrigin;
55279     var _zoom;
55280     var _source;
55281
55282
55283     // blacklist overlay tiles around Null Island..
55284     function nearNullIsland(x, y, z) {
55285         if (z >= 7) {
55286             var center = Math.pow(2, z - 1);
55287             var width = Math.pow(2, z - 6);
55288             var min = center - (width / 2);
55289             var max = center + (width / 2) - 1;
55290             return x >= min && x <= max && y >= min && y <= max;
55291         }
55292         return false;
55293     }
55294
55295
55296     function tileSizeAtZoom(d, z) {
55297         var EPSILON = 0.002;
55298         return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON;
55299     }
55300
55301
55302     function atZoom(t$$1, distance) {
55303         var power = Math.pow(2, distance);
55304         return [
55305             Math.floor(t$$1[0] * power),
55306             Math.floor(t$$1[1] * power),
55307             t$$1[2] + distance
55308         ];
55309     }
55310
55311
55312     function lookUp(d) {
55313         for (var up = -1; up > -d[2]; up--) {
55314             var tile = atZoom(d, up);
55315             if (_cache[_source.url(tile)] !== false) {
55316                 return tile;
55317             }
55318         }
55319     }
55320
55321
55322     function uniqueBy(a, n) {
55323         var o = [];
55324         var seen = {};
55325         for (var i = 0; i < a.length; i++) {
55326             if (seen[a[i][n]] === undefined) {
55327                 o.push(a[i]);
55328                 seen[a[i][n]] = true;
55329             }
55330         }
55331         return o;
55332     }
55333
55334
55335     function addSource(d) {
55336         d.push(_source.url(d));
55337         return d;
55338     }
55339
55340
55341     // Update tiles based on current state of `projection`.
55342     function background(selection$$1) {
55343         _zoom = geoScaleToZoom(_projection.scale(), tileSize);
55344
55345         var pixelOffset;
55346         if (_source) {
55347             pixelOffset = [
55348                 _source.offset()[0] * Math.pow(2, _zoom),
55349                 _source.offset()[1] * Math.pow(2, _zoom)
55350             ];
55351         } else {
55352             pixelOffset = [0, 0];
55353         }
55354
55355         var translate = [
55356             _projection.translate()[0] + pixelOffset[0],
55357             _projection.translate()[1] + pixelOffset[1]
55358         ];
55359
55360         geotile
55361             .scale(_projection.scale() * 2 * Math.PI)
55362             .translate(translate);
55363
55364         _tileOrigin = [
55365             _projection.scale() * Math.PI - translate[0],
55366             _projection.scale() * Math.PI - translate[1]
55367         ];
55368
55369         render(selection$$1);
55370     }
55371
55372
55373     // Derive the tiles onscreen, remove those offscreen and position them.
55374     // Important that this part not depend on `_projection` because it's
55375     // rentered when tiles load/error (see #644).
55376     function render(selection$$1) {
55377         if (!_source) return;
55378         var requests = [];
55379         var showDebug = context.getDebug('tile') && !_source.overlay;
55380
55381         if (_source.validZoom(_zoom)) {
55382             geotile().forEach(function(d) {
55383                 addSource(d);
55384                 if (d[3] === '') return;
55385                 if (typeof d[3] !== 'string') return; // Workaround for #2295
55386                 requests.push(d);
55387                 if (_cache[d[3]] === false && lookUp(d)) {
55388                     requests.push(addSource(lookUp(d)));
55389                 }
55390             });
55391
55392             requests = uniqueBy(requests, 3).filter(function(r) {
55393                 if (!!_source.overlay && nearNullIsland(r[0], r[1], r[2])) {
55394                     return false;
55395                 }
55396                 // don't re-request tiles which have failed in the past
55397                 return _cache[r[3]] !== false;
55398             });
55399         }
55400
55401
55402         function load(d) {
55403             _cache[d[3]] = true;
55404             d3_select(this)
55405                 .on('error', null)
55406                 .on('load', null)
55407                 .classed('tile-loaded', true);
55408             render(selection$$1);
55409         }
55410
55411         function error(d) {
55412             _cache[d[3]] = false;
55413             d3_select(this)
55414                 .on('error', null)
55415                 .on('load', null)
55416                 .remove();
55417             render(selection$$1);
55418         }
55419
55420         function imageTransform(d) {
55421             var ts = tileSize * Math.pow(2, _zoom - d[2]);
55422             var scale = tileSizeAtZoom(d, _zoom);
55423             return 'translate(' +
55424                 ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
55425                 ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
55426                 'scale(' + scale + ',' + scale + ')';
55427         }
55428
55429         function tileCenter(d) {
55430             var ts = tileSize * Math.pow(2, _zoom - d[2]);
55431             return [
55432                 ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
55433                 ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
55434             ];
55435         }
55436
55437         function debugTransform(d) {
55438             var coord = tileCenter(d);
55439             return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
55440         }
55441
55442
55443         // Pick a representative tile near the center of the viewport
55444         // (This is useful for sampling the imagery vintage)
55445         var dims = geotile.size();
55446         var mapCenter = [dims[0] / 2, dims[1] / 2];
55447         var minDist = Math.max(dims[0], dims[1]);
55448         var nearCenter;
55449
55450         requests.forEach(function(d) {
55451             var c = tileCenter(d);
55452             var dist = geoVecLength(c, mapCenter);
55453             if (dist < minDist) {
55454                 minDist = dist;
55455                 nearCenter = d;
55456             }
55457         });
55458
55459
55460         var image = selection$$1.selectAll('img')
55461             .data(requests, function(d) { return d[3]; });
55462
55463         image.exit()
55464             .style(transformProp, imageTransform)
55465             .classed('tile-removing', true)
55466             .classed('tile-center', false)
55467             .each(function() {
55468                 var tile = d3_select(this);
55469                 window.setTimeout(function() {
55470                     if (tile.classed('tile-removing')) {
55471                         tile.remove();
55472                     }
55473                 }, 300);
55474             });
55475
55476         image.enter()
55477           .append('img')
55478             .attr('class', 'tile')
55479             .attr('src', function(d) { return d[3]; })
55480             .on('error', error)
55481             .on('load', load)
55482           .merge(image)
55483             .style(transformProp, imageTransform)
55484             .classed('tile-debug', showDebug)
55485             .classed('tile-removing', false)
55486             .classed('tile-center', function(d) { return d === nearCenter; });
55487
55488
55489
55490         var debug = selection$$1.selectAll('.tile-label-debug')
55491             .data(showDebug ? requests : [], function(d) { return d[3]; });
55492
55493         debug.exit()
55494             .remove();
55495
55496         if (showDebug) {
55497             var debugEnter = debug.enter()
55498                 .append('div')
55499                 .attr('class', 'tile-label-debug');
55500
55501             debugEnter
55502                 .append('div')
55503                 .attr('class', 'tile-label-debug-coord');
55504
55505             debugEnter
55506                 .append('div')
55507                 .attr('class', 'tile-label-debug-vintage');
55508
55509             debug = debug.merge(debugEnter);
55510
55511             debug
55512                 .style(transformProp, debugTransform);
55513
55514             debug
55515                 .selectAll('.tile-label-debug-coord')
55516                 .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
55517
55518             debug
55519                 .selectAll('.tile-label-debug-vintage')
55520                 .each(function(d) {
55521                     var span = d3_select(this);
55522                     var center = context.projection.invert(tileCenter(d));
55523                     _source.getMetadata(center, d, function(err, result) {
55524                         span.text((result && result.vintage && result.vintage.range) ||
55525                             t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
55526                         );
55527                     });
55528                 });
55529         }
55530
55531     }
55532
55533
55534     background.projection = function(_) {
55535         if (!arguments.length) return _projection;
55536         _projection = _;
55537         return background;
55538     };
55539
55540
55541     background.dimensions = function(_) {
55542         if (!arguments.length) return geotile.size();
55543         geotile.size(_);
55544         return background;
55545     };
55546
55547
55548     background.source = function(_) {
55549         if (!arguments.length) return _source;
55550         _source = _;
55551         _cache = {};
55552         geotile.scaleExtent(_source.scaleExtent);
55553         return background;
55554     };
55555
55556
55557     return background;
55558 }
55559
55560 function rendererBackground(context) {
55561     var dispatch$$1 = dispatch('change');
55562     var detected = utilDetect();
55563     var baseLayer = rendererTileLayer(context).projection(context.projection);
55564     var _overlayLayers = [];
55565     var _backgroundSources = [];
55566     var _brightness = 1;
55567     var _contrast = 1;
55568     var _saturation = 1;
55569     var _sharpness = 1;
55570
55571
55572     function background(selection$$1) {
55573
55574         var baseFilter = '';
55575         if (detected.cssfilters) {
55576             if (_brightness !== 1) {
55577                 baseFilter += 'brightness(' + _brightness + ')';
55578             }
55579             if (_contrast !== 1) {
55580                 baseFilter += 'contrast(' + _contrast + ')';
55581             }
55582             if (_saturation !== 1) {
55583                 baseFilter += 'saturate(' + _saturation + ')';
55584             }
55585             if (_sharpness < 1) {  // gaussian blur
55586                 var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
55587                 baseFilter += 'blur(' + blur + 'px)';
55588             }
55589         }
55590
55591         var base = selection$$1.selectAll('.layer-background')
55592             .data([0]);
55593
55594         base = base.enter()
55595             .insert('div', '.layer-data')
55596             .attr('class', 'layer layer-background')
55597             .merge(base);
55598
55599         if (detected.cssfilters) {
55600             base.style('filter', baseFilter || null);
55601         } else {
55602             base.style('opacity', _brightness);
55603         }
55604
55605
55606         var imagery = base.selectAll('.layer-imagery')
55607             .data([0]);
55608
55609         imagery.enter()
55610             .append('div')
55611             .attr('class', 'layer layer-imagery')
55612             .merge(imagery)
55613             .call(baseLayer);
55614
55615
55616         var maskFilter = '';
55617         var mixBlendMode = '';
55618         if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
55619             mixBlendMode = 'overlay';
55620             maskFilter = 'saturate(0) blur(3px) invert(1)';
55621
55622             var contrast = _sharpness - 1;
55623             maskFilter += ' contrast(' + contrast + ')';
55624
55625             var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
55626             maskFilter += ' brightness(' + brightness + ')';
55627         }
55628
55629         var mask = base.selectAll('.layer-unsharp-mask')
55630             .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
55631
55632         mask.exit()
55633             .remove();
55634
55635         mask.enter()
55636             .append('div')
55637             .attr('class', 'layer layer-mask layer-unsharp-mask')
55638             .merge(mask)
55639             .call(baseLayer)
55640             .style('filter', maskFilter || null)
55641             .style('mix-blend-mode', mixBlendMode || null);
55642
55643
55644         var overlays = selection$$1.selectAll('.layer-overlay')
55645             .data(_overlayLayers, function(d) { return d.source().name(); });
55646
55647         overlays.exit()
55648             .remove();
55649
55650         overlays.enter()
55651             .insert('div', '.layer-data')
55652             .attr('class', 'layer layer-overlay')
55653             .merge(overlays)
55654             .each(function(layer) { d3_select(this).call(layer); });
55655     }
55656
55657
55658     background.updateImagery = function() {
55659         if (context.inIntro()) return;
55660
55661         var b = background.baseLayerSource(),
55662             o = _overlayLayers
55663                 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
55664                 .map(function (d) { return d.source().id; })
55665                 .join(','),
55666             meters = geoOffsetToMeters(b.offset()),
55667             epsilon = 0.01,
55668             x = +meters[0].toFixed(2),
55669             y = +meters[1].toFixed(2),
55670             q = utilStringQs(window.location.hash.substring(1));
55671
55672         var id = b.id;
55673         if (id === 'custom') {
55674             id = 'custom:' + b.template();
55675         }
55676
55677         if (id) {
55678             q.background = id;
55679         } else {
55680             delete q.background;
55681         }
55682
55683         if (o) {
55684             q.overlays = o;
55685         } else {
55686             delete q.overlays;
55687         }
55688
55689         if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
55690             q.offset = x + ',' + y;
55691         } else {
55692             delete q.offset;
55693         }
55694
55695         if (!window.mocha) {
55696             window.location.replace('#' + utilQsString(q, true));
55697         }
55698
55699         var imageryUsed = [b.imageryUsed()];
55700
55701         _overlayLayers
55702             .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
55703             .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
55704
55705         var gpx = context.layers().layer('gpx');
55706         if (gpx && gpx.enabled() && gpx.hasGpx()) {
55707             // Include a string like '.gpx data file' or '.geojson data file'
55708             var match = gpx.getSrc().match(/(kml|gpx|(?:geo)?json)$/i);
55709             var extension = match ? ('.' + match[0].toLowerCase() + ' ') : '';
55710             imageryUsed.push(extension + 'data file');
55711         }
55712
55713         var mapillary_images = context.layers().layer('mapillary-images');
55714         if (mapillary_images && mapillary_images.enabled()) {
55715             imageryUsed.push('Mapillary Images');
55716         }
55717
55718         var mapillary_signs = context.layers().layer('mapillary-signs');
55719         if (mapillary_signs && mapillary_signs.enabled()) {
55720             imageryUsed.push('Mapillary Signs');
55721         }
55722
55723         var openstreetcam_images = context.layers().layer('openstreetcam-images');
55724         if (openstreetcam_images && openstreetcam_images.enabled()) {
55725             imageryUsed.push('OpenStreetCam Images');
55726         }
55727
55728         context.history().imageryUsed(imageryUsed);
55729     };
55730
55731
55732     background.sources = function(extent) {
55733         return _backgroundSources.filter(function(source) {
55734             return source.intersects(extent);
55735         });
55736     };
55737
55738
55739     background.dimensions = function(_) {
55740         if (!_) return;
55741         baseLayer.dimensions(_);
55742
55743         _overlayLayers.forEach(function(layer) {
55744             layer.dimensions(_);
55745         });
55746     };
55747
55748
55749     background.baseLayerSource = function(d) {
55750         if (!arguments.length) return baseLayer.source();
55751
55752         // test source against OSM imagery blacklists..
55753         var osm = context.connection();
55754         if (!osm) return background;
55755
55756         var blacklists = context.connection().imageryBlacklists();
55757
55758         var template = d.template(),
55759             fail = false,
55760             tested = 0,
55761             regex, i;
55762
55763         for (i = 0; i < blacklists.length; i++) {
55764             try {
55765                 regex = new RegExp(blacklists[i]);
55766                 fail = regex.test(template);
55767                 tested++;
55768                 if (fail) break;
55769             } catch (e) {
55770                 /* noop */
55771             }
55772         }
55773
55774         // ensure at least one test was run.
55775         if (!tested) {
55776             regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
55777             fail = regex.test(template);
55778         }
55779
55780         baseLayer.source(!fail ? d : background.findSource('none'));
55781         dispatch$$1.call('change');
55782         background.updateImagery();
55783         return background;
55784     };
55785
55786
55787     background.findSource = function(id) {
55788         return find$1(_backgroundSources, function(d) {
55789             return d.id && d.id === id;
55790         });
55791     };
55792
55793
55794     background.bing = function() {
55795         background.baseLayerSource(background.findSource('Bing'));
55796     };
55797
55798
55799     background.showsLayer = function(d) {
55800         return d.id === baseLayer.source().id ||
55801             _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
55802     };
55803
55804
55805     background.overlayLayerSources = function() {
55806         return _overlayLayers.map(function (l) { return l.source(); });
55807     };
55808
55809
55810     background.toggleOverlayLayer = function(d) {
55811         var layer;
55812
55813         for (var i = 0; i < _overlayLayers.length; i++) {
55814             layer = _overlayLayers[i];
55815             if (layer.source() === d) {
55816                 _overlayLayers.splice(i, 1);
55817                 dispatch$$1.call('change');
55818                 background.updateImagery();
55819                 return;
55820             }
55821         }
55822
55823         layer = rendererTileLayer(context)
55824             .source(d)
55825             .projection(context.projection)
55826             .dimensions(baseLayer.dimensions()
55827         );
55828
55829         _overlayLayers.push(layer);
55830         dispatch$$1.call('change');
55831         background.updateImagery();
55832     };
55833
55834
55835     background.nudge = function(d, zoom) {
55836         baseLayer.source().nudge(d, zoom);
55837         dispatch$$1.call('change');
55838         background.updateImagery();
55839         return background;
55840     };
55841
55842
55843     background.offset = function(d) {
55844         if (!arguments.length) return baseLayer.source().offset();
55845         baseLayer.source().offset(d);
55846         dispatch$$1.call('change');
55847         background.updateImagery();
55848         return background;
55849     };
55850
55851
55852     background.brightness = function(d) {
55853         if (!arguments.length) return _brightness;
55854         _brightness = d;
55855         if (context.mode()) dispatch$$1.call('change');
55856         return background;
55857     };
55858
55859
55860     background.contrast = function(d) {
55861         if (!arguments.length) return _contrast;
55862         _contrast = d;
55863         if (context.mode()) dispatch$$1.call('change');
55864         return background;
55865     };
55866
55867
55868     background.saturation = function(d) {
55869         if (!arguments.length) return _saturation;
55870         _saturation = d;
55871         if (context.mode()) dispatch$$1.call('change');
55872         return background;
55873     };
55874
55875
55876     background.sharpness = function(d) {
55877         if (!arguments.length) return _sharpness;
55878         _sharpness = d;
55879         if (context.mode()) dispatch$$1.call('change');
55880         return background;
55881     };
55882
55883
55884     background.init = function() {
55885         function parseMap(qmap) {
55886             if (!qmap) return false;
55887             var args = qmap.split('/').map(Number);
55888             if (args.length < 3 || args.some(isNaN)) return false;
55889             return geoExtent$$1([args[2], args[1]]);
55890         }
55891
55892         var dataImagery = data.imagery || [],
55893             q = utilStringQs(window.location.hash.substring(1)),
55894             requested = q.background || q.layer,
55895             extent = parseMap(q.map),
55896             first,
55897             best;
55898
55899         // Add all the available imagery sources
55900         _backgroundSources = dataImagery.map(function(source) {
55901             if (source.type === 'bing') {
55902                 return rendererBackgroundSource.Bing(source, dispatch$$1);
55903             } else if (/^EsriWorldImagery/.test(source.id)) {
55904                 return rendererBackgroundSource.Esri(source);
55905             } else {
55906                 return rendererBackgroundSource(source);
55907             }
55908         });
55909
55910         first = _backgroundSources.length && _backgroundSources[0];
55911
55912         // Add 'None'
55913         _backgroundSources.unshift(rendererBackgroundSource.None());
55914
55915         // Add 'Custom'
55916         var template = context.storage('background-custom-template') || '';
55917         var custom = rendererBackgroundSource.Custom(template);
55918         _backgroundSources.unshift(custom);
55919
55920
55921         // Decide which background layer to display
55922         if (!requested && extent) {
55923             best = find$1(this.sources(extent), function(s) { return s.best(); });
55924         }
55925         if (requested && requested.indexOf('custom:') === 0) {
55926             template = requested.replace(/^custom:/, '');
55927             background.baseLayerSource(custom.template(template));
55928             context.storage('background-custom-template', template);
55929         } else {
55930             background.baseLayerSource(
55931                 background.findSource(requested) ||
55932                 best ||
55933                 background.findSource(context.storage('background-last-used')) ||
55934                 background.findSource('Bing') ||
55935                 first ||
55936                 background.findSource('none')
55937             );
55938         }
55939
55940         var locator = find$1(_backgroundSources, function(d) {
55941             return d.overlay && d.default;
55942         });
55943
55944         if (locator) {
55945             background.toggleOverlayLayer(locator);
55946         }
55947
55948         var overlays = (q.overlays || '').split(',');
55949         overlays.forEach(function(overlay) {
55950             overlay = background.findSource(overlay);
55951             if (overlay) {
55952                 background.toggleOverlayLayer(overlay);
55953             }
55954         });
55955
55956         if (q.gpx) {
55957             var gpx = context.layers().layer('gpx');
55958             if (gpx) {
55959                 gpx.url(q.gpx);
55960             }
55961         }
55962
55963         if (q.offset) {
55964             var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
55965                 return !isNaN(n) && n;
55966             });
55967
55968             if (offset.length === 2) {
55969                 background.offset(geoMetersToOffset(offset));
55970             }
55971         }
55972     };
55973
55974
55975     return utilRebind(background, dispatch$$1, 'on');
55976 }
55977
55978 function rendererFeatures(context) {
55979     var traffic_roads = {
55980         'motorway': true,
55981         'motorway_link': true,
55982         'trunk': true,
55983         'trunk_link': true,
55984         'primary': true,
55985         'primary_link': true,
55986         'secondary': true,
55987         'secondary_link': true,
55988         'tertiary': true,
55989         'tertiary_link': true,
55990         'residential': true,
55991         'unclassified': true,
55992         'living_street': true
55993     };
55994
55995     var service_roads = {
55996         'service': true,
55997         'road': true,
55998         'track': true
55999     };
56000
56001     var paths = {
56002         'path': true,
56003         'footway': true,
56004         'cycleway': true,
56005         'bridleway': true,
56006         'steps': true,
56007         'pedestrian': true,
56008         'corridor': true
56009     };
56010
56011     var past_futures = {
56012         'proposed': true,
56013         'construction': true,
56014         'abandoned': true,
56015         'dismantled': true,
56016         'disused': true,
56017         'razed': true,
56018         'demolished': true,
56019         'obliterated': true
56020     };
56021
56022     var dispatch$$1 = dispatch('change', 'redraw'),
56023         _cullFactor = 1,
56024         _cache = {},
56025         _features = {},
56026         _stats = {},
56027         _keys = [],
56028         _hidden = [];
56029
56030
56031     function update() {
56032         if (!window.mocha) {
56033             var q = utilStringQs(window.location.hash.substring(1));
56034             var disabled = features.disabled();
56035             if (disabled.length) {
56036                 q.disable_features = disabled.join(',');
56037             } else {
56038                 delete q.disable_features;
56039             }
56040             window.location.replace('#' + utilQsString(q, true));
56041             context.storage('disabled-features', disabled.join(','));
56042         }
56043         _hidden = features.hidden();
56044         dispatch$$1.call('change');
56045         dispatch$$1.call('redraw');
56046     }
56047
56048
56049     function defineFeature(k, filter, max) {
56050         var isEnabled = true;
56051
56052         _keys.push(k);
56053         _features[k] = {
56054             filter: filter,
56055             enabled: isEnabled,   // whether the user wants it enabled..
56056             count: 0,
56057             currentMax: (max || Infinity),
56058             defaultMax: (max || Infinity),
56059             enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
56060             disable: function() { this.enabled = false; this.currentMax = 0; },
56061             hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
56062             autoHidden: function() { return this.hidden() && this.currentMax > 0; }
56063         };
56064     }
56065
56066
56067     defineFeature('points', function isPoint(entity, resolver, geometry) {
56068         return geometry === 'point';
56069     }, 200);
56070
56071     defineFeature('traffic_roads', function isTrafficRoad(entity) {
56072         return traffic_roads[entity.tags.highway];
56073     });
56074
56075     defineFeature('service_roads', function isServiceRoad(entity) {
56076         return service_roads[entity.tags.highway];
56077     });
56078
56079     defineFeature('paths', function isPath(entity) {
56080         return paths[entity.tags.highway];
56081     });
56082
56083     defineFeature('buildings', function isBuilding(entity) {
56084         return (
56085             !!entity.tags['building:part'] ||
56086             (!!entity.tags.building && entity.tags.building !== 'no') ||
56087             entity.tags.amenity === 'shelter' ||
56088             entity.tags.parking === 'multi-storey' ||
56089             entity.tags.parking === 'sheds' ||
56090             entity.tags.parking === 'carports' ||
56091             entity.tags.parking === 'garage_boxes'
56092         );
56093     }, 250);
56094
56095     defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
56096         return geometry === 'area' &&
56097             !_features.buildings.filter(entity) &&
56098             !_features.water.filter(entity);
56099     });
56100
56101     defineFeature('boundaries', function isBoundary(entity) {
56102         return !!entity.tags.boundary;
56103     });
56104
56105     defineFeature('water', function isWater(entity) {
56106         return (
56107             !!entity.tags.waterway ||
56108             entity.tags.natural === 'water' ||
56109             entity.tags.natural === 'coastline' ||
56110             entity.tags.natural === 'bay' ||
56111             entity.tags.landuse === 'pond' ||
56112             entity.tags.landuse === 'basin' ||
56113             entity.tags.landuse === 'reservoir' ||
56114             entity.tags.landuse === 'salt_pond'
56115         );
56116     });
56117
56118     defineFeature('rail', function isRail(entity) {
56119         return (
56120             !!entity.tags.railway ||
56121             entity.tags.landuse === 'railway'
56122         ) && !(
56123             traffic_roads[entity.tags.highway] ||
56124             service_roads[entity.tags.highway] ||
56125             paths[entity.tags.highway]
56126         );
56127     });
56128
56129     defineFeature('power', function isPower(entity) {
56130         return !!entity.tags.power;
56131     });
56132
56133     // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
56134     defineFeature('past_future', function isPastFuture(entity) {
56135         if (
56136             traffic_roads[entity.tags.highway] ||
56137             service_roads[entity.tags.highway] ||
56138             paths[entity.tags.highway]
56139         ) { return false; }
56140
56141         var strings = Object.keys(entity.tags);
56142
56143         for (var i = 0; i < strings.length; i++) {
56144             var s = strings[i];
56145             if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
56146         }
56147         return false;
56148     });
56149
56150     // Lines or areas that don't match another feature filter.
56151     // IMPORTANT: The 'others' feature must be the last one defined,
56152     //   so that code in getMatches can skip this test if `hasMatch = true`
56153     defineFeature('others', function isOther(entity, resolver, geometry) {
56154         return (geometry === 'line' || geometry === 'area');
56155     });
56156
56157
56158     function features() {}
56159
56160
56161     features.features = function() {
56162         return _features;
56163     };
56164
56165
56166     features.keys = function() {
56167         return _keys;
56168     };
56169
56170
56171     features.enabled = function(k) {
56172         if (!arguments.length) {
56173             return _keys.filter(function(k) { return _features[k].enabled; });
56174         }
56175         return _features[k] && _features[k].enabled;
56176     };
56177
56178
56179     features.disabled = function(k) {
56180         if (!arguments.length) {
56181             return _keys.filter(function(k) { return !_features[k].enabled; });
56182         }
56183         return _features[k] && !_features[k].enabled;
56184     };
56185
56186
56187     features.hidden = function(k) {
56188         if (!arguments.length) {
56189             return _keys.filter(function(k) { return _features[k].hidden(); });
56190         }
56191         return _features[k] && _features[k].hidden();
56192     };
56193
56194
56195     features.autoHidden = function(k) {
56196         if (!arguments.length) {
56197             return _keys.filter(function(k) { return _features[k].autoHidden(); });
56198         }
56199         return _features[k] && _features[k].autoHidden();
56200     };
56201
56202
56203     features.enable = function(k) {
56204         if (_features[k] && !_features[k].enabled) {
56205             _features[k].enable();
56206             update();
56207         }
56208     };
56209
56210
56211     features.disable = function(k) {
56212         if (_features[k] && _features[k].enabled) {
56213             _features[k].disable();
56214             update();
56215         }
56216     };
56217
56218
56219     features.toggle = function(k) {
56220         if (_features[k]) {
56221             (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
56222             update();
56223         }
56224     };
56225
56226
56227     features.resetStats = function() {
56228         for (var i = 0; i < _keys.length; i++) {
56229             _features[_keys[i]].count = 0;
56230         }
56231         dispatch$$1.call('change');
56232     };
56233
56234
56235     features.gatherStats = function(d, resolver, dimensions) {
56236         var needsRedraw = false,
56237             type = groupBy(d, function(ent) { return ent.type; }),
56238             entities = [].concat(type.relation || [], type.way || [], type.node || []),
56239             currHidden, geometry, matches, i, j;
56240
56241         for (i = 0; i < _keys.length; i++) {
56242             _features[_keys[i]].count = 0;
56243         }
56244
56245         // adjust the threshold for point/building culling based on viewport size..
56246         // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
56247         _cullFactor = dimensions[0] * dimensions[1] / 1000000;
56248
56249         for (i = 0; i < entities.length; i++) {
56250             geometry = entities[i].geometry(resolver);
56251             if (!(geometry === 'vertex' || geometry === 'relation')) {
56252                 matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
56253                 for (j = 0; j < matches.length; j++) {
56254                     _features[matches[j]].count++;
56255                 }
56256             }
56257         }
56258
56259         currHidden = features.hidden();
56260         if (currHidden !== _hidden) {
56261             _hidden = currHidden;
56262             needsRedraw = true;
56263             dispatch$$1.call('change');
56264         }
56265
56266         return needsRedraw;
56267     };
56268
56269
56270     features.stats = function() {
56271         for (var i = 0; i < _keys.length; i++) {
56272             _stats[_keys[i]] = _features[_keys[i]].count;
56273         }
56274
56275         return _stats;
56276     };
56277
56278
56279     features.clear = function(d) {
56280         for (var i = 0; i < d.length; i++) {
56281             features.clearEntity(d[i]);
56282         }
56283     };
56284
56285
56286     features.clearEntity = function(entity) {
56287         delete _cache[osmEntity$$1.key(entity)];
56288     };
56289
56290
56291     features.reset = function() {
56292         _cache = {};
56293     };
56294
56295
56296     features.getMatches = function(entity, resolver, geometry) {
56297         if (geometry === 'vertex' || geometry === 'relation') return {};
56298
56299         var ent = osmEntity$$1.key(entity);
56300         if (!_cache[ent]) {
56301             _cache[ent] = {};
56302         }
56303
56304         if (!_cache[ent].matches) {
56305             var matches = {},
56306                 hasMatch = false;
56307
56308             for (var i = 0; i < _keys.length; i++) {
56309                 if (_keys[i] === 'others') {
56310                     if (hasMatch) continue;
56311
56312                     // Multipolygon members:
56313                     // If an entity...
56314                     //   1. is a way that hasn't matched other 'interesting' feature rules,
56315                     //   2. and it belongs to a single parent multipolygon relation
56316                     // ...then match whatever feature rules the parent multipolygon has matched.
56317                     // see #2548, #2887
56318                     //
56319                     // IMPORTANT:
56320                     // For this to work, getMatches must be called on relations before ways.
56321                     //
56322                     if (entity.type === 'way') {
56323                         var parents = features.getParents(entity, resolver, geometry);
56324                         if (parents.length === 1 && parents[0].isMultipolygon()) {
56325                             var pkey = osmEntity$$1.key(parents[0]);
56326                             if (_cache[pkey] && _cache[pkey].matches) {
56327                                 matches = clone(_cache[pkey].matches);
56328                                 continue;
56329                             }
56330                         }
56331                     }
56332                 }
56333
56334                 if (_features[_keys[i]].filter(entity, resolver, geometry)) {
56335                     matches[_keys[i]] = hasMatch = true;
56336                 }
56337             }
56338             _cache[ent].matches = matches;
56339         }
56340
56341         return _cache[ent].matches;
56342     };
56343
56344
56345     features.getParents = function(entity, resolver, geometry) {
56346         if (geometry === 'point') return [];
56347
56348         var ent = osmEntity$$1.key(entity);
56349         if (!_cache[ent]) {
56350             _cache[ent] = {};
56351         }
56352
56353         if (!_cache[ent].parents) {
56354             var parents = [];
56355             if (geometry === 'vertex') {
56356                 parents = resolver.parentWays(entity);
56357             } else {   // 'line', 'area', 'relation'
56358                 parents = resolver.parentRelations(entity);
56359             }
56360             _cache[ent].parents = parents;
56361         }
56362         return _cache[ent].parents;
56363     };
56364
56365
56366     features.isHiddenFeature = function(entity, resolver, geometry) {
56367         if (!_hidden.length) return false;
56368         if (!entity.version) return false;
56369
56370         var matches = features.getMatches(entity, resolver, geometry);
56371
56372         for (var i = 0; i < _hidden.length; i++) {
56373             if (matches[_hidden[i]]) return true;
56374         }
56375         return false;
56376     };
56377
56378
56379     features.isHiddenChild = function(entity, resolver, geometry) {
56380         if (!_hidden.length) return false;
56381         if (!entity.version || geometry === 'point') return false;
56382
56383         var parents = features.getParents(entity, resolver, geometry);
56384         if (!parents.length) return false;
56385
56386         for (var i = 0; i < parents.length; i++) {
56387             if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
56388                 return false;
56389             }
56390         }
56391         return true;
56392     };
56393
56394
56395     features.hasHiddenConnections = function(entity, resolver) {
56396         if (!_hidden.length) return false;
56397         var childNodes, connections;
56398
56399         if (entity.type === 'midpoint') {
56400             childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
56401             connections = [];
56402         } else {
56403             childNodes = entity.nodes ? resolver.childNodes(entity) : [];
56404             connections = features.getParents(entity, resolver, entity.geometry(resolver));
56405         }
56406
56407         // gather ways connected to child nodes..
56408         connections = reduce(childNodes, function(result, e) {
56409             return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
56410         }, connections);
56411
56412         return connections.length ? some(connections, function(e) {
56413             return features.isHidden(e, resolver, e.geometry(resolver));
56414         }) : false;
56415     };
56416
56417
56418     features.isHidden = function(entity, resolver, geometry) {
56419         if (!_hidden.length) return false;
56420         if (!entity.version) return false;
56421
56422         var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
56423         return fn(entity, resolver, geometry);
56424     };
56425
56426
56427     features.filter = function(d, resolver) {
56428         if (!_hidden.length) return d;
56429
56430         var result = [];
56431         for (var i = 0; i < d.length; i++) {
56432             var entity = d[i];
56433             if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
56434                 result.push(entity);
56435             }
56436         }
56437         return result;
56438     };
56439
56440
56441     features.init = function() {
56442         var storage = context.storage('disabled-features');
56443         if (storage) {
56444             var storageDisabled = storage.replace(/;/g, ',').split(',');
56445             storageDisabled.forEach(features.disable);
56446         }
56447         
56448         var q = utilStringQs(window.location.hash.substring(1));
56449         if (q.disable_features) {
56450             var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
56451             hashDisabled.forEach(features.disable);
56452         }
56453     };
56454
56455     return utilRebind(features, dispatch$$1, 'on');
56456 }
56457
56458 function utilBindOnce(target, type, listener, capture) {
56459     var typeOnce = type + '.once';
56460     function one() {
56461         target.on(typeOnce, null);
56462         listener.apply(this, arguments);
56463     }
56464     target.on(typeOnce, one, capture);
56465     return this;
56466 }
56467
56468 function rendererMap(context) {
56469
56470     var dimensions = [1, 1],
56471         dispatch$$1 = dispatch('move', 'drawn'),
56472         projection = context.projection,
56473         curtainProjection = context.curtainProjection,
56474         dblclickEnabled = true,
56475         redrawEnabled = true,
56476         transformStart = projection.transform(),
56477         transformLast,
56478         transformed = false,
56479         minzoom = 0,
56480         drawLayers = svgLayers(projection, context),
56481         drawPoints = svgPoints$$1(projection, context),
56482         drawVertices = svgVertices$$1(projection, context),
56483         drawLines = svgLines$$1(projection, context),
56484         drawAreas = svgAreas$$1(projection, context),
56485         drawMidpoints = svgMidpoints$$1(projection, context),
56486         drawLabels = svgLabels(projection, context),
56487         supersurface = d3_select(null),
56488         wrapper = d3_select(null),
56489         surface = d3_select(null),
56490         mouse,
56491         mousemove;
56492
56493     var zoom$$1 = d3_zoom()
56494         .scaleExtent([ztok(2), ztok(24)])
56495         .interpolate(d3_interpolate)
56496         .filter(zoomEventFilter)
56497         .on('zoom', zoomPan);
56498
56499     var _selection = d3_select(null);
56500
56501     var scheduleRedraw = throttle(redraw, 750);
56502     // var isRedrawScheduled = false;
56503     // var pendingRedrawCall;
56504     // function scheduleRedraw() {
56505     //     // Only schedule the redraw if one has not already been set.
56506     //     if (isRedrawScheduled) return;
56507     //     isRedrawScheduled = true;
56508     //     var that = this;
56509     //     var args = arguments;
56510     //     pendingRedrawCall = window.requestIdleCallback(function () {
56511     //         // Reset the boolean so future redraws can be set.
56512     //         isRedrawScheduled = false;
56513     //         redraw.apply(that, args);
56514     //     }, { timeout: 1400 });
56515     // }
56516
56517     function cancelPendingRedraw() {
56518         scheduleRedraw.cancel();
56519         // isRedrawScheduled = false;
56520         // window.cancelIdleCallback(pendingRedrawCall);
56521     }
56522
56523     function map(selection$$1) {
56524
56525         _selection = selection$$1;
56526
56527         context
56528             .on('change.map', immediateRedraw);
56529
56530         var osm = context.connection();
56531         if (osm) {
56532             osm.on('change.map', immediateRedraw);
56533         }
56534
56535         context.history()
56536             .on('change.map', immediateRedraw)
56537             .on('undone.map redone.map', function(stack) {
56538                 var mode = context.mode().id;
56539                 if (mode !== 'browse' && mode !== 'select') return;
56540
56541                 var followSelected = false;
56542                 if (Array.isArray(stack.selectedIDs)) {
56543                     followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
56544                     context.enter(
56545                         modeSelect(context, stack.selectedIDs).follow(followSelected)
56546                     );
56547                 }
56548                 if (!followSelected && stack.transform) {
56549                     map.transformEase(stack.transform);
56550                 }
56551             });
56552
56553         context.background()
56554             .on('change.map', immediateRedraw);
56555
56556         context.features()
56557             .on('redraw.map', immediateRedraw);
56558
56559         drawLayers
56560             .on('change.map', function() {
56561                 context.background().updateImagery();
56562                 immediateRedraw();
56563             });
56564
56565         selection$$1
56566             .on('dblclick.map', dblClick)
56567             .call(zoom$$1)
56568             .call(zoom$$1.transform, projection.transform());
56569
56570         supersurface = selection$$1.append('div')
56571             .attr('id', 'supersurface')
56572             .call(utilSetTransform, 0, 0);
56573
56574         // Need a wrapper div because Opera can't cope with an absolutely positioned
56575         // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
56576         wrapper = supersurface
56577             .append('div')
56578             .attr('class', 'layer layer-data');
56579
56580         map.surface = surface = wrapper
56581             .call(drawLayers)
56582             .selectAll('.surface')
56583             .attr('id', 'surface');
56584
56585         surface
56586             .call(drawLabels.observe)
56587             .on('mousedown.zoom', function() {
56588                 if (event.button === 2) {
56589                     event.stopPropagation();
56590                 }
56591             }, true)
56592             .on('mouseup.zoom', function() {
56593                 if (resetTransform()) immediateRedraw();
56594             })
56595             .on('mousemove.map', function() {
56596                 mousemove = event;
56597             })
56598             .on('mouseover.vertices', function() {
56599                 if (map.editable() && !transformed) {
56600                     var hover = event.target.__data__;
56601                     surface.selectAll('.data-layer-osm')
56602                         .call(drawVertices.drawHover, context.graph(), hover, map.extent());
56603                     dispatch$$1.call('drawn', this, { full: false });
56604                 }
56605             })
56606             .on('mouseout.vertices', function() {
56607                 if (map.editable() && !transformed) {
56608                     var hover = event.relatedTarget && event.relatedTarget.__data__;
56609                     surface.selectAll('.data-layer-osm')
56610                         .call(drawVertices.drawHover, context.graph(), hover, map.extent());
56611                     dispatch$$1.call('drawn', this, { full: false });
56612                 }
56613             });
56614
56615         supersurface
56616             .call(context.background());
56617
56618         context.on('enter.map',  function() {
56619             if (map.editable() && !transformed) {
56620
56621                 // redraw immediately any objects affected by a change in selectedIDs.
56622                 var graph = context.graph();
56623                 var selectedAndParents = {};
56624                 context.selectedIDs().forEach(function(id) {
56625                     var entity = graph.hasEntity(id);
56626                     if (entity) {
56627                         selectedAndParents[entity.id] = entity;
56628                         if (entity.type === 'node') {
56629                             graph.parentWays(entity).forEach(function(parent) {
56630                                 selectedAndParents[parent.id] = parent;
56631                             });
56632                         }
56633                     }
56634                 });
56635                 var data = values$1(selectedAndParents);
56636                 var filter = function(d) { return d.id in selectedAndParents; };
56637
56638                 data = context.features().filter(data, graph);
56639
56640                 surface.selectAll('.data-layer-osm')
56641                     .call(drawVertices.drawSelected, graph, map.extent())
56642                     .call(drawLines, graph, data, filter)
56643                     .call(drawAreas, graph, data, filter)
56644                     .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
56645
56646                 dispatch$$1.call('drawn', this, { full: false });
56647
56648
56649                 // redraw everything else later
56650                 scheduleRedraw();
56651             }
56652         });
56653
56654         map.dimensions(utilGetDimensions(selection$$1));
56655     }
56656
56657
56658     function zoomEventFilter() {
56659         // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
56660         // Intercept `mousedown` and check if there is an orphaned zoom gesture.
56661         // This can happen if a previous `mousedown` occurred without a `mouseup`.
56662         // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
56663         // so that d3-zoom won't stop propagation of new `mousedown` events.
56664         if (event.type === 'mousedown') {
56665             var hasOrphan = false;
56666             var listeners = window.__on;
56667             for (var i = 0; i < listeners.length; i++) {
56668                 var listener = listeners[i];
56669                 if (listener.name === 'zoom' && listener.type === 'mouseup') {
56670                     hasOrphan = true;
56671                     break;
56672                 }
56673             }
56674             if (hasOrphan) {
56675                 var event$$1 = window.CustomEvent;
56676                 if (event$$1) {
56677                     event$$1 = new event$$1('mouseup');
56678                 } else {
56679                     event$$1 = window.document.createEvent('Event');
56680                     event$$1.initEvent('mouseup', false, false);
56681                 }
56682                 // Event needs to be dispatched with an event.view property.
56683                 event$$1.view = window;
56684                 window.dispatchEvent(event$$1);
56685             }
56686         }
56687
56688         return event.button !== 2;   // ignore right clicks
56689     }
56690
56691
56692     function ztok(z) {
56693         return 256 * Math.pow(2, z);
56694     }
56695
56696     function ktoz(k) {
56697         return Math.max(Math.log(k) / Math.LN2 - 8, 0);
56698     }
56699
56700     function pxCenter() {
56701         return [dimensions[0] / 2, dimensions[1] / 2];
56702     }
56703
56704
56705     function drawVector(difference, extent) {
56706         var mode = context.mode();
56707         var graph = context.graph();
56708         var features = context.features();
56709         var all = context.intersects(map.extent());
56710         var fullRedraw = false;
56711         var data;
56712         var filter;
56713
56714         if (difference) {
56715             var complete = difference.complete(map.extent());
56716             data = compact(values$1(complete));
56717             filter = function(d) { return d.id in complete; };
56718             features.clear(data);
56719
56720         } else {
56721             // force a full redraw if gatherStats detects that a feature
56722             // should be auto-hidden (e.g. points or buildings)..
56723             if (features.gatherStats(all, graph, dimensions)) {
56724                 extent = undefined;
56725             }
56726
56727             if (extent) {
56728                 data = context.intersects(map.extent().intersection(extent));
56729                 var set$$1 = set$2(map$3(data, 'id'));
56730                 filter = function(d) { return set$$1.has(d.id); };
56731
56732             } else {
56733                 data = all;
56734                 fullRedraw = true;
56735                 filter = utilFunctor(true);
56736             }
56737         }
56738
56739         data = features.filter(data, graph);
56740
56741         if (mode && mode.id === 'select') {
56742             // update selected vertices - the user might have just double-clicked a way,
56743             // creating a new vertex, triggering a partial redraw without a mode change
56744             surface.selectAll('.data-layer-osm')
56745                 .call(drawVertices.drawSelected, graph, map.extent());
56746         }
56747
56748         surface.selectAll('.data-layer-osm')
56749             .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
56750             .call(drawLines, graph, data, filter)
56751             .call(drawAreas, graph, data, filter)
56752             .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
56753             .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
56754             .call(drawPoints, graph, data, filter);
56755
56756         dispatch$$1.call('drawn', this, {full: true});
56757     }
56758
56759
56760     function editOff() {
56761         context.features().resetStats();
56762         surface.selectAll('.layer-osm *').remove();
56763
56764         var mode = context.mode();
56765         if (mode && mode.id !== 'save') {
56766             context.enter(modeBrowse(context));
56767         }
56768
56769         dispatch$$1.call('drawn', this, {full: true});
56770     }
56771
56772
56773     function dblClick() {
56774         if (!dblclickEnabled) {
56775             event.preventDefault();
56776             event.stopImmediatePropagation();
56777         }
56778     }
56779
56780
56781     function zoomPan(manualEvent) {
56782         var event$$1 = (manualEvent || event);
56783         var source = event$$1.sourceEvent;
56784         var eventTransform = event$$1.transform;
56785
56786         if (transformStart.x === eventTransform.x &&
56787             transformStart.y === eventTransform.y &&
56788             transformStart.k === eventTransform.k) {
56789             return;  // no change
56790         }
56791
56792         // Normalize mousewheel - #3029
56793         // If wheel delta is provided in LINE units, recalculate it in PIXEL units
56794         // We are essentially redoing the calculations that occur here:
56795         //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
56796         // See this for more info:
56797         //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
56798         if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
56799             // pick sensible scroll amount if user scrolling fast or slow..
56800             var lines = Math.abs(source.deltaY);
56801             var scroll = lines > 2 ? 40 : lines * 10;
56802
56803             var t0 = transformed ? transformLast : transformStart;
56804             var p0 = mouse(source);
56805             var p1 = t0.invert(p0);
56806             var k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500);
56807             var x2 = p0[0] - p1[0] * k2;
56808             var y2 = p0[1] - p1[1] * k2;
56809
56810             eventTransform = identity$7.translate(x2,y2).scale(k2);
56811             _selection.node().__zoom = eventTransform;
56812         }
56813
56814         if (ktoz(eventTransform.k * 2 * Math.PI) < minzoom) {
56815             surface.interrupt();
56816             uiFlash().text(t('cannot_zoom'))();
56817             setZoom(context.minEditableZoom(), true);
56818             scheduleRedraw();
56819             dispatch$$1.call('move', this, map);
56820             return;
56821         }
56822
56823         projection.transform(eventTransform);
56824
56825         var scale = eventTransform.k / transformStart.k;
56826         var tX = (eventTransform.x / scale - transformStart.x) * scale;
56827         var tY = (eventTransform.y / scale - transformStart.y) * scale;
56828
56829         if (context.inIntro()) {
56830             curtainProjection.transform({
56831                 x: eventTransform.x - tX,
56832                 y: eventTransform.y - tY,
56833                 k: eventTransform.k
56834             });
56835         }
56836
56837         if (source) mousemove = event$$1;
56838         transformed = true;
56839         transformLast = eventTransform;
56840         utilSetTransform(supersurface, tX, tY, scale);
56841         scheduleRedraw();
56842
56843         dispatch$$1.call('move', this, map);
56844     }
56845
56846
56847     function resetTransform() {
56848         if (!transformed) return false;
56849
56850         // deprecation warning - Radial Menu to be removed in iD v3
56851         surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
56852         utilSetTransform(supersurface, 0, 0);
56853         transformed = false;
56854         if (context.inIntro()) {
56855             curtainProjection.transform(projection.transform());
56856         }
56857         return true;
56858     }
56859
56860
56861     function redraw(difference, extent) {
56862         if (surface.empty() || !redrawEnabled) return;
56863
56864         // If we are in the middle of a zoom/pan, we can't do differenced redraws.
56865         // It would result in artifacts where differenced entities are redrawn with
56866         // one transform and unchanged entities with another.
56867         if (resetTransform()) {
56868             difference = extent = undefined;
56869         }
56870
56871         var z = String(~~map.zoom());
56872         if (surface.attr('data-zoom') !== z) {
56873             surface.attr('data-zoom', z)
56874                 .classed('low-zoom', z <= 16);
56875         }
56876
56877         if (!difference) {
56878             supersurface.call(context.background());
56879         }
56880
56881         wrapper
56882             .call(drawLayers);
56883
56884         // OSM
56885         if (map.editable()) {
56886             context.loadTiles(projection, dimensions);
56887             drawVector(difference, extent);
56888         } else {
56889             editOff();
56890         }
56891
56892         transformStart = projection.transform();
56893
56894         return map;
56895     }
56896
56897
56898
56899     var immediateRedraw = function(difference, extent) {
56900         if (!difference && !extent) cancelPendingRedraw();
56901         redraw(difference, extent);
56902     };
56903
56904
56905     function pointLocation(p) {
56906         var translate = projection.translate(),
56907             scale = projection.scale() * 2 * Math.PI;
56908         return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
56909     }
56910
56911
56912     function locationPoint(l) {
56913         var translate = projection.translate(),
56914             scale = projection.scale() * 2 * Math.PI;
56915         return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
56916     }
56917
56918
56919     map.mouse = function() {
56920         var event$$1 = mousemove || event;
56921         if (event$$1) {
56922             var s;
56923             while ((s = event$$1.sourceEvent)) { event$$1 = s; }
56924             return mouse(event$$1);
56925         }
56926         return null;
56927     };
56928
56929
56930     // returns Lng/Lat
56931     map.mouseCoordinates = function() {
56932         var coord = map.mouse() || pxCenter();
56933         return projection.invert(coord);
56934     };
56935
56936
56937     map.dblclickEnable = function(_) {
56938         if (!arguments.length) return dblclickEnabled;
56939         dblclickEnabled = _;
56940         return map;
56941     };
56942
56943
56944     map.redrawEnable = function(_) {
56945         if (!arguments.length) return redrawEnabled;
56946         redrawEnabled = _;
56947         return map;
56948     };
56949
56950
56951     function setTransform(t2, duration, force) {
56952         var t$$1 = projection.transform();
56953         if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
56954             return false;
56955         }
56956
56957         if (duration) {
56958             _selection
56959                 .transition()
56960                 .duration(duration)
56961                 .on('start', function() { map.startEase(); })
56962                 .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
56963         } else {
56964             projection.transform(t2);
56965             transformStart = t2;
56966             _selection.call(zoom$$1.transform, transformStart);
56967         }
56968     }
56969
56970
56971     function setZoom(z2, force, duration) {
56972         if (z2 === map.zoom() && !force) {
56973             return false;
56974         }
56975
56976         var k = projection.scale(),
56977             k2 = Math.max(ztok(2), Math.min(ztok(24), ztok(z2))) / (2 * Math.PI),
56978             center = pxCenter(),
56979             l = pointLocation(center);
56980
56981         projection.scale(k2);
56982
56983         var t$$1 = projection.translate();
56984         l = locationPoint(l);
56985
56986         t$$1[0] += center[0] - l[0];
56987         t$$1[1] += center[1] - l[1];
56988
56989         if (duration) {
56990             projection.scale(k);  // reset scale
56991             _selection
56992                 .transition()
56993                 .duration(duration)
56994                 .on('start', function() { map.startEase(); })
56995                 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
56996         } else {
56997             projection.translate(t$$1);
56998             transformStart = projection.transform();
56999             _selection.call(zoom$$1.transform, transformStart);
57000         }
57001
57002         return true;
57003     }
57004
57005
57006     function setCenter(loc2, duration) {
57007         var c = map.center();
57008         if (loc2[0] === c[0] && loc2[1] === c[1]) {
57009             return false;
57010         }
57011
57012         var t$$1 = projection.translate(),
57013             k = projection.scale(),
57014             pxC = pxCenter(),
57015             ll = projection(loc2);
57016
57017         t$$1[0] = t$$1[0] - ll[0] + pxC[0];
57018         t$$1[1] = t$$1[1] - ll[1] + pxC[1];
57019
57020         if (duration) {
57021             _selection
57022                 .transition()
57023                 .duration(duration)
57024                 .on('start', function() { map.startEase(); })
57025                 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
57026         } else {
57027             projection.translate(t$$1);
57028             transformStart = projection.transform();
57029             _selection.call(zoom$$1.transform, transformStart);
57030         }
57031
57032         return true;
57033     }
57034
57035
57036     map.pan = function(delta, duration) {
57037         var t$$1 = projection.translate(),
57038             k = projection.scale();
57039
57040         t$$1[0] += delta[0];
57041         t$$1[1] += delta[1];
57042
57043         if (duration) {
57044             _selection
57045                 .transition()
57046                 .duration(duration)
57047                 .on('start', function() { map.startEase(); })
57048                 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
57049         } else {
57050             projection.translate(t$$1);
57051             transformStart = projection.transform();
57052             _selection.call(zoom$$1.transform, transformStart);
57053             dispatch$$1.call('move', this, map);
57054             immediateRedraw();
57055         }
57056
57057         return map;
57058     };
57059
57060
57061     map.dimensions = function(_) {
57062         if (!arguments.length) return dimensions;
57063         var center = map.center();
57064         dimensions = _;
57065         drawLayers.dimensions(dimensions);
57066         context.background().dimensions(dimensions);
57067         projection.clipExtent([[0, 0], dimensions]);
57068         mouse = utilFastMouse(supersurface.node());
57069         setCenter(center);
57070
57071         scheduleRedraw();
57072         return map;
57073     };
57074
57075
57076     function zoomIn(delta) {
57077         setZoom(~~map.zoom() + delta, true, 250);
57078     }
57079
57080     function zoomOut(delta) {
57081         setZoom(~~map.zoom() - delta, true, 250);
57082     }
57083
57084     map.zoomIn = function() { zoomIn(1); };
57085     map.zoomInFurther = function() { zoomIn(4); };
57086
57087     map.zoomOut = function() { zoomOut(1); };
57088     map.zoomOutFurther = function() { zoomOut(4); };
57089
57090
57091     map.center = function(loc2) {
57092         if (!arguments.length) {
57093             return projection.invert(pxCenter());
57094         }
57095
57096         if (setCenter(loc2)) {
57097             dispatch$$1.call('move', this, map);
57098         }
57099
57100         scheduleRedraw();
57101         return map;
57102     };
57103
57104
57105     map.zoom = function(z2) {
57106         if (!arguments.length) {
57107             return Math.max(ktoz(projection.scale() * 2 * Math.PI), 0);
57108         }
57109
57110         if (z2 < minzoom) {
57111             surface.interrupt();
57112             uiFlash().text(t('cannot_zoom'))();
57113             z2 = context.minEditableZoom();
57114         }
57115
57116         if (setZoom(z2)) {
57117             dispatch$$1.call('move', this, map);
57118         }
57119
57120         scheduleRedraw();
57121         return map;
57122     };
57123
57124
57125     map.zoomTo = function(entity, zoomLimits) {
57126         var extent = entity.extent(context.graph());
57127         if (!isFinite(extent.area())) return;
57128
57129         var z2 = map.trimmedExtentZoom(extent);
57130         zoomLimits = zoomLimits || [context.minEditableZoom(), 20];
57131         map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
57132     };
57133
57134
57135     map.centerZoom = function(loc2, z2) {
57136         var centered = setCenter(loc2),
57137             zoomed   = setZoom(z2);
57138
57139         if (centered || zoomed) {
57140             dispatch$$1.call('move', this, map);
57141         }
57142
57143         scheduleRedraw();
57144         return map;
57145     };
57146
57147
57148     map.centerEase = function(loc2, duration) {
57149         duration = duration || 250;
57150         setCenter(loc2, duration);
57151         return map;
57152     };
57153
57154
57155     map.zoomEase = function(z2, duration) {
57156         duration = duration || 250;
57157         setZoom(z2, false, duration);
57158         return map;
57159     };
57160
57161
57162     map.transformEase = function(t2, duration) {
57163         duration = duration || 250;
57164         setTransform(t2, duration, false);
57165         return map;
57166     };
57167
57168
57169     map.startEase = function() {
57170         utilBindOnce(surface, 'mousedown.ease', function() {
57171             map.cancelEase();
57172         });
57173         return map;
57174     };
57175
57176
57177     map.cancelEase = function() {
57178         _selection.interrupt();
57179         return map;
57180     };
57181
57182
57183     map.extent = function(_) {
57184         if (!arguments.length) {
57185             return new geoExtent$$1(projection.invert([0, dimensions[1]]),
57186                                  projection.invert([dimensions[0], 0]));
57187         } else {
57188             var extent = geoExtent$$1(_);
57189             map.centerZoom(extent.center(), map.extentZoom(extent));
57190         }
57191     };
57192
57193
57194     map.trimmedExtent = function(_) {
57195         if (!arguments.length) {
57196             var headerY = 60, footerY = 30, pad = 10;
57197             return new geoExtent$$1(projection.invert([pad, dimensions[1] - footerY - pad]),
57198                                  projection.invert([dimensions[0] - pad, headerY + pad]));
57199         } else {
57200             var extent = geoExtent$$1(_);
57201             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
57202         }
57203     };
57204
57205
57206     function calcZoom(extent, dim) {
57207         var tl = projection([extent[0][0], extent[1][1]]),
57208             br = projection([extent[1][0], extent[0][1]]);
57209
57210         // Calculate maximum zoom that fits extent
57211         var hFactor = (br[0] - tl[0]) / dim[0],
57212             vFactor = (br[1] - tl[1]) / dim[1],
57213             hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
57214             vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
57215             newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
57216
57217         return newZoom;
57218     }
57219
57220
57221     map.extentZoom = function(_) {
57222         return calcZoom(geoExtent$$1(_), dimensions);
57223     };
57224
57225
57226     map.trimmedExtentZoom = function(_) {
57227         var trimY = 120, trimX = 40,
57228             trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
57229         return calcZoom(geoExtent$$1(_), trimmed);
57230     };
57231
57232
57233     map.editable = function() {
57234         var osmLayer = surface.selectAll('.data-layer-osm');
57235         if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
57236
57237         return map.zoom() >= context.minEditableZoom();
57238     };
57239
57240
57241     map.minzoom = function(_) {
57242         if (!arguments.length) return minzoom;
57243         minzoom = _;
57244         return map;
57245     };
57246
57247
57248     map.layers = drawLayers;
57249
57250
57251     return utilRebind(map, dispatch$$1, 'on');
57252 }
57253
57254 function uiMapInMap(context) {
57255
57256     function map_in_map(selection$$1) {
57257         var backgroundLayer = rendererTileLayer(context);
57258         var overlayLayers = {};
57259         var projection$$1 = geoRawMercator();
57260         var gpxLayer = svgGpx$$1(projection$$1, context).showLabels(false);
57261         var debugLayer = svgDebug$$1(projection$$1, context);
57262         var zoom$$1 = d3_zoom()
57263             .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
57264             .on('start', zoomStarted)
57265             .on('zoom', zoomed)
57266             .on('end', zoomEnded);
57267         var isTransformed = false;
57268         var isHidden = true;
57269         var skipEvents = false;
57270         var gesture = null;
57271         var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
57272         var wrap = d3_select(null);
57273         var tiles = d3_select(null);
57274         var viewport = d3_select(null);
57275         var tStart;    // transform at start of gesture
57276         var tCurr;     // transform at most recent event
57277         var timeoutId;
57278
57279
57280         function zoomStarted() {
57281             if (skipEvents) return;
57282             tStart = tCurr = projection$$1.transform();
57283             gesture = null;
57284         }
57285
57286
57287         function zoomed() {
57288             if (skipEvents) return;
57289
57290             var x = event.transform.x;
57291             var y = event.transform.y;
57292             var k = event.transform.k;
57293             var isZooming = (k !== tStart.k);
57294             var isPanning = (x !== tStart.x || y !== tStart.y);
57295
57296             if (!isZooming && !isPanning) {
57297                 return;  // no change
57298             }
57299
57300             // lock in either zooming or panning, don't allow both in minimap.
57301             if (!gesture) {
57302                 gesture = isZooming ? 'zoom' : 'pan';
57303             }
57304
57305             var tMini = projection$$1.transform();
57306             var tX, tY, scale;
57307
57308             if (gesture === 'zoom') {
57309                 var dMini = utilGetDimensions(wrap);
57310                 var cMini = geoVecScale(dMini, 0.5);
57311                 scale = k / tMini.k;
57312                 tX = (cMini[0] / scale - cMini[0]) * scale;
57313                 tY = (cMini[1] / scale - cMini[1]) * scale;
57314             } else {
57315                 k = tMini.k;
57316                 scale = 1;
57317                 tX = x - tMini.x;
57318                 tY = y - tMini.y;
57319             }
57320
57321             utilSetTransform(tiles, tX, tY, scale);
57322             utilSetTransform(viewport, 0, 0, scale);
57323             isTransformed = true;
57324             tCurr = identity$7.translate(x, y).scale(k);
57325
57326             var zMain = geoScaleToZoom(context.projection.scale());
57327             var zMini = geoScaleToZoom(k);
57328
57329             zDiff = zMain - zMini;
57330
57331             queueRedraw();
57332         }
57333
57334
57335         function zoomEnded() {
57336             if (skipEvents) return;
57337             if (gesture !== 'pan') return;
57338
57339             updateProjection();
57340             gesture = null;
57341             var dMini = utilGetDimensions(wrap);
57342             var cMini = geoVecScale(dMini, 0.5);
57343             context.map().center(projection$$1.invert(cMini));   // recenter main map..
57344         }
57345
57346
57347         function updateProjection() {
57348             var loc = context.map().center();
57349             var dMini = utilGetDimensions(wrap);
57350             var cMini = geoVecScale(dMini, 0.5);
57351             var tMain = context.projection.transform();
57352             var zMain = geoScaleToZoom(tMain.k);
57353             var zMini = Math.max(zMain - zDiff, 0.5);
57354             var kMini = geoZoomToScale(zMini);
57355
57356             projection$$1
57357                 .translate([tMain.x, tMain.y])
57358                 .scale(kMini);
57359
57360             var point$$1 = projection$$1(loc);
57361             var mouse = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
57362             var xMini = cMini[0] - point$$1[0] + tMain.x + mouse[0];
57363             var yMini = cMini[1] - point$$1[1] + tMain.y + mouse[1];
57364
57365             projection$$1
57366                 .translate([xMini, yMini])
57367                 .clipExtent([[0, 0], dMini]);
57368
57369             tCurr = projection$$1.transform();
57370
57371             if (isTransformed) {
57372                 utilSetTransform(tiles, 0, 0);
57373                 utilSetTransform(viewport, 0, 0);
57374                 isTransformed = false;
57375             }
57376
57377             zoom$$1
57378                 .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
57379
57380             skipEvents = true;
57381             wrap.call(zoom$$1.transform, tCurr);
57382             skipEvents = false;
57383         }
57384
57385
57386         function redraw() {
57387             clearTimeout(timeoutId);
57388             if (isHidden) return;
57389
57390             updateProjection();
57391
57392             var dMini = utilGetDimensions(wrap);
57393             var zMini = geoScaleToZoom(projection$$1.scale());
57394
57395             // setup tile container
57396             tiles = wrap
57397                 .selectAll('.map-in-map-tiles')
57398                 .data([0]);
57399
57400             tiles = tiles.enter()
57401                 .append('div')
57402                 .attr('class', 'map-in-map-tiles')
57403                 .merge(tiles);
57404
57405             // redraw background
57406             backgroundLayer
57407                 .source(context.background().baseLayerSource())
57408                 .projection(projection$$1)
57409                 .dimensions(dMini);
57410
57411             var background = tiles
57412                 .selectAll('.map-in-map-background')
57413                 .data([0]);
57414
57415             background.enter()
57416                 .append('div')
57417                 .attr('class', 'map-in-map-background')
57418                 .merge(background)
57419                 .call(backgroundLayer);
57420
57421
57422             // redraw overlay
57423             var overlaySources = context.background().overlayLayerSources();
57424             var activeOverlayLayers = [];
57425             for (var i = 0; i < overlaySources.length; i++) {
57426                 if (overlaySources[i].validZoom(zMini)) {
57427                     if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
57428                     activeOverlayLayers.push(overlayLayers[i]
57429                         .source(overlaySources[i])
57430                         .projection(projection$$1)
57431                         .dimensions(dMini));
57432                 }
57433             }
57434
57435             var overlay = tiles
57436                 .selectAll('.map-in-map-overlay')
57437                 .data([0]);
57438
57439             overlay = overlay.enter()
57440                 .append('div')
57441                 .attr('class', 'map-in-map-overlay')
57442                 .merge(overlay);
57443
57444
57445             var overlays = overlay
57446                 .selectAll('div')
57447                 .data(activeOverlayLayers, function(d) { return d.source().name(); });
57448
57449             overlays.exit()
57450                 .remove();
57451
57452             overlays = overlays.enter()
57453                 .append('div')
57454                 .merge(overlays)
57455                 .each(function(layer) { d3_select(this).call(layer); });
57456
57457
57458             var dataLayers = tiles
57459                 .selectAll('.map-in-map-data')
57460                 .data([0]);
57461
57462             dataLayers.exit()
57463                 .remove();
57464
57465             dataLayers = dataLayers.enter()
57466                 .append('svg')
57467                 .attr('class', 'map-in-map-data')
57468                 .merge(dataLayers)
57469                 .call(gpxLayer)
57470                 .call(debugLayer);
57471
57472
57473             // redraw viewport bounding box
57474             if (gesture !== 'pan') {
57475                 var getPath = d3_geoPath(projection$$1);
57476                 var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
57477
57478                 viewport = wrap.selectAll('.map-in-map-viewport')
57479                     .data([0]);
57480
57481                 viewport = viewport.enter()
57482                     .append('svg')
57483                     .attr('class', 'map-in-map-viewport')
57484                     .merge(viewport);
57485
57486
57487                 var path = viewport.selectAll('.map-in-map-bbox')
57488                     .data([bbox]);
57489
57490                 path.enter()
57491                     .append('path')
57492                     .attr('class', 'map-in-map-bbox')
57493                     .merge(path)
57494                     .attr('d', getPath)
57495                     .classed('thick', function(d) { return getPath.area(d) < 30; });
57496             }
57497         }
57498
57499
57500         function queueRedraw() {
57501             clearTimeout(timeoutId);
57502             timeoutId = setTimeout(function() { redraw(); }, 750);
57503         }
57504
57505
57506         function toggle() {
57507             if (event) event.preventDefault();
57508
57509             isHidden = !isHidden;
57510
57511             d3_select('.minimap-toggle-item')
57512                 .classed('active', !isHidden)
57513                 .select('input')
57514                 .property('checked', !isHidden);
57515
57516             if (isHidden) {
57517                 wrap
57518                     .style('display', 'block')
57519                     .style('opacity', '1')
57520                     .transition()
57521                     .duration(200)
57522                     .style('opacity', '0')
57523                     .on('end', function() {
57524                         selection$$1.selectAll('.map-in-map')
57525                             .style('display', 'none');
57526                     });
57527             } else {
57528                 wrap
57529                     .style('display', 'block')
57530                     .style('opacity', '0')
57531                     .transition()
57532                     .duration(200)
57533                     .style('opacity', '1')
57534                     .on('end', function() {
57535                         redraw();
57536                     });
57537             }
57538         }
57539
57540
57541         uiMapInMap.toggle = toggle;
57542
57543         wrap = selection$$1.selectAll('.map-in-map')
57544             .data([0]);
57545
57546         wrap = wrap.enter()
57547             .append('div')
57548             .attr('class', 'map-in-map')
57549             .style('display', (isHidden ? 'none' : 'block'))
57550             .call(zoom$$1)
57551             .on('dblclick.zoom', null)
57552             .merge(wrap);
57553
57554         context.map()
57555             .on('drawn.map-in-map', function(drawn) {
57556                 if (drawn.full === true) {
57557                     redraw();
57558                 }
57559             });
57560
57561         redraw();
57562
57563         var keybinding = d3keybinding('map-in-map')
57564             .on(t('background.minimap.key'), toggle);
57565
57566         d3_select(document)
57567             .call(keybinding);
57568     }
57569
57570     return map_in_map;
57571 }
57572
57573 function uiBackground(context) {
57574     var key = t('background.key');
57575
57576     var _customSource = context.background().findSource('custom');
57577     var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
57578     var _shown = false;
57579
57580     var _backgroundList = d3_select(null);
57581     var _overlayList = d3_select(null);
57582     var _displayOptionsContainer = d3_select(null);
57583     var _offsetContainer = d3_select(null);
57584
57585     var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
57586     var backgroundOffset = uiBackgroundOffset(context);
57587
57588
57589     function setTooltips(selection$$1) {
57590         selection$$1.each(function(d, i, nodes) {
57591             var item = d3_select(this).select('label');
57592             var span = item.select('span');
57593             var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
57594             var description = d.description();
57595             var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
57596
57597             if (d === _previousBackground) {
57598                 item.call(tooltip()
57599                     .placement(placement)
57600                     .html(true)
57601                     .title(function() {
57602                         var tip = '<div>' + t('background.switch') + '</div>';
57603                         return uiTooltipHtml(tip, uiCmd('⌘' + key));
57604                     })
57605                 );
57606             } else if (description || isOverflowing) {
57607                 item.call(tooltip()
57608                     .placement(placement)
57609                     .title(description || d.name())
57610                 );
57611             } else {
57612                 item.call(tooltip().destroy);
57613             }
57614         });
57615     }
57616
57617
57618     function updateLayerSelections(selection$$1) {
57619         function active(d) {
57620             return context.background().showsLayer(d);
57621         }
57622
57623         selection$$1.selectAll('.layer')
57624             .classed('active', active)
57625             .classed('switch', function(d) { return d === _previousBackground; })
57626             .call(setTooltips)
57627             .selectAll('input')
57628             .property('checked', active);
57629     }
57630
57631
57632     function chooseBackground(d) {
57633         if (d.id === 'custom' && !d.template()) {
57634             return editCustom();
57635         }
57636
57637         event.preventDefault();
57638         _previousBackground = context.background().baseLayerSource();
57639         context.storage('background-last-used-toggle', _previousBackground.id);
57640         context.storage('background-last-used', d.id);
57641         context.background().baseLayerSource(d);
57642         _backgroundList.call(updateLayerSelections);
57643         document.activeElement.blur();
57644     }
57645
57646
57647     function editCustom() {
57648         event.preventDefault();
57649         var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
57650         var template = window.prompt(
57651             t('background.custom_prompt', { example: example }),
57652             _customSource.template() || example
57653         );
57654
57655         if (template) {
57656             context.storage('background-custom-template', template);
57657             _customSource.template(template);
57658             chooseBackground(_customSource);
57659         } else {
57660             _backgroundList.call(updateLayerSelections);
57661         }
57662     }
57663
57664
57665     function chooseOverlay(d) {
57666         event.preventDefault();
57667         context.background().toggleOverlayLayer(d);
57668         _overlayList.call(updateLayerSelections);
57669         document.activeElement.blur();
57670     }
57671
57672
57673     function drawListItems(layerList, type, change, filter) {
57674         var sources = context.background()
57675             .sources(context.map().extent())
57676             .filter(filter);
57677
57678         var layerLinks = layerList.selectAll('li.layer')
57679             .data(sources, function(d) { return d.name(); });
57680
57681         layerLinks.exit()
57682             .remove();
57683
57684         var enter = layerLinks.enter()
57685             .append('li')
57686             .attr('class', 'layer')
57687             .classed('layer-custom', function(d) { return d.id === 'custom'; })
57688             .classed('best', function(d) { return d.best(); });
57689
57690         enter.filter(function(d) { return d.id === 'custom'; })
57691             .append('button')
57692             .attr('class', 'layer-browse')
57693             .call(tooltip()
57694                 .title(t('background.custom_button'))
57695                 .placement((textDirection === 'rtl') ? 'right' : 'left')
57696             )
57697             .on('click', editCustom)
57698             .call(svgIcon('#icon-search'));
57699
57700         enter.filter(function(d) { return d.best(); })
57701             .append('div')
57702             .attr('class', 'best')
57703             .call(tooltip()
57704                 .title(t('background.best_imagery'))
57705                 .placement((textDirection === 'rtl') ? 'right' : 'left')
57706             )
57707             .append('span')
57708             .html('&#9733;');
57709
57710         var label = enter
57711             .append('label');
57712
57713         label
57714             .append('input')
57715             .attr('type', type)
57716             .attr('name', 'layers')
57717             .on('change', change);
57718
57719         label
57720             .append('span')
57721             .text(function(d) { return d.name(); });
57722
57723
57724         layerList.selectAll('li.layer')
57725             .sort(sortSources)
57726             .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
57727
57728         layerList
57729             .call(updateLayerSelections);
57730
57731
57732         function sortSources(a, b) {
57733             return a.best() && !b.best() ? -1
57734                 : b.best() && !a.best() ? 1
57735                 : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
57736         }
57737     }
57738
57739
57740     function renderBackgroundList(selection$$1) {
57741
57742         // the background list
57743         var container = selection$$1.selectAll('.layer-background-list')
57744             .data([0]);
57745
57746         _backgroundList = container.enter()
57747             .append('ul')
57748             .attr('class', 'layer-list layer-background-list')
57749             .attr('dir', 'auto')
57750             .merge(container);
57751
57752
57753         // add minimap toggle below list
57754         var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
57755             .data([0])
57756             .enter()
57757             .append('ul')
57758             .attr('class', 'layer-list minimap-toggle-list')
57759             .append('li')
57760             .attr('class', 'layer minimap-toggle-item');
57761
57762         var minimapLabelEnter = minimapEnter
57763             .append('label')
57764             .call(tooltip()
57765                 .html(true)
57766                 .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
57767                 .placement('top')
57768             );
57769
57770         minimapLabelEnter
57771             .append('input')
57772             .attr('type', 'checkbox')
57773             .on('change', function() {
57774                 event.preventDefault();
57775                 uiMapInMap.toggle();
57776             });
57777
57778         minimapLabelEnter
57779             .append('span')
57780             .text(t('background.minimap.description'));
57781
57782
57783         // "Info / Report a Problem" link
57784         selection$$1.selectAll('.imagery-faq')
57785             .data([0])
57786             .enter()
57787             .append('div')
57788             .attr('class', 'imagery-faq')
57789             .append('a')
57790             .attr('target', '_blank')
57791             .attr('tabindex', -1)
57792             .call(svgIcon('#icon-out-link', 'inline'))
57793             .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
57794             .append('span')
57795             .text(t('background.imagery_source_faq'));
57796     }
57797
57798
57799     function renderOverlayList(selection$$1) {
57800         var container = selection$$1.selectAll('.layer-overlay-list')
57801             .data([0]);
57802
57803         _overlayList = container.enter()
57804             .append('ul')
57805             .attr('class', 'layer-list layer-overlay-list')
57806             .attr('dir', 'auto')
57807             .merge(container);
57808     }
57809
57810
57811     function update() {
57812         _backgroundList
57813             .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
57814
57815         _overlayList
57816             .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
57817
57818         _displayOptionsContainer
57819             .call(backgroundDisplayOptions);
57820
57821         _offsetContainer
57822             .call(backgroundOffset);
57823     }
57824
57825
57826     function quickSwitch() {
57827         if (event) {
57828             event.stopImmediatePropagation();
57829             event.preventDefault();
57830         }
57831         if (_previousBackground) {
57832             chooseBackground(_previousBackground);
57833         }
57834     }
57835
57836
57837     function background(selection$$1) {
57838
57839         function hidePane() {
57840             setVisible(false);
57841         }
57842
57843         function togglePane() {
57844             if (event) event.preventDefault();
57845             paneTooltip.hide(button);
57846             setVisible(!button.classed('active'));
57847         }
57848
57849         function setVisible(show) {
57850             if (show !== _shown) {
57851                 button.classed('active', show);
57852                 _shown = show;
57853
57854                 if (show) {
57855                     uiMapData.hidePane();
57856                     uiHelp.hidePane();
57857                     update();
57858
57859                     pane
57860                         .style('display', 'block')
57861                         .style('right', '-300px')
57862                         .transition()
57863                         .duration(200)
57864                         .style('right', '0px');
57865
57866                 } else {
57867                     pane
57868                         .style('display', 'block')
57869                         .style('right', '0px')
57870                         .transition()
57871                         .duration(200)
57872                         .style('right', '-300px')
57873                         .on('end', function() {
57874                             d3_select(this).style('display', 'none');
57875                         });
57876                 }
57877             }
57878         }
57879
57880
57881         var pane = selection$$1
57882             .append('div')
57883             .attr('class', 'fillL map-overlay col3 content hide');
57884
57885         var paneTooltip = tooltip()
57886             .placement((textDirection === 'rtl') ? 'right' : 'left')
57887             .html(true)
57888             .title(uiTooltipHtml(t('background.description'), key));
57889
57890         var button = selection$$1
57891             .append('button')
57892             .attr('tabindex', -1)
57893             .on('click', togglePane)
57894             .call(svgIcon('#icon-layers', 'light'))
57895             .call(paneTooltip);
57896
57897         pane
57898             .append('h2')
57899             .text(t('background.title'));
57900
57901         // background list
57902         pane
57903             .append('div')
57904             .attr('class', 'background-background-list-container')
57905             .call(uiDisclosure(context, 'background_list', true)
57906                 .title(t('background.backgrounds'))
57907                 .content(renderBackgroundList)
57908             );
57909
57910         // overlay list
57911         pane
57912             .append('div')
57913             .attr('class', 'background-overlay-list-container')
57914             .call(uiDisclosure(context, 'overlay_list', true)
57915                 .title(t('background.overlays'))
57916                 .content(renderOverlayList)
57917             );
57918
57919         // display options
57920         _displayOptionsContainer = pane
57921             .append('div')
57922             .attr('class', 'background-display-options');
57923
57924         // offset controls
57925         _offsetContainer = pane
57926             .append('div')
57927             .attr('class', 'background-offset');
57928
57929
57930         // add listeners
57931         context.map()
57932             .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
57933
57934         context.background()
57935             .on('change.background-update', update);
57936
57937
57938         update();
57939
57940         var keybinding = d3keybinding('background')
57941             .on(key, togglePane)
57942             .on(uiCmd('⌘' + key), quickSwitch)
57943             .on([t('map_data.key'), t('help.key')], hidePane);
57944
57945         d3_select(document)
57946             .call(keybinding);
57947
57948         uiBackground.hidePane = hidePane;
57949         uiBackground.togglePane = togglePane;
57950         uiBackground.setVisible = setVisible;
57951     }
57952
57953     return background;
57954 }
57955
57956 function uiContributors(context) {
57957     var osm = context.connection(),
57958         debouncedUpdate = debounce(function() { update(); }, 1000),
57959         limit = 4,
57960         hidden = false,
57961         wrap = d3_select(null);
57962
57963
57964     function update() {
57965         if (!osm) return;
57966
57967         var users = {},
57968             entities = context.intersects(context.map().extent());
57969
57970         entities.forEach(function(entity) {
57971             if (entity && entity.user) users[entity.user] = true;
57972         });
57973
57974         var u = Object.keys(users),
57975             subset = u.slice(0, u.length > limit ? limit - 1 : limit);
57976
57977         wrap.html('')
57978             .call(svgIcon('#icon-nearby', 'pre-text light'));
57979
57980         var userList = d3_select(document.createElement('span'));
57981
57982         userList.selectAll()
57983             .data(subset)
57984             .enter()
57985             .append('a')
57986             .attr('class', 'user-link')
57987             .attr('href', function(d) { return osm.userURL(d); })
57988             .attr('target', '_blank')
57989             .attr('tabindex', -1)
57990             .text(String);
57991
57992         if (u.length > limit) {
57993             var count = d3_select(document.createElement('span'));
57994
57995             count.append('a')
57996                 .attr('target', '_blank')
57997                 .attr('tabindex', -1)
57998                 .attr('href', function() {
57999                     return osm.changesetsURL(context.map().center(), context.map().zoom());
58000                 })
58001                 .text(u.length - limit + 1);
58002
58003             wrap.append('span')
58004                 .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
58005
58006         } else {
58007             wrap.append('span')
58008                 .html(t('contributors.list', { users: userList.html() }));
58009         }
58010
58011         if (!u.length) {
58012             hidden = true;
58013             wrap
58014                 .transition()
58015                 .style('opacity', 0);
58016
58017         } else if (hidden) {
58018             wrap
58019                 .transition()
58020                 .style('opacity', 1);
58021         }
58022     }
58023
58024
58025     return function(selection$$1) {
58026         if (!osm) return;
58027         wrap = selection$$1;
58028         update();
58029
58030         osm.on('loaded.contributors', debouncedUpdate);
58031         context.map().on('move.contributors', debouncedUpdate);
58032     };
58033 }
58034
58035 function uiFeatureInfo(context) {
58036     function update(selection$$1) {
58037         var features = context.features(),
58038             stats = features.stats(),
58039             count = 0,
58040             hiddenList = compact(map$3(features.hidden(), function(k) {
58041                 if (stats[k]) {
58042                     count += stats[k];
58043                     return String(stats[k]) + ' ' + t('feature.' + k + '.description');
58044                 }
58045             }));
58046
58047         selection$$1.html('');
58048
58049         if (hiddenList.length) {
58050             var tooltipBehavior = tooltip()
58051                 .placement('top')
58052                 .html(true)
58053                 .title(function() {
58054                     return uiTooltipHtml(hiddenList.join('<br/>'));
58055                 });
58056
58057             var warning = selection$$1.append('a')
58058                 .attr('href', '#')
58059                 .attr('tabindex', -1)
58060                 .html(t('feature_info.hidden_warning', { count: count }))
58061                 .call(tooltipBehavior)
58062                 .on('click', function() {
58063                     tooltipBehavior.hide(warning);
58064                     // open map data panel?
58065                     event.preventDefault();
58066                 });
58067         }
58068
58069         selection$$1
58070             .classed('hide', !hiddenList.length);
58071     }
58072
58073
58074     return function(selection$$1) {
58075         update(selection$$1);
58076
58077         context.features().on('change.feature_info', function() {
58078             update(selection$$1);
58079         });
58080     };
58081 }
58082
58083 function uiFullScreen(context) {
58084     var element = context.container().node(),
58085         keybinding = d3keybinding('full-screen');
58086         // button;
58087
58088
58089     function getFullScreenFn() {
58090         if (element.requestFullscreen) {
58091             return element.requestFullscreen;
58092         } else if (element.msRequestFullscreen) {
58093             return element.msRequestFullscreen;
58094         } else if (element.mozRequestFullScreen) {
58095             return element.mozRequestFullScreen;
58096         } else if (element.webkitRequestFullscreen) {
58097             return element.webkitRequestFullscreen;
58098         }
58099     }
58100
58101
58102     function getExitFullScreenFn() {
58103         if (document.exitFullscreen) {
58104             return document.exitFullscreen;
58105         } else if (document.msExitFullscreen) {
58106             return document.msExitFullscreen;
58107         } else if (document.mozCancelFullScreen) {
58108             return document.mozCancelFullScreen;
58109         } else if (document.webkitExitFullscreen) {
58110             return document.webkitExitFullscreen;
58111         }
58112     }
58113
58114
58115     function isFullScreen() {
58116         return document.fullscreenElement ||
58117             document.mozFullScreenElement ||
58118             document.webkitFullscreenElement ||
58119             document.msFullscreenElement;
58120     }
58121
58122
58123     function isSupported() {
58124         return !!getFullScreenFn();
58125     }
58126
58127
58128     function fullScreen() {
58129         event.preventDefault();
58130         if (!isFullScreen()) {
58131             // button.classed('active', true);
58132             getFullScreenFn().apply(element);
58133         } else {
58134             // button.classed('active', false);
58135             getExitFullScreenFn().apply(document);
58136         }
58137     }
58138
58139
58140     return function() { // selection) {
58141         if (!isSupported())
58142             return;
58143
58144         // button = selection.append('button')
58145         //     .attr('title', t('full_screen'))
58146         //     .attr('tabindex', -1)
58147         //     .on('click', fullScreen)
58148         //     .call(tooltip);
58149
58150         // button.append('span')
58151         //     .attr('class', 'icon full-screen');
58152
58153         var detected = utilDetect();
58154         var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
58155         keybinding.on(keys, fullScreen);
58156
58157         d3_select(document)
58158             .call(keybinding);
58159     };
58160 }
58161
58162 function uiLoading(context) {
58163     var _modalSelection = d3_select(null);
58164     var _message = '';
58165     var _blocking = false;
58166
58167
58168     var loading = function(selection$$1) {
58169         _modalSelection = uiModal(selection$$1, _blocking);
58170
58171         var loadertext = _modalSelection.select('.content')
58172             .classed('loading-modal', true)
58173             .append('div')
58174             .attr('class', 'modal-section fillL');
58175
58176         loadertext
58177             .append('img')
58178             .attr('class', 'loader')
58179             .attr('src', context.imagePath('loader-white.gif'));
58180
58181         loadertext
58182             .append('h3')
58183             .text(_message);
58184
58185         _modalSelection.select('button.close')
58186             .attr('class', 'hide');
58187
58188         return loading;
58189     };
58190
58191
58192     loading.message = function(_) {
58193         if (!arguments.length) return _message;
58194         _message = _;
58195         return loading;
58196     };
58197
58198
58199     loading.blocking = function(_) {
58200         if (!arguments.length) return _blocking;
58201         _blocking = _;
58202         return loading;
58203     };
58204
58205
58206     loading.close = function() {
58207         _modalSelection.remove();
58208     };
58209
58210
58211     return loading;
58212 }
58213
58214 function uiGeolocate(context) {
58215     var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
58216         locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
58217         timeoutId;
58218
58219
58220     function click() {
58221         if (context.inIntro()) return;
58222         context.enter(modeBrowse(context));
58223         context.container().call(locating);
58224         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
58225
58226         // This timeout ensures that we still call finish() even if
58227         // the user declines to share their location in Firefox
58228         timeoutId = setTimeout(finish, 10000 /* 10sec */ );
58229     }
58230
58231
58232     function success(position) {
58233         var map = context.map(),
58234             extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
58235                 .padByMeters(position.coords.accuracy);
58236
58237         map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
58238         finish();
58239     }
58240
58241
58242     function error() {
58243         finish();
58244     }
58245
58246
58247     function finish() {
58248         locating.close();  // unblock ui
58249         if (timeoutId) { clearTimeout(timeoutId); }
58250         timeoutId = undefined;
58251     }
58252
58253
58254     return function(selection) {
58255         if (!navigator.geolocation) return;
58256
58257         selection
58258             .append('button')
58259             .attr('tabindex', -1)
58260             .attr('title', t('geolocate.title'))
58261             .on('click', click)
58262             .call(svgIcon('#icon-geolocate', 'light'))
58263             .call(tooltip()
58264                 .placement((textDirection === 'rtl') ? 'right' : 'left'));
58265     };
58266 }
58267
58268 function uiPanelBackground(context) {
58269     var background = context.background();
58270     var currSourceName = null;
58271     var metadata = {};
58272     var metadataKeys = [
58273         'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
58274     ];
58275
58276     var debouncedRedraw = debounce(redraw, 250);
58277
58278     function redraw(selection$$1) {
58279         var source = background.baseLayerSource(),
58280             isDG = (source.id.match(/^DigitalGlobe/i) !== null);
58281
58282         if (currSourceName !== source.name()) {
58283             currSourceName = source.name();
58284             metadata = {};
58285         }
58286
58287         selection$$1.html('');
58288
58289         var list = selection$$1
58290             .append('ul')
58291             .attr('class', 'background-info');
58292
58293         list
58294             .append('li')
58295             .text(currSourceName);
58296
58297         metadataKeys.forEach(function(k) {
58298             // DigitalGlobe vintage is available in raster layers for now.
58299             if (isDG && k === 'vintage') return;
58300
58301             list
58302                 .append('li')
58303                 .attr('class', 'background-info-list-' + k)
58304                 .classed('hide', !metadata[k])
58305                 .text(t('info_panels.background.' + k) + ':')
58306                 .append('span')
58307                 .attr('class', 'background-info-span-' + k)
58308                 .text(metadata[k]);
58309         });
58310
58311         debouncedGetMetadata(selection$$1);
58312
58313         var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
58314
58315         selection$$1
58316             .append('a')
58317             .text(t('info_panels.background.' + toggleTiles))
58318             .attr('href', '#')
58319             .attr('class', 'button button-toggle-tiles')
58320             .on('click', function() {
58321                 event.preventDefault();
58322                 context.setDebug('tile', !context.getDebug('tile'));
58323                 selection$$1.call(redraw);
58324             });
58325
58326         if (isDG) {
58327             var key = source.id + '-vintage';
58328             var sourceVintage = context.background().findSource(key);
58329             var showsVintage = context.background().showsLayer(sourceVintage);
58330             var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
58331             selection$$1
58332                 .append('a')
58333                 .text(t('info_panels.background.' + toggleVintage))
58334                 .attr('href', '#')
58335                 .attr('class', 'button button-toggle-vintage')
58336                 .on('click', function() {
58337                     event.preventDefault();
58338                     context.background().toggleOverlayLayer(sourceVintage);
58339                     selection$$1.call(redraw);
58340                 });
58341         }
58342
58343         // disable if necessary
58344         ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
58345             if (source.id !== layerId) {
58346                 var key = layerId + '-vintage';
58347                 var sourceVintage = context.background().findSource(key);
58348                 if (context.background().showsLayer(sourceVintage)) {
58349                     context.background().toggleOverlayLayer(sourceVintage);
58350                 }
58351             }
58352         });
58353     }
58354
58355
58356     var debouncedGetMetadata = debounce(getMetadata, 250);
58357
58358     function getMetadata(selection$$1) {
58359         var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
58360         if (tile.empty()) return;
58361
58362         var sourceName = currSourceName,
58363             d = tile.datum(),
58364             zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
58365             center = context.map().center();
58366
58367         // update zoom
58368         metadata.zoom = String(zoom);
58369         selection$$1.selectAll('.background-info-list-zoom')
58370             .classed('hide', false)
58371             .selectAll('.background-info-span-zoom')
58372             .text(metadata.zoom);
58373
58374         if (!d || !d.length >= 3) return;
58375
58376         background.baseLayerSource().getMetadata(center, d, function(err, result) {
58377             if (err || currSourceName !== sourceName) return;
58378
58379             // update vintage
58380             var vintage = result.vintage;
58381             metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
58382             selection$$1.selectAll('.background-info-list-vintage')
58383                 .classed('hide', false)
58384                 .selectAll('.background-info-span-vintage')
58385                 .text(metadata.vintage);
58386
58387             // update other metdata
58388             without(metadataKeys, 'zoom', 'vintage')
58389                 .forEach(function(k) {
58390                     var val = result[k];
58391                     metadata[k] = val;
58392                     selection$$1.selectAll('.background-info-list-' + k)
58393                         .classed('hide', !val)
58394                         .selectAll('.background-info-span-' + k)
58395                         .text(val);
58396                 });
58397         });
58398     }
58399
58400
58401     var panel = function(selection$$1) {
58402         selection$$1.call(redraw);
58403
58404         context.map()
58405             .on('drawn.info-background', function() {
58406                 selection$$1.call(debouncedRedraw);
58407             })
58408             .on('move.info-background', function() {
58409                 selection$$1.call(debouncedGetMetadata);
58410             });
58411
58412     };
58413
58414     panel.off = function() {
58415         context.map()
58416             .on('drawn.info-background', null)
58417             .on('move.info-background', null);
58418     };
58419
58420     panel.id = 'background';
58421     panel.title = t('info_panels.background.title');
58422     panel.key = t('info_panels.background.key');
58423
58424
58425     return panel;
58426 }
58427
58428 function uiPanelHistory(context) {
58429     var osm;
58430
58431     function displayTimestamp(entity) {
58432         if (!entity.timestamp) return t('info_panels.history.unknown');
58433         var detected = utilDetect();
58434         var options = {
58435             day: 'numeric', month: 'short', year: 'numeric',
58436             hour: 'numeric', minute: 'numeric', second: 'numeric'
58437         };
58438         var d = new Date(entity.timestamp);
58439         if (isNaN(d.getTime())) return t('info_panels.history.unknown');
58440         return d.toLocaleString(detected.locale, options);
58441     }
58442
58443
58444     function displayUser(selection, entity) {
58445         if (!entity.user) {
58446             selection
58447                 .append('span')
58448                 .text(t('info_panels.history.unknown'));
58449             return;
58450         }
58451
58452         selection
58453             .append('span')
58454             .attr('class', 'user-name')
58455             .text(entity.user);
58456
58457         var links = selection
58458             .append('div')
58459             .attr('class', 'links');
58460
58461         if (osm) {
58462             links
58463                 .append('a')
58464                 .attr('class', 'user-osm-link')
58465                 .attr('href', osm.userURL(entity.user))
58466                 .attr('target', '_blank')
58467                 .attr('tabindex', -1)
58468                 .text('OSM');
58469         }
58470
58471         links
58472             .append('a')
58473             .attr('class', 'user-hdyc-link')
58474             .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
58475             .attr('target', '_blank')
58476             .attr('tabindex', -1)
58477             .text('HDYC');
58478     }
58479
58480
58481     function displayChangeset(selection, entity) {
58482         if (!entity.changeset) {
58483             selection
58484                 .append('span')
58485                 .text(t('info_panels.history.unknown'));
58486             return;
58487         }
58488
58489         selection
58490             .append('span')
58491             .attr('class', 'changeset-id')
58492             .text(entity.changeset);
58493
58494         var links = selection
58495             .append('div')
58496             .attr('class', 'links');
58497
58498         if (osm) {
58499             links
58500                 .append('a')
58501                 .attr('class', 'changeset-osm-link')
58502                 .attr('href', osm.changesetURL(entity.changeset))
58503                 .attr('target', '_blank')
58504                 .attr('tabindex', -1)
58505                 .text('OSM');
58506         }
58507
58508         links
58509             .append('a')
58510             .attr('class', 'changeset-osmcha-link')
58511             .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
58512             .attr('target', '_blank')
58513             .attr('tabindex', -1)
58514             .text('OSMCha');
58515     }
58516
58517
58518     function redraw(selection) {
58519         var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
58520             singular = selected.length === 1 ? selected[0] : null;
58521
58522         osm = context.connection();
58523
58524         selection.html('');
58525
58526         selection
58527             .append('h4')
58528             .attr('class', 'history-heading')
58529             .text(singular || t('info_panels.history.selected', { n: selected.length }));
58530
58531         if (!singular) return;
58532
58533         var entity = context.entity(singular);
58534
58535         var list = selection
58536             .append('ul');
58537
58538         list
58539             .append('li')
58540             .text(t('info_panels.history.version') + ':')
58541             .append('span')
58542             .text(entity.version);
58543
58544         list
58545             .append('li')
58546             .text(t('info_panels.history.last_edit') + ':')
58547             .append('span')
58548             .text(displayTimestamp(entity));
58549
58550         list
58551             .append('li')
58552             .text(t('info_panels.history.edited_by') + ':')
58553             .call(displayUser, entity);
58554
58555         list
58556             .append('li')
58557             .text(t('info_panels.history.changeset') + ':')
58558             .call(displayChangeset, entity);
58559
58560         if (osm) {
58561             selection
58562                 .append('a')
58563                 .attr('class', 'view-history-on-osm')
58564                 .attr('target', '_blank')
58565                 .attr('tabindex', -1)
58566                 .attr('href', osm.historyURL(entity))
58567                 .call(svgIcon('#icon-out-link', 'inline'))
58568                 .append('span')
58569                 .text(t('info_panels.history.link_text'));
58570         }
58571     }
58572
58573
58574     var panel = function(selection) {
58575         selection.call(redraw);
58576
58577         context.map()
58578             .on('drawn.info-history', function() {
58579                 selection.call(redraw);
58580             });
58581     };
58582
58583     panel.off = function() {
58584         context.map()
58585             .on('drawn.info-history', null);
58586     };
58587
58588     panel.id = 'history';
58589     panel.title = t('info_panels.history.title');
58590     panel.key = t('info_panels.history.key');
58591
58592
58593     return panel;
58594 }
58595
58596 var OSM_PRECISION = 7;
58597 var locale$2 = utilDetect().locale;
58598
58599 /**
58600  * Returns a localized representation of the given length measurement.
58601  *
58602  * @param {Number} m area in meters
58603  * @param {Boolean} isImperial true for U.S. customary units; false for metric
58604  */
58605 function displayLength(m, isImperial) {
58606         var d = m * (isImperial ? 3.28084 : 1),
58607                 unit;
58608
58609         if (isImperial) {
58610                 if (d >= 5280) {
58611                         d /= 5280;
58612                         unit = 'miles';
58613                 } else {
58614                         unit = 'feet';
58615                 }
58616         } else {
58617                 if (d >= 1000) {
58618                         d /= 1000;
58619                         unit = 'kilometers';
58620                 } else {
58621                         unit = 'meters';
58622                 }
58623         }
58624
58625         return t('units.' + unit, {
58626                 quantity: d.toLocaleString(locale$2, { maximumSignificantDigits: 4 })
58627         });
58628 }
58629
58630 /**
58631  * Returns a localized representation of the given area measurement.
58632  *
58633  * @param {Number} m2 area in square meters
58634  * @param {Boolean} isImperial true for U.S. customary units; false for metric
58635  */
58636 function displayArea(m2, isImperial) {
58637         var d = m2 * (isImperial ? 10.7639111056 : 1),
58638                 d1, d2, unit1, unit2, area;
58639
58640         if (isImperial) {
58641                 if (d >= 6969600) {     // > 0.25mi² show mi²
58642                         d1 = d / 27878400;
58643                         unit1 = 'square_miles';
58644                 } else {
58645                         d1 = d;
58646                         unit1 = 'square_feet';
58647                 }
58648
58649                 if (d > 4356 && d < 43560000) {   // 0.1 - 1000 acres
58650                         d2 = d / 43560;
58651                         unit2 = 'acres';
58652                 }
58653
58654         } else {
58655                 if (d >= 250000) {    // > 0.25km² show km²
58656                         d1 = d / 1000000;
58657                         unit1 = 'square_kilometers';
58658                 } else {
58659                         d1 = d;
58660                         unit1 = 'square_meters';
58661                 }
58662
58663                 if (d > 1000 && d < 10000000) {   // 0.1 - 1000 hectares
58664                         d2 = d / 10000;
58665                         unit2 = 'hectares';
58666                 }
58667         }
58668
58669         area = t('units.' + unit1, {
58670                 quantity: d1.toLocaleString(locale$2, { maximumSignificantDigits: 4 })
58671         });
58672
58673         if (d2) {
58674                 return t('units.area_pair', {
58675                         area1: area,
58676                         area2: t('units.' + unit2, {
58677                                 quantity: d2.toLocaleString(locale$2, { maximumSignificantDigits: 2 })
58678                         })
58679                 });
58680         } else {
58681                 return area;
58682         }
58683 }
58684
58685 function wrap(x, min, max) {
58686         var d = max - min;
58687         return ((x - min) % d + d) % d + min;
58688 }
58689
58690 function clamp(x, min, max) {
58691         return Math.max(min, Math.min(x, max));
58692 }
58693
58694 function displayCoordinate(deg, pos, neg) {
58695         var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60,
58696                 sec = (min - Math.floor(min)) * 60,
58697                 displayDegrees = t('units.arcdegrees', {
58698                         quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
58699                 }),
58700                 displayCoordinate;
58701
58702         if (Math.floor(sec) > 0) {
58703                 displayCoordinate = displayDegrees +
58704                         t('units.arcminutes', { quantity: Math.floor(min).toLocaleString(locale$2) }) +
58705                         t('units.arcseconds', { quantity: Math.round(sec).toLocaleString(locale$2) });
58706         } else if (Math.floor(min) > 0) {
58707                 displayCoordinate = displayDegrees +
58708                         t('units.arcminutes', { quantity: Math.round(min).toLocaleString(locale$2) });
58709         } else {
58710                 displayCoordinate = t('units.arcdegrees', {
58711                         quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
58712                 });
58713         }
58714
58715         if (deg === 0) {
58716                 return displayCoordinate;
58717         } else {
58718                 return t('units.coordinate', {
58719                         coordinate: displayCoordinate,
58720                         direction: t('units.' + (deg > 0 ? pos : neg))
58721                 });
58722         }
58723 }
58724
58725 /**
58726  * Returns given coordinate pair in degree-minute-second format.
58727  *
58728  * @param {Array<Number>} coord longitude and latitude
58729  */
58730 function dmsCoordinatePair(coord) {
58731         return t('units.coordinate_pair', {
58732                 latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
58733                 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
58734         });
58735 }
58736
58737 /**
58738  * Returns the given coordinate pair in decimal format.
58739  * note: unlocalized to avoid comma ambiguity - see #4765
58740  *
58741  * @param {Array<Number>} coord longitude and latitude
58742  */
58743 function decimalCoordinatePair(coord) {
58744         return t('units.coordinate_pair', {
58745                 latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
58746                 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
58747         });
58748 }
58749
58750 function uiPanelLocation(context) {
58751     var currLocation = '';
58752
58753
58754     function redraw(selection) {
58755         selection.html('');
58756
58757         var list = selection
58758             .append('ul');
58759
58760         // Mouse coordinates
58761         var coord = context.map().mouseCoordinates();
58762         if (coord.some(isNaN)) {
58763             coord = context.map().center();
58764         }
58765
58766         list
58767             .append('li')
58768             .text(dmsCoordinatePair(coord))
58769             .append('li')
58770             .text(decimalCoordinatePair(coord));
58771
58772         // Location Info
58773         selection
58774             .append('div')
58775             .attr('class', 'location-info')
58776             .text(currLocation || ' ');
58777
58778         debouncedGetLocation(selection, coord);
58779     }
58780
58781
58782     var debouncedGetLocation = debounce(getLocation, 250);
58783     function getLocation(selection, coord) {
58784         if (!services.geocoder) {
58785             currLocation = t('info_panels.location.unknown_location');
58786             selection.selectAll('.location-info')
58787                 .text(currLocation);
58788         } else {
58789             services.geocoder.reverse(coord, function(err, result) {
58790                 currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
58791                 selection.selectAll('.location-info')
58792                     .text(currLocation);
58793             });
58794         }
58795     }
58796
58797
58798     var panel = function(selection) {
58799         selection.call(redraw);
58800
58801         context.surface()
58802             .on('mousemove.info-location', function() {
58803                 selection.call(redraw);
58804             });
58805     };
58806
58807     panel.off = function() {
58808         context.surface()
58809             .on('mousemove.info-location', null);
58810     };
58811
58812     panel.id = 'location';
58813     panel.title = t('info_panels.location.title');
58814     panel.key = t('info_panels.location.key');
58815
58816
58817     return panel;
58818 }
58819
58820 function uiPanelMeasurement(context) {
58821     var locale = utilDetect().locale,
58822         isImperial = (locale.toLowerCase() === 'en-us');
58823
58824
58825     function radiansToMeters(r) {
58826         // using WGS84 authalic radius (6371007.1809 m)
58827         return r * 6371007.1809;
58828     }
58829
58830     function steradiansToSqmeters(r) {
58831         // http://gis.stackexchange.com/a/124857/40446
58832         return r / (4 * Math.PI) * 510065621724000;
58833     }
58834
58835
58836     function toLineString(feature) {
58837         if (feature.type === 'LineString') return feature;
58838
58839         var result = { type: 'LineString', coordinates: [] };
58840         if (feature.type === 'Polygon') {
58841             result.coordinates = feature.coordinates[0];
58842         } else if (feature.type === 'MultiPolygon') {
58843             result.coordinates = feature.coordinates[0][0];
58844         }
58845
58846         return result;
58847     }
58848
58849     function nodeCount(feature) {
58850       if (feature.type === 'LineString') return feature.coordinates.length;
58851
58852       if (feature.type === 'Polygon') {
58853           return feature.coordinates[0].length - 1;
58854       }
58855     }
58856
58857
58858     function redraw(selection$$1) {
58859         var resolver = context.graph();
58860         var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
58861         var singular = selected.length === 1 ? selected[0] : null;
58862         var extent = geoExtent$$1();
58863         var entity;
58864
58865         selection$$1.html('');
58866
58867         selection$$1
58868             .append('h4')
58869             .attr('class', 'measurement-heading')
58870             .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
58871
58872         if (!selected.length) return;
58873
58874         var center;
58875         for (var i = 0; i < selected.length; i++) {
58876             entity = context.entity(selected[i]);
58877             extent._extend(entity.extent(resolver));
58878         }
58879         center = extent.center();
58880
58881
58882         var list = selection$$1
58883             .append('ul');
58884         var coordItem;
58885
58886         // multiple features, just display extent center..
58887         if (!singular) {
58888             coordItem = list
58889                 .append('li')
58890                 .text(t('info_panels.measurement.center') + ':');
58891             coordItem.append('span')
58892                 .text(dmsCoordinatePair(center));
58893             coordItem.append('span')
58894                 .text(decimalCoordinatePair(center));
58895             return;
58896         }
58897
58898         // single feature, display details..
58899         if (!entity) return;
58900         var geometry = entity.geometry(resolver);
58901
58902         if (geometry === 'line' || geometry === 'area') {
58903             var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
58904                 feature = entity.asGeoJSON(resolver),
58905                 length = radiansToMeters(d3_geoLength(toLineString(feature))),
58906                 lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')),
58907                 centroid = d3_geoCentroid(feature);
58908
58909             list
58910                 .append('li')
58911                 .text(t('info_panels.measurement.geometry') + ':')
58912                 .append('span')
58913                 .text(
58914                     closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
58915                 );
58916
58917             if (entity.type !== 'relation') {
58918                 list
58919                     .append('li')
58920                     .text(t('info_panels.measurement.node_count') + ':')
58921                     .append('span')
58922                     .text(nodeCount(feature).toLocaleString(locale));
58923             }
58924
58925             if (closed) {
58926                 var area = steradiansToSqmeters(entity.area(resolver));
58927                 list
58928                     .append('li')
58929                     .text(t('info_panels.measurement.area') + ':')
58930                     .append('span')
58931                     .text(displayArea(area, isImperial));
58932             }
58933
58934
58935             list
58936                 .append('li')
58937                 .text(lengthLabel + ':')
58938                 .append('span')
58939                 .text(displayLength(length, isImperial));
58940
58941             coordItem = list
58942                 .append('li')
58943                 .text(t('info_panels.measurement.centroid') + ':');
58944             coordItem.append('span')
58945                 .text(dmsCoordinatePair(centroid));
58946             coordItem.append('span')
58947                 .text(decimalCoordinatePair(centroid));
58948
58949             var toggle  = isImperial ? 'imperial' : 'metric';
58950
58951             selection$$1
58952                 .append('a')
58953                 .text(t('info_panels.measurement.' + toggle))
58954                 .attr('href', '#')
58955                 .attr('class', 'button button-toggle-units')
58956                 .on('click', function() {
58957                     event.preventDefault();
58958                     isImperial = !isImperial;
58959                     selection$$1.call(redraw);
58960                 });
58961
58962         } else {
58963             var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
58964
58965             list
58966                 .append('li')
58967                 .text(t('info_panels.measurement.geometry') + ':')
58968                 .append('span')
58969                 .text(t('geometry.' + geometry));
58970
58971             coordItem = list
58972                 .append('li')
58973                 .text(centerLabel + ':');
58974             coordItem.append('span')
58975                 .text(dmsCoordinatePair(center));
58976             coordItem.append('span')
58977                 .text(decimalCoordinatePair(center));
58978         }
58979     }
58980
58981
58982     var panel = function(selection$$1) {
58983         selection$$1.call(redraw);
58984
58985         context.map()
58986             .on('drawn.info-measurement', function() {
58987                 selection$$1.call(redraw);
58988             });
58989     };
58990
58991     panel.off = function() {
58992         context.map()
58993             .on('drawn.info-measurement', null);
58994     };
58995
58996     panel.id = 'measurement';
58997     panel.title = t('info_panels.measurement.title');
58998     panel.key = t('info_panels.measurement.key');
58999
59000
59001     return panel;
59002 }
59003
59004 var uiInfoPanels = {
59005     background: uiPanelBackground,
59006     history: uiPanelHistory,
59007     location: uiPanelLocation,
59008     measurement: uiPanelMeasurement,
59009 };
59010
59011 function uiInfo(context) {
59012     var ids = Object.keys(uiInfoPanels),
59013         wasActive = ['measurement'],
59014         panels = {},
59015         active = {};
59016
59017     // create panels
59018     ids.forEach(function(k) {
59019         if (!panels[k]) {
59020             panels[k] = uiInfoPanels[k](context);
59021             active[k] = false;
59022         }
59023     });
59024
59025
59026     function info(selection$$1) {
59027
59028         function redraw() {
59029             var activeids = ids.filter(function(k) { return active[k]; }).sort();
59030
59031             var containers = infoPanels.selectAll('.panel-container')
59032                 .data(activeids, function(k) { return k; });
59033
59034             containers.exit()
59035                 .style('opacity', 1)
59036                 .transition()
59037                 .duration(200)
59038                 .style('opacity', 0)
59039                 .on('end', function(d) {
59040                     d3_select(this)
59041                         .call(panels[d].off)
59042                         .remove();
59043                 });
59044
59045             var enter = containers.enter()
59046                 .append('div')
59047                 .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
59048
59049             enter
59050                 .style('opacity', 0)
59051                 .transition()
59052                 .duration(200)
59053                 .style('opacity', 1);
59054
59055             var title = enter
59056                 .append('div')
59057                 .attr('class', 'panel-title fillD2');
59058
59059             title
59060                 .append('h3')
59061                 .text(function(d) { return panels[d].title; });
59062
59063             title
59064                 .append('button')
59065                 .attr('class', 'close')
59066                 .on('click', function (d) { toggle(d); })
59067                 .call(svgIcon('#icon-close'));
59068
59069             enter
59070                 .append('div')
59071                 .attr('class', function(d) { return 'panel-content panel-content-' + d; });
59072
59073
59074             // redraw the panels
59075             infoPanels.selectAll('.panel-content')
59076                 .each(function(d) {
59077                     d3_select(this).call(panels[d]);
59078                 });
59079         }
59080
59081
59082         function toggle(which) {
59083             if (event) {
59084                 event.stopImmediatePropagation();
59085                 event.preventDefault();
59086             }
59087
59088             var activeids = ids.filter(function(k) { return active[k]; });
59089
59090             if (which) {  // toggle one
59091                 active[which] = !active[which];
59092                 if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
59093                     wasActive = [which];
59094                 }
59095             } else {      // toggle all
59096                 if (activeids.length) {
59097                     wasActive = activeids;
59098                     activeids.forEach(function(k) { active[k] = false; });
59099                 } else {
59100                     wasActive.forEach(function(k) { active[k] = true; });
59101                 }
59102             }
59103
59104             redraw();
59105         }
59106
59107
59108         var infoPanels = selection$$1.selectAll('.info-panels')
59109             .data([0]);
59110
59111         infoPanels = infoPanels.enter()
59112             .append('div')
59113             .attr('class', 'info-panels')
59114             .merge(infoPanels);
59115
59116         redraw();
59117
59118         var keybinding = d3keybinding('info')
59119             .on(uiCmd('⌘' + t('info_panels.key')), toggle);
59120
59121         ids.forEach(function(k) {
59122             var key = t('info_panels.' + k + '.key', { default: null });
59123             if (!key) return;
59124             keybinding
59125                 .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
59126         });
59127
59128         d3_select(document)
59129             .call(keybinding);
59130     }
59131
59132     return info;
59133 }
59134
59135 function uiModes(context) {
59136     var modes = [
59137         modeAddPoint$$1(context),
59138         modeAddLine$$1(context),
59139         modeAddArea$$1(context)
59140     ];
59141
59142
59143     function editable() {
59144         var mode = context.mode();
59145         return context.editable() && mode && mode.id !== 'save';
59146     }
59147
59148
59149     return function(selection$$1) {
59150         var buttons = selection$$1.selectAll('button.add-button')
59151             .data(modes);
59152
59153         buttons = buttons.enter()
59154             .append('button')
59155             .attr('tabindex', -1)
59156             .attr('class', function(mode) { return mode.id + ' add-button col4'; })
59157             .on('click.mode-buttons', function(mode) {
59158                 // When drawing, ignore accidental clicks on mode buttons - #4042
59159                 var currMode = context.mode().id;
59160                 if (currMode.match(/^draw/) !== null) return;
59161
59162                 if (mode.id === currMode) {
59163                     context.enter(modeBrowse(context));
59164                 } else {
59165                     context.enter(mode);
59166                 }
59167             })
59168             .call(tooltip()
59169                 .placement('bottom')
59170                 .html(true)
59171                 .title(function(mode) {
59172                     return uiTooltipHtml(mode.description, mode.key);
59173                 })
59174             );
59175
59176         buttons
59177             .each(function(d) {
59178                 d3_select(this)
59179                     .call(svgIcon('#icon-' + d.button, 'pre-text'));
59180             });
59181
59182         buttons
59183             .append('span')
59184             .attr('class', 'label')
59185             .text(function(mode) { return mode.title; });
59186
59187         context
59188             .on('enter.editor', function(entered) {
59189                 selection$$1.selectAll('button.add-button')
59190                     .classed('active', function(mode) { return entered.button === mode.button; });
59191                 context.container()
59192                     .classed('mode-' + entered.id, true);
59193             });
59194
59195         context
59196             .on('exit.editor', function(exited) {
59197                 context.container()
59198                     .classed('mode-' + exited.id, false);
59199             });
59200
59201         var keybinding = d3keybinding('mode-buttons');
59202
59203         modes.forEach(function(mode) {
59204             keybinding.on(mode.key, function() {
59205                 if (editable()) {
59206                     if (mode.id === context.mode().id) {
59207                         context.enter(modeBrowse(context));
59208                     } else {
59209                         context.enter(mode);
59210                     }
59211                 }
59212             });
59213         });
59214
59215         d3_select(document)
59216             .call(keybinding);
59217
59218
59219         var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
59220
59221         context.map()
59222             .on('move.modes', debouncedUpdate)
59223             .on('drawn.modes', debouncedUpdate);
59224
59225         context
59226             .on('enter.modes', update);
59227
59228
59229
59230         function update() {
59231             selection$$1.selectAll('button.add-button')
59232                 .property('disabled', !editable());
59233         }
59234     };
59235 }
59236
59237 function uiNotice(context) {
59238
59239     return function(selection$$1) {
59240         var div = selection$$1
59241             .append('div')
59242             .attr('class', 'notice');
59243
59244         var button = div
59245             .append('button')
59246             .attr('class', 'zoom-to notice fillD')
59247             .on('click', function() {
59248                 context.map().zoomEase(context.minEditableZoom());
59249             })
59250             .on('wheel', function() {   // let wheel events pass through #4482
59251                 var e2 = new WheelEvent(event.type, event);
59252                 context.surface().node().dispatchEvent(e2);
59253             });
59254
59255         button
59256             .call(svgIcon('#icon-plus', 'pre-text'))
59257             .append('span')
59258             .attr('class', 'label')
59259             .text(t('zoom_in_edit'));
59260
59261
59262         function disableTooHigh() {
59263             var canEdit = context.map().zoom() >= context.minEditableZoom();
59264             div.style('display', canEdit ? 'none' : 'block');
59265         }
59266
59267         context.map()
59268             .on('move.notice', debounce(disableTooHigh, 500));
59269
59270         disableTooHigh();
59271     };
59272 }
59273
59274 function uiRestore(context) {
59275
59276     return function(selection) {
59277         if (!context.history().lock() || !context.history().restorableChanges())
59278             return;
59279
59280         var modalSelection = uiModal(selection, true);
59281
59282         modalSelection.select('.modal')
59283             .attr('class', 'modal fillL col6');
59284
59285         var introModal = modalSelection.select('.content');
59286
59287         introModal
59288             .attr('class','cf');
59289
59290         introModal
59291             .append('div')
59292             .attr('class', 'modal-section')
59293             .append('h3')
59294             .text(t('restore.heading'));
59295
59296         introModal
59297             .append('div')
59298             .attr('class','modal-section')
59299             .append('p')
59300             .text(t('restore.description'));
59301
59302         var buttonWrap = introModal
59303             .append('div')
59304             .attr('class', 'modal-actions cf');
59305
59306         var restore = buttonWrap
59307             .append('button')
59308             .attr('class', 'restore col6')
59309             .on('click', function() {
59310                 context.history().restore();
59311                 modalSelection.remove();
59312             });
59313
59314         restore
59315             .append('svg')
59316             .attr('class', 'logo logo-restore')
59317             .append('use')
59318             .attr('xlink:href', '#logo-restore');
59319
59320         restore
59321             .append('div')
59322             .text(t('restore.restore'));
59323
59324         var reset = buttonWrap
59325             .append('button')
59326             .attr('class', 'reset col6')
59327             .on('click', function() {
59328                 context.history().clearSaved();
59329                 modalSelection.remove();
59330             });
59331
59332         reset
59333             .append('svg')
59334             .attr('class', 'logo logo-reset')
59335             .append('use')
59336             .attr('xlink:href', '#logo-reset');
59337
59338         reset
59339             .append('div')
59340             .text(t('restore.reset'));
59341
59342         restore.node().focus();
59343     };
59344 }
59345
59346 function uiSave(context) {
59347     var history = context.history();
59348     var key = uiCmd('⌘S');
59349
59350
59351     function saving() {
59352         var mode = context.mode();
59353         return mode && mode.id === 'save';
59354     }
59355
59356
59357     function save() {
59358         event.preventDefault();
59359         if (!context.inIntro() && !saving() && history.hasChanges()) {
59360             context.enter(modeSave$$1(context));
59361         }
59362     }
59363
59364
59365     function getBackground(numChanges) {
59366         var step;
59367         if (numChanges === 0) {
59368             return null;
59369         } else if (numChanges <= 50) {
59370             step = numChanges / 50;
59371             return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
59372         } else {
59373             step = Math.min((numChanges - 50) / 50, 1.0);
59374             return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
59375         }
59376     }
59377
59378
59379     return function(selection$$1) {
59380         var numChanges = 0;
59381
59382         function updateCount() {
59383             var _ = history.difference().summary().length;
59384             if (_ === numChanges) return;
59385             numChanges = _;
59386
59387             tooltipBehavior
59388                 .title(uiTooltipHtml(
59389                     t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
59390                 );
59391
59392             var background = getBackground(numChanges);
59393
59394             button
59395                 .classed('disabled', numChanges === 0)
59396                 .classed('has-count', numChanges > 0)
59397                 .style('background', background);
59398
59399             button.select('span.count')
59400                 .text(numChanges)
59401                 .style('background', background)
59402                 .style('border-color', background);
59403         }
59404
59405
59406         var tooltipBehavior = tooltip()
59407             .placement('bottom')
59408             .html(true)
59409             .title(uiTooltipHtml(t('save.no_changes'), key));
59410
59411         var button = selection$$1
59412             .append('button')
59413             .attr('class', 'save col12 disabled')
59414             .attr('tabindex', -1)
59415             .on('click', save)
59416             .call(tooltipBehavior);
59417
59418         button
59419             .call(svgIcon('#icon-save', 'pre-text'))
59420             .append('span')
59421             .attr('class', 'label')
59422             .text(t('save.title'));
59423
59424         button
59425             .append('span')
59426             .attr('class', 'count')
59427             .text('0');
59428
59429         updateCount();
59430
59431
59432         var keybinding = d3keybinding('uiSave')
59433             .on(key, save, true);
59434
59435         d3_select(document)
59436             .call(keybinding);
59437
59438         context.history()
59439             .on('change.save', updateCount);
59440
59441         context
59442             .on('enter.save', function() {
59443                 button.property('disabled', saving());
59444                 if (saving()) button.call(tooltipBehavior.hide);
59445             });
59446     };
59447 }
59448
59449 function uiScale(context) {
59450     var projection = context.projection,
59451         isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
59452         maxLength = 180,
59453         tickHeight = 8;
59454
59455
59456     function scaleDefs(loc1, loc2) {
59457         var lat = (loc2[1] + loc1[1]) / 2,
59458             conversion = (isImperial ? 3.28084 : 1),
59459             dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
59460             scale = { dist: 0, px: 0, text: '' },
59461             buckets, i, val, dLon;
59462
59463         if (isImperial) {
59464             buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
59465         } else {
59466             buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
59467         }
59468
59469         // determine a user-friendly endpoint for the scale
59470         for (i = 0; i < buckets.length; i++) {
59471             val = buckets[i];
59472             if (dist >= val) {
59473                 scale.dist = Math.floor(dist / val) * val;
59474                 break;
59475             } else {
59476                 scale.dist = +dist.toFixed(2);
59477             }
59478         }
59479
59480         dLon = geoMetersToLon(scale.dist / conversion, lat);
59481         scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
59482
59483         scale.text = displayLength(scale.dist / conversion, isImperial);
59484
59485         return scale;
59486     }
59487
59488
59489     function update(selection) {
59490         // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
59491         var dims = context.map().dimensions(),
59492             loc1 = projection.invert([0, dims[1]]),
59493             loc2 = projection.invert([maxLength, dims[1]]),
59494             scale = scaleDefs(loc1, loc2);
59495
59496         selection.select('#scale-path')
59497             .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
59498
59499         selection.select('#scale-textgroup')
59500             .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
59501
59502         selection.select('#scale-text')
59503             .text(scale.text);
59504     }
59505
59506
59507     return function(selection) {
59508         function switchUnits() {
59509             isImperial = !isImperial;
59510             selection.call(update);
59511         }
59512
59513         var scalegroup = selection.append('svg')
59514             .attr('id', 'scale')
59515             .on('click', switchUnits)
59516             .append('g')
59517             .attr('transform', 'translate(10,11)');
59518
59519         scalegroup
59520             .append('path')
59521             .attr('id', 'scale-path');
59522
59523         scalegroup
59524             .append('g')
59525             .attr('id', 'scale-textgroup')
59526             .append('text')
59527             .attr('id', 'scale-text');
59528
59529         selection.call(update);
59530
59531         context.map().on('move.scale', function() {
59532             update(selection);
59533         });
59534     };
59535 }
59536
59537 var pair_1 = pair$1;
59538
59539 function search(x, dims, r) {
59540   if (!dims) dims = 'NSEW';
59541   if (typeof x !== 'string') return { val: null, regex: r };
59542
59543   r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
59544
59545   var m = r.exec(x);
59546   if (!m) return { val: null, regex: r };
59547
59548   var dim = m[1] || m[5];
59549   if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
59550
59551   return {
59552     val: (((m[2]) ? parseFloat(m[2]) : 0) +
59553           ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
59554           ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
59555           ((dim === 'S' || dim === 'W') ? -1 : 1),
59556     regex: r,
59557     raw: m[0],
59558     dim: dim
59559   };
59560 }
59561
59562 function pair$1(x, dims) {
59563   x = x.trim();
59564   var one = search(x, dims);
59565   if (one.val === null) return null;
59566   var two = search(x, dims, one.regex);
59567   if (two.val === null) return null;
59568   // null if one/two are not contiguous.
59569   if (one.raw + two.raw !== x) return null;
59570   if (one.dim) {
59571     return swapdim(one.val, two.val, one.dim);
59572   } else {
59573     return [one.val, two.val];
59574   }
59575 }
59576
59577 function swapdim(a, b, dim) {
59578   if (dim === 'N' || dim === 'S') return [a, b];
59579   if (dim === 'W' || dim === 'E') return [b, a];
59580 }
59581
59582 function uiFeatureList(context) {
59583     var keybinding = d3keybinding('uiFeatureList');
59584     var _geocodeResults;
59585
59586
59587     function featureList(selection$$1) {
59588         var header = selection$$1
59589             .append('div')
59590             .attr('class', 'header fillL cf');
59591
59592         header
59593             .append('h3')
59594             .text(t('inspector.feature_list'));
59595
59596         var searchWrap = selection$$1
59597             .append('div')
59598             .attr('class', 'search-header');
59599
59600         var search = searchWrap
59601             .append('input')
59602             .attr('placeholder', t('inspector.search'))
59603             .attr('type', 'search')
59604             .call(utilNoAuto)
59605             .on('keypress', keypress)
59606             .on('keydown', keydown)
59607             .on('input', inputevent);
59608
59609         searchWrap
59610             .call(svgIcon('#icon-search', 'pre-text'));
59611
59612         var listWrap = selection$$1
59613             .append('div')
59614             .attr('class', 'inspector-body');
59615
59616         var list = listWrap
59617             .append('div')
59618             .attr('class', 'feature-list cf');
59619
59620         context
59621             .on('exit.feature-list', clearSearch);
59622         context.map()
59623             .on('drawn.feature-list', mapDrawn);
59624
59625         keybinding
59626             .on(uiCmd('⌘F'), focusSearch);
59627
59628         d3_select(document)
59629             .call(keybinding);
59630
59631
59632         function focusSearch() {
59633             var mode = context.mode() && context.mode().id;
59634             if (mode !== 'browse') return;
59635
59636             event.preventDefault();
59637             search.node().focus();
59638         }
59639
59640
59641         function keydown() {
59642             if (event.keyCode === 27) {  // escape
59643                 search.node().blur();
59644             }
59645         }
59646
59647
59648         function keypress() {
59649             var q = search.property('value'),
59650                 items = list.selectAll('.feature-list-item');
59651             if (event.keyCode === 13 && q.length && items.size()) {  // return
59652                 click(items.datum());
59653             }
59654         }
59655
59656
59657         function inputevent() {
59658             _geocodeResults = undefined;
59659             drawList();
59660         }
59661
59662
59663         function clearSearch() {
59664             search.property('value', '');
59665             drawList();
59666         }
59667
59668
59669         function mapDrawn(e) {
59670             if (e.full) {
59671                 drawList();
59672             }
59673         }
59674
59675
59676         function features() {
59677             var entities = {};
59678             var result = [];
59679             var graph = context.graph();
59680             var q = search.property('value').toLowerCase();
59681
59682             if (!q) return result;
59683
59684             var idMatch = q.match(/^([nwr])([0-9]+)$/);
59685
59686             if (idMatch) {
59687                 result.push({
59688                     id: idMatch[0],
59689                     geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
59690                     type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
59691                     name: idMatch[2]
59692                 });
59693             }
59694
59695             var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
59696
59697             if (locationMatch) {
59698                 var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
59699                 result.push({
59700                     id: -1,
59701                     geometry: 'point',
59702                     type: t('inspector.location'),
59703                     name: dmsCoordinatePair([loc[1], loc[0]]),
59704                     location: loc
59705                 });
59706             }
59707
59708             function addEntity(entity) {
59709                 if (entity.id in entities || result.length > 200)
59710                     return;
59711
59712                 entities[entity.id] = true;
59713
59714                 var name = utilDisplayName(entity) || '';
59715                 if (name.toLowerCase().indexOf(q) >= 0) {
59716                     var matched = context.presets().match(entity, graph);
59717                     var type = (matched && matched.name()) || utilDisplayType(entity.id);
59718
59719                     result.push({
59720                         id: entity.id,
59721                         entity: entity,
59722                         geometry: context.geometry(entity.id),
59723                         type: type,
59724                         name: name
59725                     });
59726                 }
59727
59728                 graph.parentRelations(entity).forEach(function(parent) {
59729                     addEntity(parent);
59730                 });
59731             }
59732
59733             var visible = context.surface().selectAll('.point, .line, .area').nodes();
59734             for (var i = 0; i < visible.length && result.length <= 200; i++) {
59735                 var datum = visible[i].__data__;
59736                 var entity = datum && datum.properties && datum.properties.entity;
59737                 if (entity) { addEntity(entity); }
59738             }
59739
59740             (_geocodeResults || []).forEach(function(d) {
59741                 if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
59742
59743                     // Make a temporary osmEntity so we can preset match
59744                     // and better localize the search result - #4725
59745                     var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
59746                     var tags = {};
59747                     tags[d.class] = d.type;
59748
59749                     var attrs = { id: id, type: d.osm_type, tags: tags };
59750                     if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
59751                         attrs.nodes = ['a','a'];  // so that geometry area is possible
59752                     }
59753
59754                     var tempEntity = osmEntity$$1(attrs);
59755                     var tempGraph = coreGraph$$1([tempEntity]);
59756                     var matched = context.presets().match(tempEntity, tempGraph);
59757                     var type = (matched && matched.name()) || utilDisplayType(id);
59758
59759                     result.push({
59760                         id: tempEntity.id,
59761                         geometry: tempEntity.geometry(tempGraph),
59762                         type: type,
59763                         name: d.display_name,
59764                         extent: new geoExtent$$1(
59765                             [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
59766                             [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
59767                     });
59768                 }
59769             });
59770
59771             return result;
59772         }
59773
59774
59775         function drawList() {
59776             var value = search.property('value');
59777             var results = features();
59778
59779             list.classed('filtered', value.length);
59780
59781             var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
59782
59783             var resultsIndicator = list.selectAll('.no-results-item')
59784                 .data([0])
59785                 .enter()
59786                 .append('button')
59787                 .property('disabled', true)
59788                 .attr('class', 'no-results-item')
59789                 .call(svgIcon('#icon-alert', 'pre-text'));
59790
59791             resultsIndicator.append('span')
59792                 .attr('class', 'entity-name');
59793
59794             list.selectAll('.no-results-item .entity-name')
59795                 .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
59796
59797             if (services.geocoder) {
59798               list.selectAll('.geocode-item')
59799                   .data([0])
59800                   .enter()
59801                   .append('button')
59802                   .attr('class', 'geocode-item')
59803                   .on('click', geocoderSearch)
59804                   .append('div')
59805                   .attr('class', 'label')
59806                   .append('span')
59807                   .attr('class', 'entity-name')
59808                   .text(t('geocoder.search'));
59809             }
59810
59811             list.selectAll('.no-results-item')
59812                 .style('display', (value.length && !results.length) ? 'block' : 'none');
59813
59814             list.selectAll('.geocode-item')
59815                 .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
59816
59817             list.selectAll('.feature-list-item')
59818                 .data([-1])
59819                 .remove();
59820
59821             var items = list.selectAll('.feature-list-item')
59822                 .data(results, function(d) { return d.id; });
59823
59824             var enter = items.enter()
59825                 .insert('button', '.geocode-item')
59826                 .attr('class', 'feature-list-item')
59827                 .on('mouseover', mouseover)
59828                 .on('mouseout', mouseout)
59829                 .on('click', click);
59830
59831             var label = enter
59832                 .append('div')
59833                 .attr('class', 'label');
59834
59835             label
59836                 .each(function(d) {
59837                     d3_select(this)
59838                         .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
59839                 });
59840
59841             label
59842                 .append('span')
59843                 .attr('class', 'entity-type')
59844                 .text(function(d) { return d.type; });
59845
59846             label
59847                 .append('span')
59848                 .attr('class', 'entity-name')
59849                 .text(function(d) { return d.name; });
59850
59851             enter
59852                 .style('opacity', 0)
59853                 .transition()
59854                 .style('opacity', 1);
59855
59856             items.order();
59857
59858             items.exit()
59859                 .remove();
59860         }
59861
59862
59863         function mouseover(d) {
59864             if (d.id === -1) return;
59865
59866             context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
59867                 .classed('hover', true);
59868         }
59869
59870
59871         function mouseout() {
59872             context.surface().selectAll('.hover')
59873                 .classed('hover', false);
59874         }
59875
59876
59877         function click(d) {
59878             event.preventDefault();
59879             if (d.location) {
59880                 context.map().centerZoom([d.location[1], d.location[0]], 20);
59881             }
59882             else if (d.entity) {
59883                 if (d.entity.type === 'node') {
59884                     context.map().center(d.entity.loc);
59885                 } else if (d.entity.type === 'way') {
59886                     var center = context.projection(context.map().center());
59887                     var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
59888                     context.map().center(edge.loc);
59889                 }
59890                 context.enter(modeSelect(context, [d.entity.id]));
59891             } else {
59892                 context.zoomToEntity(d.id);
59893             }
59894         }
59895
59896
59897         function geocoderSearch() {
59898             services.geocoder.search(search.property('value'), function (err, resp) {
59899                 _geocodeResults = resp || [];
59900                 drawList();
59901             });
59902         }
59903     }
59904
59905
59906     return featureList;
59907 }
59908
59909 function uiPresetIcon() {
59910     var preset, geometry;
59911
59912
59913     function presetIcon(selection$$1) {
59914         selection$$1.each(render);
59915     }
59916
59917
59918     function getIcon(p, geom) {
59919         if (p.icon)
59920             return p.icon;
59921         else if (geom === 'line')
59922             return 'other-line';
59923         else if (geom === 'vertex')
59924             return p.isFallback() ? '' : 'poi-vertex';
59925         else
59926             return 'marker-stroked';
59927     }
59928
59929
59930     function render() {
59931         var selection$$1 = d3_select(this),
59932             p = preset.apply(this, arguments),
59933             geom = geometry.apply(this, arguments),
59934             picon = getIcon(p, geom),
59935             isPoi = picon.match(/^poi-/) !== null,
59936             isMaki = dataFeatureIcons.indexOf(picon) !== -1,
59937             isFramed = (geom === 'area' || geom === 'verex');
59938
59939
59940         function tag_classes(p) {
59941             var s = '';
59942             for (var i in p.tags) {
59943                 s += ' tag-' + i;
59944                 if (p.tags[i] !== '*') {
59945                     s += ' tag-' + i + '-' + p.tags[i];
59946                 }
59947             }
59948             return s;
59949         }
59950
59951
59952         var fill = selection$$1.selectAll('.preset-icon-fill')
59953             .data([0]);
59954
59955         fill = fill.enter()
59956             .append('div')
59957             .merge(fill);
59958
59959         fill
59960             .attr('class', function() {
59961                 return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
59962             });
59963
59964
59965         var areaFrame = selection$$1.selectAll('.preset-icon-frame')
59966             .data((geom === 'area') ? [0] : []);
59967
59968         areaFrame.exit()
59969             .remove();
59970
59971         areaFrame = areaFrame.enter()
59972             .append('div')
59973             .attr('class', 'preset-icon-frame')
59974             .call(svgIcon('#preset-icon-frame'));
59975
59976
59977         var icon = selection$$1.selectAll('.preset-icon')
59978             .data([0]);
59979
59980         icon = icon.enter()
59981             .append('div')
59982             .attr('class', 'preset-icon')
59983             .call(svgIcon(''))
59984             .merge(icon);
59985
59986         icon
59987             .attr('class', 'preset-icon preset-icon-' +
59988                 ((isMaki || isPoi) ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
59989             );
59990
59991         icon.selectAll('svg')
59992             .attr('class', function() {
59993                 return 'icon ' + picon + (isMaki || isPoi ? '' : tag_classes(p));
59994             });
59995
59996         icon.selectAll('use')
59997             .attr('href', '#' + picon + (isMaki ? '-15' : ''));
59998     }
59999
60000
60001     presetIcon.preset = function(_) {
60002         if (!arguments.length) return preset;
60003         preset = utilFunctor(_);
60004         return presetIcon;
60005     };
60006
60007
60008     presetIcon.geometry = function(_) {
60009         if (!arguments.length) return geometry;
60010         geometry = utilFunctor(_);
60011         return presetIcon;
60012     };
60013
60014     return presetIcon;
60015 }
60016
60017 function d3combobox() {
60018     var dispatch$$1 = dispatch('accept');
60019     var _container = d3_select(document.body);
60020     var _data = [];
60021     var _suggestions = [];
60022     var _minItems = 2;
60023     var _caseSensitive = false;
60024
60025     var _fetcher = function(val, cb) {
60026         cb(_data.filter(function(d) {
60027             return d.value
60028                 .toString()
60029                 .toLowerCase()
60030                 .indexOf(val.toLowerCase()) !== -1;
60031         }));
60032     };
60033
60034     var combobox = function(input, attachTo) {
60035         var idx = -1;
60036         var wrapper = _container
60037             .selectAll('div.combobox')
60038             .filter(function(d) { return d === input.node(); });
60039         var shown = !wrapper.empty();
60040         var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
60041
60042         input
60043             .classed('combobox-input', true)
60044             .on('focus.typeahead', focus)
60045             .on('blur.typeahead', blur)
60046             .on('keydown.typeahead', keydown)
60047             .on('keyup.typeahead', keyup)
60048             .on('input.typeahead', change)
60049             .each(function() {
60050                 var parent = this.parentNode;
60051                 var sibling = this.nextSibling;
60052
60053                 var caret = d3_select(parent).selectAll('.combobox-caret')
60054                     .filter(function(d) { return d === input.node(); })
60055                     .data([input.node()]);
60056
60057                 caret = caret.enter()
60058                     .insert('div', function() { return sibling; })
60059                     .attr('class', 'combobox-caret')
60060                     .merge(caret);
60061
60062                 caret
60063                     .on('mousedown', function () {
60064                         // prevent the form element from blurring. it blurs
60065                         // on mousedown
60066                         event.stopPropagation();
60067                         event.preventDefault();
60068                         if (!shown) {
60069                             input.node().focus();
60070                             fetch('', render);
60071                         } else {
60072                             hide();
60073                         }
60074                     });
60075             });
60076
60077         function focus() {
60078             fetch(value(), render);
60079         }
60080
60081         function blur() {
60082             window.setTimeout(hide, 150);
60083         }
60084
60085         function show() {
60086             if (!shown) {
60087                 wrapper = _container
60088                     .insert('div', ':first-child')
60089                     .datum(input.node())
60090                     .attr('class', 'combobox')
60091                     .style('position', 'absolute')
60092                     .style('display', 'block')
60093                     .style('left', '0px')
60094                     .on('mousedown', function () {
60095                         // prevent moving focus out of the text field
60096                         event.preventDefault();
60097                     });
60098
60099                 d3_select('body')
60100                     .on('scroll.combobox', render, true);
60101
60102                 shown = true;
60103             }
60104         }
60105
60106         function hide() {
60107             if (shown) {
60108                 idx = -1;
60109                 wrapper.remove();
60110
60111                 d3_select('body')
60112                     .on('scroll.combobox', null);
60113
60114                 shown = false;
60115             }
60116         }
60117
60118         function keydown() {
60119            switch (event.keyCode) {
60120                // backspace, delete
60121                case 8:
60122                case 46:
60123                    input.on('input.typeahead', function() {
60124                        idx = -1;
60125                        render();
60126                        var start = input.property('selectionStart');
60127                        input.node().setSelectionRange(start, start);
60128                        input.on('input.typeahead', change);
60129                    });
60130                    break;
60131                // tab
60132                case 9:
60133                    wrapper.selectAll('a.selected').each(function (d) {
60134                        dispatch$$1.call('accept', this, d);
60135                    });
60136                    hide();
60137                    break;
60138                // return
60139                case 13:
60140                    event.preventDefault();
60141                    break;
60142                // up arrow
60143                case 38:
60144                    if (tagName === 'textarea' && !shown) return;
60145                    nav(-1);
60146                    event.preventDefault();
60147                    break;
60148                // down arrow
60149                case 40:
60150                    if (tagName === 'textarea' && !shown) return;
60151                    nav(+1);
60152                    event.preventDefault();
60153                    break;
60154            }
60155            event.stopPropagation();
60156         }
60157
60158         function keyup() {
60159             switch (event.keyCode) {
60160                 // escape
60161                 case 27:
60162                     hide();
60163                     break;
60164                 // return
60165                 case 13:
60166                     wrapper.selectAll('a.selected').each(function (d) {
60167                        dispatch$$1.call('accept', this, d);
60168                     });
60169                     hide();
60170                     break;
60171             }
60172         }
60173
60174         function change() {
60175             fetch(value(), function() {
60176                 if (input.property('selectionEnd') === input.property('value').length) {
60177                     autocomplete();
60178                 }
60179                 render();
60180             });
60181         }
60182
60183         function nav(dir) {
60184             if (!_suggestions.length) return;
60185             idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
60186             input.property('value', _suggestions[idx].value);
60187             render();
60188             ensureVisible();
60189         }
60190
60191         function value() {
60192             var value = input.property('value');
60193             var start = input.property('selectionStart');
60194             var end = input.property('selectionEnd');
60195
60196             if (start && end) {
60197                 value = value.substring(0, start);
60198             }
60199
60200             return value;
60201         }
60202
60203         function fetch(v, cb) {
60204             _fetcher.call(input, v, function(_) {
60205                 _suggestions = _;
60206                 cb();
60207             });
60208         }
60209
60210         function autocomplete() {
60211             var v = _caseSensitive ? value() : value().toLowerCase();
60212             idx = -1;
60213             if (!v) return;
60214
60215             var best = -1;
60216             var suggestion, compare;
60217
60218             for (var i = 0; i < _suggestions.length; i++) {
60219                 suggestion = _suggestions[i].value;
60220                 compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
60221
60222                 // if search string matches suggestion exactly, pick it..
60223                 if (compare === v) {
60224                     best = i;
60225                     break;
60226
60227                 // otherwise lock in the first result that starts with the search string..
60228                 } else if (best === -1 && compare.indexOf(v) === 0) {
60229                     best = i;
60230                 }
60231             }
60232
60233             if (best !== -1) {
60234                 idx = best;
60235                 suggestion = _suggestions[best].value;
60236                 input.property('value', suggestion);
60237                 input.node().setSelectionRange(v.length, suggestion.length);
60238             }
60239         }
60240
60241         function render() {
60242             if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
60243                 show();
60244             } else {
60245                 hide();
60246                 return;
60247             }
60248
60249             var options = wrapper
60250                 .selectAll('a.combobox-option')
60251                 .data(_suggestions, function(d) { return d.value; });
60252
60253             options.exit()
60254                 .remove();
60255
60256             options.enter()
60257                 .append('a')
60258                 .attr('class', 'combobox-option')
60259                 .text(function(d) { return d.value; })
60260                 .merge(options)
60261                 .attr('title', function(d) { return d.title; })
60262                 .classed('selected', function(d, i) { return i === idx; })
60263                 .on('mouseover', select$$1)
60264                 .on('click', accept)
60265                 .order();
60266
60267
60268             var node = attachTo ? attachTo.node() : input.node();
60269             var rect = node.getBoundingClientRect();
60270
60271             wrapper
60272                 .style('left', (rect.left + 5) + 'px')
60273                 .style('width', (rect.width - 10) + 'px')
60274                 .style('top', rect.height + rect.top + 'px');
60275         }
60276
60277         function select$$1(d, i) {
60278             idx = i;
60279             render();
60280         }
60281
60282         function ensureVisible() {
60283             var node = wrapper.selectAll('a.selected').node();
60284             if (node) node.scrollIntoView();
60285         }
60286
60287         function accept(d) {
60288             if (!shown) return;
60289             input.property('value', d.value);
60290             utilTriggerEvent(input, 'change');
60291             dispatch$$1.call('accept', this, d);
60292             hide();
60293         }
60294     };
60295
60296     combobox.fetcher = function(_) {
60297         if (!arguments.length) return _fetcher;
60298         _fetcher = _;
60299         return combobox;
60300     };
60301
60302     combobox.data = function(_) {
60303         if (!arguments.length) return _data;
60304         _data = _;
60305         return combobox;
60306     };
60307
60308     combobox.minItems = function(_) {
60309         if (!arguments.length) return _minItems;
60310         _minItems = _;
60311         return combobox;
60312     };
60313
60314     combobox.caseSensitive = function(_) {
60315         if (!arguments.length) return _caseSensitive;
60316         _caseSensitive = _;
60317         return combobox;
60318     };
60319
60320     combobox.container = function(_) {
60321         if (!arguments.length) return _container;
60322         _container = _;
60323         return combobox;
60324     };
60325
60326     return utilRebind(combobox, dispatch$$1, 'on');
60327 }
60328
60329
60330 d3combobox.off = function(input) {
60331     input
60332         .on('focus.typeahead', null)
60333         .on('blur.typeahead', null)
60334         .on('keydown.typeahead', null)
60335         .on('keyup.typeahead', null)
60336         .on('input.typeahead', null)
60337         .each(function() {
60338             d3_select(this.parentNode).selectAll('.combobox-caret')
60339                 .filter(function(d) { return d === input.node(); })
60340                 .on('mousedown', null);
60341         });
60342
60343     d3_select('body')
60344         .on('scroll.combobox', null);
60345 };
60346
60347 function uiRawMemberEditor(context) {
60348     var taginfo = services.taginfo,
60349         _entityID;
60350
60351
60352     function selectMember(d) {
60353         event.preventDefault();
60354         context.enter(modeSelect(context, [d.id]));
60355     }
60356
60357
60358     function changeRole(d) {
60359         var role = d3_select(this).property('value');
60360         var member = { id: d.id, type: d.type, role: role };
60361         context.perform(
60362             actionChangeMember(d.relation.id, member, d.index),
60363             t('operations.change_role.annotation')
60364         );
60365     }
60366
60367
60368     function deleteMember(d) {
60369         context.perform(
60370             actionDeleteMember(d.relation.id, d.index),
60371             t('operations.delete_member.annotation')
60372         );
60373
60374         if (!context.hasEntity(d.relation.id)) {
60375             context.enter(modeBrowse(context));
60376         }
60377     }
60378
60379
60380     function rawMemberEditor(selection$$1) {
60381         var entity = context.entity(_entityID),
60382             memberships = [];
60383
60384         entity.members.slice(0, 1000).forEach(function(member, index) {
60385             memberships.push({
60386                 index: index,
60387                 id: member.id,
60388                 type: member.type,
60389                 role: member.role,
60390                 relation: entity,
60391                 member: context.hasEntity(member.id)
60392             });
60393         });
60394
60395         var gt = entity.members.length > 1000 ? '>' : '';
60396         selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
60397             .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
60398             .expanded(true)
60399             .updatePreference(false)
60400             .on('toggled', function(expanded) {
60401                 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60402             })
60403             .content(content)
60404         );
60405
60406
60407         function content(wrap) {
60408             var list = wrap.selectAll('.member-list')
60409                 .data([0]);
60410
60411             list = list.enter()
60412                 .append('ul')
60413                 .attr('class', 'member-list')
60414                 .merge(list);
60415
60416
60417             var items = list.selectAll('li')
60418                 .data(memberships, function(d) {
60419                     return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
60420                         (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
60421                 });
60422
60423             items.exit()
60424                 .each(unbind)
60425                 .remove();
60426
60427             var enter = items.enter()
60428                 .append('li')
60429                 .attr('class', 'member-row form-field')
60430                 .classed('member-incomplete', function(d) { return !d.member; });
60431
60432             enter
60433                 .each(function(d) {
60434                     if (d.member) {
60435                         var label = d3_select(this).append('label')
60436                             .attr('class', 'form-label')
60437                             .append('a')
60438                             .attr('href', '#')
60439                             .on('click', selectMember);
60440
60441                         label.append('span')
60442                             .attr('class', 'member-entity-type')
60443                             .text(function(d) {
60444                                 var matched = context.presets().match(d.member, context.graph());
60445                                 return (matched && matched.name()) || utilDisplayType(d.member.id);
60446                             });
60447
60448                         label.append('span')
60449                             .attr('class', 'member-entity-name')
60450                             .text(function(d) { return utilDisplayName(d.member); });
60451
60452                     } else {
60453                         d3_select(this).append('label')
60454                             .attr('class', 'form-label')
60455                             .text(t('inspector.incomplete', { id: d.id }));
60456                     }
60457                 });
60458
60459             enter
60460                 .append('input')
60461                 .attr('class', 'member-role')
60462                 .property('type', 'text')
60463                 .attr('maxlength', 255)
60464                 .attr('placeholder', t('inspector.role'))
60465                 .call(utilNoAuto)
60466                 .property('value', function(d) { return d.role; })
60467                 .on('change', changeRole);
60468
60469             enter
60470                 .append('button')
60471                 .attr('tabindex', -1)
60472                 .attr('class', 'remove button-input-action member-delete minor')
60473                 .on('click', deleteMember)
60474                 .call(svgIcon('#operation-delete'));
60475
60476             if (taginfo) {
60477                 enter.each(bindTypeahead);
60478             }
60479
60480
60481             function bindTypeahead(d) {
60482                 var row = d3_select(this),
60483                     role = row.selectAll('input.member-role');
60484
60485                 function sort(value, data) {
60486                     var sameletter = [],
60487                         other = [];
60488                     for (var i = 0; i < data.length; i++) {
60489                         if (data[i].value.substring(0, value.length) === value) {
60490                             sameletter.push(data[i]);
60491                         } else {
60492                             other.push(data[i]);
60493                         }
60494                     }
60495                     return sameletter.concat(other);
60496                 }
60497
60498                 role.call(d3combobox()
60499                     .container(context.container())
60500                     .fetcher(function(role, callback) {
60501                         var rtype = entity.tags.type;
60502                         taginfo.roles({
60503                             debounce: true,
60504                             rtype: rtype || '',
60505                             geometry: context.geometry(d.member.id),
60506                             query: role
60507                         }, function(err, data) {
60508                             if (!err) callback(sort(role, data));
60509                         });
60510                     }));
60511             }
60512
60513
60514             function unbind() {
60515                 var row = d3_select(this);
60516
60517                 row.selectAll('input.member-role')
60518                     .call(d3combobox.off);
60519             }
60520         }
60521     }
60522
60523
60524     rawMemberEditor.entityID = function(_) {
60525         if (!arguments.length) return _entityID;
60526         _entityID = _;
60527         return rawMemberEditor;
60528     };
60529
60530
60531     return rawMemberEditor;
60532 }
60533
60534 function uiRawMembershipEditor(context) {
60535     var taginfo = services.taginfo,
60536         _entityID,
60537         _showBlank;
60538
60539
60540     function selectRelation(d) {
60541         event.preventDefault();
60542         context.enter(modeSelect(context, [d.relation.id]));
60543     }
60544
60545
60546     function changeRole(d) {
60547         var role = d3_select(this).property('value');
60548         context.perform(
60549             actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
60550             t('operations.change_role.annotation')
60551         );
60552     }
60553
60554
60555     function addMembership(d, role) {
60556         _showBlank = false;
60557
60558         var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
60559
60560         if (d.relation) {
60561             context.perform(
60562                 actionAddMember(d.relation.id, member),
60563                 t('operations.add_member.annotation')
60564             );
60565
60566         } else {
60567             var relation = osmRelation();
60568             context.perform(
60569                 actionAddEntity(relation),
60570                 actionAddMember(relation.id, member),
60571                 t('operations.add.annotation.relation')
60572             );
60573
60574             context.enter(modeSelect(context, [relation.id]));
60575         }
60576     }
60577
60578
60579     function deleteMembership(d) {
60580         context.perform(
60581             actionDeleteMember(d.relation.id, d.index),
60582             t('operations.delete_member.annotation')
60583         );
60584     }
60585
60586
60587     function relations(q) {
60588         var newRelation = { relation: null, value: t('inspector.new_relation') };
60589         var result = [];
60590         var graph = context.graph();
60591
60592         context.intersects(context.extent()).forEach(function(entity) {
60593             if (entity.type !== 'relation' || entity.id === _entityID)
60594                 return;
60595
60596             var matched = context.presets().match(entity, graph),
60597                 presetName = (matched && matched.name()) || t('inspector.relation'),
60598                 entityName = utilDisplayName(entity) || '';
60599
60600             var value = presetName + ' ' + entityName;
60601             if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
60602                 return;
60603
60604             result.push({ relation: entity, value: value });
60605         });
60606
60607         result.sort(function(a, b) {
60608             return osmRelation.creationOrder(a.relation, b.relation);
60609         });
60610
60611         // Dedupe identical names by appending relation id - see #2891
60612         var dupeGroups = filter(
60613             groupBy(result, 'value'),
60614             function(v) { return v.length > 1; }
60615         );
60616
60617         dupeGroups.forEach(function(group) {
60618             group.forEach(function(obj) {
60619                 obj.value += ' ' + obj.relation.id;
60620             });
60621         });
60622
60623         forEach(result, function(obj) {
60624             obj.title = obj.value;
60625         });
60626
60627         result.unshift(newRelation);
60628         return result;
60629     }
60630
60631
60632     function rawMembershipEditor(selection$$1) {
60633         var entity = context.entity(_entityID),
60634             parents = context.graph().parentRelations(entity),
60635             memberships = [];
60636
60637         parents.slice(0, 1000).forEach(function(relation) {
60638             relation.members.forEach(function(member, index) {
60639                 if (member.id === entity.id) {
60640                     memberships.push({ relation: relation, member: member, index: index });
60641                 }
60642             });
60643         });
60644
60645         var gt = parents.length > 1000 ? '>' : '';
60646         selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
60647             .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
60648             .expanded(true)
60649             .updatePreference(false)
60650             .on('toggled', function(expanded) {
60651                 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60652             })
60653             .content(content)
60654         );
60655
60656
60657         function content(wrap) {
60658             var list = wrap.selectAll('.member-list')
60659                 .data([0]);
60660
60661             list = list.enter()
60662                 .append('ul')
60663                 .attr('class', 'member-list')
60664                 .merge(list);
60665
60666
60667             var items = list.selectAll('li.member-row-normal')
60668                 .data(memberships, function(d) {
60669                     return osmEntity$$1.key(d.relation) + ',' + d.index;
60670                 });
60671
60672             items.exit()
60673                 .each(unbind)
60674                 .remove();
60675
60676             var enter = items.enter()
60677                 .append('li')
60678                 .attr('class', 'member-row member-row-normal form-field');
60679
60680             var label = enter
60681                 .append('label')
60682                 .attr('class', 'form-label')
60683                 .append('a')
60684                 .attr('href', '#')
60685                 .on('click', selectRelation);
60686
60687             label
60688                 .append('span')
60689                 .attr('class', 'member-entity-type')
60690                 .text(function(d) {
60691                     var matched = context.presets().match(d.relation, context.graph());
60692                     return (matched && matched.name()) || t('inspector.relation');
60693                 });
60694
60695             label
60696                 .append('span')
60697                 .attr('class', 'member-entity-name')
60698                 .text(function(d) { return utilDisplayName(d.relation); });
60699
60700             enter
60701                 .append('input')
60702                 .attr('class', 'member-role')
60703                 .property('type', 'text')
60704                 .attr('maxlength', 255)
60705                 .attr('placeholder', t('inspector.role'))
60706                 .call(utilNoAuto)
60707                 .property('value', function(d) { return d.member.role; })
60708                 .on('change', changeRole);
60709
60710             enter
60711                 .append('button')
60712                 .attr('tabindex', -1)
60713                 .attr('class', 'remove button-input-action member-delete minor')
60714                 .on('click', deleteMembership)
60715                 .call(svgIcon('#operation-delete'));
60716
60717             if (taginfo) {
60718                 enter.each(bindTypeahead);
60719             }
60720
60721
60722             var newrow = list.selectAll('.member-row-new')
60723                 .data(_showBlank ? [0] : []);
60724
60725             newrow.exit()
60726                 .remove();
60727
60728             enter = newrow.enter()
60729                 .append('li')
60730                 .attr('class', 'member-row member-row-new form-field');
60731
60732             enter
60733                 .append('input')
60734                 .attr('type', 'text')
60735                 .attr('class', 'member-entity-input')
60736                 .call(utilNoAuto);
60737
60738             enter
60739                 .append('input')
60740                 .attr('class', 'member-role')
60741                 .property('type', 'text')
60742                 .attr('maxlength', 255)
60743                 .attr('placeholder', t('inspector.role'))
60744                 .call(utilNoAuto)
60745                 .on('change', changeRole);
60746
60747             enter
60748                 .append('button')
60749                 .attr('tabindex', -1)
60750                 .attr('class', 'remove button-input-action member-delete minor')
60751                 .on('click', deleteMembership)
60752                 .call(svgIcon('#operation-delete'));
60753
60754             newrow = newrow
60755                 .merge(enter);
60756
60757             newrow.selectAll('.member-entity-input')
60758                 .call(d3combobox()
60759                     .container(context.container())
60760                     .minItems(1)
60761                     .fetcher(function(value, callback) { callback(relations(value)); })
60762                     .on('accept', onAccept)
60763                 );
60764
60765
60766             var addrel = wrap.selectAll('.add-relation')
60767                 .data([0]);
60768
60769             addrel = addrel.enter()
60770                 .append('button')
60771                 .attr('class', 'add-relation')
60772                 .merge(addrel);
60773
60774             addrel
60775                 .call(svgIcon('#icon-plus', 'light'))
60776                 .on('click', function() {
60777                     _showBlank = true;
60778                     content(wrap);
60779                     list.selectAll('.member-entity-input').node().focus();
60780                 });
60781
60782
60783             function onAccept(d) {
60784                 var role = list.selectAll('.member-row-new .member-role').property('value');
60785                 addMembership(d, role);
60786             }
60787
60788
60789             function bindTypeahead(d) {
60790                 var row = d3_select(this),
60791                     role = row.selectAll('input.member-role');
60792
60793                 function sort(value, data) {
60794                     var sameletter = [],
60795                         other = [];
60796                     for (var i = 0; i < data.length; i++) {
60797                         if (data[i].value.substring(0, value.length) === value) {
60798                             sameletter.push(data[i]);
60799                         } else {
60800                             other.push(data[i]);
60801                         }
60802                     }
60803                     return sameletter.concat(other);
60804                 }
60805
60806                 role.call(d3combobox()
60807                     .container(context.container())
60808                     .fetcher(function(role, callback) {
60809                         var rtype = d.relation.tags.type;
60810                         taginfo.roles({
60811                             debounce: true,
60812                             rtype: rtype || '',
60813                             geometry: context.geometry(_entityID),
60814                             query: role
60815                         }, function(err, data) {
60816                             if (!err) callback(sort(role, data));
60817                         });
60818                     }));
60819             }
60820
60821
60822             function unbind() {
60823                 var row = d3_select(this);
60824
60825                 row.selectAll('input.member-role')
60826                     .call(d3combobox.off);
60827             }
60828         }
60829     }
60830
60831
60832     rawMembershipEditor.entityID = function(_) {
60833         if (!arguments.length) return _entityID;
60834         _entityID = _;
60835         return rawMembershipEditor;
60836     };
60837
60838
60839     return rawMembershipEditor;
60840 }
60841
60842 function uiTagReference(tag) {
60843     var taginfo = services.taginfo;
60844     var tagReference = {};
60845
60846     var _button = d3_select(null);
60847     var _body = d3_select(null);
60848     var _loaded;
60849     var _showing;
60850
60851
60852     function findLocal(data) {
60853         var locale = utilDetect().locale.toLowerCase();
60854         var localized;
60855
60856         if (locale !== 'pt-br') {  // see #3776, prefer 'pt' over 'pt-br'
60857             localized = find$1(data, function(d) {
60858                 return d.lang.toLowerCase() === locale;
60859             });
60860             if (localized) return localized;
60861         }
60862
60863         // try the non-regional version of a language, like
60864         // 'en' if the language is 'en-US'
60865         if (locale.indexOf('-') !== -1) {
60866             var first = locale.split('-')[0];
60867             localized = find$1(data, function(d) {
60868                 return d.lang.toLowerCase() === first;
60869             });
60870             if (localized) return localized;
60871         }
60872
60873         // finally fall back to english
60874         return find$1(data, function(d) {
60875             return d.lang.toLowerCase() === 'en';
60876         });
60877     }
60878
60879
60880     function load(param) {
60881         if (!taginfo) return;
60882
60883         _button
60884             .classed('tag-reference-loading', true);
60885
60886         taginfo.docs(param, function show(err, data) {
60887             var docs;
60888             if (!err && data) {
60889                 docs = findLocal(data);
60890             }
60891
60892             _body.html('');
60893
60894             if (!docs || !docs.title) {
60895                 if (param.hasOwnProperty('value')) {
60896                     load(omit(param, 'value'));   // retry with key only
60897                 } else {
60898                     _body
60899                         .append('p')
60900                         .attr('class', 'tag-reference-description')
60901                         .text(t('inspector.no_documentation_key'));
60902                     done();
60903                 }
60904                 return;
60905             }
60906
60907             if (docs.image && docs.image.thumb_url_prefix) {
60908                 _body
60909                     .append('img')
60910                     .attr('class', 'tag-reference-wiki-image')
60911                     .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
60912                     .on('load', function() { done(); })
60913                     .on('error', function() { d3_select(this).remove(); done(); });
60914             } else {
60915                 done();
60916             }
60917
60918             _body
60919                 .append('p')
60920                 .attr('class', 'tag-reference-description')
60921                 .text(docs.description || t('inspector.documentation_redirect'));
60922
60923             _body
60924                 .append('a')
60925                 .attr('class', 'tag-reference-link')
60926                 .attr('target', '_blank')
60927                 .attr('tabindex', -1)
60928                 .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
60929                 .call(svgIcon('#icon-out-link', 'inline'))
60930                 .append('span')
60931                 .text(t('inspector.reference'));
60932
60933             // Add link to info about "good changeset comments" - #2923
60934             if (param.key === 'comment') {
60935                 _body
60936                     .append('a')
60937                     .attr('class', 'tag-reference-comment-link')
60938                     .attr('target', '_blank')
60939                     .attr('tabindex', -1)
60940                     .call(svgIcon('#icon-out-link', 'inline'))
60941                     .attr('href', t('commit.about_changeset_comments_link'))
60942                     .append('span')
60943                     .text(t('commit.about_changeset_comments'));
60944             }
60945         });
60946     }
60947
60948
60949     function done() {
60950         _loaded = true;
60951
60952         _button
60953             .classed('tag-reference-loading', false);
60954
60955         _body
60956             .classed('expanded', true)
60957             .transition()
60958             .duration(200)
60959             .style('max-height', '200px')
60960             .style('opacity', '1');
60961
60962         _showing = true;
60963     }
60964
60965
60966     function hide() {
60967         _body
60968             .transition()
60969             .duration(200)
60970             .style('max-height', '0px')
60971             .style('opacity', '0')
60972             .on('end', function () {
60973                 _body.classed('expanded', false);
60974             });
60975
60976         _showing = false;
60977     }
60978
60979
60980     tagReference.button = function(selection$$1) {
60981         _button = selection$$1.selectAll('.tag-reference-button')
60982             .data([0]);
60983
60984         _button = _button.enter()
60985             .append('button')
60986             .attr('class', 'tag-reference-button')
60987             .attr('tabindex', -1)
60988             .call(svgIcon('#icon-inspect'))
60989             .merge(_button);
60990
60991         _button
60992             .on('click', function () {
60993                 event.stopPropagation();
60994                 event.preventDefault();
60995                 if (_showing) {
60996                     hide();
60997                 } else if (_loaded) {
60998                     done();
60999                 } else {
61000                     load(tag);
61001                 }
61002             });
61003     };
61004
61005
61006     tagReference.body = function(selection$$1) {
61007         var tagid = tag.rtype || (tag.key + '-' + tag.value);
61008         _body = selection$$1.selectAll('.tag-reference-body')
61009             .data([tagid], function(d) { return d; });
61010
61011         _body.exit()
61012             .remove();
61013
61014         _body = _body.enter()
61015             .append('div')
61016             .attr('class', 'tag-reference-body cf')
61017             .style('max-height', '0')
61018             .style('opacity', '0')
61019             .merge(_body);
61020
61021         if (_showing === false) {
61022             hide();
61023         }
61024     };
61025
61026
61027     tagReference.showing = function(_) {
61028         if (!arguments.length) return _showing;
61029         _showing = _;
61030         return tagReference;
61031     };
61032
61033
61034     return tagReference;
61035 }
61036
61037 function uiRawTagEditor(context) {
61038     var taginfo = services.taginfo,
61039         dispatch$$1 = dispatch('change'),
61040         _readOnlyTags = [],
61041         _showBlank = false,
61042         _updatePreference = true,
61043         _expanded = false,
61044         _newRow,
61045         _state,
61046         _preset,
61047         _tags,
61048         _entityID;
61049
61050
61051     function rawTagEditor(selection$$1) {
61052         var count = Object.keys(_tags).filter(function(d) { return d; }).length;
61053
61054         var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
61055             .title(t('inspector.all_tags') + ' (' + count + ')')
61056             .on('toggled', toggled)
61057             .updatePreference(_updatePreference)
61058             .content(content);
61059
61060         // Sometimes we want to force the raw_tag_editor to be opened/closed..
61061         // When undefined, uiDisclosure will use the user's stored preference.
61062         if (_expanded !== undefined) {
61063             disclosure.expanded(_expanded);
61064         }
61065
61066         selection$$1.call(disclosure);
61067
61068         function toggled(expanded) {
61069             _expanded = expanded;
61070             if (expanded) {
61071                 selection$$1.node().parentNode.scrollTop += 200;
61072             }
61073         }
61074     }
61075
61076
61077     function content(wrap) {
61078         var entries = map$3(_tags, function(v, k) {
61079             return { key: k, value: v };
61080         });
61081
61082         if (!entries.length || _showBlank) {
61083             _showBlank = false;
61084             entries.push({key: '', value: ''});
61085             _newRow = '';
61086         }
61087
61088         var list = wrap.selectAll('.tag-list')
61089             .data([0]);
61090
61091         list = list.enter()
61092             .append('ul')
61093             .attr('class', 'tag-list')
61094             .merge(list);
61095
61096         var newTag = wrap.selectAll('.add-tag')
61097             .data([0]);
61098
61099         newTag.enter()
61100             .append('button')
61101             .attr('class', 'add-tag')
61102             .on('click', addTag)
61103             .call(svgIcon('#icon-plus', 'light'));
61104
61105
61106         var items = list.selectAll('.tag-row')
61107             .data(entries, function(d) { return d.key; });
61108
61109         items.exit()
61110             .each(unbind)
61111             .remove();
61112
61113         // Enter
61114
61115         var enter = items.enter()
61116             .append('li')
61117             .attr('class', 'tag-row cf')
61118             .classed('readonly', isReadOnly);
61119
61120         enter
61121             .append('div')
61122             .attr('class', 'key-wrap')
61123             .append('input')
61124             .property('type', 'text')
61125             .attr('class', 'key')
61126             .attr('maxlength', 255)
61127             .call(utilNoAuto)
61128             .on('blur', keyChange)
61129             .on('change', keyChange);
61130
61131         enter
61132             .append('div')
61133             .attr('class', 'input-wrap-position')
61134             .append('input')
61135             .property('type', 'text')
61136             .attr('class', 'value')
61137             .attr('maxlength', 255)
61138             .call(utilNoAuto)
61139             .on('blur', valueChange)
61140             .on('change', valueChange)
61141             .on('keydown.push-more', pushMore);
61142
61143         enter
61144             .append('button')
61145             .attr('tabindex', -1)
61146             .attr('class', 'remove minor')
61147             .call(svgIcon('#operation-delete'));
61148
61149
61150         // Update
61151
61152         items = items
61153             .merge(enter)
61154             .sort(function(a, b) {
61155                 return (a.key === _newRow && b.key !== _newRow) ? 1
61156                     : (a.key !== _newRow && b.key === _newRow) ? -1
61157                     : d3_ascending(a.key, b.key);
61158             });
61159
61160         items
61161             .each(function(tag) {
61162                 var row = d3_select(this),
61163                     key = row.select('input.key'),      // propagate bound data to child
61164                     value = row.select('input.value');  // propagate bound data to child
61165
61166                 if (_entityID && taginfo) {
61167                     bindTypeahead(key, value);
61168                 }
61169
61170                 var isRelation = (_entityID && context.entity(_entityID).type === 'relation'),
61171                     reference;
61172
61173                 if (isRelation && tag.key === 'type') {
61174                     reference = uiTagReference({ rtype: tag.value }, context);
61175                 } else {
61176                     reference = uiTagReference({ key: tag.key, value: tag.value }, context);
61177                 }
61178
61179                 if (_state === 'hover') {
61180                     reference.showing(false);
61181                 }
61182
61183                 row
61184                     .call(reference.button)
61185                     .call(reference.body);
61186             });
61187
61188         items.selectAll('input.key')
61189             .attr('title', function(d) { return d.key; })
61190             .call(utilGetSetValue, function(d) { return d.key; })
61191             .property('disabled', isReadOnly);
61192
61193         items.selectAll('input.value')
61194             .attr('title', function(d) { return d.value; })
61195             .call(utilGetSetValue, function(d) { return d.value; })
61196             .property('disabled', isReadOnly);
61197
61198         items.selectAll('button.remove')
61199             .on('click', removeTag);
61200
61201
61202
61203         function isReadOnly(d) {
61204             for (var i = 0; i < _readOnlyTags.length; i++) {
61205                 if (d.key.match(_readOnlyTags[i]) !== null) {
61206                     return true;
61207                 }
61208             }
61209             return false;
61210         }
61211
61212
61213         function pushMore() {
61214             if (event.keyCode === 9 && !event.shiftKey &&
61215                 list.selectAll('li:last-child input.value').node() === this) {
61216                 addTag();
61217             }
61218         }
61219
61220
61221         function bindTypeahead(key, value) {
61222             if (isReadOnly({ key: key })) return;
61223             var geometry = context.geometry(_entityID);
61224
61225             key.call(d3combobox()
61226                 .container(context.container())
61227                 .fetcher(function(value, callback) {
61228                     taginfo.keys({
61229                         debounce: true,
61230                         geometry: geometry,
61231                         query: value
61232                     }, function(err, data) {
61233                         if (!err) callback(sort(value, data));
61234                     });
61235                 }));
61236
61237             value.call(d3combobox()
61238                 .container(context.container())
61239                 .fetcher(function(value, callback) {
61240                     taginfo.values({
61241                         debounce: true,
61242                         key: utilGetSetValue(key),
61243                         geometry: geometry,
61244                         query: value
61245                     }, function(err, data) {
61246                         if (!err) callback(sort(value, data));
61247                     });
61248                 }));
61249
61250
61251             function sort(value, data) {
61252                 var sameletter = [],
61253                     other = [];
61254                 for (var i = 0; i < data.length; i++) {
61255                     if (data[i].value.substring(0, value.length) === value) {
61256                         sameletter.push(data[i]);
61257                     } else {
61258                         other.push(data[i]);
61259                     }
61260                 }
61261                 return sameletter.concat(other);
61262             }
61263         }
61264
61265
61266         function unbind() {
61267             var row = d3_select(this);
61268
61269             row.selectAll('input.key')
61270                 .call(d3combobox.off);
61271
61272             row.selectAll('input.value')
61273                 .call(d3combobox.off);
61274         }
61275
61276
61277         function keyChange(d) {
61278             var kOld = d.key,
61279                 kNew = this.value.trim(),
61280                 tag = {};
61281
61282
61283             if (isReadOnly({ key: kNew })) {
61284                 this.value = kOld;
61285                 return;
61286             }
61287
61288             if (kNew && kNew !== kOld) {
61289                 var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
61290                     base = match[1],
61291                     suffix = +(match[2] || 1);
61292                 while (_tags[kNew]) {  // rename key if already in use
61293                     kNew = base + '_' + suffix++;
61294                 }
61295             }
61296             tag[kOld] = undefined;
61297             tag[kNew] = d.value;
61298
61299             d.key = kNew; // Maintain DOM identity through the subsequent update.
61300
61301             if (_newRow === kOld) {  // see if this row is still a new row
61302                 _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
61303             }
61304
61305             this.value = kNew;
61306             dispatch$$1.call('change', this, tag);
61307         }
61308
61309
61310         function valueChange(d) {
61311             if (isReadOnly(d)) return;
61312             var tag = {};
61313             tag[d.key] = this.value;
61314
61315             if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
61316                 _newRow = undefined;
61317             }
61318
61319             dispatch$$1.call('change', this, tag);
61320         }
61321
61322
61323         function removeTag(d) {
61324             if (isReadOnly(d)) return;
61325             var tag = {};
61326             tag[d.key] = undefined;
61327             dispatch$$1.call('change', this, tag);
61328             d3_select(this.parentNode).remove();
61329         }
61330
61331
61332         function addTag() {
61333             // Wrapped in a setTimeout in case it's being called from a blur
61334             // handler. Without the setTimeout, the call to `content` would
61335             // wipe out the pending value change.
61336             setTimeout(function() {
61337                 _showBlank = true;
61338                 content(wrap);
61339                 list.selectAll('li:last-child input.key').node().focus();
61340             }, 0);
61341         }
61342     }
61343
61344
61345     rawTagEditor.state = function(_) {
61346         if (!arguments.length) return _state;
61347         _state = _;
61348         return rawTagEditor;
61349     };
61350
61351
61352     rawTagEditor.preset = function(_) {
61353         if (!arguments.length) return _preset;
61354         _preset = _;
61355         if (_preset.isFallback()) {
61356             _expanded = true;
61357             _updatePreference = false;
61358         } else {
61359             _expanded = undefined;
61360             _updatePreference = true;
61361         }
61362         return rawTagEditor;
61363     };
61364
61365
61366     rawTagEditor.tags = function(_) {
61367         if (!arguments.length) return _tags;
61368         _tags = _;
61369         return rawTagEditor;
61370     };
61371
61372
61373     rawTagEditor.entityID = function(_) {
61374         if (!arguments.length) return _entityID;
61375         _entityID = _;
61376         return rawTagEditor;
61377     };
61378
61379
61380     rawTagEditor.expanded = function(_) {
61381         if (!arguments.length) return _expanded;
61382         _expanded = _;
61383         _updatePreference = false;
61384         return rawTagEditor;
61385     };
61386
61387
61388     rawTagEditor.readOnlyTags = function(_) {
61389         if (!arguments.length) return _readOnlyTags;
61390         _readOnlyTags = _;
61391         return rawTagEditor;
61392     };
61393
61394
61395     return utilRebind(rawTagEditor, dispatch$$1, 'on');
61396 }
61397
61398 // This currently only works with the 'restrictions' field
61399 // It borrows some code from uiHelp
61400
61401 function uiFieldHelp(context, fieldName) {
61402     var fieldHelp = {};
61403     var _inspector = d3_select(null);
61404     var _wrap = d3_select(null);
61405     var _body = d3_select(null);
61406
61407     var fieldHelpKeys = {
61408         restrictions: [
61409             ['about',[
61410                 'about',
61411                 'from_via_to',
61412                 'maxdist',
61413                 'maxvia'
61414             ]],
61415             ['inspecting',[
61416                 'about',
61417                 'from_shadow',
61418                 'allow_shadow',
61419                 'restrict_shadow',
61420                 'only_shadow',
61421                 'restricted',
61422                 'only'
61423             ]],
61424             ['modifying',[
61425                 'about',
61426                 'indicators',
61427                 'allow_turn',
61428                 'restrict_turn',
61429                 'only_turn'
61430             ]],
61431             ['tips',[
61432                 'simple',
61433                 'simple_example',
61434                 'indirect',
61435                 'indirect_example',
61436                 'indirect_noedit'
61437             ]]
61438         ]
61439     };
61440
61441     var fieldHelpHeadings = {};
61442
61443     var replacements = {
61444         distField: t('restriction.controls.distance'),
61445         viaField: t('restriction.controls.via'),
61446         fromShadow: icon('#turn-shadow', 'pre-text shadow from'),
61447         allowShadow: icon('#turn-shadow', 'pre-text shadow allow'),
61448         restrictShadow: icon('#turn-shadow', 'pre-text shadow restrict'),
61449         onlyShadow: icon('#turn-shadow', 'pre-text shadow only'),
61450         allowTurn: icon('#turn-yes', 'pre-text turn'),
61451         restrictTurn: icon('#turn-no', 'pre-text turn'),
61452         onlyTurn: icon('#turn-only', 'pre-text turn')
61453     };
61454
61455
61456     // For each section, squash all the texts into a single markdown document
61457     var docs = fieldHelpKeys[fieldName].map(function(key) {
61458         var helpkey = 'help.field.' + fieldName + '.' + key[0];
61459         var text = key[1].reduce(function(all, part) {
61460             var subkey = helpkey + '.' + part;
61461             var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
61462             var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
61463             return all + hhh + t(subkey, replacements) + '\n\n';
61464         }, '');
61465
61466         return {
61467             key: helpkey,
61468             title: t(helpkey + '.title'),
61469             html: marked(text.trim())
61470         };
61471     });
61472
61473
61474     function show() {
61475         updatePosition();
61476
61477         _body
61478             .classed('hide', false)
61479             .style('opacity', '0')
61480             .transition()
61481             .duration(200)
61482             .style('opacity', '1');
61483     }
61484
61485
61486     function hide() {
61487         _body
61488             .classed('hide', true)
61489             .transition()
61490             .duration(200)
61491             .style('opacity', '0')
61492             .on('end', function () {
61493                 _body.classed('hide', true);
61494             });
61495     }
61496
61497
61498     function clickHelp(index) {
61499         var d = docs[index];
61500         var tkeys = fieldHelpKeys[fieldName][index][1];
61501
61502         _body.selectAll('.field-help-nav-item')
61503             .classed('active', function(d, i) { return i === index; });
61504
61505         var content = _body.selectAll('.field-help-content')
61506             .html(d.html);
61507
61508         // class the paragraphs so we can find and style them
61509         content.selectAll('p')
61510             .attr('class', function(d, i) { return tkeys[i]; });
61511
61512         // insert special content for certain help sections
61513         if (d.key === 'help.field.restrictions.inspecting') {
61514             content
61515                 .insert('img', 'p.from_shadow')
61516                 .attr('class', 'field-help-image cf')
61517                 .attr('src', context.imagePath('tr_inspect.gif'));
61518
61519         } else if (d.key === 'help.field.restrictions.modifying') {
61520             content
61521                 .insert('img', 'p.allow_turn')
61522                 .attr('class', 'field-help-image cf')
61523                 .attr('src', context.imagePath('tr_modify.gif'));
61524         }
61525     }
61526
61527
61528     fieldHelp.button = function(selection$$1) {
61529         if (_body.empty()) return;
61530
61531         var button = selection$$1.selectAll('.field-help-button')
61532             .data([0]);
61533
61534         // enter/update
61535         button.enter()
61536             .append('button')
61537             .attr('class', 'field-help-button')
61538             .attr('tabindex', -1)
61539             .call(svgIcon('#icon-help'))
61540             .merge(button)
61541             .on('click', function () {
61542                 event.stopPropagation();
61543                 event.preventDefault();
61544                 if (_body.classed('hide')) {
61545                     show();
61546                 } else {
61547                     hide();
61548                 }
61549             });
61550     };
61551
61552
61553     function updatePosition() {
61554         var wrap = _wrap.node();
61555         var inspector = _inspector.node();
61556         var wRect = wrap.getBoundingClientRect();
61557         var iRect = inspector.getBoundingClientRect();
61558
61559         _body
61560             .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
61561     }
61562
61563
61564     fieldHelp.body = function(selection$$1) {
61565         // This control expects the field to have a preset-input-wrap div
61566         _wrap = selection$$1.selectAll('.preset-input-wrap');
61567         if (_wrap.empty()) return;
61568
61569         // absolute position relative to the inspector, so it "floats" above the fields
61570         _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
61571         if (_inspector.empty()) return;
61572
61573         _body = _inspector.selectAll('.field-help-body')
61574             .data([0]);
61575
61576         var enter = _body.enter()
61577             .append('div')
61578             .attr('class', 'field-help-body hide');   // initially hidden
61579
61580         var titleEnter = enter
61581             .append('div')
61582             .attr('class', 'field-help-title cf');
61583
61584         titleEnter
61585             .append('h2')
61586             .attr('class', 'fl')
61587             .text(t('help.field.' + fieldName + '.title'));
61588
61589         titleEnter
61590             .append('button')
61591             .attr('class', 'fr close')
61592             .on('click', function() {
61593                 event.stopPropagation();
61594                 event.preventDefault();
61595                 hide();
61596             })
61597             .call(svgIcon('#icon-close'));
61598
61599         var navEnter = enter
61600             .append('div')
61601             .attr('class', 'field-help-nav cf');
61602
61603         var titles = docs.map(function(d) { return d.title; });
61604         navEnter.selectAll('.field-help-nav-item')
61605             .data(titles)
61606             .enter()
61607             .append('div')
61608             .attr('class', 'field-help-nav-item')
61609             .text(function(d) { return d; })
61610             .on('click', function(d, i) {
61611                 event.stopPropagation();
61612                 event.preventDefault();
61613                 clickHelp(i);
61614             });
61615
61616         enter
61617             .append('div')
61618             .attr('class', 'field-help-content');
61619
61620         _body = _body
61621             .merge(enter);
61622
61623         clickHelp(0);
61624     };
61625
61626
61627     return fieldHelp;
61628 }
61629
61630 function uiFieldCheck(field, context) {
61631     var dispatch$$1 = dispatch('change');
61632     var options = field.strings && field.strings.options;
61633     var values = [];
61634     var texts = [];
61635
61636     var input = d3_select(null);
61637     var text = d3_select(null);
61638     var label = d3_select(null);
61639     var reverser = d3_select(null);
61640
61641     var _impliedYes;
61642     var _entityID;
61643     var _value;
61644
61645
61646     if (options) {
61647         for (var k in options) {
61648             values.push(k === 'undefined' ? undefined : k);
61649             texts.push(field.t('options.' + k, { 'default': options[k] }));
61650         }
61651     } else {
61652         values = [undefined, 'yes'];
61653         texts = [t('inspector.unknown'), t('inspector.check.yes')];
61654         if (field.type !== 'defaultCheck') {
61655             values.push('no');
61656             texts.push(t('inspector.check.no'));
61657         }
61658     }
61659
61660
61661     // Checks tags to see whether an undefined value is "Assumed to be Yes"
61662     function checkImpliedYes() {
61663         _impliedYes = (field.id === 'oneway_yes');
61664
61665         // hack: pretend `oneway` field is a `oneway_yes` field
61666         // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
61667         if (field.id === 'oneway') {
61668             var entity = context.entity(_entityID);
61669             for (var key in entity.tags) {
61670                 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
61671                     _impliedYes = true;
61672                     texts[0] = t('presets.fields.oneway_yes.options.undefined');
61673                     break;
61674                 }
61675             }
61676         }
61677     }
61678
61679
61680     function reverserHidden() {
61681         if (!d3_select('div.inspector-hover').empty()) return true;
61682         return !(_value === 'yes' || (_impliedYes && !_value));
61683     }
61684
61685
61686     function reverserSetText(selection$$1) {
61687         var entity = context.hasEntity(_entityID);
61688         if (reverserHidden() || !entity) return selection$$1;
61689
61690         var first = entity.first();
61691         var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
61692         var pseudoDirection = first < last;
61693         var icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
61694
61695         selection$$1.selectAll('.reverser-span')
61696             .text(t('inspector.check.reverser'))
61697             .call(svgIcon(icon, 'inline'));
61698
61699         return selection$$1;
61700     }
61701
61702
61703     var check = function(selection$$1) {
61704         checkImpliedYes();
61705         selection$$1.classed('checkselect', 'true');
61706
61707         label = selection$$1.selectAll('.preset-input-wrap')
61708             .data([0]);
61709
61710         var enter = label.enter()
61711             .append('label')
61712             .attr('class', 'preset-input-wrap');
61713
61714         enter
61715             .append('input')
61716             .property('indeterminate', field.type !== 'defaultCheck')
61717             .attr('type', 'checkbox')
61718             .attr('id', 'preset-input-' + field.id);
61719
61720         enter
61721             .append('span')
61722             .text(texts[0])
61723             .attr('class', 'value');
61724
61725         if (field.type === 'onewayCheck') {
61726             enter
61727                 .append('a')
61728                 .attr('id', 'preset-input-' + field.id + '-reverser')
61729                 .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
61730                 .attr('href', '#')
61731                 .append('span')
61732                 .attr('class', 'reverser-span');
61733         }
61734
61735         label = label.merge(enter);
61736         input = label.selectAll('input');
61737         text = label.selectAll('span.value');
61738
61739         input
61740             .on('click', function() {
61741                 var t$$1 = {};
61742                 t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
61743                 dispatch$$1.call('change', this, t$$1);
61744                 event.stopPropagation();
61745             });
61746
61747         if (field.type === 'onewayCheck') {
61748             reverser = label.selectAll('.reverser');
61749
61750             reverser
61751                 .call(reverserSetText)
61752                 .on('click', function() {
61753                     event.preventDefault();
61754                     event.stopPropagation();
61755                     context.perform(
61756                         actionReverse(_entityID),
61757                         t('operations.reverse.annotation')
61758                     );
61759                     d3_select(this)
61760                         .call(reverserSetText);
61761                 });
61762         }
61763     };
61764
61765
61766     check.entity = function(_) {
61767         if (!arguments.length) return context.hasEntity(_entityID);
61768         _entityID = _.id;
61769         return check;
61770     };
61771
61772
61773     check.tags = function(tags) {
61774
61775         function isChecked(val) {
61776             return val !== 'no' && val !== '' && val !== undefined && val !== null;
61777         }
61778
61779         function textFor(val) {
61780             if (val === '') val = undefined;
61781             var index = values.indexOf(val);
61782             return (index !== -1 ? texts[index] : ('"' + val + '"'));
61783         }
61784
61785         checkImpliedYes();
61786         _value = tags[field.key] && tags[field.key].toLowerCase();
61787
61788         if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
61789             _value = 'yes';
61790         }
61791
61792         input
61793             .property('indeterminate', field.type !== 'defaultCheck' && !_value)
61794             .property('checked', isChecked(_value));
61795
61796         text
61797             .text(textFor(_value));
61798
61799         label
61800             .classed('set', !!_value);
61801
61802         if (field.type === 'onewayCheck') {
61803             reverser
61804                 .classed('hide', reverserHidden())
61805                 .call(reverserSetText);
61806         }
61807     };
61808
61809
61810     check.focus = function() {
61811         input.node().focus();
61812     };
61813
61814     return utilRebind(check, dispatch$$1, 'on');
61815 }
61816
61817 /** Used for built-in method references. */
61818 var arrayProto$1 = Array.prototype;
61819
61820 /** Built-in value references. */
61821 var splice$1 = arrayProto$1.splice;
61822
61823 /**
61824  * The base implementation of `_.pullAt` without support for individual
61825  * indexes or capturing the removed elements.
61826  *
61827  * @private
61828  * @param {Array} array The array to modify.
61829  * @param {number[]} indexes The indexes of elements to remove.
61830  * @returns {Array} Returns `array`.
61831  */
61832 function basePullAt(array, indexes) {
61833   var length = array ? indexes.length : 0,
61834       lastIndex = length - 1;
61835
61836   while (length--) {
61837     var index = indexes[length];
61838     if (length == lastIndex || index !== previous) {
61839       var previous = index;
61840       if (isIndex(index)) {
61841         splice$1.call(array, index, 1);
61842       } else {
61843         baseUnset(array, index);
61844       }
61845     }
61846   }
61847   return array;
61848 }
61849
61850 /**
61851  * Removes all elements from `array` that `predicate` returns truthy for
61852  * and returns an array of the removed elements. The predicate is invoked
61853  * with three arguments: (value, index, array).
61854  *
61855  * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
61856  * to pull elements from an array by value.
61857  *
61858  * @static
61859  * @memberOf _
61860  * @since 2.0.0
61861  * @category Array
61862  * @param {Array} array The array to modify.
61863  * @param {Function} [predicate=_.identity] The function invoked per iteration.
61864  * @returns {Array} Returns the new array of removed elements.
61865  * @example
61866  *
61867  * var array = [1, 2, 3, 4];
61868  * var evens = _.remove(array, function(n) {
61869  *   return n % 2 == 0;
61870  * });
61871  *
61872  * console.log(array);
61873  * // => [1, 3]
61874  *
61875  * console.log(evens);
61876  * // => [2, 4]
61877  */
61878 function remove$8(array, predicate) {
61879   var result = [];
61880   if (!(array && array.length)) {
61881     return result;
61882   }
61883   var index = -1,
61884       indexes = [],
61885       length = array.length;
61886
61887   predicate = baseIteratee(predicate, 3);
61888   while (++index < length) {
61889     var value = array[index];
61890     if (predicate(value, index, array)) {
61891       result.push(value);
61892       indexes.push(index);
61893     }
61894   }
61895   basePullAt(array, indexes);
61896   return result;
61897 }
61898
61899 function uiFieldCombo(field, context) {
61900     var dispatch$$1 = dispatch('change'),
61901         nominatim = services.geocoder,
61902         taginfo = services.taginfo,
61903         isMulti = (field.type === 'multiCombo'),
61904         isNetwork = (field.type === 'networkCombo'),
61905         isSemi = (field.type === 'semiCombo'),
61906         optstrings = field.strings && field.strings.options,
61907         optarray = field.options,
61908         snake_case = (field.snake_case || (field.snake_case === undefined)),
61909         caseSensitive = field.caseSensitive,
61910         combobox = d3combobox()
61911             .container(context.container())
61912             .caseSensitive(caseSensitive)
61913             .minItems(isMulti || isSemi ? 1 : 2),
61914         comboData = [],
61915         multiData = [],
61916         container,
61917         input,
61918         entity,
61919         country;
61920
61921     // ensure multiCombo field.key ends with a ':'
61922     if (isMulti && field.key.match(/:$/) === null) {
61923         field.key += ':';
61924     }
61925
61926
61927     function snake(s) {
61928         return s.replace(/\s+/g, '_');
61929     }
61930
61931     function unsnake(s) {
61932         return s.replace(/_+/g, ' ');
61933     }
61934
61935     function clean(s) {
61936         return s.split(';')
61937             .map(function(s) { return s.trim(); })
61938             .join(';');
61939     }
61940
61941
61942     // returns the tag value for a display value
61943     // (for multiCombo, dval should be the key suffix, not the entire key)
61944     function tagValue(dval) {
61945         dval = clean(dval || '');
61946
61947         if (optstrings) {
61948             var match = find$1(comboData, function(o) {
61949                 return o.key && clean(o.value) === dval;
61950             });
61951             if (match) {
61952                 return match.key;
61953             }
61954         }
61955
61956         if (field.type === 'typeCombo' && !dval) {
61957             return 'yes';
61958         }
61959
61960         return (snake_case ? snake(dval) : dval) || undefined;
61961     }
61962
61963
61964     // returns the display value for a tag value
61965     // (for multiCombo, tval should be the key suffix, not the entire key)
61966     function displayValue(tval) {
61967         tval = tval || '';
61968
61969         if (optstrings) {
61970             var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
61971             if (match) {
61972                 return match.value;
61973             }
61974         }
61975
61976         if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
61977             return '';
61978         }
61979
61980         return snake_case ? unsnake(tval) : tval;
61981     }
61982
61983
61984     function objectDifference(a, b) {
61985         return reject(a, function(d1) {
61986             return some(b, function(d2) { return d1.value === d2.value; });
61987         });
61988     }
61989
61990
61991     function initCombo(selection$$1, attachTo) {
61992         if (optstrings) {
61993             selection$$1.attr('readonly', 'readonly');
61994             selection$$1.call(combobox, attachTo);
61995             setStaticValues(setPlaceholder);
61996
61997         } else if (optarray) {
61998             selection$$1.call(combobox, attachTo);
61999             setStaticValues(setPlaceholder);
62000
62001         } else if (taginfo) {
62002             selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
62003             setTaginfoValues('', setPlaceholder);
62004         }
62005     }
62006
62007
62008     function setStaticValues(callback) {
62009         if (!(optstrings || optarray)) return;
62010
62011         if (optstrings) {
62012             comboData = Object.keys(optstrings).map(function(k) {
62013                 var v = field.t('options.' + k, { 'default': optstrings[k] });
62014                 return {
62015                     key: k,
62016                     value: v,
62017                     title: v
62018                 };
62019             });
62020
62021         } else if (optarray) {
62022             comboData = optarray.map(function(k) {
62023                 var v = snake_case ? unsnake(k) : k;
62024                 return {
62025                     key: k,
62026                     value: v,
62027                     title: v
62028                 };
62029             });
62030         }
62031
62032         combobox.data(objectDifference(comboData, multiData));
62033         if (callback) callback(comboData);
62034     }
62035
62036
62037     function setTaginfoValues(q, callback) {
62038         var fn = isMulti ? 'multikeys' : 'values';
62039         var query = (isMulti ? field.key : '') + q;
62040         var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
62041         if (hasCountryPrefix) {
62042             query = country + ':';
62043         }
62044
62045         var params = {
62046             debounce: (q !== ''),
62047             key: field.key,
62048             query: query
62049         };
62050
62051         if (entity) {
62052             params.geometry = context.geometry(entity.id);
62053         }
62054
62055         taginfo[fn](params, function(err, data) {
62056             if (err) return;
62057             if (hasCountryPrefix) {
62058                 data = filter(data, function(d) {
62059                     return d.value.toLowerCase().indexOf(country + ':') === 0;
62060                 });
62061             }
62062
62063             comboData = map$3(data, function(d) {
62064                 var k = d.value;
62065                 if (isMulti) k = k.replace(field.key, '');
62066                 var v = snake_case ? unsnake(k) : k;
62067                 return {
62068                     key: k,
62069                     value: v,
62070                     title: isMulti ? v : d.title
62071                 };
62072             });
62073
62074             comboData = objectDifference(comboData, multiData);
62075             if (callback) callback(comboData);
62076         });
62077     }
62078
62079
62080     function setPlaceholder(d) {
62081         var ph;
62082
62083         if (isMulti || isSemi) {
62084             ph = field.placeholder() || t('inspector.add');
62085         } else {
62086             var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
62087                 placeholders = vals.length > 1 ? vals : map$3(d, 'key');
62088             ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
62089         }
62090
62091         if (ph.match(/(…|\.\.\.)$/) === null) {
62092             ph += '…';
62093         }
62094
62095         container.selectAll('input')
62096             .attr('placeholder', ph);
62097     }
62098
62099
62100     function change() {
62101         var val = tagValue(utilGetSetValue(input)),
62102             t$$1 = {};
62103
62104         if (isMulti || isSemi) {
62105             if (!val) return;
62106             container.classed('active', false);
62107             utilGetSetValue(input, '');
62108             if (isMulti) {
62109                 field.keys.push(field.key + val);
62110                 t$$1[field.key + val] = 'yes';
62111             } else if (isSemi) {
62112                 var arr = multiData.map(function(d) { return d.key; });
62113                 arr.push(val);
62114                 t$$1[field.key] = compact(uniq(arr)).join(';');
62115             }
62116             window.setTimeout(function() { input.node().focus(); }, 10);
62117
62118         } else {
62119             t$$1[field.key] = val;
62120         }
62121
62122         dispatch$$1.call('change', this, t$$1);
62123     }
62124
62125
62126     function removeMultikey(d) {
62127         event.stopPropagation();
62128         var t$$1 = {};
62129         if (isMulti) {
62130             t$$1[d.key] = undefined;
62131         } else if (isSemi) {
62132             remove$8(multiData, function(md) { return md.key === d.key; });
62133             var arr = multiData.map(function(md) { return md.key; });
62134             arr = compact(uniq(arr));
62135             t$$1[field.key] = arr.length ? arr.join(';') : undefined;
62136         }
62137         dispatch$$1.call('change', this, t$$1);
62138     }
62139
62140
62141     function combo(selection$$1) {
62142         if (isMulti || isSemi) {
62143             container = selection$$1.selectAll('ul').data([0]);
62144
62145             container = container.enter()
62146                 .append('ul')
62147                 .attr('class', 'form-field-multicombo')
62148                 .on('click', function() {
62149                     window.setTimeout(function() { input.node().focus(); }, 10);
62150                 })
62151                 .merge(container);
62152
62153         } else {
62154             container = selection$$1;
62155         }
62156
62157         input = container.selectAll('input')
62158             .data([0]);
62159
62160         input = input.enter()
62161             .append('input')
62162             .attr('type', 'text')
62163             .attr('id', 'preset-input-' + field.id)
62164             .call(utilNoAuto)
62165             .call(initCombo, selection$$1)
62166             .merge(input);
62167
62168         if (isNetwork && nominatim && entity) {
62169             var center = entity.extent(context.graph()).center();
62170             nominatim.countryCode(center, function (err, code) {
62171                 country = code;
62172             });
62173         }
62174
62175         input
62176             .on('change', change)
62177             .on('blur', change);
62178
62179         if (isMulti || isSemi) {
62180             combobox
62181                 .on('accept', function() {
62182                     input.node().blur();
62183                     input.node().focus();
62184                 });
62185
62186             input
62187                 .on('focus', function() { container.classed('active', true); });
62188         }
62189     }
62190
62191
62192     combo.tags = function(tags) {
62193         if (isMulti || isSemi) {
62194             multiData = [];
62195
62196             if (isMulti) {
62197                 // Build multiData array containing keys already set..
62198                 Object.keys(tags).forEach(function(key) {
62199                     if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
62200
62201                     var suffix = key.substring(field.key.length);
62202                     multiData.push({
62203                         key: key,
62204                         value: displayValue(suffix)
62205                     });
62206                 });
62207
62208                 // Set keys for form-field modified (needed for undo and reset buttons)..
62209                 field.keys = map$3(multiData, 'key');
62210
62211             } else if (isSemi) {
62212                 var arr = compact(uniq((tags[field.key] || '').split(';')));
62213                 multiData = arr.map(function(key) {
62214                     return {
62215                         key: key,
62216                         value: displayValue(key)
62217                     };
62218                 });
62219             }
62220
62221             // Exclude existing multikeys from combo options..
62222             var available = objectDifference(comboData, multiData);
62223             combobox.data(available);
62224
62225             // Hide 'Add' button if this field uses fixed set of
62226             // translateable optstrings and they're all currently used..
62227             container.selectAll('.combobox-input, .combobox-caret')
62228                 .classed('hide', optstrings && !available.length);
62229
62230
62231             // Render chips
62232             var chips = container.selectAll('.chips')
62233                 .data(multiData);
62234
62235             chips.exit()
62236                 .remove();
62237
62238             var enter = chips.enter()
62239                 .insert('li', 'input')
62240                 .attr('class', 'chips');
62241
62242             enter.append('span');
62243             enter.append('a');
62244
62245             chips = chips.merge(enter);
62246
62247             chips.select('span')
62248                 .text(function(d) { return d.value; });
62249
62250             chips.select('a')
62251                 .on('click', removeMultikey)
62252                 .attr('class', 'remove')
62253                 .text('×');
62254
62255         } else {
62256             utilGetSetValue(input, displayValue(tags[field.key]));
62257         }
62258     };
62259
62260
62261     combo.focus = function() {
62262         input.node().focus();
62263     };
62264
62265
62266     combo.entity = function(_) {
62267         if (!arguments.length) return entity;
62268         entity = _;
62269         return combo;
62270     };
62271
62272
62273     return utilRebind(combo, dispatch$$1, 'on');
62274 }
62275
62276 function uiFieldText(field, context) {
62277     var dispatch$$1 = dispatch('change'),
62278         nominatim = services.geocoder,
62279         input,
62280         entity;
62281
62282
62283     function i(selection$$1) {
62284         var fieldId = 'preset-input-' + field.id;
62285
62286         input = selection$$1.selectAll('input')
62287             .data([0]);
62288
62289         input = input.enter()
62290             .append('input')
62291             .attr('type', field.type)
62292             .attr('id', fieldId)
62293             .attr('placeholder', field.placeholder() || t('inspector.unknown'))
62294             .call(utilNoAuto)
62295             .merge(input);
62296
62297         input
62298             .on('input', change(true))
62299             .on('blur', change())
62300             .on('change', change());
62301
62302         if (field.type === 'tel' && nominatim && entity) {
62303             var center = entity.extent(context.graph()).center();
62304             nominatim.countryCode(center, function (err, countryCode) {
62305                 if (err || !dataPhoneFormats[countryCode]) return;
62306                 selection$$1.selectAll('#' + fieldId)
62307                     .attr('placeholder', dataPhoneFormats[countryCode]);
62308             });
62309
62310         } else if (field.type === 'number') {
62311             var rtl = (textDirection === 'rtl');
62312
62313             input.attr('type', 'text');
62314
62315             var spinControl = selection$$1.selectAll('.spin-control')
62316                 .data([0]);
62317
62318             var enter = spinControl.enter()
62319                 .append('div')
62320                 .attr('class', 'spin-control');
62321
62322             enter
62323                 .append('button')
62324                 .datum(rtl ? 1 : -1)
62325                 .attr('class', rtl ? 'increment' : 'decrement')
62326                 .attr('tabindex', -1);
62327
62328             enter
62329                 .append('button')
62330                 .datum(rtl ? -1 : 1)
62331                 .attr('class', rtl ? 'decrement' : 'increment')
62332                 .attr('tabindex', -1);
62333
62334             spinControl = spinControl
62335                 .merge(enter);
62336
62337             spinControl.selectAll('button')
62338                 .on('click', function(d) {
62339                     event.preventDefault();
62340                     var num = parseInt(input.node().value || 0, 10);
62341                     if (!isNaN(num)) input.node().value = num + d;
62342                     change()();
62343                 });
62344         }
62345     }
62346
62347
62348     function change(onInput) {
62349         return function() {
62350             var t$$1 = {};
62351             t$$1[field.key] = utilGetSetValue(input) || undefined;
62352             dispatch$$1.call('change', this, t$$1, onInput);
62353         };
62354     }
62355
62356
62357     i.entity = function(_) {
62358         if (!arguments.length) return entity;
62359         entity = _;
62360         return i;
62361     };
62362
62363
62364     i.tags = function(tags) {
62365         utilGetSetValue(input, tags[field.key] || '');
62366     };
62367
62368
62369     i.focus = function() {
62370         var node = input.node();
62371         if (node) node.focus();
62372     };
62373
62374     return utilRebind(i, dispatch$$1, 'on');
62375 }
62376
62377 function uiFieldAccess(field, context) {
62378     var dispatch$$1 = dispatch('change'),
62379         items;
62380
62381     function access(selection$$1) {
62382         var wrap = selection$$1.selectAll('.preset-input-wrap')
62383             .data([0]);
62384
62385         wrap = wrap.enter()
62386             .append('div')
62387             .attr('class', 'cf preset-input-wrap')
62388             .append('ul')
62389             .merge(wrap);
62390
62391         var list = wrap.selectAll('ul')
62392             .data([0]);
62393
62394         list = list.enter()
62395             .append('ul')
62396             .merge(list);
62397
62398
62399         items = list.selectAll('li')
62400             .data(field.keys);
62401
62402         // Enter
62403         var enter = items.enter()
62404             .append('li')
62405             .attr('class', function(d) { return 'cf preset-access-' + d; });
62406
62407         enter
62408             .append('span')
62409             .attr('class', 'col6 label preset-label-access')
62410             .attr('for', function(d) { return 'preset-input-access-' + d; })
62411             .text(function(d) { return field.t('types.' + d); });
62412
62413         enter
62414             .append('div')
62415             .attr('class', 'col6 preset-input-access-wrap')
62416             .append('input')
62417             .attr('type', 'text')
62418             .attr('class', 'preset-input-access')
62419             .attr('id', function(d) { return 'preset-input-access-' + d; })
62420             .call(utilNoAuto)
62421             .each(function(d) {
62422                 d3_select(this)
62423                     .call(d3combobox()
62424                         .container(context.container())
62425                         .data(access.options(d))
62426                     );
62427             });
62428
62429
62430         // Update
62431         items = items.merge(enter);
62432
62433         wrap.selectAll('.preset-input-access')
62434             .on('change', change)
62435             .on('blur', change);
62436     }
62437
62438
62439     function change(d) {
62440         var tag = {};
62441         tag[d] = utilGetSetValue(d3_select(this)) || undefined;
62442         dispatch$$1.call('change', this, tag);
62443     }
62444
62445
62446     access.options = function(type) {
62447         var options = ['no', 'permissive', 'private', 'destination'];
62448
62449         if (type !== 'access') {
62450             options.unshift('yes');
62451             options.push('designated');
62452
62453             if (type === 'bicycle') {
62454                 options.push('dismount');
62455             }
62456         }
62457
62458         return options.map(function(option) {
62459             return {
62460                 title: field.t('options.' + option + '.description'),
62461                 value: option
62462             };
62463         });
62464     };
62465
62466
62467     var placeholders = {
62468         footway: {
62469             foot: 'designated',
62470             motor_vehicle: 'no'
62471         },
62472         steps: {
62473             foot: 'yes',
62474             motor_vehicle: 'no',
62475             bicycle: 'no',
62476             horse: 'no'
62477         },
62478         pedestrian: {
62479             foot: 'yes',
62480             motor_vehicle: 'no'
62481         },
62482         cycleway: {
62483             motor_vehicle: 'no',
62484             bicycle: 'designated'
62485         },
62486         bridleway: {
62487             motor_vehicle: 'no',
62488             horse: 'designated'
62489         },
62490         path: {
62491             foot: 'yes',
62492             motor_vehicle: 'no',
62493             bicycle: 'yes',
62494             horse: 'yes'
62495         },
62496         motorway: {
62497             foot: 'no',
62498             motor_vehicle: 'yes',
62499             bicycle: 'no',
62500             horse: 'no'
62501         },
62502         trunk: {
62503             motor_vehicle: 'yes'
62504         },
62505         primary: {
62506             foot: 'yes',
62507             motor_vehicle: 'yes',
62508             bicycle: 'yes',
62509             horse: 'yes'
62510         },
62511         secondary: {
62512             foot: 'yes',
62513             motor_vehicle: 'yes',
62514             bicycle: 'yes',
62515             horse: 'yes'
62516         },
62517         tertiary: {
62518             foot: 'yes',
62519             motor_vehicle: 'yes',
62520             bicycle: 'yes',
62521             horse: 'yes'
62522         },
62523         residential: {
62524             foot: 'yes',
62525             motor_vehicle: 'yes',
62526             bicycle: 'yes',
62527             horse: 'yes'
62528         },
62529         unclassified: {
62530             foot: 'yes',
62531             motor_vehicle: 'yes',
62532             bicycle: 'yes',
62533             horse: 'yes'
62534         },
62535         service: {
62536             foot: 'yes',
62537             motor_vehicle: 'yes',
62538             bicycle: 'yes',
62539             horse: 'yes'
62540         },
62541         motorway_link: {
62542             foot: 'no',
62543             motor_vehicle: 'yes',
62544             bicycle: 'no',
62545             horse: 'no'
62546         },
62547         trunk_link: {
62548             motor_vehicle: 'yes'
62549         },
62550         primary_link: {
62551             foot: 'yes',
62552             motor_vehicle: 'yes',
62553             bicycle: 'yes',
62554             horse: 'yes'
62555         },
62556         secondary_link: {
62557             foot: 'yes',
62558             motor_vehicle: 'yes',
62559             bicycle: 'yes',
62560             horse: 'yes'
62561         },
62562         tertiary_link: {
62563             foot: 'yes',
62564             motor_vehicle: 'yes',
62565             bicycle: 'yes',
62566             horse: 'yes'
62567         }
62568     };
62569
62570
62571     access.tags = function(tags) {
62572         utilGetSetValue(items.selectAll('.preset-input-access'),
62573             function(d) { return tags[d] || ''; })
62574             .attr('placeholder', function() {
62575                 return tags.access ? tags.access : field.placeholder();
62576             });
62577
62578         items.selectAll('#preset-input-access-access')
62579             .attr('placeholder', 'yes');
62580
62581         forEach(placeholders[tags.highway], function(v, k) {
62582             items.selectAll('#preset-input-access-' + k)
62583                 .attr('placeholder', function() { return (tags.access || v); });
62584         });
62585     };
62586
62587
62588     access.focus = function() {
62589         items.selectAll('.preset-input-access')
62590             .node().focus();
62591     };
62592
62593
62594     return utilRebind(access, dispatch$$1, 'on');
62595 }
62596
62597 function uiFieldAddress(field, context) {
62598     var dispatch$$1 = dispatch('init', 'change'),
62599         nominatim = services.geocoder,
62600         wrap = d3_select(null),
62601         isInitialized = false,
62602         entity;
62603
62604     function getNearStreets() {
62605         var extent = entity.extent(context.graph()),
62606             l = extent.center(),
62607             box = geoExtent$$1(l).padByMeters(200);
62608
62609         var streets = context.intersects(box)
62610             .filter(isAddressable)
62611             .map(function(d) {
62612                 var loc = context.projection([
62613                     (extent[0][0] + extent[1][0]) / 2,
62614                     (extent[0][1] + extent[1][1]) / 2]),
62615                     choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
62616                 return {
62617                     title: d.tags.name,
62618                     value: d.tags.name,
62619                     dist: choice.distance
62620                 };
62621             })
62622             .sort(function(a, b) {
62623                 return a.dist - b.dist;
62624             });
62625
62626         return uniqBy(streets, 'value');
62627
62628         function isAddressable(d) {
62629             return d.tags.highway && d.tags.name && d.type === 'way';
62630         }
62631     }
62632
62633
62634     function getNearCities() {
62635         var extent = entity.extent(context.graph()),
62636             l = extent.center(),
62637             box = geoExtent$$1(l).padByMeters(200);
62638
62639         var cities = context.intersects(box)
62640             .filter(isAddressable)
62641             .map(function(d) {
62642                 return {
62643                     title: d.tags['addr:city'] || d.tags.name,
62644                     value: d.tags['addr:city'] || d.tags.name,
62645                     dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
62646                 };
62647             })
62648             .sort(function(a, b) {
62649                 return a.dist - b.dist;
62650             });
62651
62652         return uniqBy(cities, 'value');
62653
62654
62655         function isAddressable(d) {
62656             if (d.tags.name &&
62657                 (d.tags.admin_level === '8' || d.tags.border_type === 'city'))
62658                 return true;
62659
62660             if (d.tags.place && d.tags.name && (
62661                     d.tags.place === 'city' ||
62662                     d.tags.place === 'town' ||
62663                     d.tags.place === 'village'))
62664                 return true;
62665
62666             if (d.tags['addr:city']) return true;
62667
62668             return false;
62669         }
62670     }
62671
62672     function getNearValues(key) {
62673         var extent = entity.extent(context.graph()),
62674             l = extent.center(),
62675             box = geoExtent$$1(l).padByMeters(200);
62676
62677         var results = context.intersects(box)
62678             .filter(function hasTag(d) {
62679                 return d.tags[key];
62680             })
62681             .map(function(d) {
62682                 return {
62683                     title: d.tags[key],
62684                     value: d.tags[key],
62685                     dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
62686                 };
62687             })
62688             .sort(function(a, b) {
62689                 return a.dist - b.dist;
62690             });
62691
62692         return uniqBy(results, 'value');
62693     }
62694
62695
62696     function initCallback(err, countryCode) {
62697         if (err) return;
62698
62699         var addressFormat = find$1(dataAddressFormats, function (a) {
62700             return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
62701         }) || dataAddressFormats[0];
62702
62703         var widths = addressFormat.widths || {
62704             housenumber: 1/3, street: 2/3,
62705             city: 2/3, state: 1/4, postcode: 1/3
62706         };
62707
62708         function row(r) {
62709             // Normalize widths.
62710             var total = reduce(r, function(sum, field) {
62711                 return sum + (widths[field] || 0.5);
62712             }, 0);
62713
62714             return r.map(function (field) {
62715                 return {
62716                     id: field,
62717                     width: (widths[field] || 0.5) / total
62718                 };
62719             });
62720         }
62721
62722         wrap.selectAll('div.addr-row')
62723             .data(addressFormat.format)
62724             .enter()
62725             .append('div')
62726             .attr('class', 'addr-row')
62727             .selectAll('input')
62728             .data(row)
62729             .enter()
62730             .append('input')
62731             .property('type', 'text')
62732             .attr('placeholder', function (d) {
62733                 var localkey = d.id + '!' + countryCode.toLowerCase(),
62734                     tkey = field.strings.placeholders[localkey] ? localkey : d.id;
62735                 return field.t('placeholders.' + tkey);
62736             })
62737             .attr('class', function (d) { return 'addr-' + d.id; })
62738             .call(utilNoAuto)
62739             .style('width', function (d) { return d.width * 100 + '%'; });
62740
62741         // Update
62742
62743         // setup dropdowns for common address tags
62744         var dropdowns = addressFormat.dropdowns || [
62745             'city', 'county', 'country', 'district', 'hamlet',
62746             'neighbourhood', 'place', 'postcode', 'province',
62747             'quarter', 'state', 'street', 'subdistrict', 'suburb'
62748         ];
62749
62750         // If fields exist for any of these tags, create dropdowns to pick nearby values..
62751         dropdowns.forEach(function(tag) {
62752             var nearValues = (tag === 'street') ? getNearStreets
62753                     : (tag === 'city') ? getNearCities
62754                     : getNearValues;
62755
62756             wrap.selectAll('input.addr-' + tag)
62757                 .call(d3combobox()
62758                     .container(context.container())
62759                     .minItems(1)
62760                     .fetcher(function(value, callback) {
62761                         callback(nearValues('addr:' + tag));
62762                     })
62763                 );
62764         });
62765
62766         wrap.selectAll('input')
62767             .on('blur', change())
62768             .on('change', change());
62769
62770         wrap.selectAll('input:not(.combobox-input)')
62771             .on('input', change(true));
62772
62773         dispatch$$1.call('init');
62774         isInitialized = true;
62775     }
62776
62777
62778     function address(selection$$1) {
62779         isInitialized = false;
62780
62781         wrap = selection$$1.selectAll('.preset-input-wrap')
62782             .data([0]);
62783
62784         wrap = wrap.enter()
62785             .append('div')
62786             .attr('class', 'preset-input-wrap')
62787             .merge(wrap);
62788
62789         if (nominatim && entity) {
62790             var center = entity.extent(context.graph()).center();
62791             nominatim.countryCode(center, initCallback);
62792         }
62793     }
62794
62795
62796     function change(onInput) {
62797         return function() {
62798             var tags = {};
62799
62800             wrap.selectAll('input')
62801                 .each(function (field) {
62802                     tags['addr:' + field.id] = this.value || undefined;
62803                 });
62804
62805             dispatch$$1.call('change', this, tags, onInput);
62806         };
62807     }
62808
62809
62810     function updateTags(tags) {
62811         utilGetSetValue(wrap.selectAll('input'), function (field) {
62812             return tags['addr:' + field.id] || '';
62813         });
62814     }
62815
62816
62817     address.entity = function(_) {
62818         if (!arguments.length) return entity;
62819         entity = _;
62820         return address;
62821     };
62822
62823
62824     address.tags = function(tags) {
62825         if (isInitialized) {
62826             updateTags(tags);
62827         } else {
62828             dispatch$$1.on('init', function () {
62829                 dispatch$$1.on('init', null);
62830                 updateTags(tags);
62831             });
62832         }
62833     };
62834
62835
62836     address.focus = function() {
62837         var node = wrap.selectAll('input').node();
62838         if (node) node.focus();
62839     };
62840
62841
62842     return utilRebind(address, dispatch$$1, 'on');
62843 }
62844
62845 function uiFieldCycleway(field, context) {
62846     var dispatch$$1 = dispatch('change'),
62847         items = d3_select(null);
62848
62849
62850     function cycleway(selection$$1) {
62851
62852         function stripcolon(s) {
62853             return s.replace(':', '');
62854         }
62855
62856
62857         var wrap = selection$$1.selectAll('.preset-input-wrap')
62858             .data([0]);
62859
62860         wrap = wrap.enter()
62861             .append('div')
62862             .attr('class', 'cf preset-input-wrap')
62863             .merge(wrap);
62864
62865
62866         var div = wrap.selectAll('ul')
62867             .data([0]);
62868
62869         div = div.enter()
62870             .append('ul')
62871             .merge(div);
62872
62873
62874         items = div.selectAll('li')
62875             .data(field.keys);
62876
62877         var enter = items.enter()
62878             .append('li')
62879             .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
62880
62881         enter
62882             .append('span')
62883             .attr('class', 'col6 label preset-label-cycleway')
62884             .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
62885             .text(function(d) { return field.t('types.' + d); });
62886
62887         enter
62888             .append('div')
62889             .attr('class', 'col6 preset-input-cycleway-wrap')
62890             .append('input')
62891             .attr('type', 'text')
62892             .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
62893             .call(utilNoAuto)
62894             .each(function(d) {
62895                 d3_select(this)
62896                     .call(d3combobox()
62897                         .container(context.container())
62898                         .data(cycleway.options(d))
62899                     );
62900             });
62901
62902
62903         // Update
62904         wrap.selectAll('.preset-input-cycleway')
62905             .on('change', change)
62906             .on('blur', change);
62907     }
62908
62909
62910     function change() {
62911         var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft')),
62912             right = utilGetSetValue(d3_select('.preset-input-cyclewayright')),
62913             tag = {};
62914
62915         if (left === 'none' || left === '') { left = undefined; }
62916         if (right === 'none' || right === '') { right = undefined; }
62917
62918         // Always set both left and right as changing one can affect the other
62919         tag = {
62920             cycleway: undefined,
62921             'cycleway:left': left,
62922             'cycleway:right': right
62923         };
62924
62925         // If the left and right tags match, use the cycleway tag to tag both
62926         // sides the same way
62927         if (left === right) {
62928             tag = {
62929                 cycleway: left,
62930                 'cycleway:left': undefined,
62931                 'cycleway:right': undefined
62932             };
62933         }
62934
62935         dispatch$$1.call('change', this, tag);
62936     }
62937
62938
62939     cycleway.options = function() {
62940         return keys$1(field.strings.options).map(function(option) {
62941             return {
62942                 title: field.t('options.' + option + '.description'),
62943                 value: option
62944             };
62945         });
62946     };
62947
62948
62949     cycleway.tags = function(tags) {
62950         utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
62951                 // If cycleway is set, always return that
62952                 if (tags.cycleway) {
62953                     return tags.cycleway;
62954                 }
62955                 return tags[d] || '';
62956             })
62957             .attr('placeholder', field.placeholder());
62958     };
62959
62960
62961     cycleway.focus = function() {
62962         items.selectAll('.preset-input-cycleway')
62963             .node().focus();
62964     };
62965
62966
62967     return utilRebind(cycleway, dispatch$$1, 'on');
62968 }
62969
62970 function uiFieldLanes(field, context) {
62971     var dispatch$$1 = dispatch('change'),
62972         LANE_WIDTH = 40,
62973         LANE_HEIGHT = 200,
62974         wayID,
62975         lanesData;
62976
62977     function lanes(selection$$1) {
62978         lanesData = context.entity(wayID).lanes();
62979
62980         if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
62981             selection$$1.call(lanes.off);
62982             return;
62983         }
62984
62985         var wrap = selection$$1.selectAll('.preset-input-wrap')
62986             .data([0]);
62987
62988         wrap = wrap.enter()
62989             .append('div')
62990             .attr('class', 'preset-input-wrap')
62991             .merge(wrap);
62992
62993         var surface =  wrap.selectAll('.surface')
62994             .data([0]);
62995
62996         var d = utilGetDimensions(wrap);
62997         var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
62998
62999         surface = surface.enter()
63000             .append('svg')
63001             .attr('width', d[0])
63002             .attr('height', 300)
63003             .attr('class', 'surface')
63004             .merge(surface);
63005
63006
63007         var lanesSelection = surface.selectAll('.lanes')
63008             .data([0]);
63009
63010         lanesSelection = lanesSelection.enter()
63011             .append('g')
63012             .attr('class', 'lanes')
63013             .merge(lanesSelection);
63014
63015         lanesSelection
63016             .attr('transform', function () {
63017                 return 'translate(' + (freeSpace / 2) + ', 0)';
63018             });
63019
63020
63021         var lane = lanesSelection.selectAll('.lane')
63022            .data(lanesData.lanes);
63023
63024         lane.exit()
63025             .remove();
63026
63027         var enter = lane.enter()
63028             .append('g')
63029             .attr('class', 'lane');
63030
63031         enter
63032             .append('g')
63033             .append('rect')
63034             .attr('y', 50)
63035             .attr('width', LANE_WIDTH)
63036             .attr('height', LANE_HEIGHT);
63037
63038         enter
63039             .append('g')
63040             .attr('class', 'forward')
63041             .append('text')
63042             .attr('y', 40)
63043             .attr('x', 14)
63044             .text('▲');
63045
63046         enter
63047             .append('g')
63048             .attr('class', 'bothways')
63049             .append('text')
63050             .attr('y', 40)
63051             .attr('x', 14)
63052             .text('▲▼');
63053
63054         enter
63055             .append('g')
63056             .attr('class', 'backward')
63057             .append('text')
63058             .attr('y', 40)
63059             .attr('x', 14)
63060             .text('▼');
63061
63062
63063         lane = lane
63064             .merge(enter);
63065
63066         lane
63067             .attr('transform', function(d) {
63068                 return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
63069             });
63070
63071         lane.select('.forward')
63072             .style('visibility', function(d) {
63073                 return d.direction === 'forward' ? 'visible' : 'hidden';
63074             });
63075
63076         lane.select('.bothways')
63077             .style('visibility', function(d) {
63078                 return d.direction === 'bothways' ? 'visible' : 'hidden';
63079             });
63080
63081         lane.select('.backward')
63082             .style('visibility', function(d) {
63083                 return d.direction === 'backward' ? 'visible' : 'hidden';
63084             });
63085     }
63086
63087
63088     lanes.entity = function(_) {
63089         if (!wayID || wayID !== _.id) {
63090             wayID = _.id;
63091         }
63092     };
63093
63094     lanes.tags = function() {};
63095     lanes.focus = function() {};
63096     lanes.off = function() {};
63097
63098     return utilRebind(lanes, dispatch$$1, 'on');
63099 }
63100
63101 function uiFieldLocalized(field, context) {
63102     var dispatch$$1 = dispatch('change', 'input'),
63103         wikipedia = services.wikipedia,
63104         input = d3_select(null),
63105         localizedInputs = d3_select(null),
63106         wikiTitles,
63107         entity;
63108
63109
63110     function localized(selection$$1) {
63111         input = selection$$1.selectAll('.localized-main')
63112             .data([0]);
63113
63114         input = input.enter()
63115             .append('input')
63116             .attr('type', 'text')
63117             .attr('id', 'preset-input-' + field.id)
63118             .attr('class', 'localized-main')
63119             .attr('placeholder', field.placeholder())
63120             .call(utilNoAuto)
63121             .merge(input);
63122
63123         if (field.id === 'name') {
63124             var preset = context.presets().match(entity, context.graph());
63125             input
63126                 .call(d3combobox()
63127                     .container(context.container())
63128                     .fetcher(utilSuggestNames(preset, dataSuggestions))
63129                 );
63130         }
63131
63132         input
63133             .on('input', change(true))
63134             .on('blur', change())
63135             .on('change', change());
63136
63137
63138         var translateButton = selection$$1.selectAll('.localized-add')
63139             .data([0]);
63140
63141         translateButton = translateButton.enter()
63142             .append('button')
63143             .attr('class', 'button-input-action localized-add minor')
63144             .attr('tabindex', -1)
63145             .call(svgIcon('#icon-plus'))
63146             .call(tooltip()
63147                 .title(t('translate.translate'))
63148                 .placement('left'))
63149             .merge(translateButton);
63150
63151         translateButton
63152             .on('click', addNew);
63153
63154
63155         localizedInputs = selection$$1.selectAll('.localized-wrap')
63156             .data([0]);
63157
63158         localizedInputs = localizedInputs.enter().append('div')
63159             .attr('class', 'localized-wrap')
63160             .merge(localizedInputs);
63161     }
63162
63163
63164     function addNew() {
63165         event.preventDefault();
63166         var data$$1 = localizedInputs.selectAll('div.entry').data();
63167         var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
63168         var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
63169         var isLangEn = defaultLang.indexOf('en') > -1;
63170         if (isLangEn || langExists) {
63171             defaultLang = '';
63172         }
63173         data$$1.push({ lang: defaultLang, value: '' });
63174         localizedInputs.call(render, data$$1);
63175     }
63176
63177
63178     function change(onInput) {
63179         return function() {
63180             var t$$1 = {};
63181             t$$1[field.key] = utilGetSetValue(d3_select(this)) || undefined;
63182             dispatch$$1.call('change', this, t$$1, onInput);
63183         };
63184     }
63185
63186
63187     function key(lang) {
63188         return field.key + ':' + lang;
63189     }
63190
63191
63192     function changeLang(d) {
63193         var lang = utilGetSetValue(d3_select(this)),
63194             t$$1 = {},
63195             language = find$1(wikipedia$2, function(d) {
63196                 return d[0].toLowerCase() === lang.toLowerCase() ||
63197                     d[1].toLowerCase() === lang.toLowerCase();
63198             });
63199
63200         if (language) lang = language[2];
63201
63202         if (d.lang && d.lang !== lang) {
63203             t$$1[key(d.lang)] = undefined;
63204         }
63205
63206         var value = utilGetSetValue(d3_select(this.parentNode)
63207             .selectAll('.localized-value'));
63208
63209         if (lang && value) {
63210             t$$1[key(lang)] = value;
63211         } else if (lang && wikiTitles && wikiTitles[d.lang]) {
63212             t$$1[key(lang)] = wikiTitles[d.lang];
63213         }
63214
63215         d.lang = lang;
63216         dispatch$$1.call('change', this, t$$1);
63217     }
63218
63219
63220     function changeValue(d) {
63221         if (!d.lang) return;
63222         var t$$1 = {};
63223         t$$1[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
63224         dispatch$$1.call('change', this, t$$1);
63225     }
63226
63227
63228     function fetcher(value, cb) {
63229         var v = value.toLowerCase();
63230
63231         cb(wikipedia$2.filter(function(d) {
63232             return d[0].toLowerCase().indexOf(v) >= 0 ||
63233             d[1].toLowerCase().indexOf(v) >= 0 ||
63234             d[2].toLowerCase().indexOf(v) >= 0;
63235         }).map(function(d) {
63236             return { value: d[1] };
63237         }));
63238     }
63239
63240
63241     function render(selection$$1, data$$1) {
63242         var wraps = selection$$1.selectAll('div.entry').
63243             data(data$$1, function(d) { return d.lang; });
63244
63245         wraps.exit()
63246             .transition()
63247             .duration(200)
63248             .style('max-height','0px')
63249             .style('opacity', '0')
63250             .style('top','-10px')
63251             .remove();
63252
63253         var innerWrap = wraps.enter()
63254             .insert('div', ':first-child');
63255
63256         innerWrap.attr('class', 'entry')
63257             .each(function() {
63258                 var wrap = d3_select(this);
63259                 var langcombo = d3combobox()
63260                     .container(context.container())
63261                     .fetcher(fetcher)
63262                     .minItems(0);
63263
63264                 var label = wrap
63265                     .append('label')
63266                     .attr('class','form-label')
63267                     .text(t('translate.localized_translation_label'))
63268                     .attr('for','localized-lang');
63269
63270                 label
63271                     .append('button')
63272                     .attr('class', 'minor remove')
63273                     .on('click', function(d){
63274                         event.preventDefault();
63275                         var t$$1 = {};
63276                         t$$1[key(d.lang)] = undefined;
63277                         dispatch$$1.call('change', this, t$$1);
63278                         d3_select(this.parentNode.parentNode)
63279                             .style('top','0')
63280                             .style('max-height','240px')
63281                             .transition()
63282                             .style('opacity', '0')
63283                             .style('max-height','0px')
63284                             .remove();
63285                     })
63286                     .call(svgIcon('#operation-delete'));
63287
63288                 wrap
63289                     .append('input')
63290                     .attr('class', 'localized-lang')
63291                     .attr('type', 'text')
63292                     .attr('placeholder',t('translate.localized_translation_language'))
63293                     .on('blur', changeLang)
63294                     .on('change', changeLang)
63295                     .call(langcombo);
63296
63297                 wrap
63298                     .append('input')
63299                     .on('blur', changeValue)
63300                     .on('change', changeValue)
63301                     .attr('type', 'text')
63302                     .attr('placeholder', t('translate.localized_translation_name'))
63303                     .attr('class', 'localized-value');
63304             });
63305
63306         innerWrap
63307             .style('margin-top', '0px')
63308             .style('max-height', '0px')
63309             .style('opacity', '0')
63310             .transition()
63311             .duration(200)
63312             .style('margin-top', '10px')
63313             .style('max-height', '240px')
63314             .style('opacity', '1')
63315             .on('end', function() {
63316                 d3_select(this)
63317                     .style('max-height', '')
63318                     .style('overflow', 'visible');
63319             });
63320
63321
63322         var entry = selection$$1.selectAll('.entry');
63323
63324         utilGetSetValue(entry.select('.localized-lang'), function(d) {
63325                 var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
63326                 return lang ? lang[1] : d.lang;
63327             });
63328
63329         utilGetSetValue(entry.select('.localized-value'),
63330             function(d) { return d.value; });
63331     }
63332
63333
63334     localized.tags = function(tags) {
63335         // Fetch translations from wikipedia
63336         if (tags.wikipedia && !wikiTitles) {
63337             wikiTitles = {};
63338             var wm = tags.wikipedia.match(/([^:]+):(.+)/);
63339             if (wm && wm[0] && wm[1]) {
63340                 wikipedia.translations(wm[1], wm[2], function(d) {
63341                     wikiTitles = d;
63342                 });
63343             }
63344         }
63345
63346         utilGetSetValue(input, tags[field.key] || '');
63347
63348         var postfixed = [], k, m;
63349         for (k in tags) {
63350             m = k.match(/^(.*):([a-zA-Z_-]+)$/);
63351             if (m && m[1] === field.key && m[2]) {
63352                 postfixed.push({ lang: m[2], value: tags[k] });
63353             }
63354         }
63355
63356         localizedInputs.call(render, postfixed.reverse());
63357     };
63358
63359
63360     localized.focus = function() {
63361         input.node().focus();
63362     };
63363
63364
63365     localized.entity = function(_) {
63366         if (!arguments.length) return entity;
63367         entity = _;
63368         return localized;
63369     };
63370
63371     return utilRebind(localized, dispatch$$1, 'on');
63372 }
63373
63374 function uiFieldMaxspeed(field, context) {
63375     var dispatch$$1 = dispatch('change'),
63376         entity,
63377         isImperial,
63378         unitInput = d3_select(null),
63379         input = d3_select(null),
63380         combobox;
63381
63382     var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
63383         imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
63384
63385
63386     function maxspeed(selection$$1) {
63387         combobox = d3combobox()
63388             .container(context.container());
63389
63390         var unitCombobox = d3combobox()
63391             .container(context.container())
63392             .data(['km/h', 'mph'].map(comboValues));
63393
63394         input = selection$$1.selectAll('#preset-input-' + field.id)
63395             .data([0]);
63396
63397         input = input.enter()
63398             .append('input')
63399             .attr('type', 'text')
63400             .attr('id', 'preset-input-' + field.id)
63401             .attr('placeholder', field.placeholder())
63402             .call(utilNoAuto)
63403             .call(combobox)
63404             .merge(input);
63405
63406         input
63407             .on('change', change)
63408             .on('blur', change);
63409
63410         var childNodes = context.graph().childNodes(context.entity(entity.id)),
63411             loc = childNodes[~~(childNodes.length/2)].loc;
63412
63413         isImperial = some(dataImperial.features, function(f) {
63414             return some(f.geometry.coordinates, function(d) {
63415                 return geoPointInPolygon(loc, d);
63416             });
63417         });
63418
63419         unitInput = selection$$1.selectAll('input.maxspeed-unit')
63420             .data([0]);
63421
63422         unitInput = unitInput.enter()
63423             .append('input')
63424             .attr('type', 'text')
63425             .attr('class', 'maxspeed-unit')
63426             .call(unitCombobox)
63427             .merge(unitInput);
63428
63429         unitInput
63430             .on('blur', changeUnits)
63431             .on('change', changeUnits);
63432
63433
63434         function changeUnits() {
63435             isImperial = utilGetSetValue(unitInput) === 'mph';
63436             utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
63437             setSuggestions();
63438             change();
63439         }
63440     }
63441
63442
63443     function setSuggestions() {
63444         combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
63445         utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
63446     }
63447
63448
63449     function comboValues(d) {
63450         return {
63451             value: d.toString(),
63452             title: d.toString()
63453         };
63454     }
63455
63456
63457     function change() {
63458         var tag = {},
63459             value = utilGetSetValue(input);
63460
63461         if (!value) {
63462             tag[field.key] = undefined;
63463         } else if (isNaN(value) || !isImperial) {
63464             tag[field.key] = value;
63465         } else {
63466             tag[field.key] = value + ' mph';
63467         }
63468
63469         dispatch$$1.call('change', this, tag);
63470     }
63471
63472
63473     maxspeed.tags = function(tags) {
63474         var value = tags[field.key];
63475
63476         if (value && value.indexOf('mph') >= 0) {
63477             value = parseInt(value, 10);
63478             isImperial = true;
63479         } else if (value) {
63480             isImperial = false;
63481         }
63482
63483         setSuggestions();
63484         utilGetSetValue(input, value || '');
63485     };
63486
63487
63488     maxspeed.focus = function() {
63489         input.node().focus();
63490     };
63491
63492
63493     maxspeed.entity = function(_) {
63494         entity = _;
63495     };
63496
63497
63498     return utilRebind(maxspeed, dispatch$$1, 'on');
63499 }
63500
63501 /**
63502  * This function is like `baseIndexOf` except that it accepts a comparator.
63503  *
63504  * @private
63505  * @param {Array} array The array to inspect.
63506  * @param {*} value The value to search for.
63507  * @param {number} fromIndex The index to search from.
63508  * @param {Function} comparator The comparator invoked per element.
63509  * @returns {number} Returns the index of the matched value, else `-1`.
63510  */
63511 function baseIndexOfWith(array, value, fromIndex, comparator) {
63512   var index = fromIndex - 1,
63513       length = array.length;
63514
63515   while (++index < length) {
63516     if (comparator(array[index], value)) {
63517       return index;
63518     }
63519   }
63520   return -1;
63521 }
63522
63523 /** Used for built-in method references. */
63524 var arrayProto$2 = Array.prototype;
63525
63526 /** Built-in value references. */
63527 var splice$2 = arrayProto$2.splice;
63528
63529 /**
63530  * The base implementation of `_.pullAllBy` without support for iteratee
63531  * shorthands.
63532  *
63533  * @private
63534  * @param {Array} array The array to modify.
63535  * @param {Array} values The values to remove.
63536  * @param {Function} [iteratee] The iteratee invoked per element.
63537  * @param {Function} [comparator] The comparator invoked per element.
63538  * @returns {Array} Returns `array`.
63539  */
63540 function basePullAll(array, values, iteratee, comparator) {
63541   var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
63542       index = -1,
63543       length = values.length,
63544       seen = array;
63545
63546   if (array === values) {
63547     values = copyArray(values);
63548   }
63549   if (iteratee) {
63550     seen = arrayMap(array, baseUnary(iteratee));
63551   }
63552   while (++index < length) {
63553     var fromIndex = 0,
63554         value = values[index],
63555         computed = iteratee ? iteratee(value) : value;
63556
63557     while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
63558       if (seen !== array) {
63559         splice$2.call(seen, fromIndex, 1);
63560       }
63561       splice$2.call(array, fromIndex, 1);
63562     }
63563   }
63564   return array;
63565 }
63566
63567 /**
63568  * This method is like `_.pull` except that it accepts an array of values to remove.
63569  *
63570  * **Note:** Unlike `_.difference`, this method mutates `array`.
63571  *
63572  * @static
63573  * @memberOf _
63574  * @since 4.0.0
63575  * @category Array
63576  * @param {Array} array The array to modify.
63577  * @param {Array} values The values to remove.
63578  * @returns {Array} Returns `array`.
63579  * @example
63580  *
63581  * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
63582  *
63583  * _.pullAll(array, ['a', 'c']);
63584  * console.log(array);
63585  * // => ['b', 'b']
63586  */
63587 function pullAll(array, values) {
63588   return (array && array.length && values && values.length)
63589     ? basePullAll(array, values)
63590     : array;
63591 }
63592
63593 /**
63594  * Removes all given values from `array` using
63595  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
63596  * for equality comparisons.
63597  *
63598  * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
63599  * to remove elements from an array by predicate.
63600  *
63601  * @static
63602  * @memberOf _
63603  * @since 2.0.0
63604  * @category Array
63605  * @param {Array} array The array to modify.
63606  * @param {...*} [values] The values to remove.
63607  * @returns {Array} Returns `array`.
63608  * @example
63609  *
63610  * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
63611  *
63612  * _.pull(array, 'a', 'c');
63613  * console.log(array);
63614  * // => ['b', 'b']
63615  */
63616 var pull = baseRest(pullAll);
63617
63618 function uiFieldRadio(field, context) {
63619     var dispatch$$1 = dispatch('change'),
63620         placeholder = d3_select(null),
63621         wrap = d3_select(null),
63622         labels = d3_select(null),
63623         radios = d3_select(null),
63624         radioData = clone(field.options || field.keys),
63625         typeField,
63626         layerField,
63627         oldType = {},
63628         entity;
63629
63630
63631     function selectedKey() {
63632         var node = wrap.selectAll('.toggle-list label.active input');
63633         return !node.empty() && node.datum();
63634     }
63635
63636
63637     function radio(selection$$1) {
63638         selection$$1.classed('preset-radio', true);
63639
63640         wrap = selection$$1.selectAll('.preset-input-wrap')
63641             .data([0]);
63642
63643         var enter = wrap.enter()
63644             .append('div')
63645             .attr('class', 'preset-input-wrap toggle-list');
63646
63647         enter
63648             .append('span')
63649             .attr('class', 'placeholder');
63650
63651         wrap = wrap
63652             .merge(enter);
63653
63654
63655         placeholder = wrap.selectAll('.placeholder');
63656
63657         labels = wrap.selectAll('label')
63658             .data(radioData);
63659
63660         enter = labels.enter()
63661             .append('label');
63662
63663         enter
63664             .append('input')
63665             .attr('type', 'radio')
63666             .attr('name', field.id)
63667             .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
63668             .attr('checked', false);
63669
63670         enter
63671             .append('span')
63672             .text(function(d) { return field.t('options.' + d, { 'default': d }); });
63673
63674         labels = labels
63675             .merge(enter);
63676
63677         radios = labels.selectAll('input')
63678             .on('change', changeRadio);
63679
63680     }
63681
63682
63683     function structureExtras(selection$$1, tags) {
63684         var selected = selectedKey(),
63685             type = context.presets().field(selected),
63686             layer = context.presets().field('layer'),
63687             showLayer = (selected === 'bridge' || selected === 'tunnel');
63688
63689
63690         var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
63691             .data(selected ? [0] : []);
63692
63693         extrasWrap.exit()
63694             .remove();
63695
63696         extrasWrap = extrasWrap.enter()
63697             .append('div')
63698             .attr('class', 'structure-extras-wrap')
63699             .merge(extrasWrap);
63700
63701         var list = extrasWrap.selectAll('ul')
63702             .data([0]);
63703
63704         list = list.enter()
63705             .append('ul')
63706             .merge(list);
63707
63708
63709         // Type
63710         if (type) {
63711             if (!typeField || typeField.id !== selected) {
63712                 typeField = uiField(context, type, entity, { wrap: false })
63713                     .on('change', changeType);
63714             }
63715             typeField.tags(tags);
63716         } else {
63717             typeField = null;
63718         }
63719
63720         var typeItem = list.selectAll('.structure-type-item')
63721             .data(typeField ? [typeField] : [], function(d) { return d.id; });
63722
63723         // Exit
63724         typeItem.exit()
63725             .remove();
63726
63727         // Enter
63728         var typeEnter = typeItem.enter()
63729             .insert('li', ':first-child')
63730             .attr('class', 'cf structure-type-item');
63731
63732         typeEnter
63733             .append('span')
63734             .attr('class', 'col6 label structure-label-type')
63735             .attr('for', 'preset-input-' + selected)
63736             .text(t('inspector.radio.structure.type'));
63737
63738         typeEnter
63739             .append('div')
63740             .attr('class', 'col6 structure-input-type-wrap');
63741
63742         // Update
63743         typeItem = typeItem
63744             .merge(typeEnter);
63745
63746         if (typeField) {
63747             typeItem.selectAll('.structure-input-type-wrap')
63748                 .call(typeField.render);
63749         }
63750
63751
63752         // Layer
63753         if (layer && showLayer) {
63754             if (!layerField) {
63755                 layerField = uiField(context, layer, entity, { wrap: false })
63756                     .on('change', changeLayer);
63757             }
63758             layerField.tags(tags);
63759             field.keys = union(field.keys, ['layer']);
63760         } else {
63761             layerField = null;
63762             pull(field.keys, 'layer');
63763         }
63764
63765         var layerItem = list.selectAll('.structure-layer-item')
63766             .data(layerField ? [layerField] : []);
63767
63768         // Exit
63769         layerItem.exit()
63770             .remove();
63771
63772         // Enter
63773         var layerEnter = layerItem.enter()
63774             .append('li')
63775             .attr('class', 'cf structure-layer-item');
63776
63777         layerEnter
63778             .append('span')
63779             .attr('class', 'col6 label structure-label-layer')
63780             .attr('for', 'preset-input-layer')
63781             .text(t('inspector.radio.structure.layer'));
63782
63783         layerEnter
63784             .append('div')
63785             .attr('class', 'col6 structure-input-layer-wrap');
63786
63787         // Update
63788         layerItem = layerItem
63789             .merge(layerEnter);
63790
63791         if (layerField) {
63792             layerItem.selectAll('.structure-input-layer-wrap')
63793                 .call(layerField.render);
63794         }
63795     }
63796
63797
63798     function changeType(t$$1, onInput) {
63799         var key = selectedKey();
63800         if (!key) return;
63801
63802         var val = t$$1[key];
63803         if (val !== 'no') {
63804             oldType[key] = val;
63805         }
63806
63807         if (field.type === 'structureRadio') {
63808             // remove layer if it should not be set
63809             if (val === 'no' ||
63810                 (key !== 'bridge' && key !== 'tunnel') ||
63811                 (key === 'tunnel' && val === 'building_passage')) {
63812                 t$$1.layer = undefined;
63813             }
63814             // add layer if it should be set
63815             if (t$$1.layer === undefined) {
63816                 if (key === 'bridge' && val !== 'no') {
63817                     t$$1.layer = '1';
63818                 }
63819                 if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
63820                     t$$1.layer = '-1';
63821                 }
63822             }
63823          }
63824
63825         dispatch$$1.call('change', this, t$$1, onInput);
63826     }
63827
63828
63829     function changeLayer(t$$1, onInput) {
63830         if (t$$1.layer === '0') {
63831             t$$1.layer = undefined;
63832         }
63833         dispatch$$1.call('change', this, t$$1, onInput);
63834     }
63835
63836
63837     function changeRadio() {
63838         var t$$1 = {},
63839             activeKey;
63840
63841         if (field.key) {
63842             t$$1[field.key] = undefined;
63843         }
63844
63845         radios.each(function(d) {
63846             var active = d3_select(this).property('checked');
63847             if (active) activeKey = d;
63848
63849             if (field.key) {
63850                 if (active) t$$1[field.key] = d;
63851             } else {
63852                 var val = oldType[activeKey] || 'yes';
63853                 t$$1[d] = active ? val : undefined;
63854             }
63855         });
63856
63857         if (field.type === 'structureRadio') {
63858             if (activeKey === 'bridge') {
63859                 t$$1.layer = '1';
63860             } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
63861                 t$$1.layer = '-1';
63862             } else {
63863                 t$$1.layer = undefined;
63864             }
63865         }
63866
63867         dispatch$$1.call('change', this, t$$1);
63868     }
63869
63870
63871     radio.tags = function(tags) {
63872         function checked(d) {
63873             if (field.key) {
63874                 return tags[field.key] === d;
63875             } else {
63876                 return !!(tags[d] && tags[d].toLowerCase() !== 'no');
63877             }
63878         }
63879
63880         labels.classed('active', checked);
63881         radios.property('checked', checked);
63882
63883         var selection$$1 = radios.filter(function() { return this.checked; });
63884
63885         if (selection$$1.empty()) {
63886             placeholder.text(t('inspector.none'));
63887         } else {
63888             placeholder.text(selection$$1.attr('value'));
63889             oldType[selection$$1.datum()] = tags[selection$$1.datum()];
63890         }
63891
63892         if (field.type === 'structureRadio') {
63893             // For waterways without a tunnel tag, set 'culvert' as
63894             // the oldType to default to if the user picks 'tunnel'
63895             if (!!tags.waterway && !oldType.tunnel) {
63896                 oldType.tunnel = 'culvert';
63897             }
63898
63899             wrap.call(structureExtras, tags);
63900         }
63901     };
63902
63903
63904     radio.focus = function() {
63905         radios.node().focus();
63906     };
63907
63908
63909     radio.entity = function(_) {
63910         if (!arguments.length) return entity;
63911         entity = _;
63912         oldType = {};
63913         return radio;
63914     };
63915
63916
63917     return utilRebind(radio, dispatch$$1, 'on');
63918 }
63919
63920 function uiFieldRestrictions(field, context) {
63921     var dispatch$$1 = dispatch('change');
63922     var breathe = behaviorBreathe(context);
63923     var storedViaWay = context.storage('turn-restriction-via-way');
63924     var storedDistance = context.storage('turn-restriction-distance');
63925
63926     var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
63927     var _maxDistance = storedDistance ? (+storedDistance) : 30;
63928     var _initialized = false;
63929     var _parent = d3_select(null);       // the entire field
63930     var _container = d3_select(null);    // just the map
63931     var _oldTurns;
63932     var _graph;
63933     var _vertexID;
63934     var _intersection;
63935     var _fromWayID;
63936
63937
63938     function restrictions(selection$$1) {
63939         _parent = selection$$1;
63940
63941         // try to reuse the intersection, but always rebuild it if the graph has changed
63942         if (_vertexID && (context.graph() !== _graph || !_intersection)) {
63943             _graph = context.graph();
63944             _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
63945         }
63946
63947         // It's possible for there to be no actual intersection here.
63948         // for example, a vertex of two `highway=path`
63949         // In this case, hide the field.
63950         var isOK = (_intersection && _intersection.vertices.length && _intersection.ways.length);
63951         d3_select(selection$$1.node().parentNode).classed('hide', !isOK);
63952
63953         // if form field is hidden or has detached from dom, clean up.
63954         if (!isOK ||
63955             !d3_select('.inspector-wrap.inspector-hidden').empty() ||
63956             !selection$$1.node().parentNode ||
63957             !selection$$1.node().parentNode.parentNode) {
63958             selection$$1.call(restrictions.off);
63959             return;
63960         }
63961
63962
63963         var wrap = selection$$1.selectAll('.preset-input-wrap')
63964             .data([0]);
63965
63966         wrap = wrap.enter()
63967             .append('div')
63968             .attr('class', 'preset-input-wrap')
63969             .merge(wrap);
63970
63971         var container = wrap.selectAll('.restriction-container')
63972             .data([0]);
63973
63974         // enter
63975         var containerEnter = container.enter()
63976             .append('div')
63977             .attr('class', 'restriction-container');
63978
63979         containerEnter
63980             .append('div')
63981             .attr('class', 'restriction-help');
63982
63983         // update
63984         _container = containerEnter
63985             .merge(container)
63986             .call(renderViewer);
63987
63988         var controls = wrap.selectAll('.restriction-controls')
63989             .data([0]);
63990
63991         // enter/update
63992         controls.enter()
63993             .append('div')
63994             .attr('class', 'restriction-controls-container')
63995             .append('div')
63996             .attr('class', 'restriction-controls')
63997             .merge(controls)
63998             .call(renderControls);
63999     }
64000
64001
64002     function renderControls(selection$$1) {
64003         var distControl = selection$$1.selectAll('.restriction-distance')
64004             .data([0]);
64005
64006         distControl.exit()
64007             .remove();
64008
64009         var distControlEnter = distControl.enter()
64010             .append('div')
64011             .attr('class', 'restriction-control restriction-distance');
64012
64013         distControlEnter
64014             .append('span')
64015             .attr('class', 'restriction-control-label restriction-distance-label')
64016             .text(t('restriction.controls.distance') + ':');
64017
64018         distControlEnter
64019             .append('input')
64020             .attr('class', 'restriction-distance-input')
64021             .attr('type', 'range')
64022             .attr('min', '20')
64023             .attr('max', '50')
64024             .attr('step', '5');
64025
64026         distControlEnter
64027             .append('span')
64028             .attr('class', 'restriction-distance-text');
64029
64030         // update
64031         selection$$1.selectAll('.restriction-distance-input')
64032             .property('value', _maxDistance)
64033             .on('input', function() {
64034                 var val = d3_select(this).property('value');
64035                 _maxDistance = +val;
64036                 _intersection = null;
64037                 _container.selectAll('.layer-osm .layer-turns *').remove();
64038                 context.storage('turn-restriction-distance', _maxDistance);
64039                 _parent.call(restrictions);
64040             });
64041
64042         selection$$1.selectAll('.restriction-distance-text')
64043             .text(displayMaxDistance(_maxDistance));
64044
64045
64046         var viaControl = selection$$1.selectAll('.restriction-via-way')
64047             .data([0]);
64048
64049         viaControl.exit()
64050             .remove();
64051
64052         var viaControlEnter = viaControl.enter()
64053             .append('div')
64054             .attr('class', 'restriction-control restriction-via-way');
64055
64056         viaControlEnter
64057             .append('span')
64058             .attr('class', 'restriction-control-label restriction-via-way-label')
64059             .text(t('restriction.controls.via') + ':');
64060
64061         viaControlEnter
64062             .append('input')
64063             .attr('class', 'restriction-via-way-input')
64064             .attr('type', 'range')
64065             .attr('min', '0')
64066             .attr('max', '2')
64067             .attr('step', '1');
64068
64069         viaControlEnter
64070             .append('span')
64071             .attr('class', 'restriction-via-way-text');
64072
64073         // update
64074         selection$$1.selectAll('.restriction-via-way-input')
64075             .property('value', _maxViaWay)
64076             .on('input', function() {
64077                 var val = d3_select(this).property('value');
64078                 _maxViaWay = +val;
64079                 _container.selectAll('.layer-osm .layer-turns *').remove();
64080                 context.storage('turn-restriction-via-way', _maxViaWay);
64081                 _parent.call(restrictions);
64082             });
64083
64084         selection$$1.selectAll('.restriction-via-way-text')
64085             .text(displayMaxVia(_maxViaWay));
64086     }
64087
64088
64089     function renderViewer(selection$$1) {
64090         if (!_intersection) return;
64091
64092         var vgraph = _intersection.graph;
64093         var filter = utilFunctor(true);
64094         var projection = geoRawMercator();
64095
64096         var d = utilGetDimensions(selection$$1);
64097         var c = geoVecScale(d, 0.5);
64098         var z = 22;
64099
64100         projection.scale(geoZoomToScale(z));
64101
64102         // Calculate extent of all key vertices
64103         var extent = geoExtent$$1();
64104         for (var i = 0; i < _intersection.vertices.length; i++) {
64105             extent._extend(_intersection.vertices[i].extent());
64106         }
64107
64108         // If this is a large intersection, adjust zoom to fit extent
64109         if (_intersection.vertices.length > 1) {
64110             var padding = 180;   // in z22 pixels
64111             var tl = projection([extent[0][0], extent[1][1]]);
64112             var br = projection([extent[1][0], extent[0][1]]);
64113             var hFactor = (br[0] - tl[0]) / (d[0] - padding);
64114             var vFactor = (br[1] - tl[1]) / (d[1] - padding);
64115             var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
64116             var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
64117             z = z - Math.max(hZoomDiff, vZoomDiff);
64118             projection.scale(geoZoomToScale(z));
64119         }
64120
64121         var padTop = 35;   // reserve top space for hint text
64122         var extentCenter = projection(extent.center());
64123         extentCenter[1] = extentCenter[1] - padTop;
64124
64125         projection
64126             .translate(geoVecSubtract(c, extentCenter))
64127             .clipExtent([[0, 0], d]);
64128
64129         var drawLayers = svgLayers(projection, context).only('osm').dimensions(d);
64130         var drawVertices = svgVertices$$1(projection, context);
64131         var drawLines = svgLines$$1(projection, context);
64132         var drawTurns = svgTurns(projection, context);
64133
64134         var firstTime = selection$$1.selectAll('.surface').empty();
64135
64136         selection$$1
64137             .call(drawLayers);
64138
64139         var surface = selection$$1.selectAll('.surface')
64140             .classed('tr', true);
64141
64142         if (firstTime) {
64143             _initialized = true;
64144
64145             surface
64146                 .call(breathe);
64147
64148             d3_select(window)
64149                 .on('resize.restrictions', function() {
64150                     utilSetDimensions(_container, null);
64151                     redraw();
64152                 });
64153         }
64154
64155
64156         // This can happen if we've lowered the detail while a FROM way
64157         // is selected, and that way is no longer part of the intersection.
64158         if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
64159             _fromWayID = null;
64160             _oldTurns = null;
64161         }
64162
64163         surface
64164             .call(utilSetDimensions, d)
64165             .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
64166             .call(drawLines, vgraph, _intersection.ways, filter)
64167             .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
64168
64169         surface
64170             .on('click.restrictions', click)
64171             .on('mouseover.restrictions', mouseover);
64172
64173         surface
64174             .selectAll('.selected')
64175             .classed('selected', false);
64176
64177         surface
64178             .selectAll('.related')
64179             .classed('related', false);
64180
64181         if (_fromWayID) {
64182             var way = vgraph.entity(_fromWayID);
64183             surface
64184                 .selectAll('.' + _fromWayID)
64185                 .classed('selected', true)
64186                 .classed('related', true);
64187         }
64188
64189         updateHints(null);
64190
64191
64192         function click() {
64193             surface
64194                 .call(breathe.off)
64195                 .call(breathe);
64196
64197             var datum = event.target.__data__;
64198             var entity = datum && datum.properties && datum.properties.entity;
64199             if (entity) {
64200                 datum = entity;
64201             }
64202
64203             if (datum instanceof osmWay && (datum.__from || datum.__via)) {
64204                 _fromWayID = datum.id;
64205                 _oldTurns = null;
64206                 redraw();
64207
64208             } else if (datum instanceof osmTurn) {
64209                 var actions, extraActions, turns, i;
64210                 var restrictionType = osmInferRestriction(vgraph, datum, projection);
64211
64212                 if (datum.restrictionID && !datum.direct) {
64213                     return;
64214
64215                 } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
64216                     var datumOnly = cloneDeep(datum);
64217                     datumOnly.only = true;
64218                     restrictionType = restrictionType.replace(/^no/, 'only');
64219
64220                     // Adding an ONLY restriction should destroy all other direct restrictions from the FROM.
64221                     // We will remember them in _oldTurns, and restore them if the user clicks again.
64222                     turns = _intersection.turns(_fromWayID, 2);
64223                     extraActions = [];
64224                     _oldTurns = [];
64225                     for (i = 0; i < turns.length; i++) {
64226                         if (turns[i].direct) {
64227                             turns[i].restrictionType = osmInferRestriction(vgraph, turns[i], projection);
64228                             _oldTurns.push(turns[i]);
64229                             extraActions.push(actionUnrestrictTurn(turns[i]));
64230                         }
64231                     }
64232
64233                     actions = _intersection.actions.concat(extraActions, [
64234                         actionRestrictTurn(datumOnly, restrictionType),
64235                         t('operations.restriction.annotation.create')
64236                     ]);
64237
64238                 } else if (datum.restrictionID) {   // ONLY -> Allowed
64239                     // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
64240                     // This relies on the assumption that the intersection was already split up when we
64241                     // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
64242                     turns = _oldTurns || [];
64243                     extraActions = [];
64244                     for (i = 0; i < turns.length; i++) {
64245                         if (turns[i].key !== datum.key) {
64246                             extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
64247                         }
64248                     }
64249                     _oldTurns = null;
64250
64251                     actions = _intersection.actions.concat(extraActions, [
64252                         actionUnrestrictTurn(datum),
64253                         t('operations.restriction.annotation.delete')
64254                     ]);
64255
64256                 } else {    // Allowed -> NO
64257                     actions = _intersection.actions.concat([
64258                         actionRestrictTurn(datum, restrictionType),
64259                         t('operations.restriction.annotation.create')
64260                     ]);
64261                 }
64262
64263                 context.perform.apply(context, actions);
64264
64265                 // At this point the datum will be changed, but will have same key..
64266                 // Refresh it and update the help..
64267                 var s = surface.selectAll('.' + datum.key);
64268                 datum = s.empty() ? null : s.datum();
64269                 updateHints(datum);
64270
64271             } else {
64272                 _fromWayID = null;
64273                 _oldTurns = null;
64274                 redraw();
64275             }
64276         }
64277
64278
64279         function mouseover() {
64280             var datum = event.target.__data__;
64281             updateHints(datum);
64282         }
64283
64284
64285         function redraw() {
64286             if (context.hasEntity(_vertexID)) {
64287                 _container.call(renderViewer);
64288             }
64289         }
64290
64291
64292         function highlightPathsFrom(wayID) {
64293             surface.selectAll('.related')
64294                 .classed('related', false)
64295                 .classed('allow', false)
64296                 .classed('restrict', false)
64297                 .classed('only', false);
64298
64299             surface.selectAll('.' + wayID)
64300                 .classed('related', true);
64301
64302             if (wayID) {
64303                 var turns = _intersection.turns(wayID, _maxViaWay);
64304                 for (var i = 0; i < turns.length; i++) {
64305                     var turn = turns[i];
64306                     var ids = [turn.to.way];
64307                     var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
64308
64309                     if (turn.only || turns.length === 1) {
64310                         if (turn.via.ways) {
64311                             ids = ids.concat(turn.via.ways);
64312                         }
64313                     } else if (turn.to.way === wayID) {
64314                         continue;
64315                     }
64316
64317                     surface.selectAll(utilEntitySelector(ids))
64318                         .classed('related', true)
64319                         .classed('allow', (klass === 'allow'))
64320                         .classed('restrict', (klass === 'restrict'))
64321                         .classed('only', (klass === 'only'));
64322                 }
64323             }
64324         }
64325
64326
64327         function updateHints(datum) {
64328             var help = _container.selectAll('.restriction-help').html('');
64329
64330             var placeholders = {};
64331             ['from', 'via', 'to'].forEach(function(k) {
64332                 placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
64333             });
64334
64335             var entity = datum && datum.properties && datum.properties.entity;
64336             if (entity) {
64337                 datum = entity;
64338             }
64339
64340             if (_fromWayID) {
64341                 way = vgraph.entity(_fromWayID);
64342                 surface
64343                     .selectAll('.' + _fromWayID)
64344                     .classed('selected', true)
64345                     .classed('related', true);
64346             }
64347
64348             // Hovering a way
64349             if (datum instanceof osmWay && datum.__from) {
64350                 way = datum;
64351
64352                 highlightPathsFrom(_fromWayID ? null : way.id);
64353                 surface.selectAll('.' + way.id)
64354                     .classed('related', true);
64355
64356                 var clickSelect = (!_fromWayID || _fromWayID !== way.id);
64357                 help
64358                     .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
64359                     .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
64360                         from: placeholders.from,
64361                         fromName: displayName(way.id, vgraph)
64362                     }));
64363
64364
64365             // Hovering a turn arrow
64366             } else if (datum instanceof osmTurn) {
64367                 var restrictionType = osmInferRestriction(vgraph, datum, projection);
64368                 var turnType = restrictionType.replace(/^(only|no)\_/, '');
64369                 var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
64370                 var klass, turnText, nextText;
64371
64372                 if (datum.no) {
64373                     klass = 'restrict';
64374                     turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
64375                     nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
64376                 } else if (datum.only) {
64377                     klass = 'only';
64378                     turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
64379                     nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
64380                 } else {
64381                     klass = 'allow';
64382                     turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
64383                     nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
64384                 }
64385
64386                 help
64387                     .append('div')      // "NO Right Turn (indirect)"
64388                     .attr('class', 'qualifier ' + klass)
64389                     .text(turnText);
64390
64391                 help
64392                     .append('div')      // "FROM {fromName} TO {toName}"
64393                     .html(t('restriction.help.from_name_to_name', {
64394                         from: placeholders.from,
64395                         fromName: displayName(datum.from.way, vgraph),
64396                         to: placeholders.to,
64397                         toName: displayName(datum.to.way, vgraph)
64398                     }));
64399
64400                 if (datum.via.ways && datum.via.ways.length) {
64401                     var names = [];
64402                     for (var i = 0; i < datum.via.ways.length; i++) {
64403                         var prev = names[names.length - 1];
64404                         var curr = displayName(datum.via.ways[i], vgraph);
64405                         if (!prev || curr !== prev)   // collapse identical names
64406                             names.push(curr);
64407                     }
64408
64409                     help
64410                         .append('div')      // "VIA {viaNames}"
64411                         .html(t('restriction.help.via_names', {
64412                             via: placeholders.via,
64413                             viaNames: names.join(', ')
64414                         }));
64415                 }
64416
64417                 if (!indirect) {
64418                     help
64419                         .append('div')      // Click for "No Right Turn"
64420                         .text(t('restriction.help.toggle', { turn: nextText.trim() }));
64421                 }
64422
64423                 highlightPathsFrom(null);
64424                 var alongIDs = datum.path.slice();
64425                 surface.selectAll(utilEntitySelector(alongIDs))
64426                     .classed('related', true)
64427                     .classed('allow', (klass === 'allow'))
64428                     .classed('restrict', (klass === 'restrict'))
64429                     .classed('only', (klass === 'only'));
64430
64431
64432             // Hovering empty surface
64433             } else {
64434                 highlightPathsFrom(null);
64435                 if (_fromWayID) {
64436                     help
64437                         .append('div')      // "FROM {fromName}"
64438                         .html(t('restriction.help.from_name', {
64439                             from: placeholders.from,
64440                             fromName: displayName(_fromWayID, vgraph)
64441                         }));
64442
64443                 } else {
64444                     help
64445                         .append('div')      // "Click to select a FROM segment."
64446                         .html(t('restriction.help.select_from', {
64447                             from: placeholders.from
64448                         }));
64449                 }
64450             }
64451         }
64452     }
64453
64454
64455     function displayMaxDistance(maxDist) {
64456         var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
64457         var opts;
64458
64459         if (isImperial) {
64460             var distToFeet = {   // imprecise conversion for prettier display
64461                 20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
64462             }[maxDist];
64463             opts = { distance: t('units.feet', { quantity: distToFeet }) };
64464         } else {
64465             opts = { distance: t('units.meters', { quantity: maxDist }) };
64466         }
64467
64468         return t('restriction.controls.distance_up_to', opts);
64469     }
64470
64471
64472     function displayMaxVia(maxVia) {
64473         return maxVia === 0 ? t('restriction.controls.via_node_only')
64474             : maxVia === 1 ? t('restriction.controls.via_up_to_one')
64475             : t('restriction.controls.via_up_to_two');
64476     }
64477
64478
64479     function displayName(entityID, graph) {
64480         var entity = graph.entity(entityID);
64481         var name = utilDisplayName(entity) || '';
64482         var matched = context.presets().match(entity, graph);
64483         var type = (matched && matched.name()) || utilDisplayType(entity.id);
64484         return name || type;
64485     }
64486
64487
64488     restrictions.entity = function(_) {
64489         _intersection = null;
64490         _fromWayID = null;
64491         _oldTurns = null;
64492         _vertexID = _.id;
64493     };
64494
64495
64496     restrictions.tags = function() {};
64497     restrictions.focus = function() {};
64498
64499
64500     restrictions.off = function(selection$$1) {
64501         if (!_initialized) return;
64502
64503         selection$$1.selectAll('.surface')
64504             .call(breathe.off)
64505             .on('click.restrictions', null)
64506             .on('mouseover.restrictions', null);
64507
64508         d3_select(window)
64509             .on('resize.restrictions', null);
64510     };
64511
64512
64513     return utilRebind(restrictions, dispatch$$1, 'on');
64514 }
64515
64516 function uiFieldTextarea(field) {
64517     var dispatch$$1 = dispatch('change'),
64518         input = d3_select(null);
64519
64520
64521     function textarea(selection$$1) {
64522         input = selection$$1.selectAll('textarea')
64523             .data([0]);
64524
64525         input = input.enter()
64526             .append('textarea')
64527             .attr('id', 'preset-input-' + field.id)
64528             .attr('placeholder', field.placeholder() || t('inspector.unknown'))
64529             .attr('maxlength', 255)
64530             .call(utilNoAuto)
64531             .on('input', change(true))
64532             .on('blur', change())
64533             .on('change', change())
64534             .merge(input);
64535     }
64536
64537
64538     function change(onInput) {
64539         return function() {
64540             var t$$1 = {};
64541             t$$1[field.key] = utilGetSetValue(input) || undefined;
64542             dispatch$$1.call('change', this, t$$1, onInput);
64543         };
64544     }
64545
64546
64547     textarea.tags = function(tags) {
64548         utilGetSetValue(input, tags[field.key] || '');
64549     };
64550
64551
64552     textarea.focus = function() {
64553         input.node().focus();
64554     };
64555
64556
64557     return utilRebind(textarea, dispatch$$1, 'on');
64558 }
64559
64560 function uiFieldWikipedia(field, context) {
64561     var dispatch$$1 = dispatch('change'),
64562         wikipedia = services.wikipedia,
64563         wikidata = services.wikidata,
64564         link = d3_select(null),
64565         lang = d3_select(null),
64566         title = d3_select(null),
64567         wikiURL = '',
64568         entity;
64569
64570
64571     function wiki(selection$$1) {
64572         var langcombo = d3combobox()
64573             .container(context.container())
64574             .fetcher(function(value, cb) {
64575                 var v = value.toLowerCase();
64576
64577                 cb(wikipedia$2.filter(function(d) {
64578                     return d[0].toLowerCase().indexOf(v) >= 0 ||
64579                         d[1].toLowerCase().indexOf(v) >= 0 ||
64580                         d[2].toLowerCase().indexOf(v) >= 0;
64581                 }).map(function(d) {
64582                     return { value: d[1] };
64583                 }));
64584             });
64585
64586         var titlecombo = d3combobox()
64587             .container(context.container())
64588             .fetcher(function(value, cb) {
64589                 if (!value) {
64590                     value = context.entity(entity.id).tags.name || '';
64591                 }
64592
64593                 var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
64594                 searchfn(language()[2], value, function(query, data$$1) {
64595                     cb(data$$1.map(function(d) {
64596                         return { value: d };
64597                     }));
64598                 });
64599             });
64600
64601
64602         lang = selection$$1.selectAll('input.wiki-lang')
64603             .data([0]);
64604
64605         lang = lang.enter()
64606             .append('input')
64607             .attr('type', 'text')
64608             .attr('class', 'wiki-lang')
64609             .attr('placeholder', t('translate.localized_translation_language'))
64610             .call(utilNoAuto)
64611             .merge(lang);
64612
64613         utilGetSetValue(lang, language()[1]);
64614
64615         lang
64616             .call(langcombo)
64617             .on('blur', changeLang)
64618             .on('change', changeLang);
64619
64620
64621         title = selection$$1.selectAll('input.wiki-title')
64622             .data([0]);
64623
64624         title = title.enter()
64625             .append('input')
64626             .attr('type', 'text')
64627             .attr('class', 'wiki-title')
64628             .attr('id', 'preset-input-' + field.id)
64629             .call(utilNoAuto)
64630             .merge(title);
64631
64632         title
64633             .call(titlecombo)
64634             .on('blur', blur)
64635             .on('change', change);
64636
64637
64638         link = selection$$1.selectAll('.wiki-link')
64639             .data([0]);
64640
64641         link = link.enter()
64642             .append('button')
64643             .attr('class', 'button-input-action wiki-link minor')
64644             .attr('tabindex', -1)
64645             .call(svgIcon('#icon-out-link'))
64646             .merge(link);
64647
64648         link
64649             .on('click', function() {
64650                 event.preventDefault();
64651                 if (wikiURL) window.open(wikiURL, '_blank');
64652             });
64653     }
64654
64655
64656     function language() {
64657         var value = utilGetSetValue(lang).toLowerCase();
64658         var locale = utilDetect().locale.toLowerCase();
64659         var localeLanguage;
64660         return find$1(wikipedia$2, function(d) {
64661             if (d[2] === locale) localeLanguage = d;
64662             return d[0].toLowerCase() === value ||
64663                 d[1].toLowerCase() === value ||
64664                 d[2] === value;
64665         }) || localeLanguage || ['English', 'English', 'en'];
64666     }
64667
64668
64669     function changeLang() {
64670         utilGetSetValue(lang, language()[1]);
64671         change(true);
64672     }
64673
64674
64675     function blur() {
64676         change(true);
64677     }
64678
64679
64680     function change(skipWikidata) {
64681         var value = utilGetSetValue(title),
64682             m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
64683             l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
64684             syncTags = {};
64685
64686         if (l) {
64687             // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
64688             value = decodeURIComponent(m[2]).replace(/_/g, ' ');
64689             if (m[3]) {
64690                 var anchor;
64691                 try {
64692                     // Best-effort `anchordecode:` implementation
64693                     anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
64694                 } catch (e) {
64695                     anchor = decodeURIComponent(m[3]);
64696                 }
64697                 value += '#' + anchor.replace(/_/g, ' ');
64698             }
64699             value = value.slice(0, 1).toUpperCase() + value.slice(1);
64700             utilGetSetValue(lang, l[1]);
64701             utilGetSetValue(title, value);
64702         }
64703
64704         if (value) {
64705             syncTags.wikipedia = language()[2] + ':' + value;
64706         } else {
64707             syncTags.wikipedia = undefined;
64708             syncTags.wikidata = undefined;
64709         }
64710
64711         dispatch$$1.call('change', this, syncTags);
64712
64713
64714         if (skipWikidata || !value || !language()[2]) return;
64715
64716         // attempt asynchronous update of wikidata tag..
64717         var initGraph = context.graph(),
64718             initEntityId = entity.id;
64719
64720         wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
64721             // If graph has changed, we can't apply this update.
64722             if (context.graph() !== initGraph) return;
64723
64724             if (!data$$1 || !Object.keys(data$$1).length) return;
64725
64726             var qids = Object.keys(data$$1);
64727             var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
64728             var currTags = clone(context.entity(initEntityId).tags);
64729
64730             currTags.wikidata = value;
64731
64732             // Coalesce the update of wikidata tag into the previous tag change
64733             context.overwrite(
64734                 actionChangeTags(initEntityId, currTags),
64735                 context.history().undoAnnotation()
64736             );
64737
64738             // do not dispatch.call('change') here, because entity_editor
64739             // changeTags() is not intended to be called asynchronously
64740         });
64741     }
64742
64743
64744     wiki.tags = function(tags) {
64745         var value = tags[field.key] || '',
64746             m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
64747             l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
64748             anchor = m && m[3];
64749
64750         // value in correct format
64751         if (l) {
64752             utilGetSetValue(lang, l[1]);
64753             utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
64754             if (anchor) {
64755                 try {
64756                     // Best-effort `anchorencode:` implementation
64757                     anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
64758                 } catch (e) {
64759                     anchor = anchor.replace(/ /g, '_');
64760                 }
64761             }
64762             wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
64763                 m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
64764
64765         // unrecognized value format
64766         } else {
64767             utilGetSetValue(title, value);
64768             if (value && value !== '') {
64769                 utilGetSetValue(lang, '');
64770                 wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
64771             } else {
64772                 wikiURL = '';
64773             }
64774         }
64775     };
64776
64777
64778     wiki.entity = function(_) {
64779         if (!arguments.length) return entity;
64780         entity = _;
64781         return wiki;
64782     };
64783
64784
64785     wiki.focus = function() {
64786         title.node().focus();
64787     };
64788
64789
64790     return utilRebind(wiki, dispatch$$1, 'on');
64791 }
64792
64793 var uiFields = {
64794     access: uiFieldAccess,
64795     address: uiFieldAddress,
64796     check: uiFieldCheck,
64797     combo: uiFieldCombo,
64798     cycleway: uiFieldCycleway,
64799     defaultCheck: uiFieldCheck,
64800     email: uiFieldText,
64801     lanes: uiFieldLanes,
64802     localized: uiFieldLocalized,
64803     maxspeed: uiFieldMaxspeed,
64804     multiCombo: uiFieldCombo,
64805     networkCombo: uiFieldCombo,
64806     number: uiFieldText,
64807     onewayCheck: uiFieldCheck,
64808     radio: uiFieldRadio,
64809     restrictions: uiFieldRestrictions,
64810     semiCombo: uiFieldCombo,
64811     structureRadio: uiFieldRadio,
64812     tel: uiFieldText,
64813     text: uiFieldText,
64814     textarea: uiFieldTextarea,
64815     typeCombo: uiFieldCombo,
64816     url: uiFieldText,
64817     wikipedia: uiFieldWikipedia
64818 };
64819
64820 function uiField(context, presetField, entity, options) {
64821     options = assignIn({
64822         show: true,
64823         wrap: true,
64824         remove: true,
64825         revert: true,
64826         info: true
64827     }, options);
64828
64829     var dispatch$$1 = dispatch('change');
64830     var field = clone(presetField);
64831     var _show = options.show;
64832     var _state = '';
64833     var _tags = {};
64834
64835
64836     field.impl = uiFields[field.type](field, context)
64837         .on('change', function(t$$1, onInput) {
64838             dispatch$$1.call('change', field, t$$1, onInput);
64839         });
64840
64841     if (entity && field.impl.entity) {
64842         field.impl.entity(entity);
64843     }
64844
64845     field.keys = field.keys || [field.key];
64846
64847
64848     function isModified() {
64849         if (!entity) return false;
64850         var original = context.graph().base().entities[entity.id];
64851         return some(field.keys, function(key) {
64852             return original ? _tags[key] !== original.tags[key] : _tags[key];
64853         });
64854     }
64855
64856
64857     function isPresent() {
64858         return some(field.keys, function(key) {
64859             return _tags[key];
64860         });
64861     }
64862
64863
64864     function revert(d) {
64865         event.stopPropagation();
64866         event.preventDefault();
64867         if (!entity) return false;
64868
64869         var original = context.graph().base().entities[entity.id];
64870         var t$$1 = {};
64871         d.keys.forEach(function(key) {
64872             t$$1[key] = original ? original.tags[key] : undefined;
64873         });
64874
64875         dispatch$$1.call('change', d, t$$1);
64876     }
64877
64878
64879     function remove(d) {
64880         event.stopPropagation();
64881         event.preventDefault();
64882
64883         var t$$1 = {};
64884         d.keys.forEach(function(key) {
64885             t$$1[key] = undefined;
64886         });
64887
64888         dispatch$$1.call('change', d, t$$1);
64889     }
64890
64891
64892     field.render = function(selection$$1) {
64893         var container = selection$$1.selectAll('.form-field')
64894             .data([field]);
64895
64896         // Enter
64897         var enter = container.enter()
64898             .append('div')
64899             .attr('class', function(d) { return 'form-field form-field-' + d.id; })
64900             .classed('nowrap', !options.wrap);
64901
64902         if (options.wrap) {
64903             var label = enter
64904                 .append('label')
64905                 .attr('class', 'form-label')
64906                 .attr('for', function(d) { return 'preset-input-' + d.id; })
64907                 .text(function(d) { return d.label(); });
64908
64909             var wrap = label
64910                 .append('div')
64911                 .attr('class', 'form-label-button-wrap');
64912
64913             if (options.remove) {
64914                 wrap
64915                     .append('button')
64916                     .attr('class', 'remove-icon')
64917                     .attr('tabindex', -1)
64918                     .call(svgIcon('#operation-delete'));
64919             }
64920
64921             if (options.revert) {
64922                 wrap
64923                     .append('button')
64924                     .attr('class', 'modified-icon')
64925                     .attr('tabindex', -1)
64926                     .call(
64927                         (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
64928                     );
64929             }
64930         }
64931
64932
64933         // Update
64934         container = container
64935             .merge(enter);
64936
64937         container.selectAll('.form-label-button-wrap .remove-icon')
64938             .on('click', remove);
64939
64940         container.selectAll('.form-label-button-wrap .modified-icon')
64941             .on('click', revert);
64942
64943         container
64944             .classed('modified', isModified())
64945             .classed('present', isPresent())
64946             .each(function(d) {
64947                 var reference, help;
64948
64949                 // instantiate field help
64950                 if (options.wrap && field.type === 'restrictions') {
64951                     help = uiFieldHelp(context, 'restrictions');
64952                 }
64953
64954                 // instantiate tag reference
64955                 if (options.wrap && options.info) {
64956                     var referenceKey = d.key;
64957                     if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
64958                         referenceKey = referenceKey.replace(/:$/, '');
64959                     }
64960
64961                     reference = uiTagReference(d.reference || { key: referenceKey }, context);
64962                     if (_state === 'hover') {
64963                         reference.showing(false);
64964                     }
64965                 }
64966
64967                 d3_select(this)
64968                     .call(d.impl);
64969
64970                 // add field help components
64971                 if (help) {
64972                     d3_select(this)
64973                         .call(help.body)
64974                         .select('.form-label-button-wrap')
64975                         .call(help.button);
64976                 }
64977
64978                 // add tag reference components
64979                 if (reference) {
64980                     d3_select(this)
64981                         .call(reference.body)
64982                         .select('.form-label-button-wrap')
64983                         .call(reference.button);
64984                 }
64985
64986                 d.impl.tags(_tags);
64987             });
64988     };
64989
64990
64991     field.state = function(_) {
64992         if (!arguments.length) return _state;
64993         _state = _;
64994         return field;
64995     };
64996
64997
64998     field.tags = function(_) {
64999         if (!arguments.length) return _tags;
65000         _tags = _;
65001         return field;
65002     };
65003
65004
65005     field.show = function() {
65006         _show = true;
65007         if (field.default && field.key && _tags[field.key] !== field.default) {
65008             var t$$1 = {};
65009             t$$1[field.key] = field.default;
65010             dispatch$$1.call('change', this, t$$1);
65011         }
65012     };
65013
65014
65015     field.isShown = function() {
65016         return _show || some(field.keys, function(key) { return !!_tags[key]; });
65017     };
65018
65019
65020     field.focus = function() {
65021         field.impl.focus();
65022     };
65023
65024
65025     return utilRebind(field, dispatch$$1, 'on');
65026 }
65027
65028 function uiFormFields(context) {
65029     var fieldsArr;
65030
65031
65032     function formFields(selection$$1, klass) {
65033         render(selection$$1, klass);
65034     }
65035
65036
65037     function render(selection$$1, klass) {
65038
65039         var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
65040             notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
65041
65042         var container = selection$$1.selectAll('.form-fields-container')
65043             .data([0]);
65044
65045         container = container.enter()
65046             .append('div')
65047             .attr('class', 'form-fields-container ' + (klass || ''))
65048             .merge(container);
65049
65050
65051         var fields = container.selectAll('.wrap-form-field')
65052             .data(shown, function(d) { return d.id; });
65053
65054         fields.exit()
65055             .remove();
65056
65057         // Enter
65058         var enter = fields.enter()
65059             .append('div')
65060             .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.id; });
65061
65062         // Update
65063         fields = fields
65064             .merge(enter);
65065
65066         fields
65067             .order()
65068             .each(function(d) {
65069                 d3_select(this)
65070                     .call(d.render);
65071             });
65072
65073
65074         notShown = notShown.map(function(field) {
65075             return {
65076                 title: field.label(),
65077                 value: field.label(),
65078                 field: field
65079             };
65080         });
65081
65082
65083         var more = selection$$1.selectAll('.more-fields')
65084             .data((notShown.length > 0) ? [0] : []);
65085
65086         more.exit()
65087             .remove();
65088
65089         more = more.enter()
65090             .append('div')
65091             .attr('class', 'more-fields')
65092             .append('label')
65093             .text(t('inspector.add_fields'))
65094             .merge(more);
65095
65096
65097         var input = more.selectAll('.value')
65098             .data([0]);
65099
65100         input.exit()
65101             .remove();
65102
65103         input = input.enter()
65104             .append('input')
65105             .attr('class', 'value')
65106             .attr('type', 'text')
65107             .call(utilNoAuto)
65108             .merge(input);
65109
65110         input
65111             .call(utilGetSetValue, '')
65112             .attr('placeholder', function() {
65113                 var placeholder = [];
65114                 for (var field in notShown) {
65115                     placeholder.push(notShown[field].title);
65116                 }
65117                 return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
65118             })
65119             .call(d3combobox()
65120                 .container(context.container())
65121                 .data(notShown)
65122                 .minItems(1)
65123                 .on('accept', function (d) {
65124                     var field = d.field;
65125                     field.show();
65126                     render(selection$$1);
65127                     if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
65128                         field.focus();
65129                     }
65130                 })
65131             );
65132     }
65133
65134
65135     formFields.fieldsArr = function(_) {
65136         if (!arguments.length) return fieldsArr;
65137         fieldsArr = _;
65138         return formFields;
65139     };
65140
65141
65142     return formFields;
65143 }
65144
65145 function uiPresetEditor(context) {
65146     var dispatch$$1 = dispatch('change'),
65147         formFields = uiFormFields(context),
65148         state,
65149         fieldsArr,
65150         preset,
65151         tags,
65152         entityId;
65153
65154
65155     function presetEditor(selection$$1) {
65156         selection$$1.call(uiDisclosure(context, 'preset_fields', true)
65157             .title(t('inspector.all_fields'))
65158             .content(render)
65159         );
65160     }
65161
65162
65163     function render(selection$$1) {
65164         if (!fieldsArr) {
65165             var entity = context.entity(entityId),
65166                 geometry = context.geometry(entityId),
65167                 presets = context.presets();
65168
65169             fieldsArr = [];
65170
65171             preset.fields.forEach(function(field) {
65172                 if (field.matchGeometry(geometry)) {
65173                     fieldsArr.push(
65174                         uiField(context, field, entity)
65175                     );
65176                 }
65177             });
65178
65179             if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
65180                 fieldsArr.push(
65181                     uiField(context, presets.field('restrictions'), entity)
65182                 );
65183             }
65184
65185             presets.universal().forEach(function(field) {
65186                 if (preset.fields.indexOf(field) === -1) {
65187                     fieldsArr.push(
65188                         uiField(context, field, entity, { show: false })
65189                     );
65190                 }
65191             });
65192
65193             fieldsArr.forEach(function(field) {
65194                 field
65195                     .on('change', function(t$$1, onInput) {
65196                         dispatch$$1.call('change', field, t$$1, onInput);
65197                     });
65198             });
65199         }
65200
65201         fieldsArr.forEach(function(field) {
65202             field
65203                 .state(state)
65204                 .tags(tags);
65205         });
65206
65207
65208         selection$$1
65209             .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
65210
65211
65212         selection$$1.selectAll('.wrap-form-field input')
65213             .on('keydown', function() {
65214                 // if user presses enter, and combobox is not active, accept edits..
65215                 if (event.keyCode === 13 && d3_select('.combobox').empty()) {
65216                     context.enter(modeBrowse(context));
65217                 }
65218             });
65219     }
65220
65221
65222     presetEditor.preset = function(_) {
65223         if (!arguments.length) return preset;
65224         if (preset && preset.id === _.id) return presetEditor;
65225         preset = _;
65226         fieldsArr = null;
65227         return presetEditor;
65228     };
65229
65230
65231     presetEditor.state = function(_) {
65232         if (!arguments.length) return state;
65233         state = _;
65234         return presetEditor;
65235     };
65236
65237
65238     presetEditor.tags = function(_) {
65239         if (!arguments.length) return tags;
65240         tags = _;
65241         // Don't reset fieldsArr here.
65242         return presetEditor;
65243     };
65244
65245
65246     presetEditor.entityID = function(_) {
65247         if (!arguments.length) return entityId;
65248         if (entityId === _) return presetEditor;
65249         entityId = _;
65250         fieldsArr = null;
65251         return presetEditor;
65252     };
65253
65254
65255     return utilRebind(presetEditor, dispatch$$1, 'on');
65256 }
65257
65258 function uiEntityEditor(context) {
65259     var dispatch$$1 = dispatch('choose'),
65260         state = 'select',
65261         coalesceChanges = false,
65262         modified = false,
65263         base,
65264         entityId,
65265         activePreset,
65266         reference;
65267
65268     var presetEditor = uiPresetEditor(context)
65269         .on('change', changeTags);
65270     var rawTagEditor = uiRawTagEditor(context)
65271         .on('change', changeTags);
65272
65273
65274     function entityEditor(selection$$1) {
65275         var entity = context.entity(entityId),
65276             tags = clone(entity.tags);
65277
65278         // Header
65279         var header = selection$$1.selectAll('.header')
65280             .data([0]);
65281
65282         // Enter
65283         var enter = header.enter()
65284             .append('div')
65285             .attr('class', 'header fillL cf');
65286
65287         enter
65288             .append('button')
65289             .attr('class', 'fl preset-reset preset-choose')
65290             .call(svgIcon((textDirection === 'rtl') ? '#icon-forward' : '#icon-backward'));
65291
65292         enter
65293             .append('button')
65294             .attr('class', 'fr preset-close')
65295             .on('click', function() { context.enter(modeBrowse(context)); })
65296             .call(svgIcon(modified ? '#icon-apply' : '#icon-close'));
65297
65298         enter
65299             .append('h3')
65300             .text(t('inspector.edit'));
65301
65302         // Update
65303         header = header
65304             .merge(enter);
65305
65306         header.selectAll('.preset-reset')
65307             .on('click', function() {
65308                 dispatch$$1.call('choose', this, activePreset);
65309             });
65310
65311
65312         // Body
65313         var body = selection$$1.selectAll('.inspector-body')
65314             .data([0]);
65315
65316         // Enter
65317         enter = body.enter()
65318             .append('div')
65319             .attr('class', 'inspector-body');
65320
65321         enter
65322             .append('div')
65323             .attr('class', 'preset-list-item inspector-inner')
65324             .append('div')
65325             .attr('class', 'preset-list-button-wrap')
65326             .append('button')
65327             .attr('class', 'preset-list-button preset-reset')
65328             .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
65329             .append('div')
65330             .attr('class', 'label');
65331
65332         enter
65333             .append('div')
65334             .attr('class', 'inspector-border preset-editor');
65335
65336         enter
65337             .append('div')
65338             .attr('class', 'inspector-border raw-tag-editor inspector-inner');
65339
65340         enter
65341             .append('div')
65342             .attr('class', 'inspector-border raw-member-editor inspector-inner');
65343
65344         enter
65345             .append('div')
65346             .attr('class', 'raw-membership-editor inspector-inner');
65347
65348         enter
65349             .append('input')
65350             .attr('type', 'text')
65351             .attr('class', 'key-trap');
65352
65353
65354         // Update
65355         body = body
65356             .merge(enter);
65357
65358         body.selectAll('.preset-list-button-wrap')
65359             .call(reference.button);
65360
65361         body.selectAll('.preset-list-item')
65362             .call(reference.body);
65363
65364         body.selectAll('.preset-reset')
65365             .on('click', function() {
65366                 dispatch$$1.call('choose', this, activePreset);
65367             });
65368
65369         body.select('.preset-list-item button')
65370             .call(uiPresetIcon()
65371                 .geometry(context.geometry(entityId))
65372                 .preset(activePreset)
65373             );
65374
65375         body.select('.preset-list-item .label')
65376             .text(activePreset.name());
65377
65378         body.select('.preset-editor')
65379             .call(presetEditor
65380                 .preset(activePreset)
65381                 .entityID(entityId)
65382                 .tags(tags)
65383                 .state(state)
65384             );
65385
65386         body.select('.raw-tag-editor')
65387             .call(rawTagEditor
65388                 .preset(activePreset)
65389                 .entityID(entityId)
65390                 .tags(tags)
65391                 .state(state)
65392             );
65393
65394         if (entity.type === 'relation') {
65395             body.select('.raw-member-editor')
65396                 .style('display', 'block')
65397                 .call(uiRawMemberEditor(context)
65398                     .entityID(entityId)
65399                 );
65400         } else {
65401             body.select('.raw-member-editor')
65402                 .style('display', 'none');
65403         }
65404
65405         body.select('.raw-membership-editor')
65406             .call(uiRawMembershipEditor(context)
65407                 .entityID(entityId)
65408             );
65409
65410         body.select('.key-trap')
65411             .on('keydown.key-trap', function() {
65412                 // On tabbing, send focus back to the first field on the inspector-body
65413                 // (probably the `name` field) #4159
65414                 if (event.keyCode === 9 && !event.shiftKey) {
65415                     event.preventDefault();
65416                     body.select('input').node().focus();
65417                 }
65418             });
65419
65420         context.history()
65421             .on('change.entity-editor', historyChanged);
65422
65423
65424         function historyChanged() {
65425             if (state === 'hide') return;
65426
65427             var entity = context.hasEntity(entityId);
65428             var graph = context.graph();
65429             if (!entity) return;
65430
65431             var match = context.presets().match(entity, graph);
65432             var activePreset = entityEditor.preset();
65433             var weakPreset = activePreset && isEmpty(activePreset.addTags);
65434
65435             // A "weak" preset doesn't set any tags. (e.g. "Address")
65436             // Don't replace a weak preset with a fallback preset (e.g. "Point")
65437             if (!(weakPreset && match.isFallback())) {
65438                 entityEditor.preset(match);
65439             }
65440             entityEditor.modified(base !== graph);
65441             entityEditor(selection$$1);
65442         }
65443     }
65444
65445
65446     function clean(o) {
65447
65448         function cleanVal(k, v) {
65449             function keepSpaces(k) {
65450                 return k.match(/_hours|_times/) !== null;
65451             }
65452
65453             var blacklist = ['description', 'note', 'fixme'];
65454             if (some(blacklist, function(s) { return k.indexOf(s) !== -1; })) return v;
65455
65456             var cleaned = v.split(';')
65457                 .map(function(s) { return s.trim(); })
65458                 .join(keepSpaces(k) ? '; ' : ';');
65459
65460             // The code below is not intended to validate websites and emails.
65461             // It is only intended to prevent obvious copy-paste errors. (#2323)
65462             // clean website- and email-like tags
65463             if (k.indexOf('website') !== -1 ||
65464                 k.indexOf('email') !== -1 ||
65465                 cleaned.indexOf('http') === 0) {
65466                 cleaned = cleaned
65467                     .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
65468
65469             }
65470
65471             return cleaned;
65472         }
65473
65474         var out = {}, k, v;
65475         for (k in o) {
65476             if (k && (v = o[k]) !== undefined) {
65477                 out[k] = cleanVal(k, v);
65478             }
65479         }
65480         return out;
65481     }
65482
65483
65484     // Tag changes that fire on input can all get coalesced into a single
65485     // history operation when the user leaves the field.  #2342
65486     function changeTags(changed, onInput) {
65487         var entity = context.entity(entityId),
65488             annotation = t('operations.change_tags.annotation'),
65489             tags = clone(entity.tags);
65490
65491         forEach(changed, function(v, k) {
65492             if (v !== undefined || tags.hasOwnProperty(k)) {
65493                 tags[k] = v;
65494             }
65495         });
65496
65497         if (!onInput) {
65498             tags = clean(tags);
65499         }
65500
65501         if (!isEqual(entity.tags, tags)) {
65502             if (coalesceChanges) {
65503                 context.overwrite(actionChangeTags(entityId, tags), annotation);
65504             } else {
65505                 context.perform(actionChangeTags(entityId, tags), annotation);
65506                 coalesceChanges = !!onInput;
65507             }
65508         }
65509     }
65510
65511
65512     entityEditor.modified = function(_) {
65513         if (!arguments.length) return modified;
65514         modified = _;
65515         d3_selectAll('button.preset-close use')
65516             .attr('xlink:href', (modified ? '#icon-apply' : '#icon-close'));
65517     };
65518
65519
65520     entityEditor.state = function(_) {
65521         if (!arguments.length) return state;
65522         state = _;
65523         return entityEditor;
65524     };
65525
65526
65527     entityEditor.entityID = function(_) {
65528         if (!arguments.length) return entityId;
65529         entityId = _;
65530         base = context.graph();
65531         entityEditor.preset(context.presets().match(context.entity(entityId), base));
65532         entityEditor.modified(false);
65533         coalesceChanges = false;
65534         return entityEditor;
65535     };
65536
65537
65538     entityEditor.preset = function(_) {
65539         if (!arguments.length) return activePreset;
65540         if (_ !== activePreset) {
65541             activePreset = _;
65542             reference = uiTagReference(activePreset.reference(context.geometry(entityId)), context)
65543                 .showing(false);
65544         }
65545         return entityEditor;
65546     };
65547
65548
65549     return utilRebind(entityEditor, dispatch$$1, 'on');
65550 }
65551
65552 function uiPresetList(context) {
65553     var dispatch$$1 = dispatch('choose'),
65554         id,
65555         currentPreset,
65556         autofocus = false;
65557
65558
65559     function presetList(selection$$1) {
65560         var entity = context.entity(id),
65561             geometry = context.geometry(id);
65562
65563         // Treat entities on addr:interpolation lines as points, not vertices (#3241)
65564         if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
65565             geometry = 'point';
65566         }
65567
65568         var presets = context.presets().matchGeometry(geometry);
65569
65570         selection$$1.html('');
65571
65572         var messagewrap = selection$$1
65573             .append('div')
65574             .attr('class', 'header fillL cf');
65575
65576         var message = messagewrap
65577             .append('h3')
65578             .text(t('inspector.choose'));
65579
65580         if (context.entity(id).isUsed(context.graph())) {
65581             messagewrap
65582                 .append('button')
65583                 .attr('class', 'preset-choose')
65584                 .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
65585                 .call(svgIcon((textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'));
65586         } else {
65587             messagewrap
65588                 .append('button')
65589                 .attr('class', 'close')
65590                 .on('click', function() {
65591                     context.enter(modeBrowse(context));
65592                 })
65593                 .call(svgIcon('#icon-close'));
65594         }
65595
65596         function keydown() {
65597             // hack to let delete shortcut work when search is autofocused
65598             if (search.property('value').length === 0 &&
65599                 (event.keyCode === d3keybinding.keyCodes['⌫'] ||
65600                  event.keyCode === d3keybinding.keyCodes['⌦'])) {
65601                 event.preventDefault();
65602                 event.stopPropagation();
65603                 operationDelete([id], context)();
65604             } else if (search.property('value').length === 0 &&
65605                 (event.ctrlKey || event.metaKey) &&
65606                 event.keyCode === d3keybinding.keyCodes.z) {
65607                 event.preventDefault();
65608                 event.stopPropagation();
65609                 context.undo();
65610             } else if (!event.ctrlKey && !event.metaKey) {
65611                 d3_select(this).on('keydown', null);
65612             }
65613         }
65614
65615         function keypress() {
65616             // enter
65617             var value = search.property('value');
65618             if (event.keyCode === 13 && value.length) {
65619                 list.selectAll('.preset-list-item:first-child').datum().choose();
65620             }
65621         }
65622
65623         function inputevent() {
65624             var value = search.property('value');
65625             list.classed('filtered', value.length);
65626             if (value.length) {
65627                 var results = presets.search(value, geometry);
65628                 message.text(t('inspector.results', {
65629                     n: results.collection.length,
65630                     search: value
65631                 }));
65632                 list.call(drawList, results);
65633             } else {
65634                 list.call(drawList, context.presets().defaults(geometry, 36));
65635                 message.text(t('inspector.choose'));
65636             }
65637         }
65638
65639         var searchWrap = selection$$1
65640             .append('div')
65641             .attr('class', 'search-header');
65642
65643         var search = searchWrap
65644             .append('input')
65645             .attr('class', 'preset-search-input')
65646             .attr('placeholder', t('inspector.search'))
65647             .attr('type', 'search')
65648             .call(utilNoAuto)
65649             .on('keydown', keydown)
65650             .on('keypress', keypress)
65651             .on('input', inputevent);
65652
65653         searchWrap
65654             .call(svgIcon('#icon-search', 'pre-text'));
65655
65656         if (autofocus) {
65657             search.node().focus();
65658         }
65659
65660         var listWrap = selection$$1
65661             .append('div')
65662             .attr('class', 'inspector-body');
65663
65664         var list = listWrap
65665             .append('div')
65666             .attr('class', 'preset-list fillL cf')
65667             .call(drawList, context.presets().defaults(geometry, 36));
65668     }
65669
65670
65671     function drawList(list, presets) {
65672         var collection = presets.collection.map(function(preset) {
65673             return preset.members ? CategoryItem(preset) : PresetItem(preset);
65674         });
65675
65676         var items = list.selectAll('.preset-list-item')
65677             .data(collection, function(d) { return d.preset.id; });
65678
65679         items.order();
65680
65681         items.exit()
65682             .remove();
65683
65684         items.enter()
65685             .append('div')
65686             .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
65687             .classed('current', function(item) { return item.preset === currentPreset; })
65688             .each(function(item) { d3_select(this).call(item); })
65689             .style('opacity', 0)
65690             .transition()
65691             .style('opacity', 1);
65692     }
65693
65694
65695     function CategoryItem(preset) {
65696         var box, sublist, shown = false;
65697
65698         function item(selection$$1) {
65699             var wrap = selection$$1.append('div')
65700                 .attr('class', 'preset-list-button-wrap category col12');
65701
65702             var button = wrap
65703                 .append('button')
65704                 .attr('class', 'preset-list-button')
65705                 .classed('expanded', false)
65706                 .call(uiPresetIcon()
65707                     .geometry(context.geometry(id))
65708                     .preset(preset))
65709                 .on('click', function() {
65710                     var isExpanded = d3_select(this).classed('expanded');
65711                     var iconName = isExpanded ?
65712                         (textDirection === 'rtl' ? '#icon-backward' : '#icon-forward') : '#icon-down';
65713                     d3_select(this)
65714                         .classed('expanded', !isExpanded);
65715                     d3_select(this).selectAll('div.label svg.icon use')
65716                         .attr('href', iconName);
65717                     item.choose();
65718                 });
65719
65720             var label = button
65721                 .append('div')
65722                 .attr('class', 'label');
65723
65724             label
65725                 .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'))
65726                 .append('span')
65727                 .html(function() { return preset.name() + '&hellip;'; });
65728
65729             box = selection$$1.append('div')
65730                 .attr('class', 'subgrid col12')
65731                 .style('max-height', '0px')
65732                 .style('opacity', 0);
65733
65734             box.append('div')
65735                 .attr('class', 'arrow');
65736
65737             sublist = box.append('div')
65738                 .attr('class', 'preset-list fillL3 cf fl');
65739         }
65740
65741
65742         item.choose = function() {
65743             if (!box || !sublist) return;
65744
65745             if (shown) {
65746                 shown = false;
65747                 box.transition()
65748                     .duration(200)
65749                     .style('opacity', '0')
65750                     .style('max-height', '0px')
65751                     .style('padding-bottom', '0px');
65752             } else {
65753                 shown = true;
65754                 sublist.call(drawList, preset.members);
65755                 box.transition()
65756                     .duration(200)
65757                     .style('opacity', '1')
65758                     .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
65759                     .style('padding-bottom', '20px');
65760             }
65761         };
65762
65763         item.preset = preset;
65764
65765         return item;
65766     }
65767
65768
65769     function PresetItem(preset) {
65770         function item(selection$$1) {
65771             var wrap = selection$$1.append('div')
65772                 .attr('class', 'preset-list-button-wrap col12');
65773
65774             wrap.append('button')
65775                 .attr('class', 'preset-list-button')
65776                 .call(uiPresetIcon()
65777                     .geometry(context.geometry(id))
65778                     .preset(preset))
65779                 .on('click', item.choose)
65780                 .append('div')
65781                 .attr('class', 'label')
65782                 .text(preset.name());
65783
65784             wrap.call(item.reference.button);
65785             selection$$1.call(item.reference.body);
65786         }
65787
65788         item.choose = function() {
65789             context.presets().choose(preset);
65790
65791             context.perform(
65792                 actionChangePreset(id, currentPreset, preset),
65793                 t('operations.change_tags.annotation')
65794             );
65795
65796             dispatch$$1.call('choose', this, preset);
65797         };
65798
65799         item.help = function() {
65800             event.stopPropagation();
65801             item.reference.toggle();
65802         };
65803
65804         item.preset = preset;
65805         item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
65806
65807         return item;
65808     }
65809
65810
65811     presetList.autofocus = function(_) {
65812         if (!arguments.length) return autofocus;
65813         autofocus = _;
65814         return presetList;
65815     };
65816
65817
65818     presetList.entityID = function(_) {
65819         if (!arguments.length) return id;
65820         id = _;
65821         presetList.preset(context.presets().match(context.entity(id), context.graph()));
65822         return presetList;
65823     };
65824
65825
65826     presetList.preset = function(_) {
65827         if (!arguments.length) return currentPreset;
65828         currentPreset = _;
65829         return presetList;
65830     };
65831
65832
65833     return utilRebind(presetList, dispatch$$1, 'on');
65834 }
65835
65836 function uiViewOnOSM(context) {
65837     var id;
65838
65839     function viewOnOSM(selection) {
65840         var entity = context.entity(id);
65841
65842         selection.style('display', entity.isNew() ? 'none' : null);
65843
65844         var link = selection.selectAll('.view-on-osm')
65845             .data([0]);
65846
65847         var enter = link.enter()
65848             .append('a')
65849             .attr('class', 'view-on-osm')
65850             .attr('target', '_blank')
65851             .call(svgIcon('#icon-out-link', 'inline'));
65852
65853         enter
65854             .append('span')
65855             .text(t('inspector.view_on_osm'));
65856
65857         link
65858             .merge(enter)
65859             .attr('href', context.connection().entityURL(entity));
65860     }
65861
65862
65863     viewOnOSM.entityID = function(_) {
65864         if (!arguments.length) return id;
65865         id = _;
65866         return viewOnOSM;
65867     };
65868
65869     return viewOnOSM;
65870 }
65871
65872 function uiInspector(context) {
65873     var presetList = uiPresetList(context);
65874     var entityEditor = uiEntityEditor(context);
65875     var _state = 'select';
65876     var _entityID;
65877     var _newFeature = false;
65878
65879
65880     function inspector(selection$$1) {
65881         presetList
65882             .entityID(_entityID)
65883             .autofocus(_newFeature)
65884             .on('choose', setPreset);
65885
65886         entityEditor
65887             .state(_state)
65888             .entityID(_entityID)
65889             .on('choose', showList);
65890
65891         var wrap = selection$$1.selectAll('.panewrap')
65892             .data([0]);
65893
65894         var enter = wrap.enter()
65895             .append('div')
65896             .attr('class', 'panewrap');
65897
65898         enter
65899             .append('div')
65900             .attr('class', 'preset-list-pane pane');
65901
65902         enter
65903             .append('div')
65904             .attr('class', 'entity-editor-pane pane');
65905
65906         wrap = wrap.merge(enter);
65907         var presetPane = wrap.selectAll('.preset-list-pane');
65908         var editorPane = wrap.selectAll('.entity-editor-pane');
65909
65910         var graph = context.graph(),
65911             entity = context.entity(_entityID),
65912             showEditor = _state === 'hover' ||
65913                 entity.isUsed(graph) ||
65914                 entity.isHighwayIntersection(graph);
65915
65916         if (showEditor) {
65917             wrap.style('right', '0%');
65918             editorPane.call(entityEditor);
65919         } else {
65920             wrap.style('right', '-100%');
65921             presetPane.call(presetList);
65922         }
65923
65924         var footer = selection$$1.selectAll('.footer')
65925             .data([0]);
65926
65927         footer = footer.enter()
65928             .append('div')
65929             .attr('class', 'footer')
65930             .merge(footer);
65931
65932         footer
65933             .call(uiViewOnOSM(context).entityID(_entityID));
65934
65935
65936         function showList(preset) {
65937             wrap.transition()
65938                 .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
65939
65940             presetPane
65941                 .call(presetList.preset(preset).autofocus(true));
65942         }
65943
65944
65945         function setPreset(preset) {
65946             wrap.transition()
65947                 .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
65948
65949             editorPane
65950                 .call(entityEditor.preset(preset));
65951         }
65952     }
65953
65954
65955     inspector.state = function(_) {
65956         if (!arguments.length) return _state;
65957         _state = _;
65958         entityEditor.state(_state);
65959
65960         // remove any old field help overlay that might have gotten attached to the inspector
65961         d3_selectAll('.field-help-body').remove();
65962
65963         return inspector;
65964     };
65965
65966
65967     inspector.entityID = function(_) {
65968         if (!arguments.length) return _entityID;
65969         _entityID = _;
65970         return inspector;
65971     };
65972
65973
65974     inspector.newFeature = function(_) {
65975         if (!arguments.length) return _newFeature;
65976         _newFeature = _;
65977         return inspector;
65978     };
65979
65980
65981     return inspector;
65982 }
65983
65984 function uiSidebar(context) {
65985     var inspector = uiInspector(context),
65986         current;
65987
65988
65989     function sidebar(selection) {
65990         var featureListWrap = selection
65991             .append('div')
65992             .attr('class', 'feature-list-pane')
65993             .call(uiFeatureList(context));
65994
65995
65996         var inspectorWrap = selection
65997             .append('div')
65998             .attr('class', 'inspector-hidden inspector-wrap fr');
65999
66000
66001         function hover(id) {
66002             if (!current && context.hasEntity(id)) {
66003                 featureListWrap
66004                     .classed('inspector-hidden', true);
66005
66006                 inspectorWrap
66007                     .classed('inspector-hidden', false)
66008                     .classed('inspector-hover', true);
66009
66010                 if (inspector.entityID() !== id || inspector.state() !== 'hover') {
66011                     inspector
66012                         .state('hover')
66013                         .entityID(id);
66014
66015                     inspectorWrap
66016                         .call(inspector);
66017                 }
66018
66019             } else if (!current) {
66020                 featureListWrap
66021                     .classed('inspector-hidden', false);
66022                 inspectorWrap
66023                     .classed('inspector-hidden', true);
66024                 inspector
66025                     .state('hide');
66026             }
66027         }
66028
66029
66030         sidebar.hover = throttle(hover, 200);
66031
66032
66033         sidebar.select = function(id, newFeature) {
66034             if (!current && id) {
66035                 featureListWrap
66036                     .classed('inspector-hidden', true);
66037
66038                 inspectorWrap
66039                     .classed('inspector-hidden', false)
66040                     .classed('inspector-hover', false);
66041
66042                 if (inspector.entityID() !== id || inspector.state() !== 'select') {
66043                     inspector
66044                         .state('select')
66045                         .entityID(id)
66046                         .newFeature(newFeature);
66047
66048                     inspectorWrap
66049                         .call(inspector);
66050                 }
66051
66052             } else if (!current) {
66053                 featureListWrap
66054                     .classed('inspector-hidden', false);
66055                 inspectorWrap
66056                     .classed('inspector-hidden', true);
66057                 inspector
66058                     .state('hide');
66059             }
66060         };
66061
66062
66063         sidebar.show = function(component) {
66064             featureListWrap
66065                 .classed('inspector-hidden', true);
66066             inspectorWrap
66067                 .classed('inspector-hidden', true);
66068
66069             if (current) current.remove();
66070             current = selection
66071                 .append('div')
66072                 .attr('class', 'sidebar-component')
66073                 .call(component);
66074         };
66075
66076
66077         sidebar.hide = function() {
66078             featureListWrap
66079                 .classed('inspector-hidden', false);
66080             inspectorWrap
66081                 .classed('inspector-hidden', true);
66082
66083             if (current) current.remove();
66084             current = null;
66085         };
66086     }
66087
66088
66089     sidebar.hover = function() {};
66090     sidebar.hover.cancel = function() {};
66091     sidebar.select = function() {};
66092     sidebar.show = function() {};
66093     sidebar.hide = function() {};
66094
66095     return sidebar;
66096 }
66097
66098 function uiSpinner(context) {
66099     var osm = context.connection();
66100
66101
66102     return function(selection) {
66103         var img = selection
66104             .append('img')
66105             .attr('src', context.imagePath('loader-black.gif'))
66106             .style('opacity', 0);
66107
66108         if (osm) {
66109             osm
66110                 .on('loading.spinner', function() {
66111                     img.transition()
66112                         .style('opacity', 1);
66113                 })
66114                 .on('loaded.spinner', function() {
66115                     img.transition()
66116                         .style('opacity', 0);
66117                 });
66118         }
66119     };
66120 }
66121
66122 function uiSplash(context) {
66123
66124     return function(selection) {
66125         if (context.storage('sawSplash'))
66126              return;
66127
66128         context.storage('sawSplash', true);
66129
66130         var modalSelection = uiModal(selection);
66131
66132         modalSelection.select('.modal')
66133             .attr('class', 'modal-splash modal col6');
66134
66135         var introModal = modalSelection.select('.content')
66136             .append('div')
66137             .attr('class', 'fillL');
66138
66139         introModal
66140             .append('div')
66141             .attr('class','modal-section cf')
66142             .append('h3').text(t('splash.welcome'));
66143
66144         introModal
66145             .append('div')
66146             .attr('class','modal-section')
66147             .append('p')
66148             .html(t('splash.text', {
66149                 version: context.version,
66150                 website: '<a href="http://ideditor.com/">ideditor.com</a>',
66151                 github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
66152             }));
66153
66154         var buttonWrap = introModal
66155             .append('div')
66156             .attr('class', 'modal-actions cf');
66157
66158         var walkthrough = buttonWrap
66159             .append('button')
66160             .attr('class', 'walkthrough col6')
66161             .on('click', function() {
66162                 context.container().call(uiIntro(context));
66163                 modalSelection.close();
66164             });
66165
66166         walkthrough
66167             .append('svg')
66168             .attr('class', 'logo logo-walkthrough')
66169             .append('use')
66170             .attr('xlink:href', '#logo-walkthrough');
66171
66172         walkthrough
66173             .append('div')
66174             .text(t('splash.walkthrough'));
66175
66176         var startEditing = buttonWrap
66177             .append('button')
66178             .attr('class', 'start-editing col6')
66179             .on('click', modalSelection.close);
66180
66181         startEditing
66182             .append('svg')
66183             .attr('class', 'logo logo-features')
66184             .append('use')
66185             .attr('xlink:href', '#logo-features');
66186
66187         startEditing
66188             .append('div')
66189             .text(t('splash.start'));
66190
66191
66192         modalSelection.select('button.close')
66193             .attr('class','hide');
66194
66195     };
66196 }
66197
66198 function uiStatus(context) {
66199     var osm = context.connection();
66200
66201
66202     return function(selection$$1) {
66203         if (!osm) return;
66204
66205         function update() {
66206             osm.status(function(err, apiStatus) {
66207                 selection$$1.html('');
66208
66209                 if (err) {
66210                     if (apiStatus === 'connectionSwitched') {
66211                         // if the connection was just switched, we can't rely on
66212                         // the status (we're getting the status of the previous api)
66213                         return;
66214
66215                     } else if (apiStatus === 'rateLimited') {
66216                         selection$$1
66217                             .text(t('status.rateLimit'))
66218                             .append('a')
66219                             .attr('class', 'api-status-login')
66220                             .attr('target', '_blank')
66221                             .call(svgIcon('#icon-out-link', 'inline'))
66222                             .append('span')
66223                             .text(t('login'))
66224                             .on('click.login', function() {
66225                                 event.preventDefault();
66226                                 osm.authenticate();
66227                             });
66228                     } else {
66229                         // eslint-disable-next-line no-warning-comments
66230                         // TODO: nice messages for different error types
66231                         selection$$1.text(t('status.error'));
66232                     }
66233
66234                 } else if (apiStatus === 'readonly') {
66235                     selection$$1.text(t('status.readonly'));
66236                 } else if (apiStatus === 'offline') {
66237                     selection$$1.text(t('status.offline'));
66238                 }
66239
66240                 selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
66241             });
66242         }
66243
66244         osm.on('change', function() { update(selection$$1); });
66245
66246         window.setInterval(update, 90000);
66247         update(selection$$1);
66248     };
66249 }
66250
66251 function uiUndoRedo(context) {
66252     var commands = [{
66253         id: 'undo',
66254         cmd: uiCmd('⌘Z'),
66255         action: function() { if (editable()) context.undo(); },
66256         annotation: function() { return context.history().undoAnnotation(); }
66257     }, {
66258         id: 'redo',
66259         cmd: uiCmd('⌘⇧Z'),
66260         action: function() { if (editable()) context.redo(); },
66261         annotation: function() { return context.history().redoAnnotation(); }
66262     }];
66263
66264
66265     function editable() {
66266         var mode = context.mode();
66267         return context.editable() && mode && mode.id !== 'save';
66268     }
66269
66270
66271     return function(selection$$1) {
66272         var tooltipBehavior = tooltip()
66273             .placement('bottom')
66274             .html(true)
66275             .title(function (d) {
66276                 return uiTooltipHtml(d.annotation() ?
66277                     t(d.id + '.tooltip', {action: d.annotation()}) :
66278                     t(d.id + '.nothing'), d.cmd);
66279             });
66280
66281         var buttons = selection$$1.selectAll('button')
66282             .data(commands)
66283             .enter()
66284             .append('button')
66285             .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
66286             .on('click', function(d) { return d.action(); })
66287             .call(tooltipBehavior);
66288
66289         buttons.each(function(d) {
66290             var iconName = d.id;
66291             if (textDirection === 'rtl') {
66292                 if (iconName === 'undo') {
66293                     iconName = 'redo';
66294                 } else if (iconName === 'redo') {
66295                     iconName = 'undo';
66296                 }
66297             }
66298             d3_select(this)
66299                 .call(svgIcon('#icon-' + iconName));
66300         });
66301
66302         var keybinding = d3keybinding('undo')
66303             .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
66304             .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
66305
66306         d3_select(document)
66307             .call(keybinding);
66308
66309
66310         var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
66311
66312         context.map()
66313             .on('move.undo_redo', debouncedUpdate)
66314             .on('drawn.undo_redo', debouncedUpdate);
66315
66316         context.history()
66317             .on('change.undo_redo', update);
66318
66319         context
66320             .on('enter.undo_redo', update);
66321
66322
66323         function update() {
66324             buttons
66325                 .property('disabled', !editable())
66326                 .classed('disabled', function(d) { return !d.annotation(); })
66327                 .each(function() {
66328                     var selection$$1 = d3_select(this);
66329                     if (selection$$1.property('tooltipVisible')) {
66330                         selection$$1.call(tooltipBehavior.show);
66331                     }
66332                 });
66333         }
66334     };
66335 }
66336
66337 // these are module variables so they are preserved through a ui.restart()
66338 var sawVersion = null,
66339     isNewVersion = false,
66340     isNewUser = false;
66341
66342
66343 function uiVersion(context) {
66344
66345     var currVersion = context.version,
66346         matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
66347
66348     if (sawVersion === null && matchedVersion !== null) {
66349         isNewVersion = (context.storage('sawVersion') !== currVersion);
66350         isNewUser = !context.storage('sawSplash');
66351         context.storage('sawVersion', currVersion);
66352         sawVersion = currVersion;
66353     }
66354
66355     return function(selection) {
66356         selection
66357             .append('a')
66358             .attr('target', '_blank')
66359             .attr('tabindex', -1)
66360             .attr('href', 'https://github.com/openstreetmap/iD')
66361             .text(currVersion);
66362
66363         // only show new version indicator to users that have used iD before
66364         if (isNewVersion && !isNewUser) {
66365             selection
66366                 .append('div')
66367                 .attr('class', 'badge')
66368                 .append('a')
66369                 .attr('target', '_blank')
66370                 .attr('tabindex', -1)
66371                 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
66372                 .call(svgIcon('#gift-11'))
66373                 .call(tooltip()
66374                     .title(t('version.whats_new', { version: currVersion }))
66375                     .placement('top')
66376                 );
66377         }
66378     };
66379 }
66380
66381 function uiZoom(context) {
66382     var zooms = [{
66383         id: 'zoom-in',
66384         icon: 'plus',
66385         title: t('zoom.in'),
66386         action: context.zoomIn,
66387         key: '+'
66388     }, {
66389         id: 'zoom-out',
66390         icon: 'minus',
66391         title: t('zoom.out'),
66392         action: context.zoomOut,
66393         key: '-'
66394     }];
66395
66396
66397     function zoomIn() {
66398         event.preventDefault();
66399         context.zoomIn();
66400     }
66401
66402
66403     function zoomOut() {
66404         event.preventDefault();
66405         context.zoomOut();
66406     }
66407
66408
66409     function zoomInFurther() {
66410         event.preventDefault();
66411         context.zoomInFurther();
66412     }
66413
66414
66415     function zoomOutFurther() {
66416         event.preventDefault();
66417         context.zoomOutFurther();
66418     }
66419
66420
66421     return function(selection$$1) {
66422         var button = selection$$1.selectAll('button')
66423             .data(zooms)
66424             .enter()
66425             .append('button')
66426             .attr('tabindex', -1)
66427             .attr('class', function(d) { return d.id; })
66428             .on('click.editor', function(d) { d.action(); })
66429             .call(tooltip()
66430                 .placement((textDirection === 'rtl') ? 'right' : 'left')
66431                 .html(true)
66432                 .title(function(d) {
66433                     return uiTooltipHtml(d.title, d.key);
66434                 })
66435             );
66436
66437         button.each(function(d) {
66438             d3_select(this)
66439                 .call(svgIcon('#icon-' + d.icon, 'light'));
66440         });
66441
66442         var keybinding = d3keybinding('zoom');
66443
66444         ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
66445             keybinding.on([key], zoomIn);
66446             keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
66447         });
66448
66449         ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
66450             keybinding.on([key], zoomOut);
66451             keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
66452         });
66453
66454         d3_select(document)
66455             .call(keybinding);
66456     };
66457 }
66458
66459 function uiInit(context) {
66460     var uiInitCounter = 0;
66461
66462
66463     function render(container) {
66464         container
66465             .attr('dir', textDirection);
66466
66467         var map = context.map();
66468
66469         var hash = behaviorHash(context);
66470         hash();
66471
66472         if (!hash.hadHash) {
66473             map.centerZoom([0, 0], 2);
66474         }
66475
66476         container
66477             .append('svg')
66478             .attr('id', 'defs')
66479             .call(svgDefs(context));
66480
66481         container
66482             .append('div')
66483             .attr('id', 'sidebar')
66484             .attr('class', 'col4')
66485             .call(ui.sidebar);
66486
66487         var content = container
66488             .append('div')
66489             .attr('id', 'content')
66490             .attr('class', 'active');
66491
66492         var bar = content
66493             .append('div')
66494             .attr('id', 'bar')
66495             .attr('class', 'fillD');
66496
66497         content
66498             .append('div')
66499             .attr('id', 'map')
66500             .attr('dir', 'ltr')
66501             .call(map);
66502
66503         content
66504             .call(uiMapInMap(context))
66505             .call(uiInfo(context))
66506             .call(uiNotice(context));
66507
66508         bar
66509             .append('div')
66510             .attr('class', 'spacer col4');
66511
66512         var limiter = bar.append('div')
66513             .attr('class', 'limiter');
66514
66515         limiter
66516             .append('div')
66517             .attr('class', 'button-wrap joined col3')
66518             .call(uiModes(context), limiter);
66519
66520         limiter
66521             .append('div')
66522             .attr('class', 'button-wrap joined col1')
66523             .call(uiUndoRedo(context));
66524
66525         limiter
66526             .append('div')
66527             .attr('class', 'button-wrap col1')
66528             .call(uiSave(context));
66529
66530         bar
66531             .append('div')
66532             .attr('class', 'full-screen')
66533             .call(uiFullScreen(context));
66534
66535         bar
66536             .append('div')
66537             .attr('class', 'spinner')
66538             .call(uiSpinner(context));
66539
66540
66541         var controls = bar
66542             .append('div')
66543             .attr('class', 'map-controls');
66544
66545         controls
66546             .append('div')
66547             .attr('class', 'map-control zoombuttons')
66548             .call(uiZoom(context));
66549
66550         controls
66551             .append('div')
66552             .attr('class', 'map-control geolocate-control')
66553             .call(uiGeolocate(context));
66554
66555         controls
66556             .append('div')
66557             .attr('class', 'map-control background-control')
66558             .call(uiBackground(context));
66559
66560         controls
66561             .append('div')
66562             .attr('class', 'map-control map-data-control')
66563             .call(uiMapData(context));
66564
66565         controls
66566             .append('div')
66567             .attr('class', 'map-control help-control')
66568             .call(uiHelp(context));
66569
66570
66571         var about = content
66572             .append('div')
66573             .attr('id', 'about');
66574
66575         about
66576             .append('div')
66577             .attr('id', 'attrib')
66578             .attr('dir', 'ltr')
66579             .call(uiAttribution(context));
66580
66581         about
66582             .append('div')
66583             .attr('class', 'api-status')
66584             .call(uiStatus(context));
66585
66586
66587         var footer = about
66588             .append('div')
66589             .attr('id', 'footer')
66590             .attr('class', 'fillD');
66591
66592         footer
66593             .append('div')
66594             .attr('id', 'flash-wrap')
66595             .attr('class', 'footer-hide');
66596
66597         var footerWrap = footer
66598             .append('div')
66599             .attr('id', 'footer-wrap')
66600             .attr('class', 'footer-show');
66601
66602         footerWrap
66603             .append('div')
66604             .attr('id', 'scale-block')
66605             .call(uiScale(context));
66606
66607         var aboutList = footerWrap
66608             .append('div')
66609             .attr('id', 'info-block')
66610             .append('ul')
66611             .attr('id', 'about-list');
66612
66613         if (!context.embed()) {
66614             aboutList
66615                 .call(uiAccount(context));
66616         }
66617
66618         aboutList
66619             .append('li')
66620             .attr('class', 'version')
66621             .call(uiVersion(context));
66622
66623         var issueLinks = aboutList
66624             .append('li');
66625
66626         issueLinks
66627             .append('a')
66628             .attr('target', '_blank')
66629             .attr('tabindex', -1)
66630             .attr('href', 'https://github.com/openstreetmap/iD/issues')
66631             .call(svgIcon('#icon-bug', 'light'))
66632             .call(tooltip().title(t('report_a_bug')).placement('top'));
66633
66634         issueLinks
66635             .append('a')
66636             .attr('target', '_blank')
66637             .attr('tabindex', -1)
66638             .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
66639             .call(svgIcon('#icon-translate', 'light'))
66640             .call(tooltip().title(t('help_translate')).placement('top'));
66641
66642         aboutList
66643             .append('li')
66644             .attr('class', 'feature-warning')
66645             .attr('tabindex', -1)
66646             .call(uiFeatureInfo(context));
66647
66648         aboutList
66649             .append('li')
66650             .attr('class', 'user-list')
66651             .attr('tabindex', -1)
66652             .call(uiContributors(context));
66653
66654
66655         var photoviewer = content
66656             .append('div')
66657             .attr('id', 'photoviewer')
66658             .classed('al', true)       // 'al'=left,  'ar'=right
66659             .classed('hide', true);
66660
66661         photoviewer
66662             .append('button')
66663             .attr('class', 'thumb-hide')
66664             .on('click', function () {
66665                 if (services.mapillary) { services.mapillary.hideViewer(); }
66666                 if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
66667             })
66668             .append('div')
66669             .call(svgIcon('#icon-close'));
66670
66671
66672         window.onbeforeunload = function() {
66673             return context.save();
66674         };
66675
66676         window.onunload = function() {
66677             context.history().unlock();
66678         };
66679
66680         var mapDimensions = map.dimensions();
66681
66682
66683         function onResize() {
66684             mapDimensions = utilGetDimensions(content, true);
66685             map.dimensions(mapDimensions);
66686         }
66687
66688         d3_select(window)
66689             .on('resize.editor', onResize);
66690
66691         onResize();
66692
66693         function pan(d) {
66694             return function() {
66695                 event.preventDefault();
66696                 context.pan(d, 100);
66697             };
66698         }
66699
66700
66701         // pan amount
66702         var pa = 80;
66703
66704         var keybinding = d3keybinding('main')
66705             .on('⌫', function() { event.preventDefault(); })
66706             .on('←', pan([pa, 0]))
66707             .on('↑', pan([0, pa]))
66708             .on('→', pan([-pa, 0]))
66709             .on('↓', pan([0, -pa]))
66710             .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
66711             .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
66712             .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
66713             .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
66714
66715         d3_select(document)
66716             .call(keybinding);
66717
66718         context.enter(modeBrowse(context));
66719
66720         if (!uiInitCounter++) {
66721             if (!hash.startWalkthrough) {
66722                 context.container()
66723                     .call(uiSplash(context))
66724                     .call(uiRestore(context));
66725             }
66726
66727             context.container()
66728                 .call(uiShortcuts(context));
66729         }
66730
66731         var osm = context.connection(),
66732             auth = uiLoading(context).message(t('loading_auth')).blocking(true);
66733
66734         if (osm && auth) {
66735             osm
66736                 .on('authLoading.ui', function() {
66737                     context.container()
66738                         .call(auth);
66739                 })
66740                 .on('authDone.ui', function() {
66741                     auth.close();
66742                 });
66743         }
66744
66745         uiInitCounter++;
66746
66747         if (hash.startWalkthrough) {
66748             hash.startWalkthrough = false;
66749             context.container().call(uiIntro(context));
66750         }
66751     }
66752
66753
66754     var renderCallback;
66755
66756     function ui(node, callback) {
66757         renderCallback = callback;
66758         var container = d3_select(node);
66759         context.container(container);
66760         context.loadLocale(function(err) {
66761             if (!err) {
66762                 render(container);
66763             }
66764             if (callback) {
66765                 callback(err);
66766             }
66767         });
66768     }
66769
66770
66771     ui.restart = function(arg) {
66772         context.locale(arg);
66773         context.loadLocale(function(err) {
66774             if (!err) {
66775                 context.container().selectAll('*').remove();
66776                 render(context.container());
66777                 if (renderCallback) renderCallback();
66778             }
66779         });
66780     };
66781
66782
66783     ui.sidebar = uiSidebar(context);
66784
66785     return ui;
66786 }
66787
66788 function uiChangesetEditor(context) {
66789     var dispatch$$1 = dispatch('change'),
66790         formFields = uiFormFields(context),
66791         fieldsArr,
66792         tags,
66793         changesetId;
66794
66795
66796
66797     function changesetEditor(selection) {
66798         render(selection);
66799     }
66800
66801
66802     function render(selection) {
66803         var initial = false;
66804
66805         if (!fieldsArr) {
66806             initial = true;
66807             var presets = context.presets();
66808
66809             fieldsArr = [
66810                 uiField(context, presets.field('comment'), null, { show: true, revert: false }),
66811                 uiField(context, presets.field('source'), null, { show: false, revert: false }),
66812                 uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
66813             ];
66814
66815             fieldsArr.forEach(function(field) {
66816                 field
66817                     .on('change', function(t$$1, onInput) {
66818                         dispatch$$1.call('change', field, t$$1, onInput);
66819                     });
66820             });
66821         }
66822
66823         fieldsArr.forEach(function(field) {
66824             field
66825                 .tags(tags);
66826         });
66827
66828
66829         selection
66830             .call(formFields.fieldsArr(fieldsArr));
66831
66832
66833         if (initial) {
66834             var commentField = selection.select('#preset-input-comment'),
66835                 commentNode = commentField.node();
66836
66837             if (commentNode) {
66838                 commentNode.focus();
66839                 commentNode.select();
66840             }
66841
66842             // trigger a 'blur' event so that comment field can be cleaned
66843             // and checked for hashtags, even if retrieved from localstorage
66844             utilTriggerEvent(commentField, 'blur');
66845
66846             var osm = context.connection();
66847             if (osm) {
66848                 osm.userChangesets(function (err, changesets) {
66849                     if (err) return;
66850
66851                     var comments = changesets.map(function(changeset) {
66852                         return {
66853                             title: changeset.tags.comment,
66854                             value: changeset.tags.comment
66855                         };
66856                     });
66857
66858                     commentField
66859                         .call(d3combobox()
66860                             .container(context.container())
66861                             .caseSensitive(true)
66862                             .data(uniqBy(comments, 'title'))
66863                         );
66864                 });
66865             }
66866         }
66867
66868         // Add warning if comment mentions Google
66869         var hasGoogle = tags.comment.match(/google/i);
66870         var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
66871             .data(hasGoogle ? [0] : []);
66872
66873         commentWarning.exit()
66874             .transition()
66875             .duration(200)
66876             .style('opacity', 0)
66877             .remove();
66878
66879         var commentEnter = commentWarning.enter()
66880             .insert('div', '.tag-reference-body')
66881             .attr('class', 'field-warning comment-warning')
66882             .style('opacity', 0);
66883
66884         commentEnter
66885             .append('a')
66886             .attr('target', '_blank')
66887             .attr('tabindex', -1)
66888             .call(svgIcon('#icon-alert', 'inline'))
66889             .attr('href', t('commit.google_warning_link'))
66890             .append('span')
66891             .text(t('commit.google_warning'));
66892
66893         commentEnter
66894             .transition()
66895             .duration(200)
66896             .style('opacity', 1);
66897     }
66898
66899
66900     changesetEditor.tags = function(_) {
66901         if (!arguments.length) return tags;
66902         tags = _;
66903         // Don't reset fieldsArr here.
66904         return changesetEditor;
66905     };
66906
66907
66908     changesetEditor.changesetID = function(_) {
66909         if (!arguments.length) return changesetId;
66910         if (changesetId === _) return changesetEditor;
66911         changesetId = _;
66912         fieldsArr = null;
66913         return changesetEditor;
66914     };
66915
66916
66917     return utilRebind(changesetEditor, dispatch$$1, 'on');
66918 }
66919
66920 /**
66921  * This method is like `_.union` except that it accepts `iteratee` which is
66922  * invoked for each element of each `arrays` to generate the criterion by
66923  * which uniqueness is computed. Result values are chosen from the first
66924  * array in which the value occurs. The iteratee is invoked with one argument:
66925  * (value).
66926  *
66927  * @static
66928  * @memberOf _
66929  * @since 4.0.0
66930  * @category Array
66931  * @param {...Array} [arrays] The arrays to inspect.
66932  * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
66933  * @returns {Array} Returns the new array of combined values.
66934  * @example
66935  *
66936  * _.unionBy([2.1], [1.2, 2.3], Math.floor);
66937  * // => [2.1, 1.2]
66938  *
66939  * // The `_.property` iteratee shorthand.
66940  * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
66941  * // => [{ 'x': 1 }, { 'x': 2 }]
66942  */
66943 var unionBy = baseRest(function(arrays) {
66944   var iteratee = last(arrays);
66945   if (isArrayLikeObject(iteratee)) {
66946     iteratee = undefined;
66947   }
66948   return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
66949 });
66950
66951 function uiCommitChanges(context) {
66952     var detected = utilDetect();
66953     var _entityID;
66954
66955
66956     function commitChanges(selection$$1) {
66957         var history = context.history();
66958         var summary = history.difference().summary();
66959
66960         var container = selection$$1.selectAll('.modal-section.commit-section')
66961             .data([0]);
66962
66963         var containerEnter = container.enter()
66964             .append('div')
66965             .attr('class', 'commit-section modal-section fillL2');
66966
66967         containerEnter
66968             .append('h3')
66969             .text(t('commit.changes', { count: summary.length }));
66970
66971         containerEnter
66972             .append('ul')
66973             .attr('class', 'changeset-list');
66974
66975         container = containerEnter
66976             .merge(container);
66977
66978
66979         var items = container.select('ul').selectAll('li')
66980             .data(summary);
66981
66982         var itemsEnter = items.enter()
66983             .append('li')
66984             .attr('class', 'change-item');
66985
66986         itemsEnter
66987             .each(function(d) {
66988                 d3_select(this)
66989                     .call(svgIcon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
66990             });
66991
66992         itemsEnter
66993             .append('span')
66994             .attr('class', 'change-type')
66995             .text(function(d) { return t('commit.' + d.changeType) + ' '; });
66996
66997         itemsEnter
66998             .append('strong')
66999             .attr('class', 'entity-type')
67000             .text(function(d) {
67001                 var matched = context.presets().match(d.entity, d.graph);
67002                 return (matched && matched.name()) || utilDisplayType(d.entity.id);
67003             });
67004
67005         itemsEnter
67006             .append('span')
67007             .attr('class', 'entity-name')
67008             .text(function(d) {
67009                 var name = utilDisplayName(d.entity) || '',
67010                     string = '';
67011                 if (name !== '') {
67012                     string += ':';
67013                 }
67014                 return string += ' ' + name;
67015             });
67016
67017         itemsEnter
67018             .style('opacity', 0)
67019             .transition()
67020             .style('opacity', 1);
67021
67022         items = itemsEnter
67023             .merge(items);
67024
67025         items
67026             .on('mouseover', mouseover)
67027             .on('mouseout', mouseout)
67028             .on('click', click);
67029
67030
67031         // Download changeset link
67032         var changeset = new osmChangeset().update({ id: undefined });
67033         var changes = history.changes(actionDiscardTags(history.difference()));
67034
67035         delete changeset.id;  // Export without chnageset_id
67036
67037         var data = JXON.stringify(changeset.osmChangeJXON(changes));
67038         var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
67039         var fileName = 'changes.osc';
67040
67041         var linkEnter = container.selectAll('.download-changes')
67042             .data([0])
67043             .enter()
67044             .append('a')
67045             .attr('class', 'download-changes');
67046
67047         if (detected.download) {      // All except IE11 and Edge
67048             linkEnter                 // download the data as a file
67049                 .attr('href', window.URL.createObjectURL(blob))
67050                 .attr('download', fileName);
67051
67052         } else {                      // IE11 and Edge
67053             linkEnter                 // open data uri in a new tab
67054                 .attr('target', '_blank')
67055                 .on('click.download', function() {
67056                     navigator.msSaveBlob(blob, fileName);
67057                 });
67058         }
67059
67060         linkEnter
67061             .call(svgIcon('#icon-load', 'inline'))
67062             .append('span')
67063             .text(t('commit.download_changes'));
67064
67065
67066         function mouseover(d) {
67067             if (d.entity) {
67068                 context.surface().selectAll(
67069                     utilEntityOrMemberSelector([d.entity.id], context.graph())
67070                 ).classed('hover', true);
67071             }
67072         }
67073
67074
67075         function mouseout() {
67076             context.surface().selectAll('.hover')
67077                 .classed('hover', false);
67078         }
67079
67080
67081         function click(change) {
67082             if (change.changeType === 'deleted') {
67083                 _entityID = null;
67084             } else {
67085                 var entity = change.entity;
67086                 _entityID = change.entity.id;
67087                 context.map().zoomTo(entity);
67088                 context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
67089                     .classed('hover', true);
67090             }
67091         }
67092     }
67093
67094
67095     commitChanges.entityID = function(_) {
67096         if (!arguments.length) return _entityID;
67097         _entityID = _;
67098         return commitChanges;
67099     };
67100
67101
67102     return commitChanges;
67103 }
67104
67105 function uiCommitWarnings(context) {
67106
67107     function commitWarnings(selection) {
67108
67109         var changes = context.history().changes();
67110         var warnings = context.history().validate(changes);
67111
67112         var container = selection.selectAll('.warning-section')
67113             .data(warnings.length ? [0] : []);
67114
67115         container.exit()
67116             .remove();
67117
67118         var containerEnter = container.enter()
67119             .append('div')
67120             .attr('class', 'modal-section warning-section fillL2');
67121
67122         containerEnter
67123             .append('h3')
67124             .text(t('commit.warnings'));
67125
67126         containerEnter
67127             .append('ul')
67128             .attr('class', 'changeset-list');
67129
67130         container = containerEnter
67131             .merge(container);
67132
67133
67134         var items = container.select('ul').selectAll('li')
67135             .data(warnings);
67136
67137         items.exit()
67138             .remove();
67139
67140         var itemsEnter = items.enter()
67141             .append('li')
67142             .attr('class', 'warning-item');
67143
67144         itemsEnter
67145             .call(svgIcon('#icon-alert', 'pre-text'));
67146
67147         itemsEnter
67148             .append('strong')
67149             .text(function(d) { return d.message; });
67150
67151         itemsEnter.filter(function(d) { return d.tooltip; })
67152             .call(tooltip()
67153                 .title(function(d) { return d.tooltip; })
67154                 .placement('top')
67155             );
67156
67157         items = itemsEnter
67158             .merge(items);
67159
67160         items
67161             .on('mouseover', mouseover)
67162             .on('mouseout', mouseout)
67163             .on('click', warningClick);
67164
67165
67166         function mouseover(d) {
67167             if (d.entity) {
67168                 context.surface().selectAll(
67169                     utilEntityOrMemberSelector([d.entity.id], context.graph())
67170                 ).classed('hover', true);
67171             }
67172         }
67173
67174
67175         function mouseout() {
67176             context.surface().selectAll('.hover')
67177                 .classed('hover', false);
67178         }
67179
67180
67181         function warningClick(d) {
67182             if (d.entity) {
67183                 context.map().zoomTo(d.entity);
67184                 context.enter(modeSelect(context, [d.entity.id]));
67185             }
67186         }
67187
67188     }
67189
67190
67191     return commitWarnings;
67192 }
67193
67194 var _changeset$1;
67195 var readOnlyTags = [
67196     /^_changesets_count$/,
67197     /^created_by$/,
67198     /^ideditor:/,
67199     /^imagery_used$/,
67200     /^host$/,
67201     /^locale$/
67202 ];
67203
67204 // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
67205 // from https://stackoverflow.com/a/25575009
67206 var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
67207
67208
67209 function uiCommit(context) {
67210     var dispatch$$1 = dispatch('cancel', 'save');
67211     var _userDetails;
67212     var _selection;
67213
67214     var changesetEditor = uiChangesetEditor(context)
67215         .on('change', changeTags);
67216     var rawTagEditor = uiRawTagEditor(context)
67217         .on('change', changeTags);
67218     var commitChanges = uiCommitChanges(context);
67219     var commitWarnings = uiCommitWarnings(context);
67220
67221
67222     function commit(selection$$1) {
67223         _selection = selection$$1;
67224
67225         var osm = context.connection();
67226         if (!osm) return;
67227
67228         // expire stored comment and hashtags after cutoff datetime - #3947
67229         var commentDate = +context.storage('commentDate') || 0;
67230         var currDate = Date.now();
67231         var cutoff = 2 * 86400 * 1000;   // 2 days
67232         if (commentDate > currDate || currDate - commentDate > cutoff) {
67233             context.storage('comment', null);
67234             context.storage('hashtags', null);
67235         }
67236
67237         var tags;
67238         if (!_changeset$1) {
67239             var detected = utilDetect();
67240             tags = {
67241                 comment: context.storage('comment') || '',
67242                 created_by: ('iD ' + context.version).substr(0, 255),
67243                 host: detected.host.substr(0, 255),
67244                 locale: detected.locale.substr(0, 255)
67245             };
67246
67247             // call findHashtags initially - this will remove stored
67248             // hashtags if any hashtags are found in the comment - #4304
67249             findHashtags(tags, true);
67250
67251             var hashtags = context.storage('hashtags');
67252             if (hashtags) {
67253                 tags.hashtags = hashtags;
67254             }
67255
67256             _changeset$1 = new osmChangeset({ tags: tags });
67257         }
67258
67259         tags = clone(_changeset$1.tags);
67260         tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
67261         _changeset$1 = _changeset$1.update({ tags: tags });
67262
67263         var header = selection$$1.selectAll('.header')
67264             .data([0]);
67265
67266         header.enter()
67267             .append('div')
67268             .attr('class', 'header fillL')
67269             .append('h3')
67270             .text(t('commit.title'));
67271
67272         var body = selection$$1.selectAll('.body')
67273             .data([0]);
67274
67275         body = body.enter()
67276             .append('div')
67277             .attr('class', 'body')
67278             .merge(body);
67279
67280
67281         // Changeset Section
67282         var changesetSection = body.selectAll('.changeset-editor')
67283             .data([0]);
67284
67285         changesetSection = changesetSection.enter()
67286             .append('div')
67287             .attr('class', 'modal-section changeset-editor')
67288             .merge(changesetSection);
67289
67290         changesetSection
67291             .call(changesetEditor
67292                 .changesetID(_changeset$1.id)
67293                 .tags(tags)
67294             );
67295
67296
67297         // Warnings
67298         body.call(commitWarnings);
67299
67300
67301         // Upload Explanation
67302         var saveSection = body.selectAll('.save-section')
67303             .data([0]);
67304
67305         saveSection = saveSection.enter()
67306             .append('div')
67307             .attr('class','modal-section save-section fillL cf')
67308             .merge(saveSection);
67309
67310         var prose = saveSection.selectAll('.commit-info')
67311             .data([0]);
67312
67313         prose = prose.enter()
67314             .append('p')
67315             .attr('class', 'commit-info')
67316             .text(t('commit.upload_explanation'))
67317             .merge(prose);
67318
67319         osm.userDetails(function(err, user) {
67320             if (err) return;
67321
67322             var userLink = d3_select(document.createElement('div'));
67323
67324             _userDetails = user;
67325
67326             if (user.image_url) {
67327                 userLink
67328                     .append('img')
67329                     .attr('src', user.image_url)
67330                     .attr('class', 'icon pre-text user-icon');
67331             }
67332
67333             userLink
67334                 .append('a')
67335                 .attr('class','user-info')
67336                 .text(user.display_name)
67337                 .attr('href', osm.userURL(user.display_name))
67338                 .attr('tabindex', -1)
67339                 .attr('target', '_blank');
67340
67341             prose
67342                 .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
67343         });
67344
67345
67346         // Request Review
67347         var requestReview = saveSection.selectAll('.request-review')
67348             .data([0]);
67349
67350         // Enter
67351         var requestReviewEnter = requestReview.enter()
67352             .append('div')
67353             .attr('class', 'request-review');
67354
67355         var labelEnter = requestReviewEnter
67356             .append('label')
67357             .attr('for', 'commit-input-request-review');
67358
67359         labelEnter
67360             .append('input')
67361             .attr('type', 'checkbox')
67362             .attr('id', 'commit-input-request-review');
67363
67364         labelEnter
67365             .append('span')
67366             .text(t('commit.request_review'));
67367
67368         // Update
67369         requestReview = requestReview
67370             .merge(requestReviewEnter);
67371
67372         var requestReviewInput = requestReview.selectAll('input')
67373             .property('checked', isReviewRequested(_changeset$1.tags))
67374             .on('change', toggleRequestReview);
67375
67376
67377         // Buttons
67378         var buttonSection = saveSection.selectAll('.buttons')
67379             .data([0]);
67380
67381         // enter
67382         var buttonEnter = buttonSection.enter()
67383             .append('div')
67384             .attr('class', 'buttons fillL cf');
67385
67386         buttonEnter
67387             .append('button')
67388             .attr('class', 'secondary-action col5 button cancel-button')
67389             .append('span')
67390             .attr('class', 'label')
67391             .text(t('commit.cancel'));
67392
67393         buttonEnter
67394             .append('button')
67395             .attr('class', 'action col5 button save-button')
67396             .append('span')
67397             .attr('class', 'label')
67398             .text(t('commit.save'));
67399
67400         // update
67401         buttonSection = buttonSection
67402             .merge(buttonEnter);
67403
67404         buttonSection.selectAll('.cancel-button')
67405             .on('click.cancel', function() {
67406                 var selectedID = commitChanges.entityID();
67407                 dispatch$$1.call('cancel', this, selectedID);
67408             });
67409
67410         buttonSection.selectAll('.save-button')
67411             .attr('disabled', function() {
67412                 var n = d3_select('#preset-input-comment').node();
67413                 return (n && n.value.length) ? null : true;
67414             })
67415             .on('click.save', function() {
67416                 this.blur();    // avoid keeping focus on the button - #4641
67417                 dispatch$$1.call('save', this, _changeset$1);
67418             });
67419
67420
67421         // Raw Tag Editor
67422         var tagSection = body.selectAll('.tag-section.raw-tag-editor')
67423             .data([0]);
67424
67425         tagSection = tagSection.enter()
67426             .append('div')
67427             .attr('class', 'modal-section tag-section raw-tag-editor')
67428             .merge(tagSection);
67429
67430         var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
67431         tagSection
67432             .call(rawTagEditor
67433                 .expanded(expanded)
67434                 .readOnlyTags(readOnlyTags)
67435                 .tags(clone(_changeset$1.tags))
67436             );
67437
67438
67439         // Change summary
67440         body.call(commitChanges);
67441
67442
67443         function toggleRequestReview() {
67444             var rr = requestReviewInput.property('checked');
67445             updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
67446
67447             var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
67448             tagSection
67449                 .call(rawTagEditor
67450                     .expanded(expanded)
67451                     .readOnlyTags(readOnlyTags)
67452                     .tags(clone(_changeset$1.tags))
67453                 );
67454         }
67455     }
67456
67457
67458     function changeTags(changed, onInput) {
67459         if (changed.hasOwnProperty('comment')) {
67460             if (changed.comment === undefined) {
67461                 changed.comment = '';
67462             }
67463             if (!onInput) {
67464                 context.storage('comment', changed.comment);
67465                 context.storage('commentDate', Date.now());
67466             }
67467         }
67468
67469         updateChangeset(changed, onInput);
67470
67471         if (_selection) {
67472             _selection.call(commit);
67473         }
67474     }
67475
67476
67477     function findHashtags(tags, commentOnly) {
67478         var inComment = commentTags();
67479         var inHashTags = hashTags();
67480
67481         if (inComment !== null) {                    // when hashtags are detected in comment...
67482             context.storage('hashtags', null);       // always remove stored hashtags - #4304
67483             if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
67484         }
67485         return unionBy(inComment, inHashTags, function (s) {
67486             return s.toLowerCase();
67487         });
67488
67489         // Extract hashtags from `comment`
67490         function commentTags() {
67491             return tags.comment
67492                 .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
67493                 .match(hashtagRegex);
67494         }
67495
67496         // Extract and clean hashtags from `hashtags`
67497         function hashTags() {
67498             var t$$1 = tags.hashtags || '';
67499             return t$$1
67500                 .split(/[,;\s]+/)
67501                 .map(function (s) {
67502                     if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
67503                     var matched = s.match(hashtagRegex);
67504                     return matched && matched[0];
67505                 }).filter(Boolean);                       // exclude falsey
67506         }
67507     }
67508
67509
67510     function isReviewRequested(tags) {
67511         var rr = tags.review_requested;
67512         if (rr === undefined) return false;
67513         rr = rr.trim().toLowerCase();
67514         return !(rr === '' || rr === 'no');
67515     }
67516
67517
67518     function updateChangeset(changed, onInput) {
67519         var tags = clone(_changeset$1.tags);
67520
67521         forEach(changed, function(v, k) {
67522             k = k.trim().substr(0, 255);
67523             if (readOnlyTags.indexOf(k) !== -1) return;
67524
67525             if (k !== '' && v !== undefined) {
67526                 if (onInput) {
67527                     tags[k] = v;
67528                 } else {
67529                     tags[k] = v.trim().substr(0, 255);
67530                 }
67531             } else {
67532                 delete tags[k];
67533             }
67534         });
67535
67536         if (!onInput) {
67537             // when changing the comment, override hashtags with any found in comment.
67538             var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
67539             var arr = findHashtags(tags, commentOnly);
67540             if (arr.length) {
67541                 tags.hashtags = arr.join(';').substr(0, 255);
67542                 context.storage('hashtags', tags.hashtags);
67543             } else {
67544                 delete tags.hashtags;
67545                 context.storage('hashtags', null);
67546             }
67547         }
67548
67549         // always update userdetails, just in case user reauthenticates as someone else
67550         if (_userDetails && _userDetails.changesets_count !== undefined) {
67551             var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
67552             tags.changesets_count = String(changesetsCount);
67553
67554             // first 100 edits - new user
67555             if (changesetsCount <= 100) {
67556                 var s;
67557                 s = context.storage('walkthrough_completed');
67558                 if (s) {
67559                     tags['ideditor:walkthrough_completed'] = s;
67560                 }
67561
67562                 s = context.storage('walkthrough_progress');
67563                 if (s) {
67564                     tags['ideditor:walkthrough_progress'] = s;
67565                 }
67566
67567                 s = context.storage('walkthrough_started');
67568                 if (s) {
67569                     tags['ideditor:walkthrough_started'] = s;
67570                 }
67571             }
67572         } else {
67573             delete tags.changesets_count;
67574         }
67575
67576         if (!isEqual(_changeset$1.tags, tags)) {
67577             _changeset$1 = _changeset$1.update({ tags: tags });
67578         }
67579     }
67580
67581
67582     commit.reset = function() {
67583         _changeset$1 = null;
67584     };
67585
67586
67587     return utilRebind(commit, dispatch$$1, 'on');
67588 }
67589
67590 function uiConfirm(selection) {
67591     var modalSelection = uiModal(selection);
67592
67593     modalSelection.select('.modal')
67594         .classed('modal-alert', true);
67595
67596     var section = modalSelection.select('.content');
67597
67598     section.append('div')
67599         .attr('class', 'modal-section header');
67600
67601     section.append('div')
67602         .attr('class', 'modal-section message-text');
67603
67604     var buttons = section.append('div')
67605         .attr('class', 'modal-section buttons cf');
67606
67607
67608     modalSelection.okButton = function() {
67609         buttons
67610             .append('button')
67611             .attr('class', 'action col4')
67612             .on('click.confirm', function() {
67613                 modalSelection.remove();
67614             })
67615             .text(t('confirm.okay'))
67616             .node()
67617             .focus();
67618
67619         return modalSelection;
67620     };
67621
67622
67623     return modalSelection;
67624 }
67625
67626 function uiConflicts(context) {
67627     var dispatch$$1 = dispatch('cancel', 'save');
67628     var keybinding = d3keybinding('conflicts');
67629     var _origChanges;
67630     var _conflictList;
67631
67632
67633     function keybindingOn() {
67634         d3_select(document)
67635             .call(keybinding.on('⎋', cancel, true));
67636     }
67637
67638     function keybindingOff() {
67639         d3_select(document)
67640             .call(keybinding.off);
67641     }
67642
67643     function tryAgain() {
67644         keybindingOff();
67645         dispatch$$1.call('save');
67646     }
67647
67648     function cancel() {
67649         keybindingOff();
67650         dispatch$$1.call('cancel');
67651     }
67652
67653
67654     function conflicts(selection$$1) {
67655         keybindingOn();
67656
67657         var headerEnter = selection$$1.selectAll('.header')
67658             .data([0])
67659             .enter()
67660             .append('div')
67661             .attr('class', 'header fillL');
67662
67663         headerEnter
67664             .append('button')
67665             .attr('class', 'fr')
67666             .on('click', cancel)
67667             .call(svgIcon('#icon-close'));
67668
67669         headerEnter
67670             .append('h3')
67671             .text(t('save.conflict.header'));
67672
67673         var bodyEnter = selection$$1.selectAll('.body')
67674             .data([0])
67675             .enter()
67676             .append('div')
67677             .attr('class', 'body fillL');
67678
67679         var conflictsHelpEnter = bodyEnter
67680             .append('div')
67681             .attr('class', 'conflicts-help')
67682             .text(t('save.conflict.help'));
67683
67684
67685         // Download changes link
67686         var detected = utilDetect();
67687         var changeset = new osmChangeset();
67688
67689         delete changeset.id;  // Export without changeset_id
67690
67691         var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
67692         var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
67693         var fileName = 'changes.osc';
67694
67695         var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
67696             .append('a')
67697             .attr('class', 'download-changes');
67698
67699         if (detected.download) {      // All except IE11 and Edge
67700             linkEnter                 // download the data as a file
67701                 .attr('href', window.URL.createObjectURL(blob))
67702                 .attr('download', fileName);
67703
67704         } else {                      // IE11 and Edge
67705             linkEnter                 // open data uri in a new tab
67706                 .attr('target', '_blank')
67707                 .on('click.download', function() {
67708                     navigator.msSaveBlob(blob, fileName);
67709                 });
67710         }
67711
67712         linkEnter
67713             .call(svgIcon('#icon-load', 'inline'))
67714             .append('span')
67715             .text(t('save.conflict.download_changes'));
67716
67717
67718         bodyEnter
67719             .append('div')
67720             .attr('class', 'conflict-container fillL3')
67721             .call(showConflict, 0);
67722
67723         bodyEnter
67724             .append('div')
67725             .attr('class', 'conflicts-done')
67726             .attr('opacity', 0)
67727             .style('display', 'none')
67728             .text(t('save.conflict.done'));
67729
67730         var buttonsEnter = bodyEnter
67731             .append('div')
67732             .attr('class','buttons col12 joined conflicts-buttons');
67733
67734         buttonsEnter
67735             .append('button')
67736             .attr('disabled', _conflictList.length > 1)
67737             .attr('class', 'action conflicts-button col6')
67738             .text(t('save.title'))
67739             .on('click.try_again', tryAgain);
67740
67741         buttonsEnter
67742             .append('button')
67743             .attr('class', 'secondary-action conflicts-button col6')
67744             .text(t('confirm.cancel'))
67745             .on('click.cancel', cancel);
67746     }
67747
67748
67749     function showConflict(selection$$1, index) {
67750         index = utilWrap(index, _conflictList.length);
67751
67752         var parent = d3_select(selection$$1.node().parentNode);
67753
67754         // enable save button if this is the last conflict being reviewed..
67755         if (index === _conflictList.length - 1) {
67756             window.setTimeout(function() {
67757                 parent.select('.conflicts-button')
67758                     .attr('disabled', null);
67759
67760                 parent.select('.conflicts-done')
67761                     .transition()
67762                     .attr('opacity', 1)
67763                     .style('display', 'block');
67764             }, 250);
67765         }
67766
67767         var conflict = selection$$1
67768             .selectAll('.conflict')
67769             .data([_conflictList[index]]);
67770
67771         conflict.exit()
67772             .remove();
67773
67774         var conflictEnter = conflict.enter()
67775             .append('div')
67776             .attr('class', 'conflict');
67777
67778         conflictEnter
67779             .append('h4')
67780             .attr('class', 'conflict-count')
67781             .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
67782
67783         conflictEnter
67784             .append('a')
67785             .attr('class', 'conflict-description')
67786             .attr('href', '#')
67787             .text(function(d) { return d.name; })
67788             .on('click', function(d) {
67789                 event.preventDefault();
67790                 zoomToEntity(d.id);
67791             });
67792
67793         var details = conflictEnter
67794             .append('div')
67795             .attr('class', 'conflict-detail-container');
67796
67797         details
67798             .append('ul')
67799             .attr('class', 'conflict-detail-list')
67800             .selectAll('li')
67801             .data(function(d) { return d.details || []; })
67802             .enter()
67803             .append('li')
67804             .attr('class', 'conflict-detail-item')
67805             .html(function(d) { return d; });
67806
67807         details
67808             .append('div')
67809             .attr('class', 'conflict-choices')
67810             .call(addChoices);
67811
67812         details
67813             .append('div')
67814             .attr('class', 'conflict-nav-buttons joined cf')
67815             .selectAll('button')
67816             .data(['previous', 'next'])
67817             .enter()
67818             .append('button')
67819             .text(function(d) { return t('save.conflict.' + d); })
67820             .attr('class', 'conflict-nav-button action col6')
67821             .attr('disabled', function(d, i) {
67822                 return (i === 0 && index === 0) ||
67823                     (i === 1 && index === _conflictList.length - 1) || null;
67824             })
67825             .on('click', function(d, i) {
67826                 event.preventDefault();
67827
67828                 var container = parent.selectAll('.conflict-container');
67829                 var sign = (i === 0 ? -1 : 1);
67830
67831                 container
67832                     .selectAll('.conflict')
67833                     .remove();
67834
67835                 container
67836                     .call(showConflict, index + sign);
67837             });
67838
67839     }
67840
67841
67842     function addChoices(selection$$1) {
67843         var choices = selection$$1
67844             .append('ul')
67845             .attr('class', 'layer-list')
67846             .selectAll('li')
67847             .data(function(d) { return d.choices || []; });
67848
67849         // enter
67850         var choicesEnter = choices.enter()
67851             .append('li')
67852             .attr('class', 'layer');
67853
67854         var labelEnter = choicesEnter
67855             .append('label');
67856
67857         labelEnter
67858             .append('input')
67859             .attr('type', 'radio')
67860             .attr('name', function(d) { return d.id; })
67861             .on('change', function(d, i) {
67862                 var ul = this.parentNode.parentNode.parentNode;
67863                 ul.__data__.chosen = i;
67864                 choose(ul, d);
67865             });
67866
67867         labelEnter
67868             .append('span')
67869             .text(function(d) { return d.text; });
67870
67871         // update
67872         choicesEnter
67873             .merge(choices)
67874             .each(function(d, i) {
67875                 var ul = this.parentNode;
67876                 if (ul.__data__.chosen === i) {
67877                     choose(ul, d);
67878                 }
67879             });
67880     }
67881
67882
67883     function choose(ul, datum) {
67884         if (event) event.preventDefault();
67885
67886         d3_select(ul)
67887             .selectAll('li')
67888             .classed('active', function(d) { return d === datum; })
67889             .selectAll('input')
67890             .property('checked', function(d) { return d === datum; });
67891
67892         var extent = geoExtent$$1();
67893         var entity;
67894
67895         entity = context.graph().hasEntity(datum.id);
67896         if (entity) extent._extend(entity.extent(context.graph()));
67897
67898         datum.action();
67899
67900         entity = context.graph().hasEntity(datum.id);
67901         if (entity) extent._extend(entity.extent(context.graph()));
67902
67903         zoomToEntity(datum.id, extent);
67904     }
67905
67906
67907     function zoomToEntity(id, extent) {
67908         context.surface().selectAll('.hover')
67909             .classed('hover', false);
67910
67911         var entity = context.graph().hasEntity(id);
67912         if (entity) {
67913             if (extent) {
67914                 context.map().trimmedExtent(extent);
67915             } else {
67916                 context.map().zoomTo(entity);
67917             }
67918             context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
67919                 .classed('hover', true);
67920         }
67921     }
67922
67923
67924     // The conflict list should be an array of objects like:
67925     // {
67926     //     id: id,
67927     //     name: entityName(local),
67928     //     details: merge.conflicts(),
67929     //     chosen: 1,
67930     //     choices: [
67931     //         choice(id, keepMine, forceLocal),
67932     //         choice(id, keepTheirs, forceRemote)
67933     //     ]
67934     // }
67935     conflicts.conflictList = function(_) {
67936         if (!arguments.length) return _conflictList;
67937         _conflictList = _;
67938         return conflicts;
67939     };
67940
67941
67942     conflicts.origChanges = function(_) {
67943         if (!arguments.length) return _origChanges;
67944         _origChanges = _;
67945         return conflicts;
67946     };
67947
67948
67949     return utilRebind(conflicts, dispatch$$1, 'on');
67950 }
67951
67952 function uiEditMenu(context, operations) {
67953     var menu,
67954         center = [0, 0],
67955         offset = [0, 0],
67956         tooltip;
67957
67958     var p = 8,               // top padding
67959         m = 4,               // top margin
67960         h = 15,              // height of icon
67961         vpBottomMargin = 45, // viewport bottom margin
67962         vpSideMargin = 35,   // viewport side margin
67963         buttonWidth = 44,
67964         buttonHeight = (2 * p + h),
67965         menuWidth = buttonWidth,
67966         menuHeight = (2 * m) + operations.length * buttonHeight,
67967         menuSideMargin = 10,
67968         tooltipWidth = 200,
67969         tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
67970
67971
67972     var editMenu = function (selection$$1) {
67973         if (!operations.length) return;
67974
67975         selection$$1.node().parentNode.focus();
67976
67977         var isRTL = textDirection === 'rtl',
67978             viewport = context.surfaceRect();
67979
67980         if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
67981             // menu is going left-to-right and near right viewport edge, go left instead
67982             isRTL = true;
67983         } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
67984             // menu is going right-to-left and near left viewport edge, go right instead
67985             isRTL = false;
67986         }
67987
67988         offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
67989
67990         if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
67991             // menu is near bottom viewport edge, shift upwards
67992             offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
67993         }
67994
67995         var origin = [ center[0] + offset[0], center[1] + offset[1] ];
67996
67997         menu = selection$$1
67998             .append('g')
67999             .attr('class', 'edit-menu')
68000             .attr('transform', 'translate(' + origin + ')')
68001             .attr('opacity', 0);
68002
68003         menu
68004             .transition()
68005             .attr('opacity', 1);
68006
68007         menu
68008             .append('rect')
68009             .attr('class', 'edit-menu-background')
68010             .attr('x', 4)
68011             .attr('rx', 4)
68012             .attr('ry', 4)
68013             .attr('width', menuWidth)
68014             .attr('height', menuHeight)
68015             .attr('stroke-linecap', 'round');
68016
68017
68018         var button = menu.selectAll('.edit-menu-item')
68019             .data(operations)
68020             .enter()
68021             .append('g')
68022             .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
68023             .classed('disabled', function (d) { return d.disabled(); })
68024             .attr('transform', function (d, i) {
68025                 return 'translate(' + geoVecFloor([
68026                     0,
68027                     m + i * buttonHeight
68028                 ]).join(',') + ')';
68029             });
68030
68031         button
68032             .append('rect')
68033             .attr('x', 4)
68034             .attr('width', buttonWidth)
68035             .attr('height', buttonHeight)
68036             .on('click', click)
68037             .on('mousedown', mousedown)
68038             .on('mouseover', mouseover)
68039             .on('mouseout', mouseout);
68040
68041         button
68042             .append('use')
68043             .attr('width', '20')
68044             .attr('height', '20')
68045             .attr('transform', function () {
68046                 return 'translate(' + [2 * p, 5] + ')';
68047             })
68048             .attr('xlink:href', function (d) { return '#operation-' + d.id; });
68049
68050         tooltip = d3_select(document.body)
68051             .append('div')
68052             .attr('class', 'tooltip-inner edit-menu-tooltip');
68053
68054
68055         function click(operation) {
68056             event.stopPropagation();
68057             if (operation.disabled()) return;
68058             operation();
68059             editMenu.close();
68060         }
68061
68062         function mousedown() {
68063             event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
68064         }
68065
68066         function mouseover(d, i) {
68067             var tipX, tipY;
68068
68069             if (!isRTL) {
68070                 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
68071             } else {
68072                 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
68073             }
68074
68075             if (tipX + tooltipWidth > viewport.right) {
68076                 // tip is going left-to-right and near right viewport edge, go left instead
68077                 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
68078             } else if (tipX < viewport.left) {
68079                 // tip is going right-to-left and near left viewport edge, go right instead
68080                 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
68081             }
68082
68083             tipY = viewport.top + origin[1] + (i * buttonHeight);
68084             if (tipY + tooltipHeight > viewport.bottom) {
68085                 // tip is near bottom viewport edge, shift upwards
68086                 tipY -= tipY + tooltipHeight - viewport.bottom;
68087             }
68088
68089             tooltip
68090                 .style('left', tipX + 'px')
68091                 .style('top', tipY + 'px')
68092                 .style('display', 'block')
68093                 .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
68094         }
68095
68096         function mouseout() {
68097             tooltip.style('display', 'none');
68098         }
68099     };
68100
68101
68102     editMenu.close = function () {
68103         if (menu) {
68104             menu
68105                 .style('pointer-events', 'none')
68106                 .transition()
68107                 .attr('opacity', 0)
68108                 .remove();
68109         }
68110
68111         if (tooltip) {
68112             tooltip.remove();
68113         }
68114     };
68115
68116
68117     editMenu.center = function (_) {
68118         if (!arguments.length) return center;
68119         center = _;
68120         return editMenu;
68121     };
68122
68123
68124     return editMenu;
68125 }
68126
68127 var _flashTimer;
68128
68129
68130 function uiFlash() {
68131     var _duration = 2000;
68132     var _iconName = '#icon-no';
68133     var _iconClass = 'disabled';
68134     var _text = '';
68135     var _textClass;
68136
68137
68138     function flash() {
68139         if (_flashTimer) {
68140             _flashTimer.stop();
68141         }
68142
68143         d3_select('#footer-wrap')
68144             .attr('class', 'footer-hide');
68145         d3_select('#flash-wrap')
68146             .attr('class', 'footer-show');
68147
68148         var content = d3_select('#flash-wrap').selectAll('.flash-content')
68149             .data([0]);
68150
68151         // Enter
68152         var contentEnter = content.enter()
68153             .append('div')
68154             .attr('class', 'flash-content');
68155
68156         var iconEnter = contentEnter
68157             .append('svg')
68158             .attr('class', 'flash-icon')
68159             .append('g')
68160             .attr('transform', 'translate(10,10)');
68161
68162         iconEnter
68163             .append('circle')
68164             .attr('r', 9);
68165
68166         iconEnter
68167             .append('use')
68168             .attr('transform', 'translate(-7,-7)')
68169             .attr('width', '14')
68170             .attr('height', '14');
68171
68172         contentEnter
68173             .append('div')
68174             .attr('class', 'flash-text');
68175
68176
68177         // Update
68178         content = content
68179             .merge(contentEnter);
68180
68181         content
68182             .selectAll('.flash-icon')
68183             .attr('class', 'flash-icon ' + (_iconClass || ''));
68184
68185         content
68186             .selectAll('.flash-icon use')
68187             .attr('xlink:href', _iconName);
68188
68189         content
68190             .selectAll('.flash-text')
68191             .attr('class', 'flash-text ' + (_textClass || ''))
68192             .text(_text);
68193
68194
68195         _flashTimer = d3_timeout(function() {
68196             _flashTimer = null;
68197             d3_select('#footer-wrap')
68198                 .attr('class', 'footer-show');
68199             d3_select('#flash-wrap')
68200                 .attr('class', 'footer-hide');
68201         }, _duration);
68202
68203         return content;
68204     }
68205
68206
68207     flash.duration = function(_) {
68208         if (!arguments.length) return _duration;
68209         _duration = _;
68210         return flash;
68211     };
68212
68213     flash.text = function(_) {
68214         if (!arguments.length) return _text;
68215         _text = _;
68216         return flash;
68217     };
68218
68219     flash.textClass = function(_) {
68220         if (!arguments.length) return _textClass;
68221         _textClass = _;
68222         return flash;
68223     };
68224
68225     flash.iconName = function(_) {
68226         if (!arguments.length) return _iconName;
68227         _iconName = _;
68228         return flash;
68229     };
68230
68231     flash.iconClass = function(_) {
68232         if (!arguments.length) return _iconClass;
68233         _iconClass = _;
68234         return flash;
68235     };
68236
68237     return flash;
68238 }
68239
68240 function uiLasso(context) {
68241     var group, polygon;
68242
68243     lasso.coordinates = [];
68244
68245     function lasso(selection$$1) {
68246         context.container()
68247             .classed('lasso', true);
68248
68249         group = selection$$1
68250             .append('g')
68251             .attr('class', 'lasso hide');
68252
68253         polygon = group
68254             .append('path')
68255             .attr('class', 'lasso-path');
68256
68257         group
68258             .call(uiToggle(true));
68259     }
68260
68261
68262     function draw() {
68263         if (polygon) {
68264             polygon.data([lasso.coordinates])
68265                 .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
68266         }
68267     }
68268
68269
68270     lasso.extent = function () {
68271         return lasso.coordinates.reduce(function(extent, point$$1) {
68272             return extent.extend(geoExtent$$1(point$$1));
68273         }, geoExtent$$1());
68274     };
68275
68276
68277     lasso.p = function(_) {
68278         if (!arguments.length) return lasso;
68279         lasso.coordinates.push(_);
68280         draw();
68281         return lasso;
68282     };
68283
68284
68285     lasso.close = function() {
68286         if (group) {
68287             group.call(uiToggle(false, function() {
68288                 d3_select(this).remove();
68289             }));
68290         }
68291         context.container().classed('lasso', false);
68292     };
68293
68294
68295     return lasso;
68296 }
68297
68298 function uiRadialMenu(context, operations) {
68299     var menu,
68300         center = [0, 0],
68301         tooltip;
68302
68303
68304     var radialMenu = function(selection$$1) {
68305         if (!operations.length) return;
68306
68307         selection$$1.node().parentNode.focus();
68308
68309         function click(operation) {
68310             event.stopPropagation();
68311             if (operation.disabled()) return;
68312             operation();
68313             radialMenu.close();
68314         }
68315
68316         menu = selection$$1
68317             .append('g')
68318             .attr('class', 'radial-menu')
68319             .attr('transform', 'translate(' + center + ')')
68320             .attr('opacity', 0);
68321
68322         menu
68323             .transition()
68324             .attr('opacity', 1);
68325
68326         var r = 50,
68327             a = Math.PI / 4,
68328             a0 = -Math.PI / 4,
68329             a1 = a0 + (operations.length - 1) * a;
68330
68331         menu
68332             .append('path')
68333             .attr('class', 'radial-menu-background')
68334             .attr('d', 'M' + r * Math.sin(a0) + ',' +
68335                              r * Math.cos(a0) +
68336                       ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
68337                              (r * Math.sin(a1) + 1e-3) + ',' +
68338                              (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
68339             .attr('stroke-width', 50)
68340             .attr('stroke-linecap', 'round');
68341
68342         var button = menu.selectAll()
68343             .data(operations)
68344             .enter()
68345             .append('g')
68346             .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
68347             .classed('disabled', function(d) { return d.disabled(); })
68348             .attr('transform', function(d, i) {
68349                 return 'translate(' + geoVecFloor([
68350                         r * Math.sin(a0 + i * a),
68351                         r * Math.cos(a0 + i * a)]).join(',') + ')';
68352             });
68353
68354         button
68355             .append('circle')
68356             .attr('r', 15)
68357             .on('click', click)
68358             .on('mousedown', mousedown)
68359             .on('mouseover', mouseover)
68360             .on('mouseout', mouseout);
68361
68362         button
68363             .append('use')
68364             .attr('transform', 'translate(-10,-10)')
68365             .attr('width', '20')
68366             .attr('height', '20')
68367             .attr('xlink:href', function(d) { return '#operation-' + d.id; });
68368
68369         tooltip = d3_select(document.body)
68370             .append('div')
68371             .attr('class', 'tooltip-inner radial-menu-tooltip');
68372
68373         function mousedown() {
68374             event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
68375         }
68376
68377         function mouseover(d, i) {
68378             var rect = context.surfaceRect(),
68379                 angle = a0 + i * a,
68380                 top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px',
68381                 left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px',
68382                 bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px',
68383                 right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
68384
68385             tooltip
68386                 .style('top', null)
68387                 .style('left', null)
68388                 .style('bottom', null)
68389                 .style('right', null)
68390                 .style('display', 'block')
68391                 .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
68392
68393             if (i === 0) {
68394                 tooltip
68395                     .style('right', right)
68396                     .style('top', top);
68397             } else if (i >= 4) {
68398                 tooltip
68399                     .style('left', left)
68400                     .style('bottom', bottom);
68401             } else {
68402                 tooltip
68403                     .style('left', left)
68404                     .style('top', top);
68405             }
68406         }
68407
68408         function mouseout() {
68409             tooltip.style('display', 'none');
68410         }
68411     };
68412
68413
68414     radialMenu.close = function() {
68415         if (menu) {
68416             menu
68417                 .style('pointer-events', 'none')
68418                 .transition()
68419                 .attr('opacity', 0)
68420                 .remove();
68421         }
68422
68423         if (tooltip) {
68424             tooltip.remove();
68425         }
68426     };
68427
68428
68429     radialMenu.center = function(_) {
68430         if (!arguments.length) return center;
68431         center = _;
68432         return radialMenu;
68433     };
68434
68435
68436     return radialMenu;
68437 }
68438
68439 function uiSelectionList(context, selectedIDs) {
68440
68441     function selectEntity(entity) {
68442         context.enter(modeSelect(context, [entity.id]));
68443     }
68444
68445
68446     function deselectEntity(entity) {
68447         event.stopPropagation();
68448         var index = selectedIDs.indexOf(entity.id);
68449         if (index > -1) {
68450             selectedIDs.splice(index, 1);
68451         }
68452         context.enter(modeSelect(context, selectedIDs));
68453     }
68454
68455
68456     function selectionList(selection$$1) {
68457         selection$$1.classed('selection-list-pane', true);
68458
68459         var header = selection$$1
68460             .append('div')
68461             .attr('class', 'header fillL cf');
68462
68463         header
68464             .append('h3')
68465             .text(t('inspector.multiselect'));
68466
68467         var listWrap = selection$$1
68468             .append('div')
68469             .attr('class', 'inspector-body');
68470
68471         var list = listWrap
68472             .append('div')
68473             .attr('class', 'feature-list cf');
68474
68475         context.history().on('change.selection-list', drawList);
68476         drawList();
68477
68478
68479         function drawList() {
68480             var entities = selectedIDs
68481                 .map(function(id) { return context.hasEntity(id); })
68482                 .filter(function(entity) { return entity; });
68483
68484             var items = list.selectAll('.feature-list-item')
68485                 .data(entities, osmEntity$$1.key);
68486
68487             items.exit()
68488                 .remove();
68489
68490             // Enter
68491             var enter = items.enter()
68492                 .append('div')
68493                 .attr('class', 'feature-list-item')
68494                 .on('click', selectEntity);
68495
68496             var label = enter
68497                 .append('button')
68498                 .attr('class', 'label');
68499
68500             enter
68501                 .append('button')
68502                 .attr('class', 'close')
68503                 .on('click', deselectEntity)
68504                 .call(svgIcon('#icon-close'));
68505
68506             label
68507                 .append('span')
68508                 .attr('class', 'entity-geom-icon')
68509                 .call(svgIcon('', 'pre-text'));
68510
68511             label
68512                 .append('span')
68513                 .attr('class', 'entity-type');
68514
68515             label
68516                 .append('span')
68517                 .attr('class', 'entity-name');
68518
68519             // Update
68520             items = items.merge(enter);
68521
68522             items.selectAll('.entity-geom-icon use')
68523                 .attr('href', function() {
68524                     var entity = this.parentNode.parentNode.__data__;
68525                     return '#icon-' + context.geometry(entity.id);
68526                 });
68527
68528             items.selectAll('.entity-type')
68529                 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
68530
68531             items.selectAll('.entity-name')
68532                 .text(function(entity) { return utilDisplayName(entity); });
68533         }
68534     }
68535
68536     return selectionList;
68537 }
68538
68539 function uiSourceSwitch(context) {
68540     var keys;
68541
68542
68543     function click() {
68544         event.preventDefault();
68545
68546         var osm = context.connection();
68547         if (!osm) return;
68548
68549         if (context.inIntro()) return;
68550
68551         if (context.history().hasChanges() &&
68552             !window.confirm(t('source_switch.lose_changes'))) return;
68553
68554         var isLive = d3_select(this)
68555             .classed('live');
68556
68557         isLive = !isLive;
68558         context.enter(modeBrowse(context));
68559         context.history().clearSaved();          // remove saved history
68560         context.flush();                         // remove stored data
68561
68562         d3_select(this)
68563             .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
68564             .classed('live', isLive);
68565
68566         osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
68567     }
68568
68569     var sourceSwitch = function(selection$$1) {
68570         selection$$1
68571             .append('a')
68572             .attr('href', '#')
68573             .text(t('source_switch.live'))
68574             .classed('live', true)
68575             .attr('tabindex', -1)
68576             .on('click', click);
68577     };
68578
68579
68580     sourceSwitch.keys = function(_) {
68581         if (!arguments.length) return keys;
68582         keys = _;
68583         return sourceSwitch;
68584     };
68585
68586
68587     return sourceSwitch;
68588 }
68589
68590 function uiSuccess(context) {
68591     var dispatch$$1 = dispatch('cancel'),
68592         changeset;
68593
68594
68595     function success(selection$$1) {
68596         var header = selection$$1
68597             .append('div')
68598             .attr('class', 'header fillL');
68599
68600         header
68601             .append('button')
68602             .attr('class', 'fr')
68603             .on('click', function() { dispatch$$1.call('cancel'); })
68604             .call(svgIcon('#icon-close'));
68605
68606         header
68607             .append('h3')
68608             .text(t('success.just_edited'));
68609
68610         var body = selection$$1
68611             .append('div')
68612             .attr('class', 'body save-success fillL');
68613
68614         body
68615             .append('p')
68616             .html(t('success.help_html'));
68617
68618         body
68619             .append('a')
68620             .attr('class', 'details')
68621             .attr('target', '_blank')
68622             .attr('tabindex', -1)
68623             .call(svgIcon('#icon-out-link', 'inline'))
68624             .attr('href', t('success.help_link_url'))
68625             .append('span')
68626             .text(t('success.help_link_text'));
68627
68628         var osm = context.connection();
68629         if (!osm) return;
68630
68631         var changesetURL = osm.changesetURL(changeset.id);
68632
68633         var viewOnOsm = body
68634             .append('a')
68635             .attr('class', 'button col12 osm')
68636             .attr('target', '_blank')
68637             .attr('href', changesetURL);
68638
68639         viewOnOsm
68640             .append('svg')
68641             .attr('class', 'logo logo-osm')
68642             .append('use')
68643             .attr('xlink:href', '#logo-osm');
68644
68645         viewOnOsm
68646             .append('div')
68647             .text(t('success.view_on_osm'));
68648
68649         var message = (changeset.tags.comment || t('success.edited_osm')).substring(0, 130) +
68650             ' ' + changesetURL;
68651
68652         var sharing = [
68653             { key: 'facebook', value: 'https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(changesetURL) },
68654             { key: 'twitter', value: 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message) },
68655             { key: 'google', value: 'https://plus.google.com/share?url=' + encodeURIComponent(changesetURL) }
68656         ];
68657
68658         body.selectAll('.button.social')
68659             .data(sharing)
68660             .enter()
68661             .append('a')
68662             .attr('class', 'button social col4')
68663             .attr('target', '_blank')
68664             .attr('href', function(d) { return d.value; })
68665             .call(tooltip()
68666                 .title(function(d) { return t('success.' + d.key); })
68667                 .placement('bottom'))
68668             .each(function(d) { d3_select(this).call(svgIcon('#logo-' + d.key, 'social')); });
68669     }
68670
68671
68672     success.changeset = function(_) {
68673         if (!arguments.length) return changeset;
68674         changeset = _;
68675         return success;
68676     };
68677
68678
68679     return utilRebind(success, dispatch$$1, 'on');
68680 }
68681
68682 function coreHistory(context) {
68683     var imageryUsed = ['Bing'];
68684     var dispatch$$1 = dispatch('change', 'undone', 'redone');
68685     var lock = utilSessionMutex('lock');
68686     var duration = 150;
68687     var _checkpoints = {};
68688     var _stack;
68689     var _index;
68690     var _tree;
68691
68692
68693     // internal _act, accepts list of actions and eased time
68694     function _act(actions, t) {
68695         actions = Array.prototype.slice.call(actions);
68696
68697         var annotation;
68698         if (!isFunction(actions[actions.length - 1])) {
68699             annotation = actions.pop();
68700         }
68701
68702         _stack[_index].transform = context.projection.transform();
68703         _stack[_index].selectedIDs = context.selectedIDs();
68704
68705         var graph = _stack[_index].graph;
68706         for (var i = 0; i < actions.length; i++) {
68707             graph = actions[i](graph, t);
68708         }
68709
68710         return {
68711             graph: graph,
68712             annotation: annotation,
68713             imageryUsed: imageryUsed
68714         };
68715     }
68716
68717
68718     // internal _perform with eased time
68719     function _perform(args, t) {
68720         var previous = _stack[_index].graph;
68721         _stack = _stack.slice(0, _index + 1);
68722         _stack.push(_act(args, t));
68723         _index++;
68724         return change(previous);
68725     }
68726
68727
68728     // internal _replace with eased time
68729     function _replace(args, t) {
68730         var previous = _stack[_index].graph;
68731         // assert(_index == _stack.length - 1)
68732         _stack[_index] = _act(args, t);
68733         return change(previous);
68734     }
68735
68736
68737     // internal _overwrite with eased time
68738     function _overwrite(args, t) {
68739         var previous = _stack[_index].graph;
68740         if (_index > 0) {
68741             _index--;
68742             _stack.pop();
68743         }
68744         _stack = _stack.slice(0, _index + 1);
68745         _stack.push(_act(args, t));
68746         _index++;
68747         return change(previous);
68748     }
68749
68750
68751     // determine diffrence and dispatch a change event
68752     function change(previous) {
68753         var difference$$1 = coreDifference(previous, history.graph());
68754         dispatch$$1.call('change', this, difference$$1);
68755         return difference$$1;
68756     }
68757
68758
68759     // iD uses namespaced keys so multiple installations do not conflict
68760     function getKey(n) {
68761         return 'iD_' + window.location.origin + '_' + n;
68762     }
68763
68764
68765     var history = {
68766
68767         graph: function() {
68768             return _stack[_index].graph;
68769         },
68770
68771
68772         base: function() {
68773             return _stack[0].graph;
68774         },
68775
68776
68777         merge: function(entities, extent) {
68778             _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
68779             _tree.rebase(entities, false);
68780
68781             dispatch$$1.call('change', this, undefined, extent);
68782         },
68783
68784
68785         perform: function() {
68786             // complete any transition already in progress
68787             d3_select(document).interrupt('history.perform');
68788
68789             var transitionable = false;
68790             var action0 = arguments[0];
68791
68792             if (arguments.length === 1 ||
68793                 arguments.length === 2 && !isFunction(arguments[1])) {
68794                 transitionable = !!action0.transitionable;
68795             }
68796
68797             if (transitionable) {
68798                 var origArguments = arguments;
68799                 d3_select(document)
68800                     .transition('history.perform')
68801                     .duration(duration)
68802                     .ease(linear$1)
68803                     .tween('history.tween', function() {
68804                         return function(t) {
68805                             if (t < 1) _overwrite([action0], t);
68806                         };
68807                     })
68808                     .on('start', function() {
68809                         _perform([action0], 0);
68810                     })
68811                     .on('end interrupt', function() {
68812                         _overwrite(origArguments, 1);
68813                     });
68814
68815             } else {
68816                 return _perform(arguments);
68817             }
68818         },
68819
68820
68821         replace: function() {
68822             d3_select(document).interrupt('history.perform');
68823             return _replace(arguments, 1);
68824         },
68825
68826
68827         // Same as calling pop and then perform
68828         overwrite: function() {
68829             d3_select(document).interrupt('history.perform');
68830             return _overwrite(arguments, 1);
68831         },
68832
68833
68834         pop: function(n) {
68835             d3_select(document).interrupt('history.perform');
68836
68837             var previous = _stack[_index].graph;
68838             if (isNaN(+n) || +n < 0) {
68839                 n = 1;
68840             }
68841             while (n-- > 0 && _index > 0) {
68842                 _index--;
68843                 _stack.pop();
68844             }
68845             return change(previous);
68846         },
68847
68848
68849         // Back to the previous annotated state or _index = 0.
68850         undo: function() {
68851             d3_select(document).interrupt('history.perform');
68852
68853             var previous = _stack[_index].graph;
68854             while (_index > 0) {
68855                 _index--;
68856                 if (_stack[_index].annotation) break;
68857             }
68858
68859             dispatch$$1.call('undone', this, _stack[_index]);
68860             return change(previous);
68861         },
68862
68863
68864         // Forward to the next annotated state.
68865         redo: function() {
68866             d3_select(document).interrupt('history.perform');
68867
68868             var previous = _stack[_index].graph;
68869             var tryIndex = _index;
68870             while (tryIndex < _stack.length - 1) {
68871                 tryIndex++;
68872                 if (_stack[tryIndex].annotation) {
68873                     _index = tryIndex;
68874                     dispatch$$1.call('redone', this, _stack[_index]);
68875                     break;
68876                 }
68877             }
68878
68879             return change(previous);
68880         },
68881
68882
68883         undoAnnotation: function() {
68884             var i = _index;
68885             while (i >= 0) {
68886                 if (_stack[i].annotation) return _stack[i].annotation;
68887                 i--;
68888             }
68889         },
68890
68891
68892         redoAnnotation: function() {
68893             var i = _index + 1;
68894             while (i <= _stack.length - 1) {
68895                 if (_stack[i].annotation) return _stack[i].annotation;
68896                 i++;
68897             }
68898         },
68899
68900
68901         intersects: function(extent) {
68902             return _tree.intersects(extent, _stack[_index].graph);
68903         },
68904
68905
68906         difference: function() {
68907             var base = _stack[0].graph;
68908             var head = _stack[_index].graph;
68909             return coreDifference(base, head);
68910         },
68911
68912
68913         changes: function(action) {
68914             var base = _stack[0].graph;
68915             var head = _stack[_index].graph;
68916
68917             if (action) {
68918                 head = action(head);
68919             }
68920
68921             var difference$$1 = coreDifference(base, head);
68922
68923             return {
68924                 modified: difference$$1.modified(),
68925                 created: difference$$1.created(),
68926                 deleted: difference$$1.deleted()
68927             };
68928         },
68929
68930
68931         validate: function(changes) {
68932             return flatten(
68933                 map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
68934             );
68935         },
68936
68937
68938         hasChanges: function() {
68939             return this.difference().length() > 0;
68940         },
68941
68942
68943         imageryUsed: function(sources) {
68944             if (sources) {
68945                 imageryUsed = sources;
68946                 return history;
68947             } else {
68948                 var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
68949                 return without(uniq(flatten(arr)), 'Custom');
68950             }
68951         },
68952
68953
68954         // save the current history state
68955         checkpoint: function(key) {
68956             _checkpoints[key] = {
68957                 stack: cloneDeep(_stack),
68958                 index: _index
68959             };
68960             return history;
68961         },
68962
68963
68964         // restore history state to a given checkpoint or reset completely
68965         reset: function(key) {
68966             if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
68967                 _stack = cloneDeep(_checkpoints[key].stack);
68968                 _index = _checkpoints[key].index;
68969             } else {
68970                 _stack = [{graph: coreGraph$$1()}];
68971                 _index = 0;
68972                 _tree = coreTree(_stack[0].graph);
68973                 _checkpoints = {};
68974             }
68975             dispatch$$1.call('change');
68976             return history;
68977         },
68978
68979
68980         toIntroGraph: function() {
68981             var nextId = { n: 0, r: 0, w: 0 };
68982             var permIds = {};
68983             var graph = this.graph();
68984             var baseEntities = {};
68985
68986             // clone base entities..
68987             forEach(graph.base().entities, function(entity) {
68988                 var copy = cloneDeepWith(entity, customizer);
68989                 baseEntities[copy.id] = copy;
68990             });
68991
68992             // replace base entities with head entities..
68993             forEach(graph.entities, function(entity, id) {
68994                 if (entity) {
68995                     var copy = cloneDeepWith(entity, customizer);
68996                     baseEntities[copy.id] = copy;
68997                 } else {
68998                     delete baseEntities[id];
68999                 }
69000             });
69001
69002             // swap temporary for permanent ids..
69003             forEach(baseEntities, function(entity) {
69004                 if (Array.isArray(entity.nodes)) {
69005                     entity.nodes = entity.nodes.map(function(node) {
69006                         return permIds[node] || node;
69007                     });
69008                 }
69009                 if (Array.isArray(entity.members)) {
69010                     entity.members = entity.members.map(function(member) {
69011                         member.id = permIds[member.id] || member.id;
69012                         return member;
69013                     });
69014                 }
69015             });
69016
69017             return JSON.stringify({ dataIntroGraph: baseEntities });
69018
69019
69020             function customizer(src) {
69021                 var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
69022                 if (isEmpty(copy.tags)) {
69023                     delete copy.tags;
69024                 }
69025
69026                 if (Array.isArray(copy.loc)) {
69027                     copy.loc[0] = +copy.loc[0].toFixed(6);
69028                     copy.loc[1] = +copy.loc[1].toFixed(6);
69029                 }
69030
69031                 var match = src.id.match(/([nrw])-\d*/);  // temporary id
69032                 if (match !== null) {
69033                     var nrw = match[1], permId;
69034                     do { permId = nrw + (++nextId[nrw]); }
69035                     while (baseEntities.hasOwnProperty(permId));
69036
69037                     copy.id = permIds[src.id] = permId;
69038                 }
69039                 return copy;
69040             }
69041         },
69042
69043
69044         toJSON: function() {
69045             if (!this.hasChanges()) return;
69046
69047             var allEntities = {};
69048             var baseEntities = {};
69049             var base = _stack[0];
69050
69051             var s = _stack.map(function(i) {
69052                 var modified = [], deleted = [];
69053
69054                 forEach(i.graph.entities, function(entity, id) {
69055                     if (entity) {
69056                         var key = osmEntity$$1.key(entity);
69057                         allEntities[key] = entity;
69058                         modified.push(key);
69059                     } else {
69060                         deleted.push(id);
69061                     }
69062
69063                     // make sure that the originals of changed or deleted entities get merged
69064                     // into the base of the _stack after restoring the data from JSON.
69065                     if (id in base.graph.entities) {
69066                         baseEntities[id] = base.graph.entities[id];
69067                     }
69068                     // get originals of parent entities too
69069                     forEach(base.graph._parentWays[id], function(parentId) {
69070                         if (parentId in base.graph.entities) {
69071                             baseEntities[parentId] = base.graph.entities[parentId];
69072                         }
69073                     });
69074                 });
69075
69076                 var x = {};
69077
69078                 if (modified.length) x.modified = modified;
69079                 if (deleted.length) x.deleted = deleted;
69080                 if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
69081                 if (i.annotation) x.annotation = i.annotation;
69082
69083                 return x;
69084             });
69085
69086             return JSON.stringify({
69087                 version: 3,
69088                 entities: values$1(allEntities),
69089                 baseEntities: values$1(baseEntities),
69090                 stack: s,
69091                 nextIDs: osmEntity$$1.id.next,
69092                 index: _index
69093             });
69094         },
69095
69096
69097         fromJSON: function(json, loadChildNodes) {
69098             var h = JSON.parse(json);
69099             var loadComplete = true;
69100
69101             osmEntity$$1.id.next = h.nextIDs;
69102             _index = h.index;
69103
69104             if (h.version === 2 || h.version === 3) {
69105                 var allEntities = {};
69106
69107                 h.entities.forEach(function(entity) {
69108                     allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
69109                 });
69110
69111                 if (h.version === 3) {
69112                     // This merges originals for changed entities into the base of
69113                     // the _stack even if the current _stack doesn't have them (for
69114                     // example when iD has been restarted in a different region)
69115                     var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
69116                     _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
69117                     _tree.rebase(baseEntities, true);
69118
69119                     // When we restore a modified way, we also need to fetch any missing
69120                     // childnodes that would normally have been downloaded with it.. #2142
69121                     if (loadChildNodes) {
69122                         var osm = context.connection();
69123                         var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
69124                         var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
69125
69126                         if (!isEmpty(missing) && osm) {
69127                             loadComplete = false;
69128                             context.redrawEnable(false);
69129
69130                             var loading = uiLoading(context).blocking(true);
69131                             context.container().call(loading);
69132
69133                             var childNodesLoaded = function(err, result) {
69134                                 if (!err) {
69135                                     var visible = groupBy(result.data, 'visible');
69136                                     if (!isEmpty(visible.true)) {
69137                                         missing = difference(missing, map$3(visible.true, 'id'));
69138                                         _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
69139                                         _tree.rebase(visible.true, true);
69140                                     }
69141
69142                                     // fetch older versions of nodes that were deleted..
69143                                     forEach(visible.false, function(entity) {
69144                                         osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
69145                                     });
69146                                 }
69147
69148                                 if (err || isEmpty(missing)) {
69149                                     loading.close();
69150                                     context.redrawEnable(true);
69151                                     dispatch$$1.call('change');
69152                                 }
69153                             };
69154
69155                             osm.loadMultiple(missing, childNodesLoaded);
69156                         }
69157                     }
69158                 }
69159
69160                 _stack = h.stack.map(function(d) {
69161                     var entities = {}, entity;
69162
69163                     if (d.modified) {
69164                         d.modified.forEach(function(key) {
69165                             entity = allEntities[key];
69166                             entities[entity.id] = entity;
69167                         });
69168                     }
69169
69170                     if (d.deleted) {
69171                         d.deleted.forEach(function(id) {
69172                             entities[id] = undefined;
69173                         });
69174                     }
69175
69176                     return {
69177                         graph: coreGraph$$1(_stack[0].graph).load(entities),
69178                         annotation: d.annotation,
69179                         imageryUsed: d.imageryUsed
69180                     };
69181                 });
69182
69183             } else { // original version
69184                 _stack = h.stack.map(function(d) {
69185                     var entities = {};
69186
69187                     for (var i in d.entities) {
69188                         var entity = d.entities[i];
69189                         entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
69190                     }
69191
69192                     d.graph = coreGraph$$1(_stack[0].graph).load(entities);
69193                     return d;
69194                 });
69195             }
69196
69197             if (loadComplete) {
69198                 dispatch$$1.call('change');
69199             }
69200
69201             return history;
69202         },
69203
69204
69205         save: function() {
69206             if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
69207             return history;
69208         },
69209
69210
69211         clearSaved: function() {
69212             context.debouncedSave.cancel();
69213             if (lock.locked()) context.storage(getKey('saved_history'), null);
69214             return history;
69215         },
69216
69217
69218         lock: function() {
69219             return lock.lock();
69220         },
69221
69222
69223         unlock: function() {
69224             lock.unlock();
69225         },
69226
69227
69228         // is iD not open in another window and it detects that
69229         // there's a history stored in localStorage that's recoverable?
69230         restorableChanges: function() {
69231             return lock.locked() && !!context.storage(getKey('saved_history'));
69232         },
69233
69234
69235         // load history from a version stored in localStorage
69236         restore: function() {
69237             if (!lock.locked()) return;
69238
69239             var json = context.storage(getKey('saved_history'));
69240             if (json) history.fromJSON(json, true);
69241         },
69242
69243
69244         _getKey: getKey
69245
69246     };
69247
69248
69249     history.reset();
69250
69251     return utilRebind(history, dispatch$$1, 'on');
69252 }
69253
69254 /** Used to store function metadata. */
69255 var metaMap = WeakMap && new WeakMap;
69256
69257 /**
69258  * The base implementation of `setData` without support for hot loop shorting.
69259  *
69260  * @private
69261  * @param {Function} func The function to associate metadata with.
69262  * @param {*} data The metadata.
69263  * @returns {Function} Returns `func`.
69264  */
69265 var baseSetData = !metaMap ? identity$8 : function(func, data) {
69266   metaMap.set(func, data);
69267   return func;
69268 };
69269
69270 /**
69271  * Creates a function that produces an instance of `Ctor` regardless of
69272  * whether it was invoked as part of a `new` expression or by `call` or `apply`.
69273  *
69274  * @private
69275  * @param {Function} Ctor The constructor to wrap.
69276  * @returns {Function} Returns the new wrapped function.
69277  */
69278 function createCtor(Ctor) {
69279   return function() {
69280     // Use a `switch` statement to work with class constructors. See
69281     // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
69282     // for more details.
69283     var args = arguments;
69284     switch (args.length) {
69285       case 0: return new Ctor;
69286       case 1: return new Ctor(args[0]);
69287       case 2: return new Ctor(args[0], args[1]);
69288       case 3: return new Ctor(args[0], args[1], args[2]);
69289       case 4: return new Ctor(args[0], args[1], args[2], args[3]);
69290       case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
69291       case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
69292       case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
69293     }
69294     var thisBinding = baseCreate(Ctor.prototype),
69295         result = Ctor.apply(thisBinding, args);
69296
69297     // Mimic the constructor's `return` behavior.
69298     // See https://es5.github.io/#x13.2.2 for more details.
69299     return isObject(result) ? result : thisBinding;
69300   };
69301 }
69302
69303 /** Used to compose bitmasks for function metadata. */
69304 var WRAP_BIND_FLAG = 1;
69305
69306 /**
69307  * Creates a function that wraps `func` to invoke it with the optional `this`
69308  * binding of `thisArg`.
69309  *
69310  * @private
69311  * @param {Function} func The function to wrap.
69312  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69313  * @param {*} [thisArg] The `this` binding of `func`.
69314  * @returns {Function} Returns the new wrapped function.
69315  */
69316 function createBind(func, bitmask, thisArg) {
69317   var isBind = bitmask & WRAP_BIND_FLAG,
69318       Ctor = createCtor(func);
69319
69320   function wrapper() {
69321     var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
69322     return fn.apply(isBind ? thisArg : this, arguments);
69323   }
69324   return wrapper;
69325 }
69326
69327 /* Built-in method references for those with the same name as other `lodash` methods. */
69328 var nativeMax$5 = Math.max;
69329
69330 /**
69331  * Creates an array that is the composition of partially applied arguments,
69332  * placeholders, and provided arguments into a single array of arguments.
69333  *
69334  * @private
69335  * @param {Array} args The provided arguments.
69336  * @param {Array} partials The arguments to prepend to those provided.
69337  * @param {Array} holders The `partials` placeholder indexes.
69338  * @params {boolean} [isCurried] Specify composing for a curried function.
69339  * @returns {Array} Returns the new array of composed arguments.
69340  */
69341 function composeArgs(args, partials, holders, isCurried) {
69342   var argsIndex = -1,
69343       argsLength = args.length,
69344       holdersLength = holders.length,
69345       leftIndex = -1,
69346       leftLength = partials.length,
69347       rangeLength = nativeMax$5(argsLength - holdersLength, 0),
69348       result = Array(leftLength + rangeLength),
69349       isUncurried = !isCurried;
69350
69351   while (++leftIndex < leftLength) {
69352     result[leftIndex] = partials[leftIndex];
69353   }
69354   while (++argsIndex < holdersLength) {
69355     if (isUncurried || argsIndex < argsLength) {
69356       result[holders[argsIndex]] = args[argsIndex];
69357     }
69358   }
69359   while (rangeLength--) {
69360     result[leftIndex++] = args[argsIndex++];
69361   }
69362   return result;
69363 }
69364
69365 /* Built-in method references for those with the same name as other `lodash` methods. */
69366 var nativeMax$6 = Math.max;
69367
69368 /**
69369  * This function is like `composeArgs` except that the arguments composition
69370  * is tailored for `_.partialRight`.
69371  *
69372  * @private
69373  * @param {Array} args The provided arguments.
69374  * @param {Array} partials The arguments to append to those provided.
69375  * @param {Array} holders The `partials` placeholder indexes.
69376  * @params {boolean} [isCurried] Specify composing for a curried function.
69377  * @returns {Array} Returns the new array of composed arguments.
69378  */
69379 function composeArgsRight(args, partials, holders, isCurried) {
69380   var argsIndex = -1,
69381       argsLength = args.length,
69382       holdersIndex = -1,
69383       holdersLength = holders.length,
69384       rightIndex = -1,
69385       rightLength = partials.length,
69386       rangeLength = nativeMax$6(argsLength - holdersLength, 0),
69387       result = Array(rangeLength + rightLength),
69388       isUncurried = !isCurried;
69389
69390   while (++argsIndex < rangeLength) {
69391     result[argsIndex] = args[argsIndex];
69392   }
69393   var offset = argsIndex;
69394   while (++rightIndex < rightLength) {
69395     result[offset + rightIndex] = partials[rightIndex];
69396   }
69397   while (++holdersIndex < holdersLength) {
69398     if (isUncurried || argsIndex < argsLength) {
69399       result[offset + holders[holdersIndex]] = args[argsIndex++];
69400     }
69401   }
69402   return result;
69403 }
69404
69405 /**
69406  * Gets the number of `placeholder` occurrences in `array`.
69407  *
69408  * @private
69409  * @param {Array} array The array to inspect.
69410  * @param {*} placeholder The placeholder to search for.
69411  * @returns {number} Returns the placeholder count.
69412  */
69413 function countHolders(array, placeholder) {
69414   var length = array.length,
69415       result = 0;
69416
69417   while (length--) {
69418     if (array[length] === placeholder) {
69419       ++result;
69420     }
69421   }
69422   return result;
69423 }
69424
69425 /**
69426  * The function whose prototype chain sequence wrappers inherit from.
69427  *
69428  * @private
69429  */
69430 function baseLodash() {
69431   // No operation performed.
69432 }
69433
69434 /** Used as references for the maximum length and index of an array. */
69435 var MAX_ARRAY_LENGTH = 4294967295;
69436
69437 /**
69438  * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
69439  *
69440  * @private
69441  * @constructor
69442  * @param {*} value The value to wrap.
69443  */
69444 function LazyWrapper(value) {
69445   this.__wrapped__ = value;
69446   this.__actions__ = [];
69447   this.__dir__ = 1;
69448   this.__filtered__ = false;
69449   this.__iteratees__ = [];
69450   this.__takeCount__ = MAX_ARRAY_LENGTH;
69451   this.__views__ = [];
69452 }
69453
69454 // Ensure `LazyWrapper` is an instance of `baseLodash`.
69455 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
69456 LazyWrapper.prototype.constructor = LazyWrapper;
69457
69458 /**
69459  * Gets metadata for `func`.
69460  *
69461  * @private
69462  * @param {Function} func The function to query.
69463  * @returns {*} Returns the metadata for `func`.
69464  */
69465 var getData = !metaMap ? noop$3 : function(func) {
69466   return metaMap.get(func);
69467 };
69468
69469 /** Used to lookup unminified function names. */
69470 var realNames = {};
69471
69472 /** Used for built-in method references. */
69473 var objectProto$20 = Object.prototype;
69474
69475 /** Used to check objects for own properties. */
69476 var hasOwnProperty$17 = objectProto$20.hasOwnProperty;
69477
69478 /**
69479  * Gets the name of `func`.
69480  *
69481  * @private
69482  * @param {Function} func The function to query.
69483  * @returns {string} Returns the function name.
69484  */
69485 function getFuncName(func) {
69486   var result = (func.name + ''),
69487       array = realNames[result],
69488       length = hasOwnProperty$17.call(realNames, result) ? array.length : 0;
69489
69490   while (length--) {
69491     var data = array[length],
69492         otherFunc = data.func;
69493     if (otherFunc == null || otherFunc == func) {
69494       return data.name;
69495     }
69496   }
69497   return result;
69498 }
69499
69500 /**
69501  * The base constructor for creating `lodash` wrapper objects.
69502  *
69503  * @private
69504  * @param {*} value The value to wrap.
69505  * @param {boolean} [chainAll] Enable explicit method chain sequences.
69506  */
69507 function LodashWrapper(value, chainAll) {
69508   this.__wrapped__ = value;
69509   this.__actions__ = [];
69510   this.__chain__ = !!chainAll;
69511   this.__index__ = 0;
69512   this.__values__ = undefined;
69513 }
69514
69515 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
69516 LodashWrapper.prototype.constructor = LodashWrapper;
69517
69518 /**
69519  * Creates a clone of `wrapper`.
69520  *
69521  * @private
69522  * @param {Object} wrapper The wrapper to clone.
69523  * @returns {Object} Returns the cloned wrapper.
69524  */
69525 function wrapperClone(wrapper) {
69526   if (wrapper instanceof LazyWrapper) {
69527     return wrapper.clone();
69528   }
69529   var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
69530   result.__actions__ = copyArray(wrapper.__actions__);
69531   result.__index__  = wrapper.__index__;
69532   result.__values__ = wrapper.__values__;
69533   return result;
69534 }
69535
69536 /** Used for built-in method references. */
69537 var objectProto$21 = Object.prototype;
69538
69539 /** Used to check objects for own properties. */
69540 var hasOwnProperty$18 = objectProto$21.hasOwnProperty;
69541
69542 /**
69543  * Creates a `lodash` object which wraps `value` to enable implicit method
69544  * chain sequences. Methods that operate on and return arrays, collections,
69545  * and functions can be chained together. Methods that retrieve a single value
69546  * or may return a primitive value will automatically end the chain sequence
69547  * and return the unwrapped value. Otherwise, the value must be unwrapped
69548  * with `_#value`.
69549  *
69550  * Explicit chain sequences, which must be unwrapped with `_#value`, may be
69551  * enabled using `_.chain`.
69552  *
69553  * The execution of chained methods is lazy, that is, it's deferred until
69554  * `_#value` is implicitly or explicitly called.
69555  *
69556  * Lazy evaluation allows several methods to support shortcut fusion.
69557  * Shortcut fusion is an optimization to merge iteratee calls; this avoids
69558  * the creation of intermediate arrays and can greatly reduce the number of
69559  * iteratee executions. Sections of a chain sequence qualify for shortcut
69560  * fusion if the section is applied to an array and iteratees accept only
69561  * one argument. The heuristic for whether a section qualifies for shortcut
69562  * fusion is subject to change.
69563  *
69564  * Chaining is supported in custom builds as long as the `_#value` method is
69565  * directly or indirectly included in the build.
69566  *
69567  * In addition to lodash methods, wrappers have `Array` and `String` methods.
69568  *
69569  * The wrapper `Array` methods are:
69570  * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
69571  *
69572  * The wrapper `String` methods are:
69573  * `replace` and `split`
69574  *
69575  * The wrapper methods that support shortcut fusion are:
69576  * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
69577  * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
69578  * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
69579  *
69580  * The chainable wrapper methods are:
69581  * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
69582  * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
69583  * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
69584  * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
69585  * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
69586  * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
69587  * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
69588  * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
69589  * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
69590  * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
69591  * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
69592  * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
69593  * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
69594  * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
69595  * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
69596  * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
69597  * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
69598  * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
69599  * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
69600  * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
69601  * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
69602  * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
69603  * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
69604  * `zipObject`, `zipObjectDeep`, and `zipWith`
69605  *
69606  * The wrapper methods that are **not** chainable by default are:
69607  * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
69608  * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
69609  * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
69610  * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
69611  * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
69612  * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
69613  * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
69614  * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
69615  * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
69616  * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
69617  * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
69618  * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
69619  * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
69620  * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
69621  * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
69622  * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
69623  * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
69624  * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
69625  * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
69626  * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
69627  * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
69628  * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
69629  * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
69630  * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
69631  * `upperFirst`, `value`, and `words`
69632  *
69633  * @name _
69634  * @constructor
69635  * @category Seq
69636  * @param {*} value The value to wrap in a `lodash` instance.
69637  * @returns {Object} Returns the new `lodash` wrapper instance.
69638  * @example
69639  *
69640  * function square(n) {
69641  *   return n * n;
69642  * }
69643  *
69644  * var wrapped = _([1, 2, 3]);
69645  *
69646  * // Returns an unwrapped value.
69647  * wrapped.reduce(_.add);
69648  * // => 6
69649  *
69650  * // Returns a wrapped value.
69651  * var squares = wrapped.map(square);
69652  *
69653  * _.isArray(squares);
69654  * // => false
69655  *
69656  * _.isArray(squares.value());
69657  * // => true
69658  */
69659 function lodash(value) {
69660   if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
69661     if (value instanceof LodashWrapper) {
69662       return value;
69663     }
69664     if (hasOwnProperty$18.call(value, '__wrapped__')) {
69665       return wrapperClone(value);
69666     }
69667   }
69668   return new LodashWrapper(value);
69669 }
69670
69671 // Ensure wrappers are instances of `baseLodash`.
69672 lodash.prototype = baseLodash.prototype;
69673 lodash.prototype.constructor = lodash;
69674
69675 /**
69676  * Checks if `func` has a lazy counterpart.
69677  *
69678  * @private
69679  * @param {Function} func The function to check.
69680  * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
69681  *  else `false`.
69682  */
69683 function isLaziable(func) {
69684   var funcName = getFuncName(func),
69685       other = lodash[funcName];
69686
69687   if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
69688     return false;
69689   }
69690   if (func === other) {
69691     return true;
69692   }
69693   var data = getData(other);
69694   return !!data && func === data[0];
69695 }
69696
69697 /**
69698  * Sets metadata for `func`.
69699  *
69700  * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
69701  * period of time, it will trip its breaker and transition to an identity
69702  * function to avoid garbage collection pauses in V8. See
69703  * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
69704  * for more details.
69705  *
69706  * @private
69707  * @param {Function} func The function to associate metadata with.
69708  * @param {*} data The metadata.
69709  * @returns {Function} Returns `func`.
69710  */
69711 var setData = shortOut(baseSetData);
69712
69713 /** Used to match wrap detail comments. */
69714 var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
69715     reSplitDetails = /,? & /;
69716
69717 /**
69718  * Extracts wrapper details from the `source` body comment.
69719  *
69720  * @private
69721  * @param {string} source The source to inspect.
69722  * @returns {Array} Returns the wrapper details.
69723  */
69724 function getWrapDetails(source) {
69725   var match = source.match(reWrapDetails);
69726   return match ? match[1].split(reSplitDetails) : [];
69727 }
69728
69729 /** Used to match wrap detail comments. */
69730 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
69731
69732 /**
69733  * Inserts wrapper `details` in a comment at the top of the `source` body.
69734  *
69735  * @private
69736  * @param {string} source The source to modify.
69737  * @returns {Array} details The details to insert.
69738  * @returns {string} Returns the modified source.
69739  */
69740 function insertWrapDetails(source, details) {
69741   var length = details.length;
69742   if (!length) {
69743     return source;
69744   }
69745   var lastIndex = length - 1;
69746   details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
69747   details = details.join(length > 2 ? ', ' : ' ');
69748   return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
69749 }
69750
69751 /** Used to compose bitmasks for function metadata. */
69752 var WRAP_BIND_FLAG$1 = 1,
69753     WRAP_BIND_KEY_FLAG = 2,
69754     WRAP_CURRY_FLAG = 8,
69755     WRAP_CURRY_RIGHT_FLAG = 16,
69756     WRAP_PARTIAL_FLAG = 32,
69757     WRAP_PARTIAL_RIGHT_FLAG = 64,
69758     WRAP_ARY_FLAG = 128,
69759     WRAP_REARG_FLAG = 256,
69760     WRAP_FLIP_FLAG = 512;
69761
69762 /** Used to associate wrap methods with their bit flags. */
69763 var wrapFlags = [
69764   ['ary', WRAP_ARY_FLAG],
69765   ['bind', WRAP_BIND_FLAG$1],
69766   ['bindKey', WRAP_BIND_KEY_FLAG],
69767   ['curry', WRAP_CURRY_FLAG],
69768   ['curryRight', WRAP_CURRY_RIGHT_FLAG],
69769   ['flip', WRAP_FLIP_FLAG],
69770   ['partial', WRAP_PARTIAL_FLAG],
69771   ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
69772   ['rearg', WRAP_REARG_FLAG]
69773 ];
69774
69775 /**
69776  * Updates wrapper `details` based on `bitmask` flags.
69777  *
69778  * @private
69779  * @returns {Array} details The details to modify.
69780  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69781  * @returns {Array} Returns `details`.
69782  */
69783 function updateWrapDetails(details, bitmask) {
69784   arrayEach(wrapFlags, function(pair) {
69785     var value = '_.' + pair[0];
69786     if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
69787       details.push(value);
69788     }
69789   });
69790   return details.sort();
69791 }
69792
69793 /**
69794  * Sets the `toString` method of `wrapper` to mimic the source of `reference`
69795  * with wrapper details in a comment at the top of the source body.
69796  *
69797  * @private
69798  * @param {Function} wrapper The function to modify.
69799  * @param {Function} reference The reference function.
69800  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69801  * @returns {Function} Returns `wrapper`.
69802  */
69803 function setWrapToString(wrapper, reference, bitmask) {
69804   var source = (reference + '');
69805   return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
69806 }
69807
69808 /** Used to compose bitmasks for function metadata. */
69809 var WRAP_BIND_FLAG$2 = 1,
69810     WRAP_BIND_KEY_FLAG$1 = 2,
69811     WRAP_CURRY_BOUND_FLAG = 4,
69812     WRAP_CURRY_FLAG$1 = 8,
69813     WRAP_PARTIAL_FLAG$1 = 32,
69814     WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
69815
69816 /**
69817  * Creates a function that wraps `func` to continue currying.
69818  *
69819  * @private
69820  * @param {Function} func The function to wrap.
69821  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69822  * @param {Function} wrapFunc The function to create the `func` wrapper.
69823  * @param {*} placeholder The placeholder value.
69824  * @param {*} [thisArg] The `this` binding of `func`.
69825  * @param {Array} [partials] The arguments to prepend to those provided to
69826  *  the new function.
69827  * @param {Array} [holders] The `partials` placeholder indexes.
69828  * @param {Array} [argPos] The argument positions of the new function.
69829  * @param {number} [ary] The arity cap of `func`.
69830  * @param {number} [arity] The arity of `func`.
69831  * @returns {Function} Returns the new wrapped function.
69832  */
69833 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
69834   var isCurry = bitmask & WRAP_CURRY_FLAG$1,
69835       newHolders = isCurry ? holders : undefined,
69836       newHoldersRight = isCurry ? undefined : holders,
69837       newPartials = isCurry ? partials : undefined,
69838       newPartialsRight = isCurry ? undefined : partials;
69839
69840   bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
69841   bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
69842
69843   if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
69844     bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
69845   }
69846   var newData = [
69847     func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
69848     newHoldersRight, argPos, ary, arity
69849   ];
69850
69851   var result = wrapFunc.apply(undefined, newData);
69852   if (isLaziable(func)) {
69853     setData(result, newData);
69854   }
69855   result.placeholder = placeholder;
69856   return setWrapToString(result, func, bitmask);
69857 }
69858
69859 /**
69860  * Gets the argument placeholder value for `func`.
69861  *
69862  * @private
69863  * @param {Function} func The function to inspect.
69864  * @returns {*} Returns the placeholder value.
69865  */
69866 function getHolder(func) {
69867   var object = func;
69868   return object.placeholder;
69869 }
69870
69871 /* Built-in method references for those with the same name as other `lodash` methods. */
69872 var nativeMin$2 = Math.min;
69873
69874 /**
69875  * Reorder `array` according to the specified indexes where the element at
69876  * the first index is assigned as the first element, the element at
69877  * the second index is assigned as the second element, and so on.
69878  *
69879  * @private
69880  * @param {Array} array The array to reorder.
69881  * @param {Array} indexes The arranged array indexes.
69882  * @returns {Array} Returns `array`.
69883  */
69884 function reorder(array, indexes) {
69885   var arrLength = array.length,
69886       length = nativeMin$2(indexes.length, arrLength),
69887       oldArray = copyArray(array);
69888
69889   while (length--) {
69890     var index = indexes[length];
69891     array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
69892   }
69893   return array;
69894 }
69895
69896 /** Used as the internal argument placeholder. */
69897 var PLACEHOLDER = '__lodash_placeholder__';
69898
69899 /**
69900  * Replaces all `placeholder` elements in `array` with an internal placeholder
69901  * and returns an array of their indexes.
69902  *
69903  * @private
69904  * @param {Array} array The array to modify.
69905  * @param {*} placeholder The placeholder to replace.
69906  * @returns {Array} Returns the new array of placeholder indexes.
69907  */
69908 function replaceHolders(array, placeholder) {
69909   var index = -1,
69910       length = array.length,
69911       resIndex = 0,
69912       result = [];
69913
69914   while (++index < length) {
69915     var value = array[index];
69916     if (value === placeholder || value === PLACEHOLDER) {
69917       array[index] = PLACEHOLDER;
69918       result[resIndex++] = index;
69919     }
69920   }
69921   return result;
69922 }
69923
69924 /** Used to compose bitmasks for function metadata. */
69925 var WRAP_BIND_FLAG$3 = 1,
69926     WRAP_BIND_KEY_FLAG$2 = 2,
69927     WRAP_CURRY_FLAG$2 = 8,
69928     WRAP_CURRY_RIGHT_FLAG$1 = 16,
69929     WRAP_ARY_FLAG$1 = 128,
69930     WRAP_FLIP_FLAG$1 = 512;
69931
69932 /**
69933  * Creates a function that wraps `func` to invoke it with optional `this`
69934  * binding of `thisArg`, partial application, and currying.
69935  *
69936  * @private
69937  * @param {Function|string} func The function or method name to wrap.
69938  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69939  * @param {*} [thisArg] The `this` binding of `func`.
69940  * @param {Array} [partials] The arguments to prepend to those provided to
69941  *  the new function.
69942  * @param {Array} [holders] The `partials` placeholder indexes.
69943  * @param {Array} [partialsRight] The arguments to append to those provided
69944  *  to the new function.
69945  * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
69946  * @param {Array} [argPos] The argument positions of the new function.
69947  * @param {number} [ary] The arity cap of `func`.
69948  * @param {number} [arity] The arity of `func`.
69949  * @returns {Function} Returns the new wrapped function.
69950  */
69951 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
69952   var isAry = bitmask & WRAP_ARY_FLAG$1,
69953       isBind = bitmask & WRAP_BIND_FLAG$3,
69954       isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
69955       isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
69956       isFlip = bitmask & WRAP_FLIP_FLAG$1,
69957       Ctor = isBindKey ? undefined : createCtor(func);
69958
69959   function wrapper() {
69960     var length = arguments.length,
69961         args = Array(length),
69962         index = length;
69963
69964     while (index--) {
69965       args[index] = arguments[index];
69966     }
69967     if (isCurried) {
69968       var placeholder = getHolder(wrapper),
69969           holdersCount = countHolders(args, placeholder);
69970     }
69971     if (partials) {
69972       args = composeArgs(args, partials, holders, isCurried);
69973     }
69974     if (partialsRight) {
69975       args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
69976     }
69977     length -= holdersCount;
69978     if (isCurried && length < arity) {
69979       var newHolders = replaceHolders(args, placeholder);
69980       return createRecurry(
69981         func, bitmask, createHybrid, wrapper.placeholder, thisArg,
69982         args, newHolders, argPos, ary, arity - length
69983       );
69984     }
69985     var thisBinding = isBind ? thisArg : this,
69986         fn = isBindKey ? thisBinding[func] : func;
69987
69988     length = args.length;
69989     if (argPos) {
69990       args = reorder(args, argPos);
69991     } else if (isFlip && length > 1) {
69992       args.reverse();
69993     }
69994     if (isAry && ary < length) {
69995       args.length = ary;
69996     }
69997     if (this && this !== root$2 && this instanceof wrapper) {
69998       fn = Ctor || createCtor(fn);
69999     }
70000     return fn.apply(thisBinding, args);
70001   }
70002   return wrapper;
70003 }
70004
70005 /**
70006  * Creates a function that wraps `func` to enable currying.
70007  *
70008  * @private
70009  * @param {Function} func The function to wrap.
70010  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70011  * @param {number} arity The arity of `func`.
70012  * @returns {Function} Returns the new wrapped function.
70013  */
70014 function createCurry(func, bitmask, arity) {
70015   var Ctor = createCtor(func);
70016
70017   function wrapper() {
70018     var length = arguments.length,
70019         args = Array(length),
70020         index = length,
70021         placeholder = getHolder(wrapper);
70022
70023     while (index--) {
70024       args[index] = arguments[index];
70025     }
70026     var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
70027       ? []
70028       : replaceHolders(args, placeholder);
70029
70030     length -= holders.length;
70031     if (length < arity) {
70032       return createRecurry(
70033         func, bitmask, createHybrid, wrapper.placeholder, undefined,
70034         args, holders, undefined, undefined, arity - length);
70035     }
70036     var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70037     return apply(fn, this, args);
70038   }
70039   return wrapper;
70040 }
70041
70042 /** Used to compose bitmasks for function metadata. */
70043 var WRAP_BIND_FLAG$4 = 1;
70044
70045 /**
70046  * Creates a function that wraps `func` to invoke it with the `this` binding
70047  * of `thisArg` and `partials` prepended to the arguments it receives.
70048  *
70049  * @private
70050  * @param {Function} func The function to wrap.
70051  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70052  * @param {*} thisArg The `this` binding of `func`.
70053  * @param {Array} partials The arguments to prepend to those provided to
70054  *  the new function.
70055  * @returns {Function} Returns the new wrapped function.
70056  */
70057 function createPartial(func, bitmask, thisArg, partials) {
70058   var isBind = bitmask & WRAP_BIND_FLAG$4,
70059       Ctor = createCtor(func);
70060
70061   function wrapper() {
70062     var argsIndex = -1,
70063         argsLength = arguments.length,
70064         leftIndex = -1,
70065         leftLength = partials.length,
70066         args = Array(leftLength + argsLength),
70067         fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70068
70069     while (++leftIndex < leftLength) {
70070       args[leftIndex] = partials[leftIndex];
70071     }
70072     while (argsLength--) {
70073       args[leftIndex++] = arguments[++argsIndex];
70074     }
70075     return apply(fn, isBind ? thisArg : this, args);
70076   }
70077   return wrapper;
70078 }
70079
70080 /** Used as the internal argument placeholder. */
70081 var PLACEHOLDER$1 = '__lodash_placeholder__';
70082
70083 /** Used to compose bitmasks for function metadata. */
70084 var WRAP_BIND_FLAG$5 = 1,
70085     WRAP_BIND_KEY_FLAG$3 = 2,
70086     WRAP_CURRY_BOUND_FLAG$1 = 4,
70087     WRAP_CURRY_FLAG$3 = 8,
70088     WRAP_ARY_FLAG$2 = 128,
70089     WRAP_REARG_FLAG$1 = 256;
70090
70091 /* Built-in method references for those with the same name as other `lodash` methods. */
70092 var nativeMin$3 = Math.min;
70093
70094 /**
70095  * Merges the function metadata of `source` into `data`.
70096  *
70097  * Merging metadata reduces the number of wrappers used to invoke a function.
70098  * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
70099  * may be applied regardless of execution order. Methods like `_.ary` and
70100  * `_.rearg` modify function arguments, making the order in which they are
70101  * executed important, preventing the merging of metadata. However, we make
70102  * an exception for a safe combined case where curried functions have `_.ary`
70103  * and or `_.rearg` applied.
70104  *
70105  * @private
70106  * @param {Array} data The destination metadata.
70107  * @param {Array} source The source metadata.
70108  * @returns {Array} Returns `data`.
70109  */
70110 function mergeData(data, source) {
70111   var bitmask = data[1],
70112       srcBitmask = source[1],
70113       newBitmask = bitmask | srcBitmask,
70114       isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
70115
70116   var isCombo =
70117     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
70118     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
70119     ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
70120
70121   // Exit early if metadata can't be merged.
70122   if (!(isCommon || isCombo)) {
70123     return data;
70124   }
70125   // Use source `thisArg` if available.
70126   if (srcBitmask & WRAP_BIND_FLAG$5) {
70127     data[2] = source[2];
70128     // Set when currying a bound function.
70129     newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
70130   }
70131   // Compose partial arguments.
70132   var value = source[3];
70133   if (value) {
70134     var partials = data[3];
70135     data[3] = partials ? composeArgs(partials, value, source[4]) : value;
70136     data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
70137   }
70138   // Compose partial right arguments.
70139   value = source[5];
70140   if (value) {
70141     partials = data[5];
70142     data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
70143     data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
70144   }
70145   // Use source `argPos` if available.
70146   value = source[7];
70147   if (value) {
70148     data[7] = value;
70149   }
70150   // Use source `ary` if it's smaller.
70151   if (srcBitmask & WRAP_ARY_FLAG$2) {
70152     data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
70153   }
70154   // Use source `arity` if one is not provided.
70155   if (data[9] == null) {
70156     data[9] = source[9];
70157   }
70158   // Use source `func` and merge bitmasks.
70159   data[0] = source[0];
70160   data[1] = newBitmask;
70161
70162   return data;
70163 }
70164
70165 /** Error message constants. */
70166 var FUNC_ERROR_TEXT$4 = 'Expected a function';
70167
70168 /** Used to compose bitmasks for function metadata. */
70169 var WRAP_BIND_FLAG$6 = 1,
70170     WRAP_BIND_KEY_FLAG$4 = 2,
70171     WRAP_CURRY_FLAG$4 = 8,
70172     WRAP_CURRY_RIGHT_FLAG$2 = 16,
70173     WRAP_PARTIAL_FLAG$2 = 32,
70174     WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
70175
70176 /* Built-in method references for those with the same name as other `lodash` methods. */
70177 var nativeMax$7 = Math.max;
70178
70179 /**
70180  * Creates a function that either curries or invokes `func` with optional
70181  * `this` binding and partially applied arguments.
70182  *
70183  * @private
70184  * @param {Function|string} func The function or method name to wrap.
70185  * @param {number} bitmask The bitmask flags.
70186  *    1 - `_.bind`
70187  *    2 - `_.bindKey`
70188  *    4 - `_.curry` or `_.curryRight` of a bound function
70189  *    8 - `_.curry`
70190  *   16 - `_.curryRight`
70191  *   32 - `_.partial`
70192  *   64 - `_.partialRight`
70193  *  128 - `_.rearg`
70194  *  256 - `_.ary`
70195  *  512 - `_.flip`
70196  * @param {*} [thisArg] The `this` binding of `func`.
70197  * @param {Array} [partials] The arguments to be partially applied.
70198  * @param {Array} [holders] The `partials` placeholder indexes.
70199  * @param {Array} [argPos] The argument positions of the new function.
70200  * @param {number} [ary] The arity cap of `func`.
70201  * @param {number} [arity] The arity of `func`.
70202  * @returns {Function} Returns the new wrapped function.
70203  */
70204 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
70205   var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
70206   if (!isBindKey && typeof func != 'function') {
70207     throw new TypeError(FUNC_ERROR_TEXT$4);
70208   }
70209   var length = partials ? partials.length : 0;
70210   if (!length) {
70211     bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
70212     partials = holders = undefined;
70213   }
70214   ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
70215   arity = arity === undefined ? arity : toInteger(arity);
70216   length -= holders ? holders.length : 0;
70217
70218   if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
70219     var partialsRight = partials,
70220         holdersRight = holders;
70221
70222     partials = holders = undefined;
70223   }
70224   var data = isBindKey ? undefined : getData(func);
70225
70226   var newData = [
70227     func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
70228     argPos, ary, arity
70229   ];
70230
70231   if (data) {
70232     mergeData(newData, data);
70233   }
70234   func = newData[0];
70235   bitmask = newData[1];
70236   thisArg = newData[2];
70237   partials = newData[3];
70238   holders = newData[4];
70239   arity = newData[9] = newData[9] === undefined
70240     ? (isBindKey ? 0 : func.length)
70241     : nativeMax$7(newData[9] - length, 0);
70242
70243   if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
70244     bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
70245   }
70246   if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
70247     var result = createBind(func, bitmask, thisArg);
70248   } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
70249     result = createCurry(func, bitmask, arity);
70250   } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
70251     result = createPartial(func, bitmask, thisArg, partials);
70252   } else {
70253     result = createHybrid.apply(undefined, newData);
70254   }
70255   var setter = data ? baseSetData : setData;
70256   return setWrapToString(setter(result, newData), func, bitmask);
70257 }
70258
70259 /** Used to compose bitmasks for function metadata. */
70260 var WRAP_BIND_FLAG$7 = 1,
70261     WRAP_PARTIAL_FLAG$3 = 32;
70262
70263 /**
70264  * Creates a function that invokes `func` with the `this` binding of `thisArg`
70265  * and `partials` prepended to the arguments it receives.
70266  *
70267  * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
70268  * may be used as a placeholder for partially applied arguments.
70269  *
70270  * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
70271  * property of bound functions.
70272  *
70273  * @static
70274  * @memberOf _
70275  * @since 0.1.0
70276  * @category Function
70277  * @param {Function} func The function to bind.
70278  * @param {*} thisArg The `this` binding of `func`.
70279  * @param {...*} [partials] The arguments to be partially applied.
70280  * @returns {Function} Returns the new bound function.
70281  * @example
70282  *
70283  * function greet(greeting, punctuation) {
70284  *   return greeting + ' ' + this.user + punctuation;
70285  * }
70286  *
70287  * var object = { 'user': 'fred' };
70288  *
70289  * var bound = _.bind(greet, object, 'hi');
70290  * bound('!');
70291  * // => 'hi fred!'
70292  *
70293  * // Bound with placeholders.
70294  * var bound = _.bind(greet, object, _, '!');
70295  * bound('hi');
70296  * // => 'hi fred!'
70297  */
70298 var bind$2 = baseRest(function(func, thisArg, partials) {
70299   var bitmask = WRAP_BIND_FLAG$7;
70300   if (partials.length) {
70301     var holders = replaceHolders(partials, getHolder(bind$2));
70302     bitmask |= WRAP_PARTIAL_FLAG$3;
70303   }
70304   return createWrap(func, bitmask, thisArg, partials, holders);
70305 });
70306
70307 // Assign default placeholders.
70308 bind$2.placeholder = {};
70309
70310 function presetCollection(collection) {
70311     var maxSearchResults = 50,
70312         maxSuggestionResults = 10;
70313
70314     var presets = {
70315
70316         collection: collection,
70317
70318
70319         item: function(id) {
70320             return find$1(this.collection, function(d) {
70321                 return d.id === id;
70322             });
70323         },
70324
70325
70326         matchGeometry: function(geometry) {
70327             return presetCollection(this.collection.filter(function(d) {
70328                 return d.matchGeometry(geometry);
70329             }));
70330         },
70331
70332
70333         search: function(value, geometry) {
70334             if (!value) return this;
70335
70336             function leading(a) {
70337                 var index = a.indexOf(value);
70338                 return index === 0 || a[index - 1] === ' ';
70339             }
70340
70341             function suggestionName(name) {
70342                 var nameArray = name.split(' - ');
70343                 if (nameArray.length > 1) {
70344                     name = nameArray.slice(0, nameArray.length - 1).join(' - ');
70345                 }
70346                 return name.toLowerCase();
70347             }
70348
70349
70350             value = value.toLowerCase();
70351
70352             var searchable = filter(this.collection, function(a) {
70353                     return a.searchable !== false && a.suggestion !== true;
70354                 }),
70355                 suggestions = filter(this.collection, function(a) {
70356                     return a.suggestion === true;
70357                 });
70358
70359
70360             // matches value to preset.name
70361             var leading_name = filter(searchable, function(a) {
70362                     return leading(a.name().toLowerCase());
70363                 }).sort(function(a, b) {
70364                     var aCompare = a.name().toLowerCase(),
70365                         bCompare = b.name().toLowerCase(),
70366                         i;
70367
70368                     // priority if search string matches preset name exactly - #4325
70369                     if (value === aCompare) return -1;
70370                     if (value === bCompare) return 1;
70371
70372                     // priority for higher matchScore
70373                     i = b.originalScore - a.originalScore;
70374                     if (i !== 0) return i;
70375
70376                     // priority if search string appears earlier in preset name
70377                     i = aCompare.indexOf(value) - bCompare.indexOf(value);
70378                     if (i !== 0) return i;
70379
70380                     // priority for shorter preset names
70381                     return a.name().length - b.name().length;
70382                 });
70383
70384             // matches value to preset.terms values
70385             var leading_terms = filter(searchable, function(a) {
70386                     return some(a.terms() || [], leading);
70387                 });
70388
70389             // matches value to preset.tags values
70390             var leading_tag_values = filter(searchable, function(a) {
70391                     return some(without(values$1(a.tags || {}), '*'), leading);
70392                 });
70393
70394
70395             // finds close matches to value in preset.name
70396             var similar_name = searchable.map(function(a) {
70397                     return {
70398                         preset: a,
70399                         dist: utilEditDistance(value, a.name())
70400                     };
70401                 }).filter(function(a) {
70402                     return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
70403                 }).sort(function(a, b) {
70404                     return a.dist - b.dist;
70405                 }).map(function(a) {
70406                     return a.preset;
70407                 });
70408
70409             // finds close matches to value in preset.terms
70410             var similar_terms = filter(searchable, function(a) {
70411                     return some(a.terms() || [], function(b) {
70412                         return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
70413                     });
70414                 });
70415
70416             var leading_suggestions = filter(suggestions, function(a) {
70417                     return leading(suggestionName(a.name()));
70418                 }).sort(function(a, b) {
70419                     a = suggestionName(a.name());
70420                     b = suggestionName(b.name());
70421                     var i = a.indexOf(value) - b.indexOf(value);
70422                     if (i === 0) return a.length - b.length;
70423                     else return i;
70424                 });
70425
70426             var similar_suggestions = suggestions.map(function(a) {
70427                     return {
70428                         preset: a,
70429                         dist: utilEditDistance(value, suggestionName(a.name()))
70430                     };
70431                 }).filter(function(a) {
70432                     return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
70433                 }).sort(function(a, b) {
70434                     return a.dist - b.dist;
70435                 }).map(function(a) {
70436                     return a.preset;
70437                 });
70438
70439             var other = presets.item(geometry);
70440
70441             var results = leading_name.concat(
70442                     leading_terms,
70443                     leading_tag_values,
70444                     leading_suggestions.slice(0, maxSuggestionResults + 5),
70445                     similar_name,
70446                     similar_terms,
70447                     similar_suggestions.slice(0, maxSuggestionResults)
70448                 ).slice(0, maxSearchResults - 1);
70449
70450             return presetCollection(uniq(results.concat(other)));
70451         }
70452     };
70453
70454
70455     return presets;
70456 }
70457
70458 function presetCategory(id, category, all) {
70459     category = clone(category);
70460
70461     category.id = id;
70462
70463
70464     category.members = presetCollection(category.members.map(function(id) {
70465         return all.item(id);
70466     }));
70467
70468
70469     category.matchGeometry = function(geometry) {
70470         return category.geometry.indexOf(geometry) >= 0;
70471     };
70472
70473
70474     category.matchScore = function() {
70475         return -1;
70476     };
70477
70478
70479     category.name = function() {
70480         return t('presets.categories.' + id + '.name', {'default': id});
70481     };
70482
70483
70484     category.terms = function() {
70485         return [];
70486     };
70487
70488
70489     return category;
70490 }
70491
70492 function presetField(id, field) {
70493     field = clone(field);
70494
70495     field.id = id;
70496
70497
70498     field.matchGeometry = function(geometry) {
70499         return !field.geometry || field.geometry === geometry;
70500     };
70501
70502
70503     field.t = function(scope, options) {
70504         return t('presets.fields.' + id + '.' + scope, options);
70505     };
70506
70507
70508     field.label = function() {
70509         return field.t('label', {'default': id});
70510     };
70511
70512
70513     var placeholder = field.placeholder;
70514     field.placeholder = function() {
70515         return field.t('placeholder', {'default': placeholder});
70516     };
70517
70518
70519     return field;
70520 }
70521
70522 function presetPreset(id, preset, fields) {
70523     preset = clone(preset);
70524
70525     preset.id = id;
70526     preset.fields = (preset.fields || []).map(getFields);
70527     preset.geometry = (preset.geometry || []);
70528
70529
70530     function getFields(f) {
70531         return fields[f];
70532     }
70533
70534
70535     preset.matchGeometry = function(geometry) {
70536         return preset.geometry.indexOf(geometry) >= 0;
70537     };
70538
70539
70540     preset.originalScore = preset.matchScore || 1;
70541
70542
70543     preset.matchScore = function(entity) {
70544         var tags = preset.tags,
70545             score = 0;
70546
70547         for (var t$$1 in tags) {
70548             if (entity.tags[t$$1] === tags[t$$1]) {
70549                 score += preset.originalScore;
70550             } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
70551                 score += preset.originalScore / 2;
70552             } else {
70553                 return -1;
70554             }
70555         }
70556
70557         return score;
70558     };
70559
70560
70561     preset.t = function(scope, options) {
70562         return t('presets.presets.' + id + '.' + scope, options);
70563     };
70564
70565
70566     var origName = preset.name || '';
70567     preset.name = function() {
70568         if (preset.suggestion) {
70569             id = id.split('/');
70570             id = id[0] + '/' + id[1];
70571             return origName + ' - ' + t('presets.presets.' + id + '.name');
70572         }
70573         return preset.t('name', { 'default': origName });
70574     };
70575
70576     var origTerms = (preset.terms || []).join();
70577     preset.terms = function() {
70578         return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
70579     };
70580
70581
70582     preset.isFallback = function() {
70583         var tagCount = Object.keys(preset.tags).length;
70584         return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
70585     };
70586
70587
70588     var reference = preset.reference || {};
70589     preset.reference = function(geometry) {
70590         var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
70591             value = reference.value || preset.tags[key];
70592
70593         if (geometry === 'relation' && key === 'type') {
70594             if (value in preset.tags) {
70595                 key = value;
70596                 value = preset.tags[key];
70597             } else {
70598                 return { rtype: value };
70599             }
70600         }
70601
70602         if (value === '*') {
70603             return { key: key };
70604         } else {
70605             return { key: key, value: value };
70606         }
70607     };
70608
70609
70610     var removeTags = preset.removeTags || preset.tags || {};
70611     preset.removeTags = function(tags, geometry) {
70612         tags = omit(tags, keys$1(removeTags));
70613
70614         for (var f in preset.fields) {
70615             var field = preset.fields[f];
70616             if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
70617                 delete tags[field.key];
70618             }
70619         }
70620
70621         delete tags.area;
70622         return tags;
70623     };
70624
70625
70626     var applyTags = preset.addTags || preset.tags || {};
70627     preset.applyTags = function(tags, geometry) {
70628         var k;
70629
70630         tags = clone(tags);
70631
70632         for (k in applyTags) {
70633             if (applyTags[k] === '*') {
70634                 tags[k] = 'yes';
70635             } else {
70636                 tags[k] = applyTags[k];
70637             }
70638         }
70639
70640         // Add area=yes if necessary.
70641         // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
70642         // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
70643         // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
70644         if (!applyTags.hasOwnProperty('area')) {
70645             delete tags.area;
70646             if (geometry === 'area') {
70647                 var needsAreaTag = true;
70648                 if (preset.geometry.indexOf('line') === -1) {
70649                     for (k in applyTags) {
70650                         if (k in areaKeys) {
70651                             needsAreaTag = false;
70652                             break;
70653                         }
70654                     }
70655                 }
70656                 if (needsAreaTag) {
70657                     tags.area = 'yes';
70658                 }
70659             }
70660         }
70661
70662         for (var f in preset.fields) {
70663             var field = preset.fields[f];
70664             if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
70665                 tags[field.key] = field.default;
70666             }
70667         }
70668
70669         return tags;
70670     };
70671
70672
70673     return preset;
70674 }
70675
70676 function presetIndex() {
70677     // a presetCollection with methods for
70678     // loading new data and returning defaults
70679
70680     var all = presetCollection([]);
70681     var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
70682     var _fields = {};
70683     var _universal = [];
70684     var _recent = presetCollection([]);
70685
70686     // Index of presets by (geometry, tag key).
70687     var _index = {
70688         point: {},
70689         vertex: {},
70690         line: {},
70691         area: {},
70692         relation: {}
70693     };
70694
70695     all.match = function(entity, resolver) {
70696         var geometry = entity.geometry(resolver);
70697         var address;
70698
70699         // Treat entities on addr:interpolation lines as points, not vertices - #3241
70700         if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
70701             geometry = 'point';
70702         }
70703
70704         var geometryMatches = _index[geometry];
70705         var best = -1;
70706         var match;
70707
70708         for (var k in entity.tags) {
70709             // If any part of an address is present,
70710             // allow fallback to "Address" preset - #4353
70711             if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
70712                 address = geometryMatches['addr:*'][0];
70713             }
70714
70715             var keyMatches = geometryMatches[k];
70716             if (!keyMatches) continue;
70717
70718             for (var i = 0; i < keyMatches.length; i++) {
70719                 var score = keyMatches[i].matchScore(entity);
70720                 if (score > best) {
70721                     best = score;
70722                     match = keyMatches[i];
70723                 }
70724             }
70725         }
70726
70727         if (address && (!match || match.isFallback())) {
70728             match = address;
70729         }
70730
70731         return match || all.item(geometry);
70732     };
70733
70734
70735     // Because of the open nature of tagging, iD will never have a complete
70736     // list of tags used in OSM, so we want it to have logic like "assume
70737     // that a closed way with an amenity tag is an area, unless the amenity
70738     // is one of these specific types". This function computes a structure
70739     // that allows testing of such conditions, based on the presets designated
70740     // as as supporting (or not supporting) the area geometry.
70741     //
70742     // The returned object L is a whitelist/blacklist of tags. A closed way
70743     // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
70744     // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
70745     // and the subkeys form the blacklist.
70746     all.areaKeys = function() {
70747         var areaKeys = {};
70748         var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
70749         var presets = reject(all.collection, 'suggestion');
70750
70751         // whitelist
70752         presets.forEach(function(d) {
70753             for (var key in d.tags) break;
70754             if (!key) return;
70755             if (ignore.indexOf(key) !== -1) return;
70756
70757             if (d.geometry.indexOf('area') !== -1) {    // probably an area..
70758                 areaKeys[key] = areaKeys[key] || {};
70759             }
70760         });
70761
70762         // blacklist
70763         presets.forEach(function(d) {
70764             for (var key in d.tags) break;
70765             if (!key) return;
70766             if (ignore.indexOf(key) !== -1) return;
70767
70768             var value = d.tags[key];
70769             if (key in areaKeys &&                      // probably an area...
70770                 d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
70771                 value !== '*') {
70772                 areaKeys[key][value] = true;
70773             }
70774         });
70775
70776         return areaKeys;
70777     };
70778
70779
70780     all.init = function() {
70781         var d = data.presets;
70782
70783         all.collection = [];
70784         _recent.collection = [];
70785         _fields = {};
70786         _universal = [];
70787         _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
70788
70789         if (d.fields) {
70790             forEach(d.fields, function(d, id) {
70791                 _fields[id] = presetField(id, d);
70792                 if (d.universal) {
70793                     _universal.push(_fields[id]);
70794                 }
70795             });
70796         }
70797
70798         if (d.presets) {
70799             forEach(d.presets, function(d, id) {
70800                 all.collection.push(presetPreset(id, d, _fields));
70801             });
70802         }
70803
70804         if (d.categories) {
70805             forEach(d.categories, function(d, id) {
70806                 all.collection.push(presetCategory(id, d, all));
70807             });
70808         }
70809
70810         if (d.defaults) {
70811             var getItem = bind$2(all.item, all);
70812             _defaults = {
70813                 area: presetCollection(d.defaults.area.map(getItem)),
70814                 line: presetCollection(d.defaults.line.map(getItem)),
70815                 point: presetCollection(d.defaults.point.map(getItem)),
70816                 vertex: presetCollection(d.defaults.vertex.map(getItem)),
70817                 relation: presetCollection(d.defaults.relation.map(getItem))
70818             };
70819         }
70820
70821         for (var i = 0; i < all.collection.length; i++) {
70822             var preset = all.collection[i];
70823             var geometry = preset.geometry;
70824
70825             for (var j = 0; j < geometry.length; j++) {
70826                 var g = _index[geometry[j]];
70827                 for (var k in preset.tags) {
70828                     (g[k] = g[k] || []).push(preset);
70829                 }
70830             }
70831         }
70832
70833         return all;
70834     };
70835
70836     all.field = function(id) {
70837         return _fields[id];
70838     };
70839
70840     all.universal = function() {
70841         return _universal;
70842     };
70843
70844     all.defaults = function(geometry, n) {
70845         var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
70846         var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
70847         return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
70848     };
70849
70850     all.choose = function(preset) {
70851         _recent = presetCollection(uniq([preset].concat(_recent.collection)));
70852         return all;
70853     };
70854
70855     return all;
70856 }
70857
70858 var areaKeys = {};
70859
70860 function setAreaKeys(value) {
70861     areaKeys = value;
70862 }
70863
70864
70865 function coreContext() {
70866     var context = {};
70867     context.version = '2.7.0';
70868
70869     // create a special translation that contains the keys in place of the strings
70870     var tkeys = cloneDeep(en);
70871     var parents = [];
70872
70873     function traverser(v, k, obj) {
70874         parents.push(k);
70875         if (isObject(v)) {
70876             forOwn(v, traverser);
70877         } else if (isString(v)) {
70878             obj[k] = parents.join('.');
70879         }
70880         parents.pop();
70881     }
70882
70883     forOwn(tkeys, traverser);
70884     addTranslation('_tkeys_', tkeys);
70885
70886     addTranslation('en', en);
70887     setLocale('en');
70888
70889     var dispatch$$1 = dispatch('enter', 'exit', 'change');
70890
70891     // https://github.com/openstreetmap/iD/issues/772
70892     // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
70893     var storage;
70894     try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
70895     storage = storage || (function() {
70896         var s = {};
70897         return {
70898             getItem: function(k) { return s[k]; },
70899             setItem: function(k, v) { s[k] = v; },
70900             removeItem: function(k) { delete s[k]; }
70901         };
70902     })();
70903
70904     context.storage = function(k, v) {
70905         try {
70906             if (arguments.length === 1) return storage.getItem(k);
70907             else if (v === null) storage.removeItem(k);
70908             else storage.setItem(k, v);
70909         } catch (e) {
70910             // localstorage quota exceeded
70911             /* eslint-disable no-console */
70912             if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
70913             /* eslint-enable no-console */
70914         }
70915     };
70916
70917
70918     /* Straight accessors. Avoid using these if you can. */
70919     var ui, connection, history;
70920     context.ui = function() { return ui; };
70921     context.connection = function() { return connection; };
70922     context.history = function() { return history; };
70923
70924
70925     /* Connection */
70926     context.preauth = function(options) {
70927         if (connection) {
70928             connection.switch(options);
70929         }
70930         return context;
70931     };
70932
70933     context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
70934         var cid;
70935         function done(err, result) {
70936             if (connection.getConnectionId() !== cid) {
70937                 if (callback) callback({ message: 'Connection Switched', status: -1 });
70938                 return;
70939             }
70940             if (!err) history.merge(result.data, result.extent);
70941             if (callback) callback(err, result);
70942         }
70943         if (connection && context.editable()) {
70944             cid = connection.getConnectionId();
70945             connection.loadTiles(projection, dimensions, done);
70946         }
70947     });
70948
70949     context.loadEntity = function(entityId, callback) {
70950         var cid;
70951         function done(err, result) {
70952             if (connection.getConnectionId() !== cid) {
70953                 if (callback) callback({ message: 'Connection Switched', status: -1 });
70954                 return;
70955             }
70956             if (!err) history.merge(result.data, result.extent);
70957             if (callback) callback(err, result);
70958         }
70959         if (connection) {
70960             cid = connection.getConnectionId();
70961             connection.loadEntity(entityId, done);
70962         }
70963     };
70964
70965     context.zoomToEntity = function(entityId, zoomTo) {
70966         if (zoomTo !== false) {
70967             this.loadEntity(entityId, function(err, result) {
70968                 if (err) return;
70969                 var entity = find$1(result.data, function(e) { return e.id === entityId; });
70970                 if (entity) { map.zoomTo(entity); }
70971             });
70972         }
70973
70974         map.on('drawn.zoomToEntity', function() {
70975             if (!context.hasEntity(entityId)) return;
70976             map.on('drawn.zoomToEntity', null);
70977             context.on('enter.zoomToEntity', null);
70978             context.enter(modeSelect(context, [entityId]));
70979         });
70980
70981         context.on('enter.zoomToEntity', function() {
70982             if (mode.id !== 'browse') {
70983                 map.on('drawn.zoomToEntity', null);
70984                 context.on('enter.zoomToEntity', null);
70985             }
70986         });
70987     };
70988
70989     var minEditableZoom = 16;
70990     context.minEditableZoom = function(_) {
70991         if (!arguments.length) return minEditableZoom;
70992         minEditableZoom = _;
70993         if (connection) {
70994             connection.tileZoom(_);
70995         }
70996         return context;
70997     };
70998
70999
71000     /* History */
71001     var inIntro = false;
71002     context.inIntro = function(_) {
71003         if (!arguments.length) return inIntro;
71004         inIntro = _;
71005         return context;
71006     };
71007
71008     context.save = function() {
71009         // no history save, no message onbeforeunload
71010         if (inIntro || d3_select('.modal').size()) return;
71011
71012         var canSave;
71013         if (mode && mode.id === 'save') {
71014             canSave = false;
71015         } else {
71016             canSave = context.selectedIDs().every(function(id) {
71017                 var entity = context.hasEntity(id);
71018                 return entity && !entity.isDegenerate();
71019             });
71020         }
71021
71022         if (canSave) {
71023             history.save();
71024         }
71025         if (history.hasChanges()) {
71026             return t('save.unsaved_changes');
71027         }
71028     };
71029
71030
71031     /* Graph */
71032     context.hasEntity = function(id) {
71033         return history.graph().hasEntity(id);
71034     };
71035     context.entity = function(id) {
71036         return history.graph().entity(id);
71037     };
71038     context.childNodes = function(way) {
71039         return history.graph().childNodes(way);
71040     };
71041     context.geometry = function(id) {
71042         return context.entity(id).geometry(history.graph());
71043     };
71044
71045
71046     /* Modes */
71047     var mode;
71048     context.mode = function() {
71049         return mode;
71050     };
71051     context.enter = function(newMode) {
71052         if (mode) {
71053             mode.exit();
71054             dispatch$$1.call('exit', this, mode);
71055         }
71056
71057         mode = newMode;
71058         mode.enter();
71059         dispatch$$1.call('enter', this, mode);
71060     };
71061
71062     context.selectedIDs = function() {
71063         if (mode && mode.selectedIDs) {
71064             return mode.selectedIDs();
71065         } else {
71066             return [];
71067         }
71068     };
71069     context.activeID = function() {
71070         return mode && mode.activeID && mode.activeID();
71071     };
71072
71073
71074     /* Behaviors */
71075     context.install = function(behavior) {
71076         context.surface().call(behavior);
71077     };
71078     context.uninstall = function(behavior) {
71079         context.surface().call(behavior.off);
71080     };
71081
71082
71083     /* Copy/Paste */
71084     var copyIDs = [], copyGraph;
71085     context.copyGraph = function() { return copyGraph; };
71086     context.copyIDs = function(_) {
71087         if (!arguments.length) return copyIDs;
71088         copyIDs = _;
71089         copyGraph = history.graph();
71090         return context;
71091     };
71092
71093
71094     /* Background */
71095     var background;
71096     context.background = function() { return background; };
71097
71098
71099     /* Features */
71100     var features;
71101     context.features = function() { return features; };
71102     context.hasHiddenConnections = function(id) {
71103         var graph = history.graph(),
71104             entity = graph.entity(id);
71105         return features.hasHiddenConnections(entity, graph);
71106     };
71107
71108
71109     /* Presets */
71110     var presets;
71111     context.presets = function() { return presets; };
71112
71113
71114     /* Map */
71115     var map;
71116     context.map = function() { return map; };
71117     context.layers = function() { return map.layers; };
71118     context.surface = function() { return map.surface; };
71119     context.editable = function() { return map.editable(); };
71120     context.surfaceRect = function() {
71121         return map.surface.node().getBoundingClientRect();
71122     };
71123
71124
71125     /* Debug */
71126     var debugFlags = {
71127         tile: false,        // tile boundaries
71128         collision: false,   // label collision bounding boxes
71129         imagery: false,     // imagery bounding polygons
71130         imperial: false,    // imperial (not metric) bounding polygons
71131         driveLeft: false,   // driveLeft bounding polygons
71132         target: false       // touch targets
71133     };
71134     context.debugFlags = function() {
71135         return debugFlags;
71136     };
71137     context.setDebug = function(flag, val) {
71138         if (arguments.length === 1) val = true;
71139         debugFlags[flag] = val;
71140         dispatch$$1.call('change');
71141         return context;
71142     };
71143     context.getDebug = function(flag) {
71144         return flag && debugFlags[flag];
71145     };
71146
71147
71148     /* Container */
71149     var container = d3_select(document.body);
71150     context.container = function(_) {
71151         if (!arguments.length) return container;
71152         container = _;
71153         container.classed('id-container', true);
71154         return context;
71155     };
71156     var embed;
71157     context.embed = function(_) {
71158         if (!arguments.length) return embed;
71159         embed = _;
71160         return context;
71161     };
71162
71163
71164     /* Assets */
71165     var assetPath = '';
71166     context.assetPath = function(_) {
71167         if (!arguments.length) return assetPath;
71168         assetPath = _;
71169         return context;
71170     };
71171
71172     var assetMap = {};
71173     context.assetMap = function(_) {
71174         if (!arguments.length) return assetMap;
71175         assetMap = _;
71176         return context;
71177     };
71178
71179     context.asset = function(_) {
71180         var filename = assetPath + _;
71181         return assetMap[filename] || filename;
71182     };
71183
71184     context.imagePath = function(_) {
71185         return context.asset('img/' + _);
71186     };
71187
71188
71189     /* locales */
71190     // `locale` variable contains a "requested locale".
71191     // It won't become the `currentLocale` until after loadLocale() is called.
71192     var locale, localePath;
71193
71194     context.locale = function(loc, path) {
71195         if (!arguments.length) return currentLocale;
71196         locale = loc;
71197         localePath = path;
71198         return context;
71199     };
71200
71201     context.loadLocale = function(callback) {
71202         if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
71203             localePath = localePath || context.asset('locales/' + locale + '.json');
71204             d3_json(localePath, function(err, result) {
71205                 if (!err) {
71206                     addTranslation(locale, result[locale]);
71207                     setLocale(locale);
71208                     utilDetect(true);
71209                 }
71210                 if (callback) {
71211                     callback(err);
71212                 }
71213             });
71214         } else {
71215             if (locale) {
71216                 setLocale(locale);
71217                 utilDetect(true);
71218             }
71219             if (callback) {
71220                 callback();
71221             }
71222         }
71223     };
71224
71225
71226     /* reset (aka flush) */
71227     context.reset = context.flush = function() {
71228         context.debouncedSave.cancel();
71229         forEach(services, function(service) {
71230             if (service && typeof service.reset === 'function') {
71231                 service.reset(context);
71232             }
71233         });
71234         features.reset();
71235         history.reset();
71236         return context;
71237     };
71238
71239
71240     /* Init */
71241
71242     context.projection = geoRawMercator();
71243     context.curtainProjection = geoRawMercator();
71244
71245     locale = utilDetect().locale;
71246     if (locale && !dataLocales.hasOwnProperty(locale)) {
71247         locale = locale.split('-')[0];
71248     }
71249
71250     history = coreHistory(context);
71251     context.graph = history.graph;
71252     context.changes = history.changes;
71253     context.intersects = history.intersects;
71254
71255     // Debounce save, since it's a synchronous localStorage write,
71256     // and history changes can happen frequently (e.g. when dragging).
71257     context.debouncedSave = debounce(context.save, 350);
71258     function withDebouncedSave(fn) {
71259         return function() {
71260             var result = fn.apply(history, arguments);
71261             context.debouncedSave();
71262             return result;
71263         };
71264     }
71265
71266     context.perform = withDebouncedSave(history.perform);
71267     context.replace = withDebouncedSave(history.replace);
71268     context.pop = withDebouncedSave(history.pop);
71269     context.overwrite = withDebouncedSave(history.overwrite);
71270     context.undo = withDebouncedSave(history.undo);
71271     context.redo = withDebouncedSave(history.redo);
71272
71273     ui = uiInit(context);
71274
71275     connection = services.osm;
71276     background = rendererBackground(context);
71277     features = rendererFeatures(context);
71278     presets = presetIndex();
71279
71280     map = rendererMap(context);
71281     context.mouse = map.mouse;
71282     context.extent = map.extent;
71283     context.pan = map.pan;
71284     context.zoomIn = map.zoomIn;
71285     context.zoomOut = map.zoomOut;
71286     context.zoomInFurther = map.zoomInFurther;
71287     context.zoomOutFurther = map.zoomOutFurther;
71288     context.redrawEnable = map.redrawEnable;
71289
71290     forEach(services, function(service) {
71291         if (service && typeof service.init === 'function') {
71292             service.init(context);
71293         }
71294     });
71295
71296     background.init();
71297     features.init();
71298     presets.init();
71299     areaKeys = presets.areaKeys();
71300
71301
71302     return utilRebind(context, dispatch$$1, 'on');
71303 }
71304
71305 function osmWay() {
71306     if (!(this instanceof osmWay)) {
71307         return (new osmWay()).initialize(arguments);
71308     } else if (arguments.length) {
71309         this.initialize(arguments);
71310     }
71311 }
71312
71313
71314 osmEntity$$1.way = osmWay;
71315
71316 osmWay.prototype = Object.create(osmEntity$$1.prototype);
71317
71318
71319 assignIn(osmWay.prototype, {
71320     type: 'way',
71321     nodes: [],
71322
71323
71324     copy: function(resolver, copies) {
71325         if (copies[this.id])
71326             return copies[this.id];
71327
71328         var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
71329
71330         var nodes = this.nodes.map(function(id) {
71331             return resolver.entity(id).copy(resolver, copies).id;
71332         });
71333
71334         copy = copy.update({ nodes: nodes });
71335         copies[this.id] = copy;
71336
71337         return copy;
71338     },
71339
71340
71341     extent: function(resolver) {
71342         return resolver.transient(this, 'extent', function() {
71343             var extent = geoExtent$$1();
71344             for (var i = 0; i < this.nodes.length; i++) {
71345                 var node = resolver.hasEntity(this.nodes[i]);
71346                 if (node) {
71347                     extent._extend(node.extent());
71348                 }
71349             }
71350             return extent;
71351         });
71352     },
71353
71354
71355     first: function() {
71356         return this.nodes[0];
71357     },
71358
71359
71360     last: function() {
71361         return this.nodes[this.nodes.length - 1];
71362     },
71363
71364
71365     contains: function(node) {
71366         return this.nodes.indexOf(node) >= 0;
71367     },
71368
71369
71370     affix: function(node) {
71371         if (this.nodes[0] === node) return 'prefix';
71372         if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
71373     },
71374
71375
71376     layer: function() {
71377         // explicit layer tag, clamp between -10, 10..
71378         if (isFinite(this.tags.layer)) {
71379             return Math.max(-10, Math.min(+(this.tags.layer), 10));
71380         }
71381
71382         // implied layer tag..
71383         if (this.tags.covered === 'yes') return -1;
71384         if (this.tags.location === 'overground') return 1;
71385         if (this.tags.location === 'underground') return -1;
71386         if (this.tags.location === 'underwater') return -10;
71387
71388         if (this.tags.power === 'line') return 10;
71389         if (this.tags.power === 'minor_line') return 10;
71390         if (this.tags.aerialway) return 10;
71391         if (this.tags.bridge) return 1;
71392         if (this.tags.cutting) return -1;
71393         if (this.tags.tunnel) return -1;
71394         if (this.tags.waterway) return -1;
71395         if (this.tags.man_made === 'pipeline') return -10;
71396         if (this.tags.boundary) return -10;
71397         return 0;
71398     },
71399
71400
71401     isOneWay: function() {
71402         // explicit oneway tag..
71403         var values = {
71404             'yes': true,
71405             '1': true,
71406             '-1': true,
71407             'reversible': true,
71408             'alternating': true,
71409             'no': false,
71410             '0': false
71411         };
71412         if (values[this.tags.oneway] !== undefined) {
71413             return values[this.tags.oneway];
71414         }
71415
71416         // implied oneway tag..
71417         for (var key in this.tags) {
71418             if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
71419                 return true;
71420         }
71421         return false;
71422     },
71423
71424
71425     lanes: function() {
71426         return osmLanes(this);
71427     },
71428
71429
71430     isClosed: function() {
71431         return this.nodes.length > 1 && this.first() === this.last();
71432     },
71433
71434
71435     isConvex: function(resolver) {
71436         if (!this.isClosed() || this.isDegenerate()) return null;
71437
71438         var nodes = uniq(resolver.childNodes(this));
71439         var coords = map$3(nodes, 'loc');
71440         var curr = 0;
71441         var prev = 0;
71442
71443         for (var i = 0; i < coords.length; i++) {
71444             var o = coords[(i+1) % coords.length];
71445             var a = coords[i];
71446             var b = coords[(i+2) % coords.length];
71447             var res = geoVecCross(a, b, o);
71448
71449             curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
71450             if (curr === 0) {
71451                 continue;
71452             } else if (prev && curr !== prev) {
71453                 return false;
71454             }
71455             prev = curr;
71456         }
71457         return true;
71458     },
71459
71460
71461     isArea: function() {
71462         // `highway` and `railway` are typically linear features, but there
71463         // are a few exceptions that should be treated as areas, even in the
71464         // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
71465         var lineKeys = {
71466             highway: {
71467                 rest_area: true,
71468                 services: true
71469             },
71470             railway: {
71471                 roundhouse: true,
71472                 station: true,
71473                 traverser: true,
71474                 turntable: true,
71475                 wash: true
71476             }
71477         };
71478
71479         if (this.tags.area === 'yes')
71480             return true;
71481         if (!this.isClosed() || this.tags.area === 'no')
71482             return false;
71483         for (var key in this.tags) {
71484             if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
71485                 return true;
71486             }
71487             if (key in lineKeys && this.tags[key] in lineKeys[key]) {
71488                 return true;
71489             }
71490         }
71491         return false;
71492     },
71493
71494
71495     isDegenerate: function() {
71496         return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
71497     },
71498
71499
71500     areAdjacent: function(n1, n2) {
71501         for (var i = 0; i < this.nodes.length; i++) {
71502             if (this.nodes[i] === n1) {
71503                 if (this.nodes[i - 1] === n2) return true;
71504                 if (this.nodes[i + 1] === n2) return true;
71505             }
71506         }
71507         return false;
71508     },
71509
71510
71511     geometry: function(graph) {
71512         return graph.transient(this, 'geometry', function() {
71513             return this.isArea() ? 'area' : 'line';
71514         });
71515     },
71516
71517
71518     // If this way is not closed, append the beginning node to the end of the nodelist to close it.
71519     close: function() {
71520         if (this.isClosed() || !this.nodes.length) return this;
71521
71522         var nodes = this.nodes.slice();
71523         nodes = nodes.filter(noRepeatNodes);
71524         nodes.push(nodes[0]);
71525         return this.update({ nodes: nodes });
71526     },
71527
71528
71529     // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
71530     unclose: function() {
71531         if (!this.isClosed()) return this;
71532
71533         var nodes = this.nodes.slice(),
71534             connector = this.first(),
71535             i = nodes.length - 1;
71536
71537         // remove trailing connectors..
71538         while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71539             nodes.splice(i, 1);
71540             i = nodes.length - 1;
71541         }
71542
71543         nodes = nodes.filter(noRepeatNodes);
71544         return this.update({ nodes: nodes });
71545     },
71546
71547
71548     // Adds a node (id) in front of the node which is currently at position index.
71549     // If index is undefined, the node will be added to the end of the way for linear ways,
71550     //   or just before the final connecting node for circular ways.
71551     // Consecutive duplicates are eliminated including existing ones.
71552     // Circularity is always preserved when adding a node.
71553     addNode: function(id, index) {
71554         var nodes = this.nodes.slice(),
71555             isClosed = this.isClosed(),
71556             max = isClosed ? nodes.length - 1 : nodes.length;
71557
71558         if (index === undefined) {
71559             index = max;
71560         }
71561
71562         if (index < 0 || index > max) {
71563             throw new RangeError('index ' + index + ' out of range 0..' + max);
71564         }
71565
71566         // If this is a closed way, remove all connector nodes except the first one
71567         // (there may be duplicates) and adjust index if necessary..
71568         if (isClosed) {
71569             var connector = this.first();
71570
71571             // leading connectors..
71572             var i = 1;
71573             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
71574                 nodes.splice(i, 1);
71575                 if (index > i) index--;
71576             }
71577
71578             // trailing connectors..
71579             i = nodes.length - 1;
71580             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71581                 nodes.splice(i, 1);
71582                 if (index > i) index--;
71583                 i = nodes.length - 1;
71584             }
71585         }
71586
71587         nodes.splice(index, 0, id);
71588         nodes = nodes.filter(noRepeatNodes);
71589
71590         // If the way was closed before, append a connector node to keep it closed..
71591         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71592             nodes.push(nodes[0]);
71593         }
71594
71595         return this.update({ nodes: nodes });
71596     },
71597
71598
71599     // Replaces the node which is currently at position index with the given node (id).
71600     // Consecutive duplicates are eliminated including existing ones.
71601     // Circularity is preserved when updating a node.
71602     updateNode: function(id, index) {
71603         var nodes = this.nodes.slice(),
71604             isClosed = this.isClosed(),
71605             max = nodes.length - 1;
71606
71607         if (index === undefined || index < 0 || index > max) {
71608             throw new RangeError('index ' + index + ' out of range 0..' + max);
71609         }
71610
71611         // If this is a closed way, remove all connector nodes except the first one
71612         // (there may be duplicates) and adjust index if necessary..
71613         if (isClosed) {
71614             var connector = this.first();
71615
71616             // leading connectors..
71617             var i = 1;
71618             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
71619                 nodes.splice(i, 1);
71620                 if (index > i) index--;
71621             }
71622
71623             // trailing connectors..
71624             i = nodes.length - 1;
71625             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71626                 nodes.splice(i, 1);
71627                 if (index === i) index = 0;  // update leading connector instead
71628                 i = nodes.length - 1;
71629             }
71630         }
71631
71632         nodes.splice(index, 1, id);
71633         nodes = nodes.filter(noRepeatNodes);
71634
71635         // If the way was closed before, append a connector node to keep it closed..
71636         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71637             nodes.push(nodes[0]);
71638         }
71639
71640         return this.update({nodes: nodes});
71641     },
71642
71643
71644     // Replaces each occurrence of node id needle with replacement.
71645     // Consecutive duplicates are eliminated including existing ones.
71646     // Circularity is preserved.
71647     replaceNode: function(needle, replacement) {
71648         var nodes = this.nodes.slice(),
71649             isClosed = this.isClosed();
71650
71651         for (var i = 0; i < nodes.length; i++) {
71652             if (nodes[i] === needle) {
71653                 nodes[i] = replacement;
71654             }
71655         }
71656
71657         nodes = nodes.filter(noRepeatNodes);
71658
71659         // If the way was closed before, append a connector node to keep it closed..
71660         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71661             nodes.push(nodes[0]);
71662         }
71663
71664         return this.update({nodes: nodes});
71665     },
71666
71667
71668     // Removes each occurrence of node id needle with replacement.
71669     // Consecutive duplicates are eliminated including existing ones.
71670     // Circularity is preserved.
71671     removeNode: function(id) {
71672         var nodes = this.nodes.slice(),
71673             isClosed = this.isClosed();
71674
71675         nodes = nodes
71676             .filter(function(node) { return node !== id; })
71677             .filter(noRepeatNodes);
71678
71679         // If the way was closed before, append a connector node to keep it closed..
71680         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71681             nodes.push(nodes[0]);
71682         }
71683
71684         return this.update({nodes: nodes});
71685     },
71686
71687
71688     asJXON: function(changeset_id) {
71689         var r = {
71690             way: {
71691                 '@id': this.osmId(),
71692                 '@version': this.version || 0,
71693                 nd: map$3(this.nodes, function(id) {
71694                     return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
71695                 }),
71696                 tag: map$3(this.tags, function(v, k) {
71697                     return { keyAttributes: { k: k, v: v } };
71698                 })
71699             }
71700         };
71701         if (changeset_id) {
71702             r.way['@changeset'] = changeset_id;
71703         }
71704         return r;
71705     },
71706
71707
71708     asGeoJSON: function(resolver) {
71709         return resolver.transient(this, 'GeoJSON', function() {
71710             var coordinates = map$3(resolver.childNodes(this), 'loc');
71711             if (this.isArea() && this.isClosed()) {
71712                 return {
71713                     type: 'Polygon',
71714                     coordinates: [coordinates]
71715                 };
71716             } else {
71717                 return {
71718                     type: 'LineString',
71719                     coordinates: coordinates
71720                 };
71721             }
71722         });
71723     },
71724
71725
71726     area: function(resolver) {
71727         return resolver.transient(this, 'area', function() {
71728             var nodes = resolver.childNodes(this);
71729
71730             var json = {
71731                 type: 'Polygon',
71732                 coordinates: [map$3(nodes, 'loc')]
71733             };
71734
71735             if (!this.isClosed() && nodes.length) {
71736                 json.coordinates[0].push(nodes[0].loc);
71737             }
71738
71739             var area = d3_geoArea(json);
71740
71741             // Heuristic for detecting counterclockwise winding order. Assumes
71742             // that OpenStreetMap polygons are not hemisphere-spanning.
71743             if (area > 2 * Math.PI) {
71744                 json.coordinates[0] = json.coordinates[0].reverse();
71745                 area = d3_geoArea(json);
71746             }
71747
71748             return isNaN(area) ? 0 : area;
71749         });
71750     }
71751 });
71752
71753
71754 // Filter function to eliminate consecutive duplicates.
71755 function noRepeatNodes(node, i, arr) {
71756     return i === 0 || node !== arr[i - 1];
71757 }
71758
71759 // For fixing up rendering of multipolygons with tags on the outer member.
71760 // https://github.com/openstreetmap/iD/issues/613
71761 function osmIsSimpleMultipolygonOuterMember(entity, graph) {
71762     if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
71763         return false;
71764
71765     var parents = graph.parentRelations(entity);
71766     if (parents.length !== 1)
71767         return false;
71768
71769     var parent = parents[0];
71770     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
71771         return false;
71772
71773     var members = parent.members, member;
71774     for (var i = 0; i < members.length; i++) {
71775         member = members[i];
71776         if (member.id === entity.id && member.role && member.role !== 'outer')
71777             return false; // Not outer member
71778         if (member.id !== entity.id && (!member.role || member.role === 'outer'))
71779             return false; // Not a simple multipolygon
71780     }
71781
71782     return parent;
71783 }
71784
71785
71786 function osmSimpleMultipolygonOuterMember(entity, graph) {
71787     if (entity.type !== 'way')
71788         return false;
71789
71790     var parents = graph.parentRelations(entity);
71791     if (parents.length !== 1)
71792         return false;
71793
71794     var parent = parents[0];
71795     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
71796         return false;
71797
71798     var members = parent.members, member, outerMember;
71799     for (var i = 0; i < members.length; i++) {
71800         member = members[i];
71801         if (!member.role || member.role === 'outer') {
71802             if (outerMember)
71803                 return false; // Not a simple multipolygon
71804             outerMember = member;
71805         }
71806     }
71807
71808     if (!outerMember)
71809         return false;
71810
71811     var outerEntity = graph.hasEntity(outerMember.id);
71812     if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
71813         return false;
71814
71815     return outerEntity;
71816 }
71817
71818
71819 // Join `toJoin` array into sequences of connecting ways.
71820
71821 // Segments which share identical start/end nodes will, as much as possible,
71822 // be connected with each other.
71823 //
71824 // The return value is a nested array. Each constituent array contains elements
71825 // of `toJoin` which have been determined to connect.
71826 //
71827 // Each consitituent array also has a `nodes` property whose value is an
71828 // ordered array of member nodes, with appropriate order reversal and
71829 // start/end coordinate de-duplication.
71830 //
71831 // Members of `toJoin` must have, at minimum, `type` and `id` properties.
71832 // Thus either an array of `osmWay`s or a relation member array may be used.
71833 //
71834 // If an member is an `osmWay`, its tags and childnodes may be reversed via
71835 // `actionReverse` in the output.
71836 //
71837 // The returned sequences array also has an `actions` array property, containing
71838 // any reversal actions that should be applied to the graph, should the calling
71839 // code attempt to actually join the given ways.
71840 //
71841 // Incomplete members (those for which `graph.hasEntity(element.id)` returns
71842 // false) and non-way members are ignored.
71843 //
71844 function osmJoinWays(toJoin, graph) {
71845     function resolve(member) {
71846         return graph.childNodes(graph.entity(member.id));
71847     }
71848
71849     function reverse(item) {
71850         var action = actionReverse(item.id, { reverseOneway: true });
71851         sequences.actions.push(action);
71852         return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
71853     }
71854
71855     // make a copy containing only the items to join
71856     toJoin = toJoin.filter(function(member) {
71857         return member.type === 'way' && graph.hasEntity(member.id);
71858     });
71859
71860
71861     var sequences = [];
71862     sequences.actions = [];
71863
71864     while (toJoin.length) {
71865         // start a new sequence
71866         var item = toJoin.shift();
71867         var currWays = [item];
71868         var currNodes = resolve(item).slice();
71869         var doneSequence = false;
71870
71871         // add to it
71872         while (toJoin.length && !doneSequence) {
71873             var start = currNodes[0];
71874             var end = currNodes[currNodes.length - 1];
71875             var fn = null;
71876             var nodes = null;
71877             var i;
71878
71879             // Find the next way/member to join.
71880             for (i = 0; i < toJoin.length; i++) {
71881                 item = toJoin[i];
71882                 nodes = resolve(item);
71883
71884                 // Strongly prefer to generate a forward path that preserves the order
71885                 // of the members array. For multipolygons and most relations, member
71886                 // order does not matter - but for routes, it does. If we started this
71887                 // sequence backwards (i.e. next member way attaches to the start node
71888                 // and not the end node), reverse the initial way before continuing.
71889                 if (currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
71890                     (nodes[nodes.length - 1] === start || nodes[0] === start)
71891                 ) {
71892                     currWays[0] = reverse(currWays[0]);
71893                     currNodes.reverse();
71894                     start = currNodes[0];
71895                     end = currNodes[currNodes.length - 1];
71896                 }
71897
71898                 if (nodes[0] === end) {
71899                     fn = currNodes.push;               // join to end
71900                     nodes = nodes.slice(1);
71901                     break;
71902                 } else if (nodes[nodes.length - 1] === end) {
71903                     fn = currNodes.push;               // join to end
71904                     nodes = nodes.slice(0, -1).reverse();
71905                     item = reverse(item);
71906                     break;
71907                 } else if (nodes[nodes.length - 1] === start) {
71908                     fn = currNodes.unshift;            // join to beginning
71909                     nodes = nodes.slice(0, -1);
71910                     break;
71911                 } else if (nodes[0] === start) {
71912                     fn = currNodes.unshift;            // join to beginning
71913                     nodes = nodes.slice(1).reverse();
71914                     item = reverse(item);
71915                     break;
71916                 } else {
71917                     fn = nodes = null;
71918                 }
71919             }
71920
71921             if (!nodes) {     // couldn't find a joinable way/member
71922                 doneSequence = true;
71923                 break;
71924             }
71925
71926             fn.apply(currWays, [item]);
71927             fn.apply(currNodes, nodes);
71928
71929             toJoin.splice(i, 1);
71930         }
71931
71932         currWays.nodes = currNodes;
71933         sequences.push(currWays);
71934     }
71935
71936     return sequences;
71937 }
71938
71939 function osmRelation() {
71940     if (!(this instanceof osmRelation)) {
71941         return (new osmRelation()).initialize(arguments);
71942     } else if (arguments.length) {
71943         this.initialize(arguments);
71944     }
71945 }
71946
71947
71948 osmEntity$$1.relation = osmRelation;
71949
71950 osmRelation.prototype = Object.create(osmEntity$$1.prototype);
71951
71952
71953 osmRelation.creationOrder = function(a, b) {
71954     var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
71955     var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
71956
71957     if (aId < 0 || bId < 0) return aId - bId;
71958     return bId - aId;
71959 };
71960
71961
71962 assignIn(osmRelation.prototype, {
71963     type: 'relation',
71964     members: [],
71965
71966
71967     copy: function(resolver, copies) {
71968         if (copies[this.id])
71969             return copies[this.id];
71970
71971         var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
71972
71973         var members = this.members.map(function(member) {
71974             return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
71975         });
71976
71977         copy = copy.update({members: members});
71978         copies[this.id] = copy;
71979
71980         return copy;
71981     },
71982
71983
71984     extent: function(resolver, memo) {
71985         return resolver.transient(this, 'extent', function() {
71986             if (memo && memo[this.id]) return geoExtent$$1();
71987             memo = memo || {};
71988             memo[this.id] = true;
71989
71990             var extent = geoExtent$$1();
71991             for (var i = 0; i < this.members.length; i++) {
71992                 var member = resolver.hasEntity(this.members[i].id);
71993                 if (member) {
71994                     extent._extend(member.extent(resolver, memo));
71995                 }
71996             }
71997             return extent;
71998         });
71999     },
72000
72001
72002     geometry: function(graph) {
72003         return graph.transient(this, 'geometry', function() {
72004             return this.isMultipolygon() ? 'area' : 'relation';
72005         });
72006     },
72007
72008
72009     isDegenerate: function() {
72010         return this.members.length === 0;
72011     },
72012
72013
72014     // Return an array of members, each extended with an 'index' property whose value
72015     // is the member index.
72016     indexedMembers: function() {
72017         var result = new Array(this.members.length);
72018         for (var i = 0; i < this.members.length; i++) {
72019             result[i] = assignIn({}, this.members[i], {index: i});
72020         }
72021         return result;
72022     },
72023
72024
72025     // Return the first member with the given role. A copy of the member object
72026     // is returned, extended with an 'index' property whose value is the member index.
72027     memberByRole: function(role) {
72028         for (var i = 0; i < this.members.length; i++) {
72029             if (this.members[i].role === role) {
72030                 return assignIn({}, this.members[i], {index: i});
72031             }
72032         }
72033     },
72034
72035     // Same as memberByRole, but returns all members with the given role
72036     membersByRole: function(role) {
72037         var result = [];
72038         for (var i = 0; i < this.members.length; i++) {
72039             if (this.members[i].role === role) {
72040                 result.push(assignIn({}, this.members[i], {index: i}));
72041             }
72042         }
72043         return result;
72044     },
72045
72046     // Return the first member with the given id. A copy of the member object
72047     // is returned, extended with an 'index' property whose value is the member index.
72048     memberById: function(id) {
72049         for (var i = 0; i < this.members.length; i++) {
72050             if (this.members[i].id === id) {
72051                 return assignIn({}, this.members[i], {index: i});
72052             }
72053         }
72054     },
72055
72056
72057     // Return the first member with the given id and role. A copy of the member object
72058     // is returned, extended with an 'index' property whose value is the member index.
72059     memberByIdAndRole: function(id, role) {
72060         for (var i = 0; i < this.members.length; i++) {
72061             if (this.members[i].id === id && this.members[i].role === role) {
72062                 return assignIn({}, this.members[i], {index: i});
72063             }
72064         }
72065     },
72066
72067
72068     addMember: function(member, index) {
72069         var members = this.members.slice();
72070         members.splice(index === undefined ? members.length : index, 0, member);
72071         return this.update({members: members});
72072     },
72073
72074
72075     updateMember: function(member, index) {
72076         var members = this.members.slice();
72077         members.splice(index, 1, assignIn({}, members[index], member));
72078         return this.update({members: members});
72079     },
72080
72081
72082     removeMember: function(index) {
72083         var members = this.members.slice();
72084         members.splice(index, 1);
72085         return this.update({members: members});
72086     },
72087
72088
72089     removeMembersWithID: function(id) {
72090         var members = reject(this.members, function(m) { return m.id === id; });
72091         return this.update({members: members});
72092     },
72093
72094
72095     // Wherever a member appears with id `needle.id`, replace it with a member
72096     // with id `replacement.id`, type `replacement.type`, and the original role,
72097     // By default, adding a duplicate member (by id and role) is prevented.
72098     // Return an updated relation.
72099     replaceMember: function(needle, replacement, keepDuplicates) {
72100         if (!this.memberById(needle.id))
72101             return this;
72102
72103         var members = [];
72104
72105         for (var i = 0; i < this.members.length; i++) {
72106             var member = this.members[i];
72107             if (member.id !== needle.id) {
72108                 members.push(member);
72109             } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
72110                 members.push({id: replacement.id, type: replacement.type, role: member.role});
72111             }
72112         }
72113
72114         return this.update({members: members});
72115     },
72116
72117
72118     asJXON: function(changeset_id) {
72119         var r = {
72120             relation: {
72121                 '@id': this.osmId(),
72122                 '@version': this.version || 0,
72123                 member: map$3(this.members, function(member) {
72124                     return {
72125                         keyAttributes: {
72126                             type: member.type,
72127                             role: member.role,
72128                             ref: osmEntity$$1.id.toOSM(member.id)
72129                         }
72130                     };
72131                 }),
72132                 tag: map$3(this.tags, function(v, k) {
72133                     return { keyAttributes: { k: k, v: v } };
72134                 })
72135             }
72136         };
72137         if (changeset_id) r.relation['@changeset'] = changeset_id;
72138         return r;
72139     },
72140
72141
72142     asGeoJSON: function(resolver) {
72143         return resolver.transient(this, 'GeoJSON', function () {
72144             if (this.isMultipolygon()) {
72145                 return {
72146                     type: 'MultiPolygon',
72147                     coordinates: this.multipolygon(resolver)
72148                 };
72149             } else {
72150                 return {
72151                     type: 'FeatureCollection',
72152                     properties: this.tags,
72153                     features: this.members.map(function (member) {
72154                         return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
72155                     })
72156                 };
72157             }
72158         });
72159     },
72160
72161
72162     area: function(resolver) {
72163         return resolver.transient(this, 'area', function() {
72164             return d3_geoArea(this.asGeoJSON(resolver));
72165         });
72166     },
72167
72168
72169     isMultipolygon: function() {
72170         return this.tags.type === 'multipolygon';
72171     },
72172
72173
72174     isComplete: function(resolver) {
72175         for (var i = 0; i < this.members.length; i++) {
72176             if (!resolver.hasEntity(this.members[i].id)) {
72177                 return false;
72178             }
72179         }
72180         return true;
72181     },
72182
72183
72184     isRestriction: function() {
72185         return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
72186     },
72187
72188
72189     isValidRestriction: function() {
72190         if (!this.isRestriction()) return false;
72191
72192         var froms = this.members.filter(function(m) { return m.role === 'from'; });
72193         var vias = this.members.filter(function(m) { return m.role === 'via'; });
72194         var tos = this.members.filter(function(m) { return m.role === 'to'; });
72195
72196         if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
72197         if (froms.some(function(m) { return m.type !== 'way'; })) return false;
72198
72199         if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
72200         if (tos.some(function(m) { return m.type !== 'way'; })) return false;
72201
72202         if (vias.length === 0) return false;
72203         if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
72204
72205         return true;
72206     },
72207
72208
72209     // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
72210     // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
72211     //
72212     // This corresponds to the structure needed for rendering a multipolygon path using a
72213     // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
72214     //
72215     // In the case of invalid geometries, this function will still return a result which
72216     // includes the nodes of all way members, but some Nds may be unclosed and some inner
72217     // rings not matched with the intended outer ring.
72218     //
72219     multipolygon: function(resolver) {
72220         var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
72221         var inners = this.members.filter(function(m) { return 'inner' === m.role; });
72222
72223         outers = osmJoinWays(outers, resolver);
72224         inners = osmJoinWays(inners, resolver);
72225
72226         outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
72227         inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
72228
72229         var result = outers.map(function(o) {
72230             // Heuristic for detecting counterclockwise winding order. Assumes
72231             // that OpenStreetMap polygons are not hemisphere-spanning.
72232             return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
72233         });
72234
72235         function findOuter(inner) {
72236             var o, outer;
72237
72238             for (o = 0; o < outers.length; o++) {
72239                 outer = outers[o];
72240                 if (geoPolygonContainsPolygon(outer, inner))
72241                     return o;
72242             }
72243
72244             for (o = 0; o < outers.length; o++) {
72245                 outer = outers[o];
72246                 if (geoPolygonIntersectsPolygon(outer, inner, false))
72247                     return o;
72248             }
72249         }
72250
72251         for (var i = 0; i < inners.length; i++) {
72252             var inner = inners[i];
72253
72254             if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
72255                 inner = inner.reverse();
72256             }
72257
72258             var o = findOuter(inners[i]);
72259             if (o !== undefined)
72260                 result[o].push(inners[i]);
72261             else
72262                 result.push([inners[i]]); // Invalid geometry
72263         }
72264
72265         return result;
72266     }
72267 });
72268
72269 function osmTurn(turn) {
72270     if (!(this instanceof osmTurn)) {
72271         return new osmTurn(turn);
72272     }
72273     assignIn(this, turn);
72274 }
72275
72276
72277 function osmIntersection(graph, startVertexId, maxDistance) {
72278     maxDistance = maxDistance || 30;    // in meters
72279     var vgraph = coreGraph$$1();           // virtual graph
72280     var i, j, k;
72281
72282
72283     function memberOfRestriction(entity) {
72284         return graph.parentRelations(entity)
72285             .some(function(r) { return r.isRestriction(); });
72286     }
72287
72288     function isRoad(way) {
72289         if (way.isArea() || way.isDegenerate()) return false;
72290         var roads = {
72291             'motorway': true,
72292             'motorway_link': true,
72293             'trunk': true,
72294             'trunk_link': true,
72295             'primary': true,
72296             'primary_link': true,
72297             'secondary': true,
72298             'secondary_link': true,
72299             'tertiary': true,
72300             'tertiary_link': true,
72301             'residential': true,
72302             'unclassified': true,
72303             'living_street': true,
72304             'service': true,
72305             'road': true,
72306             'track': true
72307         };
72308         return roads[way.tags.highway];
72309     }
72310
72311
72312     var startNode = graph.entity(startVertexId);
72313     var checkVertices = [startNode];
72314     var checkWays;
72315     var vertices = [];
72316     var vertexIds = [];
72317     var vertex;
72318     var ways = [];
72319     var wayIds = [];
72320     var way;
72321     var nodes = [];
72322     var node;
72323     var parents = [];
72324     var parent;
72325
72326     // `actions` will store whatever actions must be performed to satisfy
72327     // preconditions for adding a turn restriction to this intersection.
72328     //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
72329     //  - Reverse oneways so that they are drawn in the forward direction
72330     //  - Split ways on key vertices
72331     var actions = [];
72332
72333
72334     // STEP 1:  walk the graph outwards from starting vertex to search
72335     //  for more key vertices and ways to include in the intersection..
72336
72337     while (checkVertices.length) {
72338         vertex = checkVertices.pop();
72339
72340         // check this vertex for parent ways that are roads
72341         checkWays = graph.parentWays(vertex);
72342         var hasWays = false;
72343         for (i = 0; i < checkWays.length; i++) {
72344             way = checkWays[i];
72345             if (!isRoad(way) && !memberOfRestriction(way)) continue;
72346
72347             ways.push(way);   // it's a road, or it's already in a turn restriction
72348             hasWays = true;
72349
72350             // check the way's children for more key vertices
72351             nodes = uniq(graph.childNodes(way));
72352             for (j = 0; j < nodes.length; j++) {
72353                 node = nodes[j];
72354                 if (node === vertex) continue;                                           // same thing
72355                 if (vertices.indexOf(node) !== -1) continue;                             // seen it already
72356                 if (node.loc && startNode.loc &&
72357                     geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
72358
72359                 // a key vertex will have parents that are also roads
72360                 var hasParents = false;
72361                 parents = graph.parentWays(node);
72362                 for (k = 0; k < parents.length; k++) {
72363                     parent = parents[k];
72364                     if (parent === way) continue;                 // same thing
72365                     if (ways.indexOf(parent) !== -1) continue;    // seen it already
72366                     if (!isRoad(parent)) continue;                // not a road
72367                     hasParents = true;
72368                     break;
72369                 }
72370
72371                 if (hasParents) {
72372                     checkVertices.push(node);
72373                 }
72374             }
72375         }
72376
72377         if (hasWays) {
72378             vertices.push(vertex);
72379         }
72380     }
72381
72382     vertices = uniq(vertices);
72383     ways = uniq(ways);
72384
72385
72386     // STEP 2:  Build a virtual graph containing only the entities in the intersection..
72387     // Everything done after this step should act on the virtual graph
72388     // Any actions that must be performed later to the main graph go in `actions` array
72389     ways.forEach(function(way) {
72390         graph.childNodes(way).forEach(function(node) {
72391             vgraph = vgraph.replace(node);
72392         });
72393
72394         vgraph = vgraph.replace(way);
72395
72396         graph.parentRelations(way).forEach(function(relation) {
72397             if (relation.isRestriction()) {
72398                 if (relation.isValidRestriction(graph)) {
72399                     vgraph = vgraph.replace(relation);
72400                 } else if (relation.isComplete(graph)) {
72401                     actions.push(actionDeleteRelation(relation.id));
72402                 }
72403             }
72404         });
72405     });
72406
72407
72408     // STEP 3:  Force all oneways to be drawn in the forward direction
72409     ways.forEach(function(w) {
72410         var way = vgraph.entity(w.id);
72411         if (way.tags.oneway === '-1') {
72412             var action = actionReverse(way.id, { reverseOneway: true });
72413             actions.push(action);
72414             vgraph = action(vgraph);
72415         }
72416     });
72417
72418
72419     // STEP 4:  Split ways on key vertices
72420     var origCount = osmEntity$$1.id.next.way;
72421     vertices.forEach(function(v) {
72422         // This is an odd way to do it, but we need to find all the ways that
72423         // will be split here, then split them one at a time to ensure that these
72424         // actions can be replayed on the main graph exactly in the same order.
72425         // (It is unintuitive, but the order of ways returned from graph.parentWays()
72426         // is arbitrary, depending on how the main graph and vgraph were built)
72427         var splitAll = actionSplit(v.id);
72428         if (!splitAll.disabled(vgraph)) {
72429             splitAll.ways(vgraph).forEach(function(way) {
72430                 var splitOne = actionSplit(v.id).limitWays([way.id]);
72431                 actions.push(splitOne);
72432                 vgraph = splitOne(vgraph);
72433             });
72434         }
72435     });
72436
72437     // In here is where we should also split the intersection at nearby junction.
72438     //   for https://github.com/mapbox/iD-internal/issues/31
72439     // nearbyVertices.forEach(function(v) {
72440     // });
72441
72442     // Reasons why we reset the way id count here:
72443     //  1. Continuity with way ids created by the splits so that we can replay
72444     //     these actions later if the user decides to create a turn restriction
72445     //  2. Avoids churning way ids just by hovering over a vertex
72446     //     and displaying the turn restriction editor
72447     osmEntity$$1.id.next.way = origCount;
72448
72449
72450     // STEP 5:  Update arrays to point to vgraph entities
72451     vertexIds = vertices.map(function(v) { return v.id; });
72452     vertices = [];
72453     ways = [];
72454
72455     vertexIds.forEach(function(id) {
72456         var vertex = vgraph.entity(id);
72457         var parents = vgraph.parentWays(vertex);
72458         vertices.push(vertex);
72459         ways = ways.concat(parents);
72460     });
72461
72462     vertices = uniq(vertices);
72463     ways = uniq(ways);
72464
72465     vertexIds = vertices.map(function(v) { return v.id; });
72466     wayIds = ways.map(function(w) { return w.id; });
72467
72468
72469     // STEP 6:  Update the ways with some metadata that will be useful for
72470     // walking the intersection graph later and rendering turn arrows.
72471
72472     function withMetadata(way, vertexIds) {
72473         var __oneWay = way.isOneWay();
72474
72475         // which affixes are key vertices?
72476         var __first = (vertexIds.indexOf(way.first()) !== -1);
72477         var __last = (vertexIds.indexOf(way.last()) !== -1);
72478
72479         // what roles is this way eligible for?
72480         var __via = (__first && __last);
72481         var __from = ((__first && !__oneWay) || __last);
72482         var __to = (__first || (__last && !__oneWay));
72483
72484         return way.update({
72485             __first:  __first,
72486             __last:  __last,
72487             __from:  __from,
72488             __via: __via,
72489             __to:  __to,
72490             __oneWay:  __oneWay
72491         });
72492     }
72493
72494     ways = [];
72495     wayIds.forEach(function(id) {
72496         var way = withMetadata(vgraph.entity(id), vertexIds);
72497         vgraph = vgraph.replace(way);
72498         ways.push(way);
72499     });
72500
72501
72502     // STEP 7:  Simplify - This is an iterative process where we:
72503     //  1. Find trivial vertices with only 2 parents
72504     //  2. trim off the leaf way from those vertices and remove from vgraph
72505
72506     var keepGoing;
72507     var removeWayIds = [];
72508     var removeVertexIds = [];
72509
72510     do {
72511         keepGoing = false;
72512         checkVertices = vertexIds.slice();
72513
72514         for (i = 0; i < checkVertices.length; i++) {
72515             var vertexId = checkVertices[i];
72516             vertex = vgraph.hasEntity(vertexId);
72517
72518             if (!vertex) {
72519                 if (vertexIds.indexOf(vertexId) !== -1) {
72520                     vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
72521                 }
72522                 removeVertexIds.push(vertexId);
72523                 continue;
72524             }
72525
72526             parents = vgraph.parentWays(vertex);
72527             if (parents.length < 3) {
72528                 if (vertexIds.indexOf(vertexId) !== -1) {
72529                     vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
72530                 }
72531             }
72532
72533             if (parents.length === 2) {     // vertex with 2 parents is trivial
72534                 var a = parents[0];
72535                 var b = parents[1];
72536                 var aIsLeaf = a && !a.__via;
72537                 var bIsLeaf = b && !b.__via;
72538                 var leaf, survivor;
72539
72540                 if (aIsLeaf && !bIsLeaf) {
72541                     leaf = a;
72542                     survivor = b;
72543                 } else if (!aIsLeaf && bIsLeaf) {
72544                     leaf = b;
72545                     survivor = a;
72546                 }
72547
72548                 if (leaf && survivor) {
72549                     survivor = withMetadata(survivor, vertexIds);      // update survivor way
72550                     vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
72551                     removeWayIds.push(leaf.id);
72552                     keepGoing = true;
72553                 }
72554             }
72555
72556             parents = vgraph.parentWays(vertex);
72557
72558             if (parents.length < 2) {     // vertex is no longer a key vertex
72559                 if (vertexIds.indexOf(vertexId) !== -1) {
72560                     vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
72561                 }
72562                 removeVertexIds.push(vertexId);
72563                 keepGoing = true;
72564             }
72565
72566             if (parents.length < 1) {     // vertex is no longer attached to anything
72567                 vgraph = vgraph.remove(vertex);
72568             }
72569
72570         }
72571     } while (keepGoing);
72572
72573
72574     vertices = vertices
72575         .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
72576         .map(function(vertex) { return vgraph.entity(vertex.id); });
72577     ways = ways
72578         .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
72579         .map(function(way) { return vgraph.entity(way.id); });
72580
72581
72582     // STEP 8:  Extend leaf ways, so they don't end within the viewer
72583     ways.forEach(function(way) {
72584         var n1, n2;
72585         if (way.__via) return;   // not a leaf
72586         if (way.__first) {
72587             n1 = vgraph.entity(way.nodes[way.nodes.length - 2]);
72588             n2 = vgraph.entity(way.nodes[way.nodes.length - 1]);
72589         } else {
72590             n1 = vgraph.entity(way.nodes[1]);
72591             n2 = vgraph.entity(way.nodes[0]);
72592         }
72593
72594         if (n1.loc && n2.loc && vgraph.parentWays(n2).length === 1) {
72595             var toLoc = geoVecInterp(n1.loc, n2.loc, 10);  // extend 1000%
72596             n2 = n2.move(toLoc);
72597             vgraph = vgraph.replace(n2);
72598         }
72599     });
72600
72601
72602     // OK!  Here is our intersection..
72603     var intersection = {
72604         graph: vgraph,
72605         actions: actions,
72606         vertices: vertices,
72607         ways: ways,
72608     };
72609
72610
72611
72612     // Get all the valid turns through this intersection given a starting way id.
72613     // This operates on the virtual graph for everything.
72614     //
72615     // Basically, walk through all possible paths from starting way,
72616     //   honoring the existing turn restrictions as we go (watch out for loops!)
72617     //
72618     // For each path found, generate and return a `osmTurn` datastructure.
72619     //
72620     intersection.turns = function(fromWayId, maxViaWay) {
72621         if (!fromWayId) return [];
72622         if (!maxViaWay) maxViaWay = 0;
72623
72624         var vgraph = intersection.graph;
72625         var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
72626         var keyWayIds = intersection.ways.map(function(w) { return w.id; });
72627
72628         var start = vgraph.entity(fromWayId);
72629         if (!start || !(start.__from || start.__via)) return [];
72630
72631         // maxViaWay=0   from-*-to              (0 vias)
72632         // maxViaWay=1   from-*-via-*-to        (1 via max)
72633         // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
72634         var maxPathLength = (maxViaWay * 2) + 3;
72635         var turns = [];
72636
72637         step(start);
72638         return turns;
72639
72640
72641         // traverse the intersection graph and find all the valid paths
72642         function step(entity, currPath, currRestrictions, matchedRestriction) {
72643             currPath = clone(currPath || []);
72644             if (currPath.length >= maxPathLength) return;
72645             currPath.push(entity.id);
72646             currRestrictions = clone(currRestrictions || []);
72647             var i, j;
72648
72649             if (entity.type === 'node') {
72650                 var parents = vgraph.parentWays(entity);
72651                 var nextWays = [];
72652
72653                 // which ways can we step into?
72654                 for (i = 0; i < parents.length; i++) {
72655                     var way = parents[i];
72656
72657                     // if next way is a oneway incoming to this vertex, skip
72658                     if (way.__oneWay && way.nodes[0] !== entity.id) continue;
72659
72660                     // if we have seen it before (allowing for an initial u-turn), skip
72661                     if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
72662
72663                     // Check all "current" restrictions (where we've already walked the `from`)
72664                     var restrict = undefined;
72665                     for (j = 0; j < currRestrictions.length; j++) {
72666                         var restriction = currRestrictions[j];
72667                         var f = restriction.memberByRole('from');
72668                         var v = restriction.membersByRole('via');
72669                         var t = restriction.memberByRole('to');
72670                         var isOnly = /^only_/.test(restriction.tags.restriction);
72671
72672                         // Are all the vias part of this local intersection?
72673                         // This matters for flagging "indirect" restrictions
72674                         var isLocalVia;
72675                         if (v.length === 1 && v[0].type === 'node') {
72676                             isLocalVia = (keyVertexIds.indexOf(v[0].id) !== -1);
72677                         } else {
72678                             isLocalVia = every(v, function(via) { return keyWayIds.indexOf(via.id) !== -1; });
72679                         }
72680
72681                         // Does the current path match this turn restriction?
72682                         var matchesFrom = (f.id === fromWayId);
72683                         var matchesViaTo = false;
72684                         var isAlongOnlyPath = false;
72685
72686                         if (t.id === way.id) {     // match VIA, TO
72687                             if (v.length === 1 && v[0].type === 'node' && v[0].id === entity.id) {
72688                                 matchesViaTo = true;    // match VIA node
72689                             } else if (every(v, function(via) { return currPath.indexOf(via.id) !== -1; })) {
72690                                 matchesViaTo = true;    // match all VIA ways
72691                             }
72692
72693                         } else if (isOnly) {
72694                             for (k = 0; k < v.length; k++) {
72695                                 // way doesn't match TO, but is one of the via ways along the path of an "only"
72696                                 if (v[k].type === 'way' && v[k].id === way.id) {
72697                                     isAlongOnlyPath = true;
72698                                     break;
72699                                 }
72700                             }
72701                         }
72702
72703                         if (matchesViaTo) {
72704                             if (isOnly) {
72705                                 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
72706                             } else {
72707                                 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
72708                             }
72709                         } else {    // indirect - caused by a different nearby restriction
72710                             if (isAlongOnlyPath) {
72711                                 restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
72712                             } else if (isOnly && isLocalVia) {
72713                                 restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
72714                             }
72715                         }
72716
72717                         // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
72718                         if (restrict && restrict.direct)
72719                             break;
72720                     }
72721
72722                     nextWays.push({ way: way, restrict: restrict });
72723                 }
72724
72725                 nextWays.forEach(function(nextWay) {
72726                     step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
72727                 });
72728
72729
72730             } else {  // entity.type === 'way'
72731                 if (currPath.length >= 3) {     // this is a "complete" path..
72732                     var turnPath = clone(currPath);
72733
72734                     // an indirect restriction - only include the partial path (starting at FROM)
72735                     if (matchedRestriction && matchedRestriction.direct === false) {
72736                         for (i = 0; i < turnPath.length; i++) {
72737                             if (turnPath[i] === matchedRestriction.from) {
72738                                 turnPath = turnPath.slice(i);
72739                                 break;
72740                             }
72741                         }
72742                     }
72743
72744                     var turn = pathToTurn(turnPath);
72745                     if (turn) {
72746                         if (matchedRestriction) {
72747                             turn.restrictionID = matchedRestriction.id;
72748                             turn.no = matchedRestriction.no;
72749                             turn.only = matchedRestriction.only;
72750                             turn.direct = matchedRestriction.direct;
72751                         }
72752                         turns.push(osmTurn(turn));
72753                     }
72754
72755                     if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
72756                 }
72757
72758                 if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
72759
72760                 // which nodes can we step into?
72761                 var n1 = vgraph.entity(entity.first());
72762                 var n2 = vgraph.entity(entity.last());
72763                 var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
72764                 var nextNodes = [];
72765
72766                 if (currPath.length > 1) {
72767                     if (dist > maxDistance) return;   // the next node is too far
72768                     if (!entity.__via) return;        // this way is a leaf / can't be a via
72769                 }
72770
72771                 if (!entity.__oneWay &&                     // bidirectional..
72772                     keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
72773                     currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
72774                     nextNodes.push(n1);                     // can advance to first node
72775                 }
72776                 if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
72777                     currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
72778                     nextNodes.push(n2);                     // can advance to last node
72779                 }
72780
72781                 // gather restrictions FROM this way
72782                 var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
72783                     if (!r.isRestriction()) return false;
72784                     var f = r.memberByRole('from');
72785                     return f && f.id === entity.id;
72786                 });
72787
72788                 nextNodes.forEach(function(node) {
72789                     step(node, currPath, currRestrictions.concat(fromRestrictions), false);
72790                 });
72791             }
72792         }
72793
72794
72795         // assumes path is alternating way-node-way of odd length
72796         function pathToTurn(path) {
72797             if (path.length < 3) return;
72798             var fromWayId, fromNodeId, fromVertexId;
72799             var toWayId, toNodeId, toVertexId;
72800             var viaWayIds, viaNodeId, isUturn;
72801
72802             fromWayId = path[0];
72803             toWayId = path[path.length - 1];
72804
72805             if (path.length === 3 && fromWayId === toWayId) {  // u turn
72806                 var way = vgraph.entity(fromWayId);
72807                 if (way.__oneWay) return null;
72808
72809                 isUturn = true;
72810                 viaNodeId = fromVertexId = toVertexId = path[1];
72811                 fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
72812
72813             } else {
72814                 isUturn = false;
72815                 fromVertexId = path[1];
72816                 fromNodeId = adjacentNode(fromWayId, fromVertexId);
72817                 toVertexId = path[path.length - 2];
72818                 toNodeId = adjacentNode(toWayId, toVertexId);
72819
72820                 if (path.length === 3) {
72821                     viaNodeId = path[1];
72822                 } else {
72823                     viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
72824                     viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
72825                 }
72826             }
72827
72828             return {
72829                 key:  path.join('_'),
72830                 path: path,
72831                 from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
72832                 via:  { node: viaNodeId,  ways: viaWayIds },
72833                 to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
72834                 u:    isUturn
72835             };
72836
72837
72838             function adjacentNode(wayId, affixId) {
72839                 var nodes = vgraph.entity(wayId).nodes;
72840                 return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
72841             }
72842         }
72843
72844     };
72845
72846     return intersection;
72847 }
72848
72849
72850 function osmInferRestriction(graph, turn, projection) {
72851     var fromWay = graph.entity(turn.from.way);
72852     var fromNode = graph.entity(turn.from.node);
72853     var fromVertex = graph.entity(turn.from.vertex);
72854     var toWay = graph.entity(turn.to.way);
72855     var toNode = graph.entity(turn.to.node);
72856     var toVertex = graph.entity(turn.to.vertex);
72857
72858     var fromOneWay = (fromWay.tags.oneway === 'yes');
72859     var toOneWay = (toWay.tags.oneway === 'yes');
72860     var angle = (geoAngle(fromVertex, fromNode, projection) -
72861                 geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
72862
72863     while (angle < 0)
72864         angle += 360;
72865
72866     if (fromNode === toNode)
72867         return 'no_u_turn';
72868     if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
72869         return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
72870     if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
72871         return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
72872     if (angle < 158)
72873         return 'no_right_turn';
72874     if (angle > 202)
72875         return 'no_left_turn';
72876
72877     return 'no_straight_on';
72878 }
72879
72880 function actionAddMember(relationId, member, memberIndex, insertPair) {
72881
72882     return function action(graph) {
72883         var relation = graph.entity(relationId);
72884
72885         if ((isNaN(memberIndex) || insertPair) && member.type === 'way') {
72886             // Try to perform sensible inserts based on how the ways join together
72887             graph = addWayMember(relation, graph);
72888         } else {
72889             graph = graph.replace(relation.addMember(member, memberIndex));
72890         }
72891
72892         return graph;
72893     };
72894
72895
72896     // Add a way member into the relation "wherever it makes sense".
72897     // In this situation we were not supplied a memberIndex.
72898     function addWayMember(relation, graph) {
72899         var groups, tempWay, item, i, j, k;
72900
72901         if (insertPair) {
72902             // We're adding a member that must stay paired with an existing member.
72903             // (This feature is used by `actionSplit`)
72904             //
72905             // This is tricky because the members may exist multiple times in the
72906             // member list, and with different A-B/B-A ordering and different roles.
72907             // (e.g. a bus route that loops out and back - #4589).
72908             //
72909             // Replace the existing member with a temporary way,
72910             // so that `osmJoinWays` can treat the pair like a single way.
72911             tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
72912             graph = graph.replace(tempWay);
72913             var tempMember = { id: tempWay.id, type: 'way', role: member.role };
72914             var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
72915             groups = groupBy(tempRelation.members, function(m) { return m.type; });
72916             groups.way = groups.way || [];
72917
72918         } else {
72919             // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
72920             groups = groupBy(relation.members, function(m) { return m.type; });
72921             groups.way = groups.way || [];
72922             groups.way.push(member);
72923         }
72924
72925         var members = withIndex(groups.way);
72926         var joined = osmJoinWays(members, graph);
72927
72928         // `joined` might not contain all of the way members,
72929         // But will contain only the completed (downloaded) members
72930         for (i = 0; i < joined.length; i++) {
72931             var segment = joined[i];
72932             var nodes = segment.nodes.slice();
72933             var startIndex = segment[0].index;
72934
72935             // j = array index in `members` where this segment starts
72936             for (j = 0; j < members.length; j++) {
72937                 if (members[j].index === startIndex) {
72938                     break;
72939                 }
72940             }
72941
72942             // k = each member in segment
72943             for (k = 0; k < segment.length; k++) {
72944                 item = segment[k];
72945                 var way = graph.entity(item.id);
72946
72947                 // If this is a paired item, generate members in correct order and role
72948                 if (tempWay && item.id === tempWay.id) {
72949                     if (nodes[0].id === insertPair.nodes[0]) {
72950                         item.pair = [
72951                             { id: insertPair.originalID, type: 'way', role: item.role },
72952                             { id: insertPair.insertedID, type: 'way', role: item.role }
72953                         ];
72954                     } else {
72955                         item.pair = [
72956                             { id: insertPair.insertedID, type: 'way', role: item.role },
72957                             { id: insertPair.originalID, type: 'way', role: item.role }
72958                         ];
72959                     }
72960                 }
72961
72962                 // reorder `members` if necessary
72963                 if (k > 0) {
72964                     if (j+k >= members.length || item.index !== members[j+k].index) {
72965                         moveMember(members, item.index, j+k);
72966                     }
72967                 }
72968
72969                 nodes.splice(0, way.nodes.length - 1);
72970             }
72971         }
72972
72973         if (tempWay) {
72974             graph = graph.remove(tempWay);
72975         }
72976
72977         // Final pass: skip dead items, split pairs, remove index properties
72978         var wayMembers = [];
72979         for (i = 0; i < members.length; i++) {
72980             item = members[i];
72981             if (item.index === -1) continue;
72982
72983             if (item.pair) {
72984                 wayMembers.push(item.pair[0]);
72985                 wayMembers.push(item.pair[1]);
72986             } else {
72987                 wayMembers.push(omit(item, 'index'));
72988             }
72989         }
72990
72991         // Write members in the order: nodes, ways, relations
72992         // This is reccomended for Public Transport routes:
72993         // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
72994         var newMembers = (groups.node || []).concat(wayMembers, (groups.relation || []));
72995
72996         return graph.replace(relation.update({members: newMembers}));
72997
72998
72999         // `moveMember()` changes the `members` array in place by splicing
73000         // the item with `.index = findIndex` to where it belongs,
73001         // and marking the old position as "dead" with `.index = -1`
73002         //
73003         // j=5, k=0                jk
73004         // segment                 5 4 7 6
73005         // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
73006         //
73007         // j=5, k=1                j k
73008         // segment                 5 4 7 6
73009         // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
73010         // members       0 1 2 3 x 5 4 6 7 8 9      moved
73011         //
73012         // j=5, k=2                j   k
73013         // segment                 5 4 7 6
73014         // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
73015         // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
73016         //
73017         // j=5, k=3                j     k
73018         // segment                 5 4 7 6
73019         // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
73020         //
73021         function moveMember(arr, findIndex, toIndex) {
73022             for (var i = 0; i < arr.length; i++) {
73023                 if (arr[i].index === findIndex) {
73024                     break;
73025                 }
73026             }
73027
73028             var item = clone(arr[i]);
73029             arr[i].index = -1;   // mark as dead
73030             item.index = toIndex;
73031             arr.splice(toIndex, 0, item);
73032         }
73033
73034
73035         // This is the same as `Relation.indexedMembers`,
73036         // Except we don't want to index all the members, only the ways
73037         function withIndex(arr) {
73038             var result = new Array(arr.length);
73039             for (var i = 0; i < arr.length; i++) {
73040                 result[i] = arr[i];
73041                 result[i].index = i;
73042             }
73043             return result;
73044         }
73045     }
73046
73047 }
73048
73049 function actionAddMidpoint(midpoint, node) {
73050     return function(graph) {
73051         graph = graph.replace(node.move(midpoint.loc));
73052
73053         var parents = intersection(
73054             graph.parentWays(graph.entity(midpoint.edge[0])),
73055             graph.parentWays(graph.entity(midpoint.edge[1])));
73056
73057         parents.forEach(function(way) {
73058             for (var i = 0; i < way.nodes.length - 1; i++) {
73059                 if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
73060                     graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
73061
73062                     // Add only one midpoint on doubled-back segments,
73063                     // turning them into self-intersections.
73064                     return;
73065                 }
73066             }
73067         });
73068
73069         return graph;
73070     };
73071 }
73072
73073 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
73074 function actionAddVertex(wayId, nodeId, index) {
73075     return function(graph) {
73076         return graph.replace(graph.entity(wayId).addNode(nodeId, index));
73077     };
73078 }
73079
73080 function actionChangeMember(relationId, member, memberIndex) {
73081     return function(graph) {
73082         return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
73083     };
73084 }
73085
73086 function actionChangePreset(entityId, oldPreset, newPreset) {
73087     return function(graph) {
73088         var entity = graph.entity(entityId),
73089             geometry = entity.geometry(graph),
73090             tags = entity.tags;
73091
73092         if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
73093         if (newPreset) tags = newPreset.applyTags(tags, geometry);
73094
73095         return graph.replace(entity.update({tags: tags}));
73096     };
73097 }
73098
73099 function actionChangeTags(entityId, tags) {
73100     return function(graph) {
73101         var entity = graph.entity(entityId);
73102         return graph.replace(entity.update({tags: tags}));
73103     };
73104 }
73105
73106 function actionCircularize(wayId, projection, maxAngle) {
73107     maxAngle = (maxAngle || 20) * Math.PI / 180;
73108
73109
73110     var action = function(graph, t) {
73111         if (t === null || !isFinite(t)) t = 1;
73112         t = Math.min(Math.max(+t, 0), 1);
73113
73114         var way = graph.entity(wayId),
73115             origNodes = {};
73116
73117         graph.childNodes(way).forEach(function(node) {
73118             if (!origNodes[node.id]) origNodes[node.id] = node;
73119         });
73120
73121         if (!way.isConvex(graph)) {
73122             graph = action.makeConvex(graph);
73123         }
73124
73125         var nodes = uniq(graph.childNodes(way)),
73126             keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
73127             points = nodes.map(function(n) { return projection(n.loc); }),
73128             keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
73129             centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
73130             radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
73131             sign = d3_polygonArea(points) > 0 ? 1 : -1,
73132             ids;
73133
73134         // we need atleast two key nodes for the algorithm to work
73135         if (!keyNodes.length) {
73136             keyNodes = [nodes[0]];
73137             keyPoints = [points[0]];
73138         }
73139
73140         if (keyNodes.length === 1) {
73141             var index = nodes.indexOf(keyNodes[0]),
73142                 oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
73143
73144             keyNodes.push(nodes[oppositeIndex]);
73145             keyPoints.push(points[oppositeIndex]);
73146         }
73147
73148         // key points and nodes are those connected to the ways,
73149         // they are projected onto the circle, inbetween nodes are moved
73150         // to constant intervals between key nodes, extra inbetween nodes are
73151         // added if necessary.
73152         for (var i = 0; i < keyPoints.length; i++) {
73153             var nextKeyNodeIndex = (i + 1) % keyNodes.length,
73154                 startNode = keyNodes[i],
73155                 endNode = keyNodes[nextKeyNodeIndex],
73156                 startNodeIndex = nodes.indexOf(startNode),
73157                 endNodeIndex = nodes.indexOf(endNode),
73158                 numberNewPoints = -1,
73159                 indexRange = endNodeIndex - startNodeIndex,
73160                 nearNodes = {},
73161                 inBetweenNodes = [],
73162                 startAngle, endAngle, totalAngle, eachAngle,
73163                 angle, loc, node, origNode, j;
73164
73165             if (indexRange < 0) {
73166                 indexRange += nodes.length;
73167             }
73168
73169             // position this key node
73170             var distance = geoVecLength(centroid, keyPoints[i]);
73171             if (distance === 0) { distance = 1e-4; }
73172             keyPoints[i] = [
73173                 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
73174                 centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
73175             ];
73176             loc = projection.invert(keyPoints[i]);
73177             node = keyNodes[i];
73178             origNode = origNodes[node.id];
73179             node = node.move(geoVecInterp(origNode.loc, loc, t));
73180             graph = graph.replace(node);
73181
73182             // figure out the between delta angle we want to match to
73183             startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
73184             endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
73185             totalAngle = endAngle - startAngle;
73186
73187             // detects looping around -pi/pi
73188             if (totalAngle * sign > 0) {
73189                 totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
73190             }
73191
73192             do {
73193                 numberNewPoints++;
73194                 eachAngle = totalAngle / (indexRange + numberNewPoints);
73195             } while (Math.abs(eachAngle) > maxAngle);
73196
73197
73198             // move existing nodes
73199             for (j = 1; j < indexRange; j++) {
73200                 angle = startAngle + j * eachAngle;
73201                 loc = projection.invert([
73202                     centroid[0] + Math.cos(angle) * radius,
73203                     centroid[1] + Math.sin(angle) * radius
73204                 ]);
73205
73206                 node = nodes[(j + startNodeIndex) % nodes.length];
73207                 origNode = origNodes[node.id];
73208                 nearNodes[node.id] = angle;
73209
73210                 node = node.move(geoVecInterp(origNode.loc, loc, t));
73211                 graph = graph.replace(node);
73212             }
73213
73214             // add new inbetween nodes if necessary
73215             for (j = 0; j < numberNewPoints; j++) {
73216                 angle = startAngle + (indexRange + j) * eachAngle;
73217                 loc = projection.invert([
73218                     centroid[0] + Math.cos(angle) * radius,
73219                     centroid[1] + Math.sin(angle) * radius
73220                 ]);
73221
73222                 // choose a nearnode to use as the original
73223                 var min$$1 = Infinity;
73224                 for (var nodeId in nearNodes) {
73225                     var nearAngle = nearNodes[nodeId],
73226                         dist = Math.abs(nearAngle - angle);
73227                     if (dist < min$$1) {
73228                         dist = min$$1;
73229                         origNode = origNodes[nodeId];
73230                     }
73231                 }
73232
73233                 node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
73234                 graph = graph.replace(node);
73235
73236                 nodes.splice(endNodeIndex + j, 0, node);
73237                 inBetweenNodes.push(node.id);
73238             }
73239
73240             // Check for other ways that share these keyNodes..
73241             // If keyNodes are adjacent in both ways,
73242             // we can add inBetween nodes to that shared way too..
73243             if (indexRange === 1 && inBetweenNodes.length) {
73244                 var startIndex1 = way.nodes.lastIndexOf(startNode.id),
73245                     endIndex1 = way.nodes.lastIndexOf(endNode.id),
73246                     wayDirection1 = (endIndex1 - startIndex1);
73247                 if (wayDirection1 < -1) { wayDirection1 = 1; }
73248
73249                 /* eslint-disable no-loop-func */
73250                 forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
73251                     if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
73252                         var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
73253                             endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
73254                             wayDirection2 = (endIndex2 - startIndex2),
73255                             insertAt = endIndex2;
73256                         if (wayDirection2 < -1) { wayDirection2 = 1; }
73257
73258                         if (wayDirection1 !== wayDirection2) {
73259                             inBetweenNodes.reverse();
73260                             insertAt = startIndex2;
73261                         }
73262                         for (j = 0; j < inBetweenNodes.length; j++) {
73263                             sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
73264                         }
73265                         graph = graph.replace(sharedWay);
73266                     }
73267                 });
73268                 /* eslint-enable no-loop-func */
73269             }
73270
73271         }
73272
73273         // update the way to have all the new nodes
73274         ids = nodes.map(function(n) { return n.id; });
73275         ids.push(ids[0]);
73276
73277         way = way.update({nodes: ids});
73278         graph = graph.replace(way);
73279
73280         return graph;
73281     };
73282
73283
73284     action.makeConvex = function(graph) {
73285         var way = graph.entity(wayId),
73286             nodes = uniq(graph.childNodes(way)),
73287             points = nodes.map(function(n) { return projection(n.loc); }),
73288             sign = d3_polygonArea(points) > 0 ? 1 : -1,
73289             hull = d3_polygonHull(points);
73290
73291         // D3 convex hulls go counterclockwise..
73292         if (sign === -1) {
73293             nodes.reverse();
73294             points.reverse();
73295         }
73296
73297         for (var i = 0; i < hull.length - 1; i++) {
73298             var startIndex = points.indexOf(hull[i]),
73299                 endIndex = points.indexOf(hull[i+1]),
73300                 indexRange = (endIndex - startIndex);
73301
73302             if (indexRange < 0) {
73303                 indexRange += nodes.length;
73304             }
73305
73306             // move interior nodes to the surface of the convex hull..
73307             for (var j = 1; j < indexRange; j++) {
73308                 var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
73309                     node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
73310                 graph = graph.replace(node);
73311             }
73312         }
73313         return graph;
73314     };
73315
73316
73317     action.disabled = function(graph) {
73318         if (!graph.entity(wayId).isClosed())
73319             return 'not_closed';
73320     };
73321
73322
73323     action.transitionable = true;
73324
73325
73326     return action;
73327 }
73328
73329 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
73330 function actionDeleteWay(wayId) {
73331
73332
73333     function canDeleteNode(node, graph) {
73334         return !graph.parentWays(node).length &&
73335             !graph.parentRelations(node).length &&
73336             !node.hasInterestingTags();
73337     }
73338
73339
73340     var action = function(graph) {
73341         var way = graph.entity(wayId);
73342
73343         graph.parentRelations(way)
73344             .forEach(function(parent) {
73345                 parent = parent.removeMembersWithID(wayId);
73346                 graph = graph.replace(parent);
73347
73348                 if (parent.isDegenerate()) {
73349                     graph = actionDeleteRelation(parent.id)(graph);
73350                 }
73351             });
73352
73353         uniq(way.nodes).forEach(function(nodeId) {
73354             graph = graph.replace(way.removeNode(nodeId));
73355
73356             var node = graph.entity(nodeId);
73357             if (canDeleteNode(node, graph)) {
73358                 graph = graph.remove(node);
73359             }
73360         });
73361
73362         return graph.remove(way);
73363     };
73364
73365
73366     return action;
73367 }
73368
73369 function actionDeleteMultiple(ids) {
73370     var actions = {
73371         way: actionDeleteWay,
73372         node: actionDeleteNode,
73373         relation: actionDeleteRelation
73374     };
73375
73376
73377     var action = function(graph) {
73378         ids.forEach(function(id) {
73379             if (graph.hasEntity(id)) { // It may have been deleted aready.
73380                 graph = actions[graph.entity(id).type](id)(graph);
73381             }
73382         });
73383
73384         return graph;
73385     };
73386
73387
73388     return action;
73389 }
73390
73391 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
73392 function actionDeleteRelation(relationId) {
73393
73394
73395     function canDeleteEntity(entity, graph) {
73396         return !graph.parentWays(entity).length &&
73397             !graph.parentRelations(entity).length &&
73398             !entity.hasInterestingTags();
73399     }
73400
73401
73402     var action = function(graph) {
73403         var relation = graph.entity(relationId);
73404
73405         graph.parentRelations(relation)
73406             .forEach(function(parent) {
73407                 parent = parent.removeMembersWithID(relationId);
73408                 graph = graph.replace(parent);
73409
73410                 if (parent.isDegenerate()) {
73411                     graph = actionDeleteRelation(parent.id)(graph);
73412                 }
73413             });
73414
73415         uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
73416             graph = graph.replace(relation.removeMembersWithID(memberId));
73417
73418             var entity = graph.entity(memberId);
73419             if (canDeleteEntity(entity, graph)) {
73420                 graph = actionDeleteMultiple([memberId])(graph);
73421             }
73422         });
73423
73424         return graph.remove(relation);
73425     };
73426
73427
73428     return action;
73429 }
73430
73431 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
73432 function actionDeleteNode(nodeId) {
73433     var action = function(graph) {
73434         var node = graph.entity(nodeId);
73435
73436         graph.parentWays(node)
73437             .forEach(function(parent) {
73438                 parent = parent.removeNode(nodeId);
73439                 graph = graph.replace(parent);
73440
73441                 if (parent.isDegenerate()) {
73442                     graph = actionDeleteWay(parent.id)(graph);
73443                 }
73444             });
73445
73446         graph.parentRelations(node)
73447             .forEach(function(parent) {
73448                 parent = parent.removeMembersWithID(nodeId);
73449                 graph = graph.replace(parent);
73450
73451                 if (parent.isDegenerate()) {
73452                     graph = actionDeleteRelation(parent.id)(graph);
73453                 }
73454             });
73455
73456         return graph.remove(node);
73457     };
73458
73459
73460     return action;
73461 }
73462
73463 // Connect the ways at the given nodes.
73464 //
73465 // The last node will survive. All other nodes will be replaced with
73466 // the surviving node in parent ways, and then removed.
73467 //
73468 // Tags and relation memberships of of non-surviving nodes are merged
73469 // to the survivor.
73470 //
73471 // This is the inverse of `iD.actionDisconnect`.
73472 //
73473 // Reference:
73474 //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
73475 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
73476 //
73477 function actionConnect(nodeIds) {
73478     return function(graph) {
73479         var last = nodeIds[nodeIds.length - 1];
73480         var survivor = graph.entity(last);
73481
73482         for (var i = 0; i < nodeIds.length - 1; i++) {
73483             var node = graph.entity(nodeIds[i]);
73484
73485             /* eslint-disable no-loop-func */
73486             graph.parentWays(node).forEach(function(parent) {
73487                 if (!parent.areAdjacent(node.id, survivor.id)) {
73488                     graph = graph.replace(parent.replaceNode(node.id, survivor.id));
73489                 }
73490             });
73491
73492             graph.parentRelations(node).forEach(function(parent) {
73493                 graph = graph.replace(parent.replaceMember(node, survivor));
73494             });
73495             /* eslint-enable no-loop-func */
73496
73497             survivor = survivor.mergeTags(node.tags);
73498             graph = actionDeleteNode(node.id)(graph);
73499         }
73500
73501         graph = graph.replace(survivor);
73502
73503         return graph;
73504     };
73505 }
73506
73507 function actionCopyEntities(ids, fromGraph) {
73508     var copies = {};
73509
73510
73511     var action = function(graph) {
73512         ids.forEach(function(id) {
73513             fromGraph.entity(id).copy(fromGraph, copies);
73514         });
73515
73516         for (var id in copies) {
73517             graph = graph.replace(copies[id]);
73518         }
73519
73520         return graph;
73521     };
73522
73523
73524     action.copies = function() {
73525         return copies;
73526     };
73527
73528
73529     return action;
73530 }
73531
73532 function actionDeleteMember(relationId, memberIndex) {
73533     return function(graph) {
73534         var relation = graph.entity(relationId)
73535             .removeMember(memberIndex);
73536
73537         graph = graph.replace(relation);
73538
73539         if (relation.isDegenerate())
73540             graph = actionDeleteRelation(relation.id)(graph);
73541
73542         return graph;
73543     };
73544 }
73545
73546 function actionDeprecateTags(entityId) {
73547
73548     return function(graph) {
73549         var entity = graph.entity(entityId),
73550             newtags = clone(entity.tags),
73551             change = false,
73552             rule;
73553
73554         // This handles dataDeprecated tags with a single condition
73555         for (var i = 0; i < dataDeprecated.length; i++) {
73556
73557             rule = dataDeprecated[i];
73558             var match = toPairs(rule.old)[0],
73559                 replacements = rule.replace ? toPairs(rule.replace) : null;
73560
73561             if (entity.tags[match[0]] && match[1] === '*') {
73562
73563                 var value = entity.tags[match[0]];
73564                 if (replacements && !newtags[replacements[0][0]]) {
73565                     newtags[replacements[0][0]] = value;
73566                 }
73567                 delete newtags[match[0]];
73568                 change = true;
73569
73570             } else if (entity.tags[match[0]] === match[1]) {
73571                 newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
73572                 change = true;
73573             }
73574         }
73575
73576         if (change) {
73577             return graph.replace(entity.update({tags: newtags}));
73578         } else {
73579             return graph;
73580         }
73581     };
73582 }
73583
73584 function actionDiscardTags(difference) {
73585
73586     return function(graph) {
73587         function discardTags(entity) {
73588             var tags = {};
73589             var keys = Object.keys(entity.tags);
73590             var discarded = false;
73591
73592             for (var i = 0; i < keys.length; i++) {
73593                 var k = keys[i];
73594                 if (dataDiscarded[k] || !entity.tags[k]) {
73595                     discarded = true;
73596                 } else {
73597                     tags[k] = entity.tags[k];
73598                 }
73599             }
73600
73601             if (discarded) {
73602                 graph = graph.replace(entity.update({ tags: tags }));
73603             }
73604         }
73605
73606         difference.modified().forEach(discardTags);
73607         difference.created().forEach(discardTags);
73608
73609         return graph;
73610     };
73611 }
73612
73613 // Disconect the ways at the given node.
73614 //
73615 // Optionally, disconnect only the given ways.
73616 //
73617 // For testing convenience, accepts an ID to assign to the (first) new node.
73618 // Normally, this will be undefined and the way will automatically
73619 // be assigned a new ID.
73620 //
73621 // This is the inverse of `iD.actionConnect`.
73622 //
73623 // Reference:
73624 //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
73625 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
73626 //
73627 function actionDisconnect(nodeId, newNodeId) {
73628     var wayIds;
73629
73630
73631     var action = function(graph) {
73632         var node = graph.entity(nodeId),
73633             connections = action.connections(graph);
73634
73635         connections.forEach(function(connection) {
73636             var way = graph.entity(connection.wayID),
73637                 newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
73638
73639             graph = graph.replace(newNode);
73640             if (connection.index === 0 && way.isArea()) {
73641                 // replace shared node with shared node..
73642                 graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
73643             } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
73644                 // replace closing node with new new node..
73645                 graph = graph.replace(way.unclose().addNode(newNode.id));
73646             } else {
73647                 // replace shared node with multiple new nodes..
73648                 graph = graph.replace(way.updateNode(newNode.id, connection.index));
73649             }
73650         });
73651
73652         return graph;
73653     };
73654
73655
73656     action.connections = function(graph) {
73657         var candidates = [],
73658             keeping = false,
73659             parentWays = graph.parentWays(graph.entity(nodeId));
73660
73661         parentWays.forEach(function(way) {
73662             if (wayIds && wayIds.indexOf(way.id) === -1) {
73663                 keeping = true;
73664                 return;
73665             }
73666             if (way.isArea() && (way.nodes[0] === nodeId)) {
73667                 candidates.push({ wayID: way.id, index: 0 });
73668             } else {
73669                 way.nodes.forEach(function(waynode, index) {
73670                     if (waynode === nodeId) {
73671                         candidates.push({ wayID: way.id, index: index });
73672                     }
73673                 });
73674             }
73675         });
73676
73677         return keeping ? candidates : candidates.slice(1);
73678     };
73679
73680
73681     action.disabled = function(graph) {
73682         var connections = action.connections(graph);
73683         if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
73684             return 'not_connected';
73685
73686         var parentWays = graph.parentWays(graph.entity(nodeId)),
73687             seenRelationIds = {},
73688             sharedRelation;
73689
73690         parentWays.forEach(function(way) {
73691             if (wayIds && wayIds.indexOf(way.id) === -1)
73692                 return;
73693
73694             var relations = graph.parentRelations(way);
73695             relations.forEach(function(relation) {
73696                 if (relation.id in seenRelationIds) {
73697                     sharedRelation = relation;
73698                 } else {
73699                     seenRelationIds[relation.id] = true;
73700                 }
73701             });
73702         });
73703
73704         if (sharedRelation)
73705             return 'relation';
73706     };
73707
73708
73709     action.limitWays = function(_) {
73710         if (!arguments.length) return wayIds;
73711         wayIds = _;
73712         return action;
73713     };
73714
73715
73716     return action;
73717 }
73718
73719 // Join ways at the end node they share.
73720 //
73721 // This is the inverse of `iD.actionSplit`.
73722 //
73723 // Reference:
73724 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
73725 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
73726 //
73727 function actionJoin(ids) {
73728
73729     function groupEntitiesByGeometry(graph) {
73730         var entities = ids.map(function(id) { return graph.entity(id); });
73731         return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
73732     }
73733
73734
73735     var action = function(graph) {
73736         var ways = ids.map(graph.entity, graph);
73737         var survivorID = ways[0].id;
73738
73739         // Prefer to keep an existing way.
73740         for (var i = 0; i < ways.length; i++) {
73741             if (!ways[i].isNew()) {
73742                 survivorID = ways[i].id;
73743                 break;
73744             }
73745         }
73746
73747         var sequences = osmJoinWays(ways, graph);
73748         var joined = sequences[0];
73749
73750         // We might need to reverse some of these ways before joining them.  #4688
73751         // `joined.actions` property will contain any actions we need to apply.
73752         graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
73753
73754         var survivor = graph.entity(survivorID);
73755         survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
73756         graph = graph.replace(survivor);
73757
73758         joined.forEach(function(way) {
73759             if (way.id === survivorID) return;
73760
73761             graph.parentRelations(way).forEach(function(parent) {
73762                 graph = graph.replace(parent.replaceMember(way, survivor));
73763             });
73764
73765             survivor = survivor.mergeTags(way.tags);
73766
73767             graph = graph.replace(survivor);
73768             graph = actionDeleteWay(way.id)(graph);
73769         });
73770
73771         return graph;
73772     };
73773
73774
73775     action.disabled = function(graph) {
73776         var geometries = groupEntitiesByGeometry(graph);
73777         if (ids.length < 2 || ids.length !== geometries.line.length)
73778             return 'not_eligible';
73779
73780         var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
73781         if (joined.length > 1)
73782             return 'not_adjacent';
73783
73784         var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
73785         var relation;
73786         var tags = {};
73787         var conflicting = false;
73788
73789         joined[0].forEach(function(way) {
73790             var parents = graph.parentRelations(way);
73791             parents.forEach(function(parent) {
73792                 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
73793                     relation = parent;
73794             });
73795
73796             for (var k in way.tags) {
73797                 if (!(k in tags)) {
73798                     tags[k] = way.tags[k];
73799                 } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
73800                     conflicting = true;
73801                 }
73802             }
73803         });
73804
73805         if (relation)
73806             return 'restriction';
73807
73808         if (conflicting)
73809             return 'conflicting_tags';
73810     };
73811
73812
73813     return action;
73814 }
73815
73816 function actionMerge(ids) {
73817
73818     function groupEntitiesByGeometry(graph) {
73819         var entities = ids.map(function(id) { return graph.entity(id); });
73820         return assignIn({point: [], area: [], line: [], relation: []},
73821             groupBy(entities, function(entity) { return entity.geometry(graph); }));
73822     }
73823
73824
73825     var action = function(graph) {
73826         var geometries = groupEntitiesByGeometry(graph),
73827             target = geometries.area[0] || geometries.line[0],
73828             points = geometries.point;
73829
73830         points.forEach(function(point) {
73831             target = target.mergeTags(point.tags);
73832             graph = graph.replace(target);
73833
73834             graph.parentRelations(point).forEach(function(parent) {
73835                 graph = graph.replace(parent.replaceMember(point, target));
73836             });
73837
73838             var nodes = uniq(graph.childNodes(target)),
73839                 removeNode = point;
73840
73841             for (var i = 0; i < nodes.length; i++) {
73842                 var node = nodes[i];
73843                 if (graph.parentWays(node).length > 1 ||
73844                     graph.parentRelations(node).length ||
73845                     node.hasInterestingTags()) {
73846                     continue;
73847                 }
73848
73849                 // Found an uninteresting child node on the target way.
73850                 // Move orig point into its place to preserve point's history. #3683
73851                 graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
73852                 target = target.replaceNode(node.id, point.id);
73853                 graph = graph.replace(target);
73854                 removeNode = node;
73855                 break;
73856             }
73857
73858             graph = graph.remove(removeNode);
73859         });
73860
73861         return graph;
73862     };
73863
73864
73865     action.disabled = function(graph) {
73866         var geometries = groupEntitiesByGeometry(graph);
73867         if (geometries.point.length === 0 ||
73868             (geometries.area.length + geometries.line.length) !== 1 ||
73869             geometries.relation.length !== 0)
73870             return 'not_eligible';
73871     };
73872
73873
73874     return action;
73875 }
73876
73877 function actionMergePolygon(ids, newRelationId) {
73878
73879     function groupEntities(graph) {
73880         var entities = ids.map(function (id) { return graph.entity(id); });
73881         return assignIn({
73882                 closedWay: [],
73883                 multipolygon: [],
73884                 other: []
73885             }, groupBy(entities, function(entity) {
73886                 if (entity.type === 'way' && entity.isClosed()) {
73887                     return 'closedWay';
73888                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
73889                     return 'multipolygon';
73890                 } else {
73891                     return 'other';
73892                 }
73893             }));
73894     }
73895
73896
73897     var action = function(graph) {
73898         var entities = groupEntities(graph);
73899
73900         // An array representing all the polygons that are part of the multipolygon.
73901         //
73902         // Each element is itself an array of objects with an id property, and has a
73903         // locs property which is an array of the locations forming the polygon.
73904         var polygons = entities.multipolygon.reduce(function(polygons, m) {
73905             return polygons.concat(osmJoinWays(m.members, graph));
73906         }, []).concat(entities.closedWay.map(function(d) {
73907             var member = [{id: d.id}];
73908             member.nodes = graph.childNodes(d);
73909             return member;
73910         }));
73911
73912         // contained is an array of arrays of boolean values,
73913         // where contained[j][k] is true iff the jth way is
73914         // contained by the kth way.
73915         var contained = polygons.map(function(w, i) {
73916             return polygons.map(function(d, n) {
73917                 if (i === n) return null;
73918                 return geoPolygonContainsPolygon(
73919                     map$3(d.nodes, 'loc'),
73920                     map$3(w.nodes, 'loc'));
73921             });
73922         });
73923
73924         // Sort all polygons as either outer or inner ways
73925         var members = [],
73926             outer = true;
73927
73928         while (polygons.length) {
73929             extractUncontained(polygons);
73930             polygons = polygons.filter(isContained);
73931             contained = contained.filter(isContained).map(filterContained);
73932         }
73933
73934         function isContained(d, i) {
73935             return some(contained[i]);
73936         }
73937
73938         function filterContained(d) {
73939             return d.filter(isContained);
73940         }
73941
73942         function extractUncontained(polygons) {
73943             polygons.forEach(function(d, i) {
73944                 if (!isContained(d, i)) {
73945                     d.forEach(function(member) {
73946                         members.push({
73947                             type: 'way',
73948                             id: member.id,
73949                             role: outer ? 'outer' : 'inner'
73950                         });
73951                     });
73952                 }
73953             });
73954             outer = !outer;
73955         }
73956
73957         // Move all tags to one relation
73958         var relation = entities.multipolygon[0] ||
73959             osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
73960
73961         entities.multipolygon.slice(1).forEach(function(m) {
73962             relation = relation.mergeTags(m.tags);
73963             graph = graph.remove(m);
73964         });
73965
73966         entities.closedWay.forEach(function(way) {
73967             function isThisOuter(m) {
73968                 return m.id === way.id && m.role !== 'inner';
73969             }
73970             if (members.some(isThisOuter)) {
73971                 relation = relation.mergeTags(way.tags);
73972                 graph = graph.replace(way.update({ tags: {} }));
73973             }
73974         });
73975
73976         return graph.replace(relation.update({
73977             members: members,
73978             tags: omit(relation.tags, 'area')
73979         }));
73980     };
73981
73982
73983     action.disabled = function(graph) {
73984         var entities = groupEntities(graph);
73985         if (entities.other.length > 0 ||
73986             entities.closedWay.length + entities.multipolygon.length < 2)
73987             return 'not_eligible';
73988         if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
73989             return 'incomplete_relation';
73990     };
73991
73992
73993     return action;
73994 }
73995
73996 // Text diff algorithm following Hunt and McIlroy 1976.
73997 // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
73998 // comparison, Bell Telephone Laboratories CSTR #41 (1976)
73999 // http://www.cs.dartmouth.edu/~doug/
74000 //
74001 // Expects two arrays of strings.
74002 function LCS(file1, file2) {
74003   var equivalenceClasses;
74004   var file2indices;
74005   var newCandidate;
74006   var candidates;
74007   var line;
74008   var c, i, j, jX, r, s;
74009
74010   equivalenceClasses = {};
74011   for (j = 0; j < file2.length; j++) {
74012     line = file2[j];
74013     if (equivalenceClasses[line]) {
74014       equivalenceClasses[line].push(j);
74015     } else {
74016       equivalenceClasses[line] = [j];
74017     }
74018   }
74019
74020   candidates = [
74021     { file1index: -1, file2index: -1, chain: null }
74022   ];
74023
74024   for (i = 0; i < file1.length; i++) {
74025     line = file1[i];
74026     file2indices = equivalenceClasses[line] || [];
74027
74028     r = 0;
74029     c = candidates[0];
74030
74031     for (jX = 0; jX < file2indices.length; jX++) {
74032       j = file2indices[jX];
74033
74034       for (s = r; s < candidates.length; s++) {
74035         if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
74036           break;
74037         }
74038       }
74039
74040       if (s < candidates.length) {
74041         newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
74042         if (r === candidates.length) {
74043           candidates.push(c);
74044         } else {
74045           candidates[r] = c;
74046         }
74047         r = s + 1;
74048         c = newCandidate;
74049         if (r === candidates.length) {
74050           break; // no point in examining further (j)s
74051         }
74052       }
74053     }
74054
74055     candidates[r] = c;
74056   }
74057
74058   // At this point, we know the LCS: it's in the reverse of the
74059   // linked-list through .chain of candidates[candidates.length - 1].
74060
74061   return candidates[candidates.length - 1];
74062 }
74063
74064
74065 // We apply the LCS to give a simple representation of the
74066 // offsets and lengths of mismatched chunks in the input
74067 // files. This is used by diff3MergeIndices below.
74068 function diffIndices(file1, file2) {
74069   var result = [];
74070   var tail1 = file1.length;
74071   var tail2 = file2.length;
74072
74073   for (var candidate = LCS(file1, file2);
74074      candidate !== null;
74075      candidate = candidate.chain)
74076   {
74077     var mismatchLength1 = tail1 - candidate.file1index - 1;
74078     var mismatchLength2 = tail2 - candidate.file2index - 1;
74079     tail1 = candidate.file1index;
74080     tail2 = candidate.file2index;
74081
74082     if (mismatchLength1 || mismatchLength2) {
74083       result.push({
74084         file1: [tail1 + 1, mismatchLength1],
74085         file2: [tail2 + 1, mismatchLength2]
74086       });
74087     }
74088   }
74089
74090   result.reverse();
74091   return result;
74092 }
74093
74094
74095 // Given three files, A, O, and B, where both A and B are
74096 // independently derived from O, returns a fairly complicated
74097 // internal representation of merge decisions it's taken. The
74098 // interested reader may wish to consult
74099 //
74100 // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
74101 // 'A Formal Investigation of ' In Arvind and Prasad,
74102 // editors, Foundations of Software Technology and Theoretical
74103 // Computer Science (FSTTCS), December 2007.
74104 //
74105 // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
74106 function diff3MergeIndices(a, o, b) {
74107   var i;
74108   var m1 = diffIndices(o, a);
74109   var m2 = diffIndices(o, b);
74110
74111   var hunks = [];
74112   function addHunk(h, side) {
74113     hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
74114   }
74115   for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
74116   for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
74117   hunks.sort(function (x, y) { return x[0] - y[0]; });
74118
74119   var result = [];
74120   var commonOffset = 0;
74121   function copyCommon(targetOffset) {
74122     if (targetOffset > commonOffset) {
74123       result.push([1, commonOffset, targetOffset - commonOffset]);
74124       commonOffset = targetOffset;
74125     }
74126   }
74127
74128   for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
74129     var firstHunkIndex = hunkIndex;
74130     var hunk = hunks[hunkIndex];
74131     var regionLhs = hunk[0];
74132     var regionRhs = regionLhs + hunk[2];
74133     while (hunkIndex < hunks.length - 1) {
74134       var maybeOverlapping = hunks[hunkIndex + 1];
74135       var maybeLhs = maybeOverlapping[0];
74136       if (maybeLhs > regionRhs) {
74137         break;
74138       }
74139       regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
74140       hunkIndex++;
74141     }
74142
74143     copyCommon(regionLhs);
74144     if (firstHunkIndex === hunkIndex) {
74145       // The 'overlap' was only one hunk long, meaning that
74146       // there's no conflict here. Either a and o were the
74147       // same, or b and o were the same.
74148       if (hunk[4] > 0) {
74149         result.push([hunk[1], hunk[3], hunk[4]]);
74150       }
74151     } else {
74152       // A proper conflict. Determine the extents of the
74153       // regions involved from a, o and b. Effectively merge
74154       // all the hunks on the left into one giant hunk, and
74155       // do the same for the right; then, correct for skew
74156       // in the regions of o that each side changed, and
74157       // report appropriate spans for the three sides.
74158       var regions = {
74159         0: [a.length, -1, o.length, -1],
74160         2: [b.length, -1, o.length, -1]
74161       };
74162       for (i = firstHunkIndex; i <= hunkIndex; i++) {
74163         hunk = hunks[i];
74164         var side = hunk[1];
74165         var r = regions[side];
74166         var oLhs = hunk[0];
74167         var oRhs = oLhs + hunk[2];
74168         var abLhs = hunk[3];
74169         var abRhs = abLhs + hunk[4];
74170         r[0] = Math.min(abLhs, r[0]);
74171         r[1] = Math.max(abRhs, r[1]);
74172         r[2] = Math.min(oLhs, r[2]);
74173         r[3] = Math.max(oRhs, r[3]);
74174       }
74175       var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
74176       var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
74177       var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
74178       var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
74179       result.push([-1,
74180                    aLhs,      aRhs      - aLhs,
74181                    regionLhs, regionRhs - regionLhs,
74182                    bLhs,      bRhs      - bLhs]);
74183     }
74184     commonOffset = regionRhs;
74185   }
74186
74187   copyCommon(o.length);
74188   return result;
74189 }
74190
74191
74192 // Applies the output of diff3MergeIndices to actually
74193 // construct the merged file; the returned result alternates
74194 // between 'ok' and 'conflict' blocks.
74195 function diff3Merge(a, o, b, excludeFalseConflicts) {
74196   var result = [];
74197   var files = [a, o, b];
74198   var indices = diff3MergeIndices(a, o, b);
74199
74200   var okLines = [];
74201   function flushOk() {
74202     if (okLines.length) {
74203       result.push({ok: okLines});
74204     }
74205     okLines = [];
74206   }
74207   function pushOk(xs) {
74208     for (var j = 0; j < xs.length; j++) {
74209       okLines.push(xs[j]);
74210     }
74211   }
74212
74213   function isTrueConflict(rec) {
74214     if (rec[2] !== rec[6]) return true;
74215     var aoff = rec[1];
74216     var boff = rec[5];
74217     for (var j = 0; j < rec[2]; j++) {
74218       if (a[j + aoff] !== b[j + boff]) {
74219         return true;
74220       }
74221     }
74222     return false;
74223   }
74224
74225   for (var i = 0; i < indices.length; i++) {
74226     var x = indices[i];
74227     var side = x[0];
74228     if (side === -1) {
74229       if (excludeFalseConflicts && !isTrueConflict(x)) {
74230         pushOk(files[0].slice(x[1], x[1] + x[2]));
74231       } else {
74232         flushOk();
74233         result.push({
74234           conflict: {
74235             a: a.slice(x[1], x[1] + x[2]),
74236             aIndex: x[1],
74237             o: o.slice(x[3], x[3] + x[4]),
74238             oIndex: x[3],
74239             b: b.slice(x[5], x[5] + x[6]),
74240             bIndex: x[5]
74241           }
74242         });
74243       }
74244     } else {
74245       pushOk(files[side].slice(x[1], x[1] + x[2]));
74246     }
74247   }
74248
74249   flushOk();
74250   return result;
74251 }
74252
74253 function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
74254     var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
74255     var _conflicts = [];
74256
74257
74258     function user(d) {
74259         return isFunction(formatUser) ? formatUser(d) : d;
74260     }
74261
74262
74263     function mergeLocation(remote, target) {
74264         function pointEqual(a, b) {
74265             var epsilon = 1e-6;
74266             return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
74267         }
74268
74269         if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
74270             return target;
74271         }
74272         if (_option === 'force_remote') {
74273             return target.update({loc: remote.loc});
74274         }
74275
74276         _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
74277         return target;
74278     }
74279
74280
74281     function mergeNodes(base, remote, target) {
74282         if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
74283             return target;
74284         }
74285         if (_option === 'force_remote') {
74286             return target.update({nodes: remote.nodes});
74287         }
74288
74289         var ccount = _conflicts.length;
74290         var o = base.nodes || [];
74291         var a = target.nodes || [];
74292         var b = remote.nodes || [];
74293         var nodes = [];
74294         var hunks = diff3Merge(a, o, b, true);
74295
74296         for (var i = 0; i < hunks.length; i++) {
74297             var hunk = hunks[i];
74298             if (hunk.ok) {
74299                 nodes.push.apply(nodes, hunk.ok);
74300             } else {
74301                 // for all conflicts, we can assume c.a !== c.b
74302                 // because `diff3Merge` called with `true` option to exclude false conflicts..
74303                 var c = hunk.conflict;
74304                 if (isEqual(c.o, c.a)) {  // only changed remotely
74305                     nodes.push.apply(nodes, c.b);
74306                 } else if (isEqual(c.o, c.b)) {  // only changed locally
74307                     nodes.push.apply(nodes, c.a);
74308                 } else {       // changed both locally and remotely
74309                     _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
74310                     break;
74311                 }
74312             }
74313         }
74314
74315         return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
74316     }
74317
74318
74319     function mergeChildren(targetWay, children, updates, graph) {
74320         function isUsed(node, targetWay) {
74321             var parentWays = map$3(graph.parentWays(node), 'id');
74322             return node.hasInterestingTags() ||
74323                 without(parentWays, targetWay.id).length > 0 ||
74324                 graph.parentRelations(node).length > 0;
74325         }
74326
74327         var ccount = _conflicts.length;
74328
74329         for (var i = 0; i < children.length; i++) {
74330             var id = children[i];
74331             var node = graph.hasEntity(id);
74332
74333             // remove unused childNodes..
74334             if (targetWay.nodes.indexOf(id) === -1) {
74335                 if (node && !isUsed(node, targetWay)) {
74336                     updates.removeIds.push(id);
74337                 }
74338                 continue;
74339             }
74340
74341             // restore used childNodes..
74342             var local = localGraph.hasEntity(id);
74343             var remote = remoteGraph.hasEntity(id);
74344             var target;
74345
74346             if (_option === 'force_remote' && remote && remote.visible) {
74347                 updates.replacements.push(remote);
74348
74349             } else if (_option === 'force_local' && local) {
74350                 target = osmEntity$$1(local);
74351                 if (remote) {
74352                     target = target.update({ version: remote.version });
74353                 }
74354                 updates.replacements.push(target);
74355
74356             } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
74357                 target = osmEntity$$1(local, { version: remote.version });
74358                 if (remote.visible) {
74359                     target = mergeLocation(remote, target);
74360                 } else {
74361                     _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
74362                 }
74363
74364                 if (_conflicts.length !== ccount) break;
74365                 updates.replacements.push(target);
74366             }
74367         }
74368
74369         return targetWay;
74370     }
74371
74372
74373     function updateChildren(updates, graph) {
74374         for (var i = 0; i < updates.replacements.length; i++) {
74375             graph = graph.replace(updates.replacements[i]);
74376         }
74377         if (updates.removeIds.length) {
74378             graph = actionDeleteMultiple(updates.removeIds)(graph);
74379         }
74380         return graph;
74381     }
74382
74383
74384     function mergeMembers(remote, target) {
74385         if (_option === 'force_local' || isEqual(target.members, remote.members)) {
74386             return target;
74387         }
74388         if (_option === 'force_remote') {
74389             return target.update({members: remote.members});
74390         }
74391
74392         _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
74393         return target;
74394     }
74395
74396
74397     function mergeTags(base, remote, target) {
74398         function ignoreKey(k) {
74399             return dataDiscarded[k];
74400         }
74401
74402         if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
74403             return target;
74404         }
74405         if (_option === 'force_remote') {
74406             return target.update({tags: remote.tags});
74407         }
74408
74409         var ccount = _conflicts.length;
74410         var o = base.tags || {};
74411         var a = target.tags || {};
74412         var b = remote.tags || {};
74413         var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
74414         var tags = clone(a);
74415         var changed = false;
74416
74417         for (var i = 0; i < keys.length; i++) {
74418             var k = keys[i];
74419
74420             if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
74421                 if (o[k] !== a[k]) {      // changed locally..
74422                     _conflicts.push(t('merge_remote_changes.conflict.tags',
74423                         { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
74424
74425                 } else {                  // unchanged locally, accept remote change..
74426                     if (b.hasOwnProperty(k)) {
74427                         tags[k] = b[k];
74428                     } else {
74429                         delete tags[k];
74430                     }
74431                     changed = true;
74432                 }
74433             }
74434         }
74435
74436         return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
74437     }
74438
74439
74440     //  `graph.base()` is the common ancestor of the two graphs.
74441     //  `localGraph` contains user's edits up to saving
74442     //  `remoteGraph` contains remote edits to modified nodes
74443     //  `graph` must be a descendent of `localGraph` and may include
74444     //      some conflict resolution actions performed on it.
74445     //
74446     //                  --- ... --- `localGraph` -- ... -- `graph`
74447     //                 /
74448     //  `graph.base()` --- ... --- `remoteGraph`
74449     //
74450     var action = function(graph) {
74451         var updates = { replacements: [], removeIds: [] };
74452         var base = graph.base().entities[id];
74453         var local = localGraph.entity(id);
74454         var remote = remoteGraph.entity(id);
74455         var target = osmEntity$$1(local, { version: remote.version });
74456
74457         // delete/undelete
74458         if (!remote.visible) {
74459             if (_option === 'force_remote') {
74460                 return actionDeleteMultiple([id])(graph);
74461
74462             } else if (_option === 'force_local') {
74463                 if (target.type === 'way') {
74464                     target = mergeChildren(target, uniq(local.nodes), updates, graph);
74465                     graph = updateChildren(updates, graph);
74466                 }
74467                 return graph.replace(target);
74468
74469             } else {
74470                 _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
74471                 return graph;  // do nothing
74472             }
74473         }
74474
74475         // merge
74476         if (target.type === 'node') {
74477             target = mergeLocation(remote, target);
74478
74479         } else if (target.type === 'way') {
74480             // pull in any child nodes that may not be present locally..
74481             graph.rebase(remoteGraph.childNodes(remote), [graph], false);
74482             target = mergeNodes(base, remote, target);
74483             target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
74484
74485         } else if (target.type === 'relation') {
74486             target = mergeMembers(remote, target);
74487         }
74488
74489         target = mergeTags(base, remote, target);
74490
74491         if (!_conflicts.length) {
74492             graph = updateChildren(updates, graph).replace(target);
74493         }
74494
74495         return graph;
74496     };
74497
74498
74499     action.withOption = function(opt) {
74500         _option = opt;
74501         return action;
74502     };
74503
74504
74505     action.conflicts = function() {
74506         return _conflicts;
74507     };
74508
74509
74510     return action;
74511 }
74512
74513 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
74514 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
74515 function actionMove(moveIds, tryDelta, projection, cache) {
74516     var _delta = tryDelta;
74517
74518     function setupCache(graph) {
74519         function canMove(nodeId) {
74520             // Allow movement of any node that is in the selectedIDs list..
74521             if (moveIds.indexOf(nodeId) !== -1) return true;
74522
74523             // Allow movement of a vertex where 2 ways meet..
74524             var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
74525             if (parents.length < 3) return true;
74526
74527             // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
74528             var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
74529             if (!parentsMoving) delete cache.moving[nodeId];
74530
74531             return parentsMoving;
74532         }
74533
74534         function cacheEntities(ids) {
74535             for (var i = 0; i < ids.length; i++) {
74536                 var id = ids[i];
74537                 if (cache.moving[id]) continue;
74538                 cache.moving[id] = true;
74539
74540                 var entity = graph.hasEntity(id);
74541                 if (!entity) continue;
74542
74543                 if (entity.type === 'node') {
74544                     cache.nodes.push(id);
74545                     cache.startLoc[id] = entity.loc;
74546                 } else if (entity.type === 'way') {
74547                     cache.ways.push(id);
74548                     cacheEntities(entity.nodes);
74549                 } else {
74550                     cacheEntities(entity.members.map(function(member) {
74551                         return member.id;
74552                     }));
74553                 }
74554             }
74555         }
74556
74557         function cacheIntersections(ids) {
74558             function isEndpoint(way, id) {
74559                 return !way.isClosed() && !!way.affix(id);
74560             }
74561
74562             for (var i = 0; i < ids.length; i++) {
74563                 var id = ids[i];
74564
74565                 // consider only intersections with 1 moved and 1 unmoved way.
74566                 var childNodes = graph.childNodes(graph.entity(id));
74567                 for (var j = 0; j < childNodes.length; j++) {
74568                     var node = childNodes[j];
74569                     var parents = graph.parentWays(node);
74570                     if (parents.length !== 2) continue;
74571
74572                     var moved = graph.entity(id);
74573                     var unmoved = null;
74574                     for (var k = 0; k < parents.length; k++) {
74575                         var way = parents[k];
74576                         if (!cache.moving[way.id]) {
74577                             unmoved = way;
74578                             break;
74579                         }
74580                     }
74581                     if (!unmoved) continue;
74582
74583                     // exclude ways that are overly connected..
74584                     if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
74585                     if (moved.isArea() || unmoved.isArea()) continue;
74586
74587                     cache.intersections.push({
74588                         nodeId: node.id,
74589                         movedId: moved.id,
74590                         unmovedId: unmoved.id,
74591                         movedIsEP: isEndpoint(moved, node.id),
74592                         unmovedIsEP: isEndpoint(unmoved, node.id)
74593                     });
74594                 }
74595             }
74596         }
74597
74598
74599         if (!cache) {
74600             cache = {};
74601         }
74602         if (!cache.ok) {
74603             cache.moving = {};
74604             cache.intersections = [];
74605             cache.replacedVertex = {};
74606             cache.startLoc = {};
74607             cache.nodes = [];
74608             cache.ways = [];
74609
74610             cacheEntities(moveIds);
74611             cacheIntersections(cache.ways);
74612             cache.nodes = filter(cache.nodes, canMove);
74613
74614             cache.ok = true;
74615         }
74616     }
74617
74618
74619     // Place a vertex where the moved vertex used to be, to preserve way shape..
74620     //
74621     //  Start:
74622     //      b ---- e
74623     //     / \
74624     //    /   \
74625     //   /     \
74626     //  a       c
74627     //
74628     //      *               node '*' added to preserve shape
74629     //     / \
74630     //    /   b ---- e      way `b,e` moved here:
74631     //   /     \
74632     //  a       c
74633     //
74634     //
74635     function replaceMovedVertex(nodeId, wayId, graph, delta) {
74636         var way = graph.entity(wayId);
74637         var moved = graph.entity(nodeId);
74638         var movedIndex = way.nodes.indexOf(nodeId);
74639         var len, prevIndex, nextIndex;
74640
74641         if (way.isClosed()) {
74642             len = way.nodes.length - 1;
74643             prevIndex = (movedIndex + len - 1) % len;
74644             nextIndex = (movedIndex + len + 1) % len;
74645         } else {
74646             len = way.nodes.length;
74647             prevIndex = movedIndex - 1;
74648             nextIndex = movedIndex + 1;
74649         }
74650
74651         var prev = graph.hasEntity(way.nodes[prevIndex]);
74652         var next = graph.hasEntity(way.nodes[nextIndex]);
74653
74654         // Don't add orig vertex at endpoint..
74655         if (!prev || !next) return graph;
74656
74657         var key = wayId + '_' + nodeId;
74658         var orig = cache.replacedVertex[key];
74659         if (!orig) {
74660             orig = osmNode();
74661             cache.replacedVertex[key] = orig;
74662             cache.startLoc[orig.id] = cache.startLoc[nodeId];
74663         }
74664
74665         var start, end;
74666         if (delta) {
74667             start = projection(cache.startLoc[nodeId]);
74668             end = projection.invert(geoVecAdd(start, delta));
74669         } else {
74670             end = cache.startLoc[nodeId];
74671         }
74672         orig = orig.move(end);
74673
74674         var angle = Math.abs(geoAngle(orig, prev, projection) -
74675                 geoAngle(orig, next, projection)) * 180 / Math.PI;
74676
74677         // Don't add orig vertex if it would just make a straight line..
74678         if (angle > 175 && angle < 185) return graph;
74679
74680         // moving forward or backward along way?
74681         var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
74682         var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
74683         var d1 = geoPathLength(p1);
74684         var d2 = geoPathLength(p2);
74685         var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
74686
74687         // moving around closed loop?
74688         if (way.isClosed() && insertAt === 0) insertAt = len;
74689
74690         way = way.addNode(orig.id, insertAt);
74691         return graph.replace(orig).replace(way);
74692     }
74693
74694
74695     // Remove duplicate vertex that might have been added by
74696     // replaceMovedVertex.  This is done after the unzorro checks.
74697     function removeDuplicateVertices(wayId, graph) {
74698         var way = graph.entity(wayId);
74699         var epsilon = 1e-6;
74700         var prev, curr;
74701
74702         function isInteresting(node, graph) {
74703             return graph.parentWays(node).length > 1 ||
74704                 graph.parentRelations(node).length ||
74705                 node.hasInterestingTags();
74706         }
74707
74708         for (var i = 0; i < way.nodes.length; i++) {
74709             curr = graph.entity(way.nodes[i]);
74710
74711             if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
74712                 if (!isInteresting(prev, graph)) {
74713                     way = way.removeNode(prev.id);
74714                     graph = graph.replace(way).remove(prev);
74715                 } else if (!isInteresting(curr, graph)) {
74716                     way = way.removeNode(curr.id);
74717                     graph = graph.replace(way).remove(curr);
74718                 }
74719             }
74720
74721             prev = curr;
74722         }
74723
74724         return graph;
74725     }
74726
74727
74728     // Reorder nodes around intersections that have moved..
74729     //
74730     //  Start:                way1.nodes: b,e         (moving)
74731     //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
74732     //      |                 vertex: b
74733     //      e                 isEP1: true,  isEP2, false
74734     //
74735     //  way1 `b,e` moved here:
74736     //  a ----- c = b - d
74737     //              |
74738     //              e
74739     //
74740     //  reorder nodes         way1.nodes: b,e
74741     //  a ----- c - b - d     way2.nodes: a,c,b,d
74742     //              |
74743     //              e
74744     //
74745     function unZorroIntersection(intersection$$1, graph) {
74746         var vertex = graph.entity(intersection$$1.nodeId);
74747         var way1 = graph.entity(intersection$$1.movedId);
74748         var way2 = graph.entity(intersection$$1.unmovedId);
74749         var isEP1 = intersection$$1.movedIsEP;
74750         var isEP2 = intersection$$1.unmovedIsEP;
74751
74752         // don't move the vertex if it is the endpoint of both ways.
74753         if (isEP1 && isEP2) return graph;
74754
74755         var nodes1 = without(graph.childNodes(way1), vertex);
74756         var nodes2 = without(graph.childNodes(way2), vertex);
74757
74758         if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
74759         if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
74760
74761         var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
74762         var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
74763         var loc;
74764
74765         // snap vertex to nearest edge (or some point between them)..
74766         if (!isEP1 && !isEP2) {
74767             var epsilon = 1e-6, maxIter = 10;
74768             for (var i = 0; i < maxIter; i++) {
74769                 loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
74770                 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
74771                 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
74772                 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
74773             }
74774         } else if (!isEP1) {
74775             loc = edge1.loc;
74776         } else {
74777             loc = edge2.loc;
74778         }
74779
74780         graph = graph.replace(vertex.move(loc));
74781
74782         // if zorro happened, reorder nodes..
74783         if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
74784             way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
74785             graph = graph.replace(way1);
74786         }
74787         if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
74788             way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
74789             graph = graph.replace(way2);
74790         }
74791
74792         return graph;
74793     }
74794
74795
74796     function cleanupIntersections(graph) {
74797         for (var i = 0; i < cache.intersections.length; i++) {
74798             var obj = cache.intersections[i];
74799             graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
74800             graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
74801             graph = unZorroIntersection(obj, graph);
74802             graph = removeDuplicateVertices(obj.movedId, graph);
74803             graph = removeDuplicateVertices(obj.unmovedId, graph);
74804         }
74805
74806         return graph;
74807     }
74808
74809
74810     // check if moving way endpoint can cross an unmoved way, if so limit delta..
74811     function limitDelta(graph) {
74812         function moveNode(loc) {
74813             return geoVecAdd(projection(loc), _delta);
74814         }
74815
74816         for (var i = 0; i < cache.intersections.length; i++) {
74817             var obj = cache.intersections[i];
74818
74819             // Don't limit movement if this is vertex joins 2 endpoints..
74820             if (obj.movedIsEP && obj.unmovedIsEP) continue;
74821             // Don't limit movement if this vertex is not an endpoint anyway..
74822             if (!obj.movedIsEP) continue;
74823
74824             var node = graph.entity(obj.nodeId);
74825             var start = projection(node.loc);
74826             var end = geoVecAdd(start, _delta);
74827             var movedNodes = graph.childNodes(graph.entity(obj.movedId));
74828             var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
74829             var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
74830             var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
74831             var hits = geoPathIntersections(movedPath, unmovedPath);
74832
74833             for (var j = 0; i < hits.length; i++) {
74834                 if (isEqual(hits[j], end)) continue;
74835                 var edge = geoChooseEdge(unmovedNodes, end, projection);
74836                 _delta = geoVecSubtract(projection(edge.loc), start);
74837             }
74838         }
74839     }
74840
74841
74842     var action = function(graph) {
74843         if (_delta[0] === 0 && _delta[1] === 0) return graph;
74844
74845         setupCache(graph);
74846
74847         if (cache.intersections.length) {
74848             limitDelta(graph);
74849         }
74850
74851         for (var i = 0; i < cache.nodes.length; i++) {
74852             var node = graph.entity(cache.nodes[i]);
74853             var start = projection(node.loc);
74854             var end = geoVecAdd(start, _delta);
74855             graph = graph.replace(node.move(projection.invert(end)));
74856         }
74857
74858         if (cache.intersections.length) {
74859             graph = cleanupIntersections(graph);
74860         }
74861
74862         return graph;
74863     };
74864
74865
74866     action.delta = function() {
74867         return _delta;
74868     };
74869
74870
74871     return action;
74872 }
74873
74874 function actionMoveNode(nodeID, toLoc) {
74875
74876     var action = function(graph, t) {
74877         if (t === null || !isFinite(t)) t = 1;
74878         t = Math.min(Math.max(+t, 0), 1);
74879
74880         var node = graph.entity(nodeID);
74881         return graph.replace(
74882             node.move(geoVecInterp(node.loc, toLoc, t))
74883         );
74884     };
74885
74886     action.transitionable = true;
74887
74888     return action;
74889 }
74890
74891 function actionNoop() {
74892     return function(graph) {
74893         return graph;
74894     };
74895 }
74896
74897 /*
74898  * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
74899  */
74900 function actionOrthogonalize(wayId, projection) {
74901     var threshold = 12, // degrees within right or straight to alter
74902         lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
74903         upperThreshold = Math.cos(threshold * Math.PI / 180);
74904
74905
74906     var action = function(graph, t) {
74907         if (t === null || !isFinite(t)) t = 1;
74908         t = Math.min(Math.max(+t, 0), 1);
74909
74910         var way = graph.entity(wayId),
74911             nodes = graph.childNodes(way),
74912             points = uniq(nodes).map(function(n) { return projection(n.loc); }),
74913             corner = {i: 0, dotp: 1},
74914             epsilon = 1e-4,
74915             node, loc, score, motions, i, j;
74916
74917         if (points.length === 3) {   // move only one vertex for right triangle
74918             for (i = 0; i < 1000; i++) {
74919                 motions = points.map(calcMotion);
74920                 points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
74921                 score = corner.dotp;
74922                 if (score < epsilon) {
74923                     break;
74924                 }
74925             }
74926
74927             node = graph.entity(nodes[corner.i].id);
74928             loc = projection.invert(points[corner.i]);
74929             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
74930
74931         } else {
74932             var best,
74933                 originalPoints = clone(points);
74934             score = Infinity;
74935
74936             for (i = 0; i < 1000; i++) {
74937                 motions = points.map(calcMotion);
74938                 for (j = 0; j < motions.length; j++) {
74939                     points[j] = addPoints(points[j],motions[j]);
74940                 }
74941                 var newScore = squareness(points);
74942                 if (newScore < score) {
74943                     best = clone(points);
74944                     score = newScore;
74945                 }
74946                 if (score < epsilon) {
74947                     break;
74948                 }
74949             }
74950
74951             points = best;
74952
74953             for (i = 0; i < points.length; i++) {
74954                 // only move the points that actually moved
74955                 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
74956                     loc = projection.invert(points[i]);
74957                     node = graph.entity(nodes[i].id);
74958                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
74959                 }
74960             }
74961
74962             // remove empty nodes on straight sections
74963             for (i = 0; t === 1 && i < points.length; i++) {
74964                 node = graph.entity(nodes[i].id);
74965
74966                 if (graph.parentWays(node).length > 1 ||
74967                     graph.parentRelations(node).length ||
74968                     node.hasInterestingTags()) {
74969                     continue;
74970                 }
74971
74972                 var dotp = normalizedDotProduct(i, points);
74973                 if (dotp < -1 + epsilon) {
74974                     graph = actionDeleteNode(node.id)(graph);
74975                 }
74976             }
74977         }
74978
74979         return graph;
74980
74981
74982         function calcMotion(b, i, array) {
74983             var a = array[(i - 1 + array.length) % array.length],
74984                 c = array[(i + 1) % array.length],
74985                 p = subtractPoints(a, b),
74986                 q = subtractPoints(c, b),
74987                 scale, dotp;
74988
74989             scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
74990             p = normalizePoint(p, 1.0);
74991             q = normalizePoint(q, 1.0);
74992
74993             dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
74994
74995             // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
74996             if (array.length > 3) {
74997                 if (dotp < -0.707106781186547) {
74998                     dotp += 1.0;
74999                 }
75000             } else if (dotp && Math.abs(dotp) < corner.dotp) {
75001                 corner.i = i;
75002                 corner.dotp = Math.abs(dotp);
75003             }
75004
75005             return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
75006         }
75007     };
75008
75009
75010     function squareness(points) {
75011         return points.reduce(function(sum, val, i, array) {
75012             var dotp = normalizedDotProduct(i, array);
75013
75014             dotp = filterDotProduct(dotp);
75015             return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
75016         }, 0);
75017     }
75018
75019
75020     function normalizedDotProduct(i, points) {
75021         var a = points[(i - 1 + points.length) % points.length],
75022             b = points[i],
75023             c = points[(i + 1) % points.length],
75024             p = subtractPoints(a, b),
75025             q = subtractPoints(c, b);
75026
75027         p = normalizePoint(p, 1.0);
75028         q = normalizePoint(q, 1.0);
75029
75030         return p[0] * q[0] + p[1] * q[1];
75031     }
75032
75033
75034     function subtractPoints(a, b) {
75035         return [a[0] - b[0], a[1] - b[1]];
75036     }
75037
75038
75039     function addPoints(a, b) {
75040         return [a[0] + b[0], a[1] + b[1]];
75041     }
75042
75043
75044     function normalizePoint(point, scale) {
75045         var vector = [0, 0];
75046         var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
75047         if (length !== 0) {
75048             vector[0] = point[0] / length;
75049             vector[1] = point[1] / length;
75050         }
75051
75052         vector[0] *= scale;
75053         vector[1] *= scale;
75054
75055         return vector;
75056     }
75057
75058
75059     function filterDotProduct(dotp) {
75060         if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
75061             return dotp;
75062         }
75063
75064         return 0;
75065     }
75066
75067
75068     action.disabled = function(graph) {
75069         var way = graph.entity(wayId),
75070             nodes = graph.childNodes(way),
75071             points = uniq(nodes).map(function(n) { return projection(n.loc); });
75072
75073         if (squareness(points)) {
75074             return false;
75075         }
75076
75077         return 'not_squarish';
75078     };
75079
75080
75081     action.transitionable = true;
75082
75083
75084     return action;
75085 }
75086
75087 // `actionRestrictTurn` creates a turn restriction relation.
75088 //
75089 // `turn` must be an `osmTurn` object
75090 // see osm/intersection.js, pathToTurn()
75091 //
75092 // This specifies a restriction of type `restriction` when traveling from
75093 // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
75094 // (The action does not check that these entities form a valid intersection.)
75095 //
75096 // From, to, and via ways should be split before calling this action.
75097 // (old versions of the code would split the ways here, but we no longer do it)
75098 //
75099 // For testing convenience, accepts a restrictionID to assign to the new
75100 // relation. Normally, this will be undefined and the relation will
75101 // automatically be assigned a new ID.
75102 //
75103 function actionRestrictTurn(turn, restrictionType, restrictionID) {
75104
75105     return function(graph) {
75106         var fromWay = graph.entity(turn.from.way);
75107         var toWay = graph.entity(turn.to.way);
75108         var viaNode = turn.via.node && graph.entity(turn.via.node);
75109         var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
75110         var members = [];
75111
75112         members.push({ id: fromWay.id, type: 'way',  role: 'from' });
75113
75114         if (viaNode) {
75115             members.push({ id: viaNode.id,  type: 'node', role: 'via' });
75116         } else if (viaWays) {
75117             viaWays.forEach(function(viaWay) {
75118                 members.push({ id: viaWay.id,  type: 'way', role: 'via' });
75119             });
75120         }
75121
75122         members.push({ id: toWay.id, type: 'way',  role: 'to' });
75123
75124         return graph.replace(osmRelation({
75125             id: restrictionID,
75126             tags: {
75127                 type: 'restriction',
75128                 restriction: restrictionType
75129             },
75130             members: members
75131         }));
75132     };
75133 }
75134
75135 function actionRevert(id) {
75136     var action = function(graph) {
75137         var entity = graph.hasEntity(id),
75138             base = graph.base().entities[id];
75139
75140         if (entity && !base) {    // entity will be removed..
75141             if (entity.type === 'node') {
75142                 graph.parentWays(entity)
75143                     .forEach(function(parent) {
75144                         parent = parent.removeNode(id);
75145                         graph = graph.replace(parent);
75146
75147                         if (parent.isDegenerate()) {
75148                             graph = actionDeleteWay(parent.id)(graph);
75149                         }
75150                     });
75151             }
75152
75153             graph.parentRelations(entity)
75154                 .forEach(function(parent) {
75155                     parent = parent.removeMembersWithID(id);
75156                     graph = graph.replace(parent);
75157
75158                     if (parent.isDegenerate()) {
75159                         graph = actionDeleteRelation(parent.id)(graph);
75160                     }
75161                 });
75162         }
75163
75164         return graph.revert(id);
75165     };
75166
75167     return action;
75168 }
75169
75170 function actionRotate(rotateIds, pivot, angle, projection) {
75171
75172     var action = function(graph) {
75173         return graph.update(function(graph) {
75174             utilGetAllNodes(rotateIds, graph).forEach(function(node) {
75175                 var point = geoRotate([projection(node.loc)], angle, pivot)[0];
75176                 graph = graph.replace(node.move(projection.invert(point)));
75177             });
75178         });
75179     };
75180
75181     return action;
75182 }
75183
75184 /* Built-in method references for those with the same name as other `lodash` methods. */
75185 var nativeMax$8 = Math.max;
75186
75187 /**
75188  * Gets the index at which the first occurrence of `value` is found in `array`
75189  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
75190  * for equality comparisons. If `fromIndex` is negative, it's used as the
75191  * offset from the end of `array`.
75192  *
75193  * @static
75194  * @memberOf _
75195  * @since 0.1.0
75196  * @category Array
75197  * @param {Array} array The array to inspect.
75198  * @param {*} value The value to search for.
75199  * @param {number} [fromIndex=0] The index to search from.
75200  * @returns {number} Returns the index of the matched value, else `-1`.
75201  * @example
75202  *
75203  * _.indexOf([1, 2, 1, 2], 2);
75204  * // => 1
75205  *
75206  * // Search from the `fromIndex`.
75207  * _.indexOf([1, 2, 1, 2], 2, 2);
75208  * // => 3
75209  */
75210 function indexOf(array, value, fromIndex) {
75211   var length = array == null ? 0 : array.length;
75212   if (!length) {
75213     return -1;
75214   }
75215   var index = fromIndex == null ? 0 : toInteger(fromIndex);
75216   if (index < 0) {
75217     index = nativeMax$8(length + index, 0);
75218   }
75219   return baseIndexOf(array, value, index);
75220 }
75221
75222 // Split a way at the given node.
75223 //
75224 // Optionally, split only the given ways, if multiple ways share
75225 // the given node.
75226 //
75227 // This is the inverse of `iD.actionJoin`.
75228 //
75229 // For testing convenience, accepts an ID to assign to the new way.
75230 // Normally, this will be undefined and the way will automatically
75231 // be assigned a new ID.
75232 //
75233 // Reference:
75234 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
75235 //
75236 function actionSplit(nodeId, newWayIds) {
75237     var _wayIDs;
75238
75239     // if the way is closed, we need to search for a partner node
75240     // to split the way at.
75241     //
75242     // The following looks for a node that is both far away from
75243     // the initial node in terms of way segment length and nearby
75244     // in terms of beeline-distance. This assures that areas get
75245     // split on the most "natural" points (independent of the number
75246     // of nodes).
75247     // For example: bone-shaped areas get split across their waist
75248     // line, circles across the diameter.
75249     function splitArea(nodes, idxA, graph) {
75250         var lengths = new Array(nodes.length);
75251         var length;
75252         var i;
75253         var best = 0;
75254         var idxB;
75255
75256         function wrap(index) {
75257             return utilWrap(index, nodes.length);
75258         }
75259
75260         function dist(nA, nB) {
75261             var locA = graph.entity(nA).loc;
75262             var locB = graph.entity(nB).loc;
75263             var epsilon = 1e-6;
75264             return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
75265         }
75266
75267         // calculate lengths
75268         length = 0;
75269         for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
75270             length += dist(nodes[i], nodes[wrap(i-1)]);
75271             lengths[i] = length;
75272         }
75273
75274         length = 0;
75275         for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
75276             length += dist(nodes[i], nodes[wrap(i+1)]);
75277             if (length < lengths[i])
75278                 lengths[i] = length;
75279         }
75280
75281         // determine best opposite node to split
75282         for (i = 0; i < nodes.length; i++) {
75283             var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
75284             if (cost > best) {
75285                 idxB = i;
75286                 best = cost;
75287             }
75288         }
75289
75290         return idxB;
75291     }
75292
75293
75294     function split(graph, wayA, newWayId) {
75295         var wayB = osmWay({id: newWayId, tags: wayA.tags});
75296         var origNodes = wayA.nodes.slice();
75297         var nodesA;
75298         var nodesB;
75299         var isArea = wayA.isArea();
75300         var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
75301
75302         if (wayA.isClosed()) {
75303             var nodes = wayA.nodes.slice(0, -1);
75304             var idxA = indexOf(nodes, nodeId);
75305             var idxB = splitArea(nodes, idxA, graph);
75306
75307             if (idxB < idxA) {
75308                 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
75309                 nodesB = nodes.slice(idxB, idxA + 1);
75310             } else {
75311                 nodesA = nodes.slice(idxA, idxB + 1);
75312                 nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
75313             }
75314         } else {
75315             var idx = indexOf(wayA.nodes, nodeId, 1);
75316             nodesA = wayA.nodes.slice(0, idx + 1);
75317             nodesB = wayA.nodes.slice(idx);
75318         }
75319
75320         wayA = wayA.update({nodes: nodesA});
75321         wayB = wayB.update({nodes: nodesB});
75322
75323         graph = graph.replace(wayA);
75324         graph = graph.replace(wayB);
75325
75326         graph.parentRelations(wayA).forEach(function(relation) {
75327             if (relation.isRestriction()) {
75328                 var via = relation.memberByRole('via');
75329                 if (via && wayB.contains(via.id)) {
75330                     relation = relation.replaceMember(wayA, wayB);
75331                     graph = graph.replace(relation);
75332                 }
75333             } else {
75334                 if (relation === isOuter) {
75335                     graph = graph.replace(relation.mergeTags(wayA.tags));
75336                     graph = graph.replace(wayA.update({tags: {}}));
75337                     graph = graph.replace(wayB.update({tags: {}}));
75338                 }
75339
75340                 var member = {
75341                     id: wayB.id,
75342                     type: 'way',
75343                     role: relation.memberById(wayA.id).role
75344                 };
75345
75346                 var insertPair = {
75347                     originalID: wayA.id,
75348                     insertedID: wayB.id,
75349                     nodes: origNodes
75350                 };
75351
75352                 graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
75353             }
75354         });
75355
75356         if (!isOuter && isArea) {
75357             var multipolygon = osmRelation({
75358                 tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
75359                 members: [
75360                     {id: wayA.id, role: 'outer', type: 'way'},
75361                     {id: wayB.id, role: 'outer', type: 'way'}
75362                 ]
75363             });
75364
75365             graph = graph.replace(multipolygon);
75366             graph = graph.replace(wayA.update({tags: {}}));
75367             graph = graph.replace(wayB.update({tags: {}}));
75368         }
75369
75370         return graph;
75371     }
75372
75373
75374     var action = function(graph) {
75375         var candidates = action.ways(graph);
75376         for (var i = 0; i < candidates.length; i++) {
75377             graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
75378         }
75379         return graph;
75380     };
75381
75382
75383     action.ways = function(graph) {
75384         var node = graph.entity(nodeId);
75385         var parents = graph.parentWays(node);
75386         var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
75387
75388         return parents.filter(function(parent) {
75389             if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
75390                 return false;
75391
75392             if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
75393                 return false;
75394
75395             if (parent.isClosed()) {
75396                 return true;
75397             }
75398
75399             for (var i = 1; i < parent.nodes.length - 1; i++) {
75400                 if (parent.nodes[i] === nodeId) {
75401                     return true;
75402                 }
75403             }
75404
75405             return false;
75406         });
75407     };
75408
75409
75410     action.disabled = function(graph) {
75411         var candidates = action.ways(graph);
75412         if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
75413             return 'not_eligible';
75414     };
75415
75416
75417     action.limitWays = function(_) {
75418         if (!arguments.length) return _wayIDs;
75419         _wayIDs = _;
75420         return action;
75421     };
75422
75423
75424     return action;
75425 }
75426
75427 /*
75428  * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
75429  */
75430 function actionStraighten(wayId, projection) {
75431
75432     function positionAlongWay(n, s, e) {
75433         return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
75434                 (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
75435     }
75436
75437
75438     var action = function(graph, t) {
75439         if (t === null || !isFinite(t)) t = 1;
75440         t = Math.min(Math.max(+t, 0), 1);
75441
75442         var way = graph.entity(wayId),
75443             nodes = graph.childNodes(way),
75444             points = nodes.map(function(n) { return projection(n.loc); }),
75445             startPoint = points[0],
75446             endPoint = points[points.length-1],
75447             toDelete = [],
75448             i;
75449
75450         for (i = 1; i < points.length-1; i++) {
75451             var node = nodes[i],
75452                 point = points[i];
75453
75454             if (t < 1 || graph.parentWays(node).length > 1 ||
75455                 graph.parentRelations(node).length ||
75456                 node.hasInterestingTags()) {
75457
75458                 var u = positionAlongWay(point, startPoint, endPoint),
75459                     p = [
75460                         startPoint[0] + u * (endPoint[0] - startPoint[0]),
75461                         startPoint[1] + u * (endPoint[1] - startPoint[1])
75462                     ],
75463                     loc2 = projection.invert(p);
75464
75465                 graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
75466
75467             } else {
75468                 // safe to delete
75469                 if (toDelete.indexOf(node) === -1) {
75470                     toDelete.push(node);
75471                 }
75472             }
75473         }
75474
75475         for (i = 0; i < toDelete.length; i++) {
75476             graph = actionDeleteNode(toDelete[i].id)(graph);
75477         }
75478
75479         return graph;
75480     };
75481
75482
75483     action.disabled = function(graph) {
75484         // check way isn't too bendy
75485         var way = graph.entity(wayId),
75486             nodes = graph.childNodes(way),
75487             points = nodes.map(function(n) { return projection(n.loc); }),
75488             startPoint = points[0],
75489             endPoint = points[points.length-1],
75490             threshold = 0.2 * geoVecLength(startPoint, endPoint),
75491             i;
75492
75493         if (threshold === 0) {
75494             return 'too_bendy';
75495         }
75496
75497         for (i = 1; i < points.length-1; i++) {
75498             var point = points[i],
75499                 u = positionAlongWay(point, startPoint, endPoint),
75500                 p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
75501                 p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
75502                 dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
75503
75504             // to bendy if point is off by 20% of total start/end distance in projected space
75505             if (isNaN(dist) || dist > threshold) {
75506                 return 'too_bendy';
75507             }
75508         }
75509     };
75510
75511
75512     action.transitionable = true;
75513
75514
75515     return action;
75516 }
75517
75518 // `actionUnrestrictTurn` deletes a turn restriction relation.
75519 //
75520 // `turn` must be an `osmTurn` object with a `restrictionID` property.
75521 // see osm/intersection.js, pathToTurn()
75522 //
75523 function actionUnrestrictTurn(turn) {
75524     return function(graph) {
75525         return actionDeleteRelation(turn.restrictionID)(graph);
75526     };
75527 }
75528
75529 /* Reflect the given area around its axis of symmetry */
75530 function actionReflect(reflectIds, projection) {
75531     var useLongAxis = true;
75532
75533
75534     // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
75535     // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
75536     function getSmallestSurroundingRectangle(graph, nodes) {
75537         var points = nodes.map(function(n) { return projection(n.loc); }),
75538             hull = d3_polygonHull(points),
75539             centroid = d3_polygonCentroid(hull),
75540             minArea = Infinity,
75541             ssrExtent = [],
75542             ssrAngle = 0,
75543             c1 = hull[0];
75544
75545         for (var i = 0; i <= hull.length - 1; i++) {
75546             var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
75547                 angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
75548                 poly = geoRotate(hull, -angle, centroid),
75549                 extent = poly.reduce(function(extent, point) {
75550                         return extent.extend(geoExtent$$1(point));
75551                     }, geoExtent$$1()),
75552                 area = extent.area();
75553
75554             if (area < minArea) {
75555                 minArea = area;
75556                 ssrExtent = extent;
75557                 ssrAngle = angle;
75558             }
75559             c1 = c2;
75560         }
75561
75562         return {
75563             poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
75564             angle: ssrAngle
75565         };
75566     }
75567
75568
75569     var action = function(graph, t) {
75570         if (t === null || !isFinite(t)) t = 1;
75571         t = Math.min(Math.max(+t, 0), 1);
75572
75573         var nodes = utilGetAllNodes(reflectIds, graph),
75574             ssr = getSmallestSurroundingRectangle(graph, nodes);
75575
75576         // Choose line pq = axis of symmetry.
75577         // The shape's surrounding rectangle has 2 axes of symmetry.
75578         // Reflect across the longer axis by default.
75579         var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
75580             q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
75581             p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
75582             q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
75583             p, q;
75584
75585         var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
75586         if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
75587             p = p1;
75588             q = q1;
75589         } else {
75590             p = p2;
75591             q = q2;
75592         }
75593
75594         // reflect c across pq
75595         // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
75596         var dx = q[0] - p[0];
75597         var dy = q[1] - p[1];
75598         var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
75599         var b = 2 * dx * dy / (dx * dx + dy * dy);
75600         for (var i = 0; i < nodes.length; i++) {
75601             var node = nodes[i];
75602             var c = projection(node.loc);
75603             var c2 = [
75604                 a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
75605                 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
75606             ];
75607             var loc2 = projection.invert(c2);
75608             node = node.move(geoVecInterp(node.loc, loc2, t));
75609             graph = graph.replace(node);
75610         }
75611
75612         return graph;
75613     };
75614
75615
75616     action.useLongAxis = function(_) {
75617         if (!arguments.length) return useLongAxis;
75618         useLongAxis = _;
75619         return action;
75620     };
75621
75622
75623     action.transitionable = true;
75624
75625
75626     return action;
75627 }
75628
75629
75630
75631 var index$4 = Object.freeze({
75632         d3combobox: d3combobox,
75633         d3geoTile: d3geoTile,
75634         d3keybinding: d3keybinding
75635 });
75636
75637 var Connection = services.osm;
75638
75639 var debug = false;
75640
75641
75642 var iD = Object.freeze({
75643         Connection: Connection,
75644         debug: debug,
75645         lib: index$4,
75646         d3: index$3,
75647         Context: coreContext,
75648         setAreaKeys: setAreaKeys,
75649         Difference: coreDifference,
75650         Graph: coreGraph$$1,
75651         History: coreHistory,
75652         Tree: coreTree,
75653         geoCross: geoVecCross,
75654         geoInterp: geoVecInterp,
75655         geoRoundCoordinates: geoVecFloor,
75656         geoEuclideanDistance: geoVecLength,
75657         Entity: osmEntity$$1,
75658         Node: osmNode,
75659         Relation: osmRelation,
75660         Way: osmWay,
75661         BackgroundSource: rendererBackgroundSource,
75662         Background: rendererBackground,
75663         Features: rendererFeatures,
75664         Map: rendererMap,
75665         TileLayer: rendererTileLayer,
75666         Detect: utilDetect,
75667         uiPreset: uiPresetEditor,
75668         actionAddEntity: actionAddEntity,
75669         actionAddMember: actionAddMember,
75670         actionAddMidpoint: actionAddMidpoint,
75671         actionAddVertex: actionAddVertex,
75672         actionChangeMember: actionChangeMember,
75673         actionChangePreset: actionChangePreset,
75674         actionChangeTags: actionChangeTags,
75675         actionCircularize: actionCircularize,
75676         actionConnect: actionConnect,
75677         actionCopyEntities: actionCopyEntities,
75678         actionDeleteMember: actionDeleteMember,
75679         actionDeleteMultiple: actionDeleteMultiple,
75680         actionDeleteNode: actionDeleteNode,
75681         actionDeleteRelation: actionDeleteRelation,
75682         actionDeleteWay: actionDeleteWay,
75683         actionDeprecateTags: actionDeprecateTags,
75684         actionDiscardTags: actionDiscardTags,
75685         actionDisconnect: actionDisconnect,
75686         actionJoin: actionJoin,
75687         actionMerge: actionMerge,
75688         actionMergePolygon: actionMergePolygon,
75689         actionMergeRemoteChanges: actionMergeRemoteChanges,
75690         actionMove: actionMove,
75691         actionMoveNode: actionMoveNode,
75692         actionNoop: actionNoop,
75693         actionOrthogonalize: actionOrthogonalize,
75694         actionRestrictTurn: actionRestrictTurn,
75695         actionReverse: actionReverse,
75696         actionRevert: actionRevert,
75697         actionRotate: actionRotate,
75698         actionSplit: actionSplit,
75699         actionStraighten: actionStraighten,
75700         actionUnrestrictTurn: actionUnrestrictTurn,
75701         actionReflect: actionReflect,
75702         behaviorAddWay: behaviorAddWay,
75703         behaviorBreathe: behaviorBreathe,
75704         behaviorCopy: behaviorCopy,
75705         behaviorDrag: behaviorDrag,
75706         behaviorDrawWay: behaviorDrawWay,
75707         behaviorDraw: behaviorDraw,
75708         behaviorEdit: behaviorEdit,
75709         behaviorHash: behaviorHash,
75710         behaviorHover: behaviorHover,
75711         behaviorLasso: behaviorLasso,
75712         behaviorOperation: behaviorOperation,
75713         behaviorPaste: behaviorPaste,
75714         behaviorSelect: behaviorSelect,
75715         behaviorTail: behaviorTail,
75716         coreContext: coreContext,
75717         coreDifference: coreDifference,
75718         coreGraph: coreGraph$$1,
75719         coreHistory: coreHistory,
75720         coreTree: coreTree,
75721         dataFeatureIcons: dataFeatureIcons,
75722         data: data,
75723         dataWikipedia: wikipedia$2,
75724         dataSuggestions: dataSuggestions,
75725         dataAddressFormats: dataAddressFormats,
75726         dataDeprecated: dataDeprecated,
75727         dataDiscarded: dataDiscarded,
75728         dataLocales: dataLocales,
75729         dataPhoneFormats: dataPhoneFormats,
75730         dataShortcuts: dataShortcuts,
75731         dataImperial: dataImperial,
75732         dataDriveLeft: dataDriveLeft,
75733         dataEn: en,
75734         geoExtent: geoExtent$$1,
75735         geoLatToMeters: geoLatToMeters,
75736         geoLonToMeters: geoLonToMeters,
75737         geoMetersToLat: geoMetersToLat,
75738         geoMetersToLon: geoMetersToLon,
75739         geoMetersToOffset: geoMetersToOffset,
75740         geoOffsetToMeters: geoOffsetToMeters,
75741         geoScaleToZoom: geoScaleToZoom,
75742         geoSphericalDistance: geoSphericalDistance,
75743         geoZoomToScale: geoZoomToScale,
75744         geoAngle: geoAngle,
75745         geoChooseEdge: geoChooseEdge,
75746         geoEdgeEqual: geoEdgeEqual,
75747         geoHasLineIntersections: geoHasLineIntersections,
75748         geoHasSelfIntersections: geoHasSelfIntersections,
75749         geoRotate: geoRotate,
75750         geoLineIntersection: geoLineIntersection,
75751         geoPathHasIntersections: geoPathHasIntersections,
75752         geoPathIntersections: geoPathIntersections,
75753         geoPathLength: geoPathLength,
75754         geoPointInPolygon: geoPointInPolygon,
75755         geoPolygonContainsPolygon: geoPolygonContainsPolygon,
75756         geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
75757         geoViewportEdge: geoViewportEdge,
75758         geoRawMercator: geoRawMercator,
75759         geoVecAdd: geoVecAdd,
75760         geoVecAngle: geoVecAngle,
75761         geoVecCross: geoVecCross,
75762         geoVecDot: geoVecDot,
75763         geoVecEqual: geoVecEqual,
75764         geoVecFloor: geoVecFloor,
75765         geoVecInterp: geoVecInterp,
75766         geoVecLength: geoVecLength,
75767         geoVecSubtract: geoVecSubtract,
75768         geoVecScale: geoVecScale,
75769         modeAddArea: modeAddArea$$1,
75770         modeAddLine: modeAddLine$$1,
75771         modeAddPoint: modeAddPoint$$1,
75772         modeBrowse: modeBrowse,
75773         modeDragNode: modeDragNode$$1,
75774         modeDrawArea: modeDrawArea,
75775         modeDrawLine: modeDrawLine,
75776         modeMove: modeMove$$1,
75777         modeRotate: modeRotate$$1,
75778         modeSave: modeSave$$1,
75779         modeSelect: modeSelect,
75780         operationCircularize: operationCircularize,
75781         operationContinue: operationContinue,
75782         operationDelete: operationDelete,
75783         operationDisconnect: operationDisconnect,
75784         operationMerge: operationMerge,
75785         operationMove: operationMove,
75786         operationOrthogonalize: operationOrthogonalize,
75787         operationReflectShort: operationReflectShort,
75788         operationReflectLong: operationReflectLong,
75789         operationReverse: operationReverse,
75790         operationRotate: operationRotate,
75791         operationSplit: operationSplit,
75792         operationStraighten: operationStraighten,
75793         osmChangeset: osmChangeset,
75794         osmEntity: osmEntity$$1,
75795         osmNode: osmNode,
75796         osmRelation: osmRelation,
75797         osmWay: osmWay,
75798         osmIntersection: osmIntersection,
75799         osmTurn: osmTurn,
75800         osmInferRestriction: osmInferRestriction,
75801         osmLanes: osmLanes,
75802         osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
75803         osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
75804         osmJoinWays: osmJoinWays,
75805         osmOneWayTags: osmOneWayTags,
75806         osmPavedTags: osmPavedTags,
75807         osmIsInterestingTag: osmIsInterestingTag,
75808         presetCategory: presetCategory,
75809         presetCollection: presetCollection,
75810         presetField: presetField,
75811         presetPreset: presetPreset,
75812         presetIndex: presetIndex,
75813         rendererBackgroundSource: rendererBackgroundSource,
75814         rendererBackground: rendererBackground,
75815         rendererFeatures: rendererFeatures,
75816         rendererMap: rendererMap,
75817         rendererTileLayer: rendererTileLayer,
75818         services: services,
75819         serviceMapillary: serviceMapillary,
75820         serviceNominatim: serviceNominatim,
75821         serviceOpenstreetcam: serviceOpenstreetcam,
75822         serviceOsm: serviceOsm,
75823         serviceTaginfo: serviceTaginfo,
75824         serviceWikidata: serviceWikidata,
75825         serviceWikipedia: serviceWikipedia,
75826         svgAreas: svgAreas$$1,
75827         svgDebug: svgDebug$$1,
75828         svgDefs: svgDefs,
75829         svgGpx: svgGpx$$1,
75830         svgIcon: svgIcon,
75831         svgLabels: svgLabels,
75832         svgLayers: svgLayers,
75833         svgLines: svgLines$$1,
75834         svgMapillaryImages: svgMapillaryImages$$1,
75835         svgMapillarySigns: svgMapillarySigns,
75836         svgMidpoints: svgMidpoints$$1,
75837         svgOneWaySegments: svgOneWaySegments,
75838         svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
75839         svgOsm: svgOsm,
75840         svgPassiveVertex: svgPassiveVertex,
75841         svgPath: svgPath,
75842         svgPointTransform: svgPointTransform,
75843         svgPoints: svgPoints$$1,
75844         svgRelationMemberTags: svgRelationMemberTags,
75845         svgSegmentWay: svgSegmentWay,
75846         svgTagClasses: svgTagClasses,
75847         svgTurns: svgTurns,
75848         svgVertices: svgVertices$$1,
75849         uiFields: uiFields,
75850         uiFieldDefaultCheck: uiFieldCheck,
75851         uiFieldOnewayCheck: uiFieldCheck,
75852         uiFieldCheck: uiFieldCheck,
75853         uiFieldMultiCombo: uiFieldCombo,
75854         uiFieldNetworkCombo: uiFieldCombo,
75855         uiFieldSemiCombo: uiFieldCombo,
75856         uiFieldTypeCombo: uiFieldCombo,
75857         uiFieldCombo: uiFieldCombo,
75858         uiFieldUrl: uiFieldText,
75859         uiFieldNumber: uiFieldText,
75860         uiFieldTel: uiFieldText,
75861         uiFieldEmail: uiFieldText,
75862         uiFieldText: uiFieldText,
75863         uiFieldAccess: uiFieldAccess,
75864         uiFieldAddress: uiFieldAddress,
75865         uiFieldCycleway: uiFieldCycleway,
75866         uiFieldLanes: uiFieldLanes,
75867         uiFieldLocalized: uiFieldLocalized,
75868         uiFieldMaxspeed: uiFieldMaxspeed,
75869         uiFieldStructureRadio: uiFieldRadio,
75870         uiFieldRadio: uiFieldRadio,
75871         uiFieldRestrictions: uiFieldRestrictions,
75872         uiFieldTextarea: uiFieldTextarea,
75873         uiFieldWikipedia: uiFieldWikipedia,
75874         uiIntro: uiIntro,
75875         uiInfoPanels: uiInfoPanels,
75876         uiPanelBackground: uiPanelBackground,
75877         uiPanelHistory: uiPanelHistory,
75878         uiPanelLocation: uiPanelLocation,
75879         uiPanelMeasurement: uiPanelMeasurement,
75880         uiInit: uiInit,
75881         uiAccount: uiAccount,
75882         uiAttribution: uiAttribution,
75883         uiBackground: uiBackground,
75884         uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
75885         uiBackgroundOffset: uiBackgroundOffset,
75886         uiChangesetEditor: uiChangesetEditor,
75887         uiCmd: uiCmd,
75888         uiCommit: uiCommit,
75889         uiCommitChanges: uiCommitChanges,
75890         uiCommitWarnings: uiCommitWarnings,
75891         uiConfirm: uiConfirm,
75892         uiConflicts: uiConflicts,
75893         uiContributors: uiContributors,
75894         uiCurtain: uiCurtain,
75895         uiDisclosure: uiDisclosure,
75896         uiEditMenu: uiEditMenu,
75897         uiEntityEditor: uiEntityEditor,
75898         uiFeatureInfo: uiFeatureInfo,
75899         uiFeatureList: uiFeatureList,
75900         uiField: uiField,
75901         uiFieldHelp: uiFieldHelp,
75902         uiFlash: uiFlash,
75903         uiFormFields: uiFormFields,
75904         uiFullScreen: uiFullScreen,
75905         uiGeolocate: uiGeolocate,
75906         uiHelp: uiHelp,
75907         uiInfo: uiInfo,
75908         uiInspector: uiInspector,
75909         uiLasso: uiLasso,
75910         uiLoading: uiLoading,
75911         uiMapData: uiMapData,
75912         uiMapInMap: uiMapInMap,
75913         uiModal: uiModal,
75914         uiModes: uiModes,
75915         uiNotice: uiNotice,
75916         uiPresetEditor: uiPresetEditor,
75917         uiPresetIcon: uiPresetIcon,
75918         uiPresetList: uiPresetList,
75919         uiRadialMenu: uiRadialMenu,
75920         uiRawMemberEditor: uiRawMemberEditor,
75921         uiRawMembershipEditor: uiRawMembershipEditor,
75922         uiRawTagEditor: uiRawTagEditor,
75923         uiRestore: uiRestore,
75924         uiSave: uiSave,
75925         uiScale: uiScale,
75926         uiSelectionList: uiSelectionList,
75927         uiSidebar: uiSidebar,
75928         uiSourceSwitch: uiSourceSwitch,
75929         uiSpinner: uiSpinner,
75930         uiSplash: uiSplash,
75931         uiStatus: uiStatus,
75932         uiSuccess: uiSuccess,
75933         uiTagReference: uiTagReference,
75934         uiToggle: uiToggle,
75935         uiTooltipHtml: uiTooltipHtml,
75936         uiUndoRedo: uiUndoRedo,
75937         uiVersion: uiVersion,
75938         uiViewOnOSM: uiViewOnOSM,
75939         uiZoom: uiZoom,
75940         utilAsyncMap: utilAsyncMap,
75941         utilCallWhenIdle: utilCallWhenIdle,
75942         utilDisplayName: utilDisplayName,
75943         utilDisplayNameForPath: utilDisplayNameForPath,
75944         utilDisplayType: utilDisplayType,
75945         utilEditDistance: utilEditDistance,
75946         utilEntitySelector: utilEntitySelector,
75947         utilEntityOrMemberSelector: utilEntityOrMemberSelector,
75948         utilFastMouse: utilFastMouse,
75949         utilFunctor: utilFunctor,
75950         utilGetAllNodes: utilGetAllNodes,
75951         utilGetPrototypeOf: utilGetPrototypeOf,
75952         utilGetSetValue: utilGetSetValue,
75953         utilIdleWorker: utilIdleWorker,
75954         utilNoAuto: utilNoAuto,
75955         utilPrefixCSSProperty: utilPrefixCSSProperty,
75956         utilPrefixDOMProperty: utilPrefixDOMProperty,
75957         utilQsString: utilQsString,
75958         utilRebind: utilRebind,
75959         utilSetTransform: utilSetTransform,
75960         utilSessionMutex: utilSessionMutex,
75961         utilStringQs: utilStringQs,
75962         utilSuggestNames: utilSuggestNames,
75963         utilTagText: utilTagText,
75964         utilTriggerEvent: utilTriggerEvent,
75965         utilWrap: utilWrap,
75966         d3combobox: d3combobox,
75967         d3geoTile: d3geoTile,
75968         d3keybinding: d3keybinding,
75969         validationDeprecatedTag: validationDeprecatedTag,
75970         validationDisconnectedHighway: validationDisconnectedHighway,
75971         validationManyDeletions: validationManyDeletions,
75972         validationMissingTag: validationMissingTag,
75973         validationOldMultipolygon: validationOldMultipolygon,
75974         validationTagSuggestsArea: validationTagSuggestsArea
75975 });
75976
75977 window.iD = iD;
75978
75979 }());
75980 //# sourceMappingURL=iD.js.map