]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge branch 'wheres_this' of https://github.com/pnorman/openstreetmap-website into...
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2 var version = "4.11.0";
3
4 var d3_ascending = function(a, b) {
5   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6 };
7
8 var d3_bisector = function(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 var pairs = function(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 var cross = function(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 var d3_descending = function(a, b) {
76   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
77 };
78
79 var number = function(x) {
80   return x === null ? NaN : +x;
81 };
82
83 var variance = function(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 var deviation = function(array, f) {
116   var v = variance(array, f);
117   return v ? Math.sqrt(v) : v;
118 };
119
120 var extent = function(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 var constant = function(x) {
164   return function() {
165     return x;
166   };
167 };
168
169 var identity = function(x) {
170   return x;
171 };
172
173 var d3_range = function(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 var e5 = Math.sqrt(10);
189 var e2 = Math.sqrt(2);
190
191 var ticks = function(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 var sturges = function(values) {
240   return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
241 };
242
243 var histogram = function() {
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 var threshold = function(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 var freedmanDiaconis = function(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 var scott = function(values, min, max) {
329   return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
330 };
331
332 var max = function(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 var mean = function(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 var d3_median = function(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 var merge = function(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 var min = function(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 var permute = function(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 var scan = function(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 var shuffle = function(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 var sum = function(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 var transpose = function(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 var zip = function() {
549   return transpose(arguments);
550 };
551
552 var slice$1 = Array.prototype.slice;
553
554 var identity$1 = function(x) {
555   return x;
556 };
557
558 var top = 1;
559 var right = 2;
560 var bottom = 3;
561 var left = 4;
562 var 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 var namespace = function(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 var creator = function(name) {
846   var fullname = namespace(name);
847   return (fullname.local
848       ? creatorFixed
849       : creatorInherit)(fullname);
850 };
851
852 var nextId = 0;
853
854 function local$1() {
855   return new Local;
856 }
857
858 function Local() {
859   this._ = "@" + (++nextId).toString(36);
860 }
861
862 Local.prototype = local$1.prototype = {
863   constructor: Local,
864   get: function(node) {
865     var id = this._;
866     while (!(id in node)) if (!(node = node.parentNode)) return;
867     return node[id];
868   },
869   set: function(node, value) {
870     return node[this._] = value;
871   },
872   remove: function(node) {
873     return this._ in node && delete node[this._];
874   },
875   toString: function() {
876     return this._;
877   }
878 };
879
880 var matcher = function(selector) {
881   return function() {
882     return this.matches(selector);
883   };
884 };
885
886 if (typeof document !== "undefined") {
887   var element = document.documentElement;
888   if (!element.matches) {
889     var vendorMatches = element.webkitMatchesSelector
890         || element.msMatchesSelector
891         || element.mozMatchesSelector
892         || element.oMatchesSelector;
893     matcher = function(selector) {
894       return function() {
895         return vendorMatches.call(this, selector);
896       };
897     };
898   }
899 }
900
901 var matcher$1 = matcher;
902
903 var filterEvents = {};
904
905 var event = null;
906
907 if (typeof document !== "undefined") {
908   var element$1 = document.documentElement;
909   if (!("onmouseenter" in element$1)) {
910     filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
911   }
912 }
913
914 function filterContextListener(listener, index, group) {
915   listener = contextListener(listener, index, group);
916   return function(event) {
917     var related = event.relatedTarget;
918     if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
919       listener.call(this, event);
920     }
921   };
922 }
923
924 function contextListener(listener, index, group) {
925   return function(event1) {
926     var event0 = event; // Events can be reentrant (e.g., focus).
927     event = event1;
928     try {
929       listener.call(this, this.__data__, index, group);
930     } finally {
931       event = event0;
932     }
933   };
934 }
935
936 function parseTypenames$1(typenames) {
937   return typenames.trim().split(/^|\s+/).map(function(t) {
938     var name = "", i = t.indexOf(".");
939     if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
940     return {type: t, name: name};
941   });
942 }
943
944 function onRemove(typename) {
945   return function() {
946     var on = this.__on;
947     if (!on) return;
948     for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
949       if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
950         this.removeEventListener(o.type, o.listener, o.capture);
951       } else {
952         on[++i] = o;
953       }
954     }
955     if (++i) on.length = i;
956     else delete this.__on;
957   };
958 }
959
960 function onAdd(typename, value, capture) {
961   var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
962   return function(d, i, group) {
963     var on = this.__on, o, listener = wrap(value, i, group);
964     if (on) for (var j = 0, m = on.length; j < m; ++j) {
965       if ((o = on[j]).type === typename.type && o.name === typename.name) {
966         this.removeEventListener(o.type, o.listener, o.capture);
967         this.addEventListener(o.type, o.listener = listener, o.capture = capture);
968         o.value = value;
969         return;
970       }
971     }
972     this.addEventListener(typename.type, listener, capture);
973     o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
974     if (!on) this.__on = [o];
975     else on.push(o);
976   };
977 }
978
979 var selection_on = function(typename, value, capture) {
980   var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
981
982   if (arguments.length < 2) {
983     var on = this.node().__on;
984     if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
985       for (i = 0, o = on[j]; i < n; ++i) {
986         if ((t = typenames[i]).type === o.type && t.name === o.name) {
987           return o.value;
988         }
989       }
990     }
991     return;
992   }
993
994   on = value ? onAdd : onRemove;
995   if (capture == null) capture = false;
996   for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
997   return this;
998 };
999
1000 function customEvent(event1, listener, that, args) {
1001   var event0 = event;
1002   event1.sourceEvent = event;
1003   event = event1;
1004   try {
1005     return listener.apply(that, args);
1006   } finally {
1007     event = event0;
1008   }
1009 }
1010
1011 var sourceEvent = function() {
1012   var current = event, source;
1013   while (source = current.sourceEvent) current = source;
1014   return current;
1015 };
1016
1017 var point = function(node, event) {
1018   var svg = node.ownerSVGElement || node;
1019
1020   if (svg.createSVGPoint) {
1021     var point = svg.createSVGPoint();
1022     point.x = event.clientX, point.y = event.clientY;
1023     point = point.matrixTransform(node.getScreenCTM().inverse());
1024     return [point.x, point.y];
1025   }
1026
1027   var rect = node.getBoundingClientRect();
1028   return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1029 };
1030
1031 var d3_mouse = function(node) {
1032   var event = sourceEvent();
1033   if (event.changedTouches) event = event.changedTouches[0];
1034   return point(node, event);
1035 };
1036
1037 function none() {}
1038
1039 var selector = function(selector) {
1040   return selector == null ? none : function() {
1041     return this.querySelector(selector);
1042   };
1043 };
1044
1045 var selection_select = function(select) {
1046   if (typeof select !== "function") select = selector(select);
1047
1048   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
1049     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
1050       if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
1051         if ("__data__" in node) subnode.__data__ = node.__data__;
1052         subgroup[i] = subnode;
1053       }
1054     }
1055   }
1056
1057   return new Selection(subgroups, this._parents);
1058 };
1059
1060 function empty$1() {
1061   return [];
1062 }
1063
1064 var selectorAll = function(selector) {
1065   return selector == null ? empty$1 : function() {
1066     return this.querySelectorAll(selector);
1067   };
1068 };
1069
1070 var selection_selectAll = function(select) {
1071   if (typeof select !== "function") select = selectorAll(select);
1072
1073   for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
1074     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
1075       if (node = group[i]) {
1076         subgroups.push(select.call(node, node.__data__, i, group));
1077         parents.push(node);
1078       }
1079     }
1080   }
1081
1082   return new Selection(subgroups, parents);
1083 };
1084
1085 var selection_filter = function(match) {
1086   if (typeof match !== "function") match = matcher$1(match);
1087
1088   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
1089     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
1090       if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
1091         subgroup.push(node);
1092       }
1093     }
1094   }
1095
1096   return new Selection(subgroups, this._parents);
1097 };
1098
1099 var sparse = function(update) {
1100   return new Array(update.length);
1101 };
1102
1103 var selection_enter = function() {
1104   return new Selection(this._enter || this._groups.map(sparse), this._parents);
1105 };
1106
1107 function EnterNode(parent, datum) {
1108   this.ownerDocument = parent.ownerDocument;
1109   this.namespaceURI = parent.namespaceURI;
1110   this._next = null;
1111   this._parent = parent;
1112   this.__data__ = datum;
1113 }
1114
1115 EnterNode.prototype = {
1116   constructor: EnterNode,
1117   appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
1118   insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
1119   querySelector: function(selector) { return this._parent.querySelector(selector); },
1120   querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
1121 };
1122
1123 var constant$1 = function(x) {
1124   return function() {
1125     return x;
1126   };
1127 };
1128
1129 var keyPrefix = "$"; // Protect against keys like “__proto__”.
1130
1131 function bindIndex(parent, group, enter, update, exit, data) {
1132   var i = 0,
1133       node,
1134       groupLength = group.length,
1135       dataLength = data.length;
1136
1137   // Put any non-null nodes that fit into update.
1138   // Put any null nodes into enter.
1139   // Put any remaining data into enter.
1140   for (; i < dataLength; ++i) {
1141     if (node = group[i]) {
1142       node.__data__ = data[i];
1143       update[i] = node;
1144     } else {
1145       enter[i] = new EnterNode(parent, data[i]);
1146     }
1147   }
1148
1149   // Put any non-null nodes that don’t fit into exit.
1150   for (; i < groupLength; ++i) {
1151     if (node = group[i]) {
1152       exit[i] = node;
1153     }
1154   }
1155 }
1156
1157 function bindKey(parent, group, enter, update, exit, data, key) {
1158   var i,
1159       node,
1160       nodeByKeyValue = {},
1161       groupLength = group.length,
1162       dataLength = data.length,
1163       keyValues = new Array(groupLength),
1164       keyValue;
1165
1166   // Compute the key for each node.
1167   // If multiple nodes have the same key, the duplicates are added to exit.
1168   for (i = 0; i < groupLength; ++i) {
1169     if (node = group[i]) {
1170       keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
1171       if (keyValue in nodeByKeyValue) {
1172         exit[i] = node;
1173       } else {
1174         nodeByKeyValue[keyValue] = node;
1175       }
1176     }
1177   }
1178
1179   // Compute the key for each datum.
1180   // If there a node associated with this key, join and add it to update.
1181   // If there is not (or the key is a duplicate), add it to enter.
1182   for (i = 0; i < dataLength; ++i) {
1183     keyValue = keyPrefix + key.call(parent, data[i], i, data);
1184     if (node = nodeByKeyValue[keyValue]) {
1185       update[i] = node;
1186       node.__data__ = data[i];
1187       nodeByKeyValue[keyValue] = null;
1188     } else {
1189       enter[i] = new EnterNode(parent, data[i]);
1190     }
1191   }
1192
1193   // Add any remaining nodes that were not bound to data to exit.
1194   for (i = 0; i < groupLength; ++i) {
1195     if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
1196       exit[i] = node;
1197     }
1198   }
1199 }
1200
1201 var selection_data = function(value, key) {
1202   if (!value) {
1203     data = new Array(this.size()), j = -1;
1204     this.each(function(d) { data[++j] = d; });
1205     return data;
1206   }
1207
1208   var bind = key ? bindKey : bindIndex,
1209       parents = this._parents,
1210       groups = this._groups;
1211
1212   if (typeof value !== "function") value = constant$1(value);
1213
1214   for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
1215     var parent = parents[j],
1216         group = groups[j],
1217         groupLength = group.length,
1218         data = value.call(parent, parent && parent.__data__, j, parents),
1219         dataLength = data.length,
1220         enterGroup = enter[j] = new Array(dataLength),
1221         updateGroup = update[j] = new Array(dataLength),
1222         exitGroup = exit[j] = new Array(groupLength);
1223
1224     bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1225
1226     // Now connect the enter nodes to their following update node, such that
1227     // appendChild can insert the materialized enter node before this node,
1228     // rather than at the end of the parent node.
1229     for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
1230       if (previous = enterGroup[i0]) {
1231         if (i0 >= i1) i1 = i0 + 1;
1232         while (!(next = updateGroup[i1]) && ++i1 < dataLength);
1233         previous._next = next || null;
1234       }
1235     }
1236   }
1237
1238   update = new Selection(update, parents);
1239   update._enter = enter;
1240   update._exit = exit;
1241   return update;
1242 };
1243
1244 var selection_exit = function() {
1245   return new Selection(this._exit || this._groups.map(sparse), this._parents);
1246 };
1247
1248 var selection_merge = function(selection$$1) {
1249
1250   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) {
1251     for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
1252       if (node = group0[i] || group1[i]) {
1253         merge[i] = node;
1254       }
1255     }
1256   }
1257
1258   for (; j < m0; ++j) {
1259     merges[j] = groups0[j];
1260   }
1261
1262   return new Selection(merges, this._parents);
1263 };
1264
1265 var selection_order = function() {
1266
1267   for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
1268     for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
1269       if (node = group[i]) {
1270         if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
1271         next = node;
1272       }
1273     }
1274   }
1275
1276   return this;
1277 };
1278
1279 var selection_sort = function(compare) {
1280   if (!compare) compare = ascending;
1281
1282   function compareNode(a, b) {
1283     return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1284   }
1285
1286   for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
1287     for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
1288       if (node = group[i]) {
1289         sortgroup[i] = node;
1290       }
1291     }
1292     sortgroup.sort(compareNode);
1293   }
1294
1295   return new Selection(sortgroups, this._parents).order();
1296 };
1297
1298 function ascending(a, b) {
1299   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1300 }
1301
1302 var selection_call = function() {
1303   var callback = arguments[0];
1304   arguments[0] = this;
1305   callback.apply(null, arguments);
1306   return this;
1307 };
1308
1309 var selection_nodes = function() {
1310   var nodes = new Array(this.size()), i = -1;
1311   this.each(function() { nodes[++i] = this; });
1312   return nodes;
1313 };
1314
1315 var selection_node = function() {
1316
1317   for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1318     for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
1319       var node = group[i];
1320       if (node) return node;
1321     }
1322   }
1323
1324   return null;
1325 };
1326
1327 var selection_size = function() {
1328   var size = 0;
1329   this.each(function() { ++size; });
1330   return size;
1331 };
1332
1333 var selection_empty = function() {
1334   return !this.node();
1335 };
1336
1337 var selection_each = function(callback) {
1338
1339   for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1340     for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
1341       if (node = group[i]) callback.call(node, node.__data__, i, group);
1342     }
1343   }
1344
1345   return this;
1346 };
1347
1348 function attrRemove(name) {
1349   return function() {
1350     this.removeAttribute(name);
1351   };
1352 }
1353
1354 function attrRemoveNS(fullname) {
1355   return function() {
1356     this.removeAttributeNS(fullname.space, fullname.local);
1357   };
1358 }
1359
1360 function attrConstant(name, value) {
1361   return function() {
1362     this.setAttribute(name, value);
1363   };
1364 }
1365
1366 function attrConstantNS(fullname, value) {
1367   return function() {
1368     this.setAttributeNS(fullname.space, fullname.local, value);
1369   };
1370 }
1371
1372 function attrFunction(name, value) {
1373   return function() {
1374     var v = value.apply(this, arguments);
1375     if (v == null) this.removeAttribute(name);
1376     else this.setAttribute(name, v);
1377   };
1378 }
1379
1380 function attrFunctionNS(fullname, value) {
1381   return function() {
1382     var v = value.apply(this, arguments);
1383     if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
1384     else this.setAttributeNS(fullname.space, fullname.local, v);
1385   };
1386 }
1387
1388 var selection_attr = function(name, value) {
1389   var fullname = namespace(name);
1390
1391   if (arguments.length < 2) {
1392     var node = this.node();
1393     return fullname.local
1394         ? node.getAttributeNS(fullname.space, fullname.local)
1395         : node.getAttribute(fullname);
1396   }
1397
1398   return this.each((value == null
1399       ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
1400       ? (fullname.local ? attrFunctionNS : attrFunction)
1401       : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
1402 };
1403
1404 var defaultView = function(node) {
1405   return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
1406       || (node.document && node) // node is a Window
1407       || node.defaultView; // node is a Document
1408 };
1409
1410 function styleRemove(name) {
1411   return function() {
1412     this.style.removeProperty(name);
1413   };
1414 }
1415
1416 function styleConstant(name, value, priority) {
1417   return function() {
1418     this.style.setProperty(name, value, priority);
1419   };
1420 }
1421
1422 function styleFunction(name, value, priority) {
1423   return function() {
1424     var v = value.apply(this, arguments);
1425     if (v == null) this.style.removeProperty(name);
1426     else this.style.setProperty(name, v, priority);
1427   };
1428 }
1429
1430 var selection_style = function(name, value, priority) {
1431   return arguments.length > 1
1432       ? this.each((value == null
1433             ? styleRemove : typeof value === "function"
1434             ? styleFunction
1435             : styleConstant)(name, value, priority == null ? "" : priority))
1436       : styleValue(this.node(), name);
1437 };
1438
1439 function styleValue(node, name) {
1440   return node.style.getPropertyValue(name)
1441       || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1442 }
1443
1444 function propertyRemove(name) {
1445   return function() {
1446     delete this[name];
1447   };
1448 }
1449
1450 function propertyConstant(name, value) {
1451   return function() {
1452     this[name] = value;
1453   };
1454 }
1455
1456 function propertyFunction(name, value) {
1457   return function() {
1458     var v = value.apply(this, arguments);
1459     if (v == null) delete this[name];
1460     else this[name] = v;
1461   };
1462 }
1463
1464 var selection_property = function(name, value) {
1465   return arguments.length > 1
1466       ? this.each((value == null
1467           ? propertyRemove : typeof value === "function"
1468           ? propertyFunction
1469           : propertyConstant)(name, value))
1470       : this.node()[name];
1471 };
1472
1473 function classArray(string) {
1474   return string.trim().split(/^|\s+/);
1475 }
1476
1477 function classList(node) {
1478   return node.classList || new ClassList(node);
1479 }
1480
1481 function ClassList(node) {
1482   this._node = node;
1483   this._names = classArray(node.getAttribute("class") || "");
1484 }
1485
1486 ClassList.prototype = {
1487   add: function(name) {
1488     var i = this._names.indexOf(name);
1489     if (i < 0) {
1490       this._names.push(name);
1491       this._node.setAttribute("class", this._names.join(" "));
1492     }
1493   },
1494   remove: function(name) {
1495     var i = this._names.indexOf(name);
1496     if (i >= 0) {
1497       this._names.splice(i, 1);
1498       this._node.setAttribute("class", this._names.join(" "));
1499     }
1500   },
1501   contains: function(name) {
1502     return this._names.indexOf(name) >= 0;
1503   }
1504 };
1505
1506 function classedAdd(node, names) {
1507   var list = classList(node), i = -1, n = names.length;
1508   while (++i < n) list.add(names[i]);
1509 }
1510
1511 function classedRemove(node, names) {
1512   var list = classList(node), i = -1, n = names.length;
1513   while (++i < n) list.remove(names[i]);
1514 }
1515
1516 function classedTrue(names) {
1517   return function() {
1518     classedAdd(this, names);
1519   };
1520 }
1521
1522 function classedFalse(names) {
1523   return function() {
1524     classedRemove(this, names);
1525   };
1526 }
1527
1528 function classedFunction(names, value) {
1529   return function() {
1530     (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1531   };
1532 }
1533
1534 var selection_classed = function(name, value) {
1535   var names = classArray(name + "");
1536
1537   if (arguments.length < 2) {
1538     var list = classList(this.node()), i = -1, n = names.length;
1539     while (++i < n) if (!list.contains(names[i])) return false;
1540     return true;
1541   }
1542
1543   return this.each((typeof value === "function"
1544       ? classedFunction : value
1545       ? classedTrue
1546       : classedFalse)(names, value));
1547 };
1548
1549 function textRemove() {
1550   this.textContent = "";
1551 }
1552
1553 function textConstant(value) {
1554   return function() {
1555     this.textContent = value;
1556   };
1557 }
1558
1559 function textFunction(value) {
1560   return function() {
1561     var v = value.apply(this, arguments);
1562     this.textContent = v == null ? "" : v;
1563   };
1564 }
1565
1566 var selection_text = function(value) {
1567   return arguments.length
1568       ? this.each(value == null
1569           ? textRemove : (typeof value === "function"
1570           ? textFunction
1571           : textConstant)(value))
1572       : this.node().textContent;
1573 };
1574
1575 function htmlRemove() {
1576   this.innerHTML = "";
1577 }
1578
1579 function htmlConstant(value) {
1580   return function() {
1581     this.innerHTML = value;
1582   };
1583 }
1584
1585 function htmlFunction(value) {
1586   return function() {
1587     var v = value.apply(this, arguments);
1588     this.innerHTML = v == null ? "" : v;
1589   };
1590 }
1591
1592 var selection_html = function(value) {
1593   return arguments.length
1594       ? this.each(value == null
1595           ? htmlRemove : (typeof value === "function"
1596           ? htmlFunction
1597           : htmlConstant)(value))
1598       : this.node().innerHTML;
1599 };
1600
1601 function raise() {
1602   if (this.nextSibling) this.parentNode.appendChild(this);
1603 }
1604
1605 var selection_raise = function() {
1606   return this.each(raise);
1607 };
1608
1609 function lower() {
1610   if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1611 }
1612
1613 var selection_lower = function() {
1614   return this.each(lower);
1615 };
1616
1617 var selection_append = function(name) {
1618   var create = typeof name === "function" ? name : creator(name);
1619   return this.select(function() {
1620     return this.appendChild(create.apply(this, arguments));
1621   });
1622 };
1623
1624 function constantNull() {
1625   return null;
1626 }
1627
1628 var selection_insert = function(name, before) {
1629   var create = typeof name === "function" ? name : creator(name),
1630       select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
1631   return this.select(function() {
1632     return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
1633   });
1634 };
1635
1636 function remove() {
1637   var parent = this.parentNode;
1638   if (parent) parent.removeChild(this);
1639 }
1640
1641 var selection_remove = function() {
1642   return this.each(remove);
1643 };
1644
1645 var selection_datum = function(value) {
1646   return arguments.length
1647       ? this.property("__data__", value)
1648       : this.node().__data__;
1649 };
1650
1651 function dispatchEvent(node, type, params) {
1652   var window = defaultView(node),
1653       event = window.CustomEvent;
1654
1655   if (typeof event === "function") {
1656     event = new event(type, params);
1657   } else {
1658     event = window.document.createEvent("Event");
1659     if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
1660     else event.initEvent(type, false, false);
1661   }
1662
1663   node.dispatchEvent(event);
1664 }
1665
1666 function dispatchConstant(type, params) {
1667   return function() {
1668     return dispatchEvent(this, type, params);
1669   };
1670 }
1671
1672 function dispatchFunction(type, params) {
1673   return function() {
1674     return dispatchEvent(this, type, params.apply(this, arguments));
1675   };
1676 }
1677
1678 var selection_dispatch = function(type, params) {
1679   return this.each((typeof params === "function"
1680       ? dispatchFunction
1681       : dispatchConstant)(type, params));
1682 };
1683
1684 var root = [null];
1685
1686 function Selection(groups, parents) {
1687   this._groups = groups;
1688   this._parents = parents;
1689 }
1690
1691 function selection() {
1692   return new Selection([[document.documentElement]], root);
1693 }
1694
1695 Selection.prototype = selection.prototype = {
1696   constructor: Selection,
1697   select: selection_select,
1698   selectAll: selection_selectAll,
1699   filter: selection_filter,
1700   data: selection_data,
1701   enter: selection_enter,
1702   exit: selection_exit,
1703   merge: selection_merge,
1704   order: selection_order,
1705   sort: selection_sort,
1706   call: selection_call,
1707   nodes: selection_nodes,
1708   node: selection_node,
1709   size: selection_size,
1710   empty: selection_empty,
1711   each: selection_each,
1712   attr: selection_attr,
1713   style: selection_style,
1714   property: selection_property,
1715   classed: selection_classed,
1716   text: selection_text,
1717   html: selection_html,
1718   raise: selection_raise,
1719   lower: selection_lower,
1720   append: selection_append,
1721   insert: selection_insert,
1722   remove: selection_remove,
1723   datum: selection_datum,
1724   on: selection_on,
1725   dispatch: selection_dispatch
1726 };
1727
1728 var d3_select = function(selector) {
1729   return typeof selector === "string"
1730       ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1731       : new Selection([[selector]], root);
1732 };
1733
1734 var d3_selectAll = function(selector) {
1735   return typeof selector === "string"
1736       ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
1737       : new Selection([selector == null ? [] : selector], root);
1738 };
1739
1740 var touch = function(node, touches, identifier) {
1741   if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1742
1743   for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
1744     if ((touch = touches[i]).identifier === identifier) {
1745       return point(node, touch);
1746     }
1747   }
1748
1749   return null;
1750 };
1751
1752 var d3_touches = function(node, touches) {
1753   if (touches == null) touches = sourceEvent().touches;
1754
1755   for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1756     points[i] = point(node, touches[i]);
1757   }
1758
1759   return points;
1760 };
1761
1762 function nopropagation() {
1763   event.stopImmediatePropagation();
1764 }
1765
1766 var noevent = function() {
1767   event.preventDefault();
1768   event.stopImmediatePropagation();
1769 };
1770
1771 var dragDisable = function(view) {
1772   var root = view.document.documentElement,
1773       selection$$1 = d3_select(view).on("dragstart.drag", noevent, true);
1774   if ("onselectstart" in root) {
1775     selection$$1.on("selectstart.drag", noevent, true);
1776   } else {
1777     root.__noselect = root.style.MozUserSelect;
1778     root.style.MozUserSelect = "none";
1779   }
1780 };
1781
1782 function yesdrag(view, noclick) {
1783   var root = view.document.documentElement,
1784       selection$$1 = d3_select(view).on("dragstart.drag", null);
1785   if (noclick) {
1786     selection$$1.on("click.drag", noevent, true);
1787     setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1788   }
1789   if ("onselectstart" in root) {
1790     selection$$1.on("selectstart.drag", null);
1791   } else {
1792     root.style.MozUserSelect = root.__noselect;
1793     delete root.__noselect;
1794   }
1795 }
1796
1797 var constant$2 = function(x) {
1798   return function() {
1799     return x;
1800   };
1801 };
1802
1803 function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1804   this.target = target;
1805   this.type = type;
1806   this.subject = subject;
1807   this.identifier = id;
1808   this.active = active;
1809   this.x = x;
1810   this.y = y;
1811   this.dx = dx;
1812   this.dy = dy;
1813   this._ = dispatch;
1814 }
1815
1816 DragEvent.prototype.on = function() {
1817   var value = this._.on.apply(this._, arguments);
1818   return value === this._ ? this : value;
1819 };
1820
1821 // Ignore right-click, since that should open the context menu.
1822 function defaultFilter$1() {
1823   return !event.button;
1824 }
1825
1826 function defaultContainer() {
1827   return this.parentNode;
1828 }
1829
1830 function defaultSubject(d) {
1831   return d == null ? {x: event.x, y: event.y} : d;
1832 }
1833
1834 function defaultTouchable() {
1835   return "ontouchstart" in this;
1836 }
1837
1838 var drag = function() {
1839   var filter = defaultFilter$1,
1840       container = defaultContainer,
1841       subject = defaultSubject,
1842       touchable = defaultTouchable,
1843       gestures = {},
1844       listeners = dispatch("start", "drag", "end"),
1845       active = 0,
1846       mousedownx,
1847       mousedowny,
1848       mousemoving,
1849       touchending,
1850       clickDistance2 = 0;
1851
1852   function drag(selection) {
1853     selection
1854         .on("mousedown.drag", mousedowned)
1855       .filter(touchable)
1856         .on("touchstart.drag", touchstarted)
1857         .on("touchmove.drag", touchmoved)
1858         .on("touchend.drag touchcancel.drag", touchended)
1859         .style("touch-action", "none")
1860         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
1861   }
1862
1863   function mousedowned() {
1864     if (touchending || !filter.apply(this, arguments)) return;
1865     var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
1866     if (!gesture) return;
1867     d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
1868     dragDisable(event.view);
1869     nopropagation();
1870     mousemoving = false;
1871     mousedownx = event.clientX;
1872     mousedowny = event.clientY;
1873     gesture("start");
1874   }
1875
1876   function mousemoved() {
1877     noevent();
1878     if (!mousemoving) {
1879       var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1880       mousemoving = dx * dx + dy * dy > clickDistance2;
1881     }
1882     gestures.mouse("drag");
1883   }
1884
1885   function mouseupped() {
1886     d3_select(event.view).on("mousemove.drag mouseup.drag", null);
1887     yesdrag(event.view, mousemoving);
1888     noevent();
1889     gestures.mouse("end");
1890   }
1891
1892   function touchstarted() {
1893     if (!filter.apply(this, arguments)) return;
1894     var touches = event.changedTouches,
1895         c = container.apply(this, arguments),
1896         n = touches.length, i, gesture;
1897
1898     for (i = 0; i < n; ++i) {
1899       if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1900         nopropagation();
1901         gesture("start");
1902       }
1903     }
1904   }
1905
1906   function touchmoved() {
1907     var touches = event.changedTouches,
1908         n = touches.length, i, gesture;
1909
1910     for (i = 0; i < n; ++i) {
1911       if (gesture = gestures[touches[i].identifier]) {
1912         noevent();
1913         gesture("drag");
1914       }
1915     }
1916   }
1917
1918   function touchended() {
1919     var touches = event.changedTouches,
1920         n = touches.length, i, gesture;
1921
1922     if (touchending) clearTimeout(touchending);
1923     touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
1924     for (i = 0; i < n; ++i) {
1925       if (gesture = gestures[touches[i].identifier]) {
1926         nopropagation();
1927         gesture("end");
1928       }
1929     }
1930   }
1931
1932   function beforestart(id, container, point, that, args) {
1933     var p = point(container, id), s, dx, dy,
1934         sublisteners = listeners.copy();
1935
1936     if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
1937       if ((event.subject = s = subject.apply(that, args)) == null) return false;
1938       dx = s.x - p[0] || 0;
1939       dy = s.y - p[1] || 0;
1940       return true;
1941     })) return;
1942
1943     return function gesture(type) {
1944       var p0 = p, n;
1945       switch (type) {
1946         case "start": gestures[id] = gesture, n = active++; break;
1947         case "end": delete gestures[id], --active; // nobreak
1948         case "drag": p = point(container, id), n = active; break;
1949       }
1950       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]);
1951     };
1952   }
1953
1954   drag.filter = function(_) {
1955     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1956   };
1957
1958   drag.container = function(_) {
1959     return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1960   };
1961
1962   drag.subject = function(_) {
1963     return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1964   };
1965
1966   drag.touchable = function(_) {
1967     return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1968   };
1969
1970   drag.on = function() {
1971     var value = listeners.on.apply(listeners, arguments);
1972     return value === listeners ? drag : value;
1973   };
1974
1975   drag.clickDistance = function(_) {
1976     return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1977   };
1978
1979   return drag;
1980 };
1981
1982 var define = function(constructor, factory, prototype) {
1983   constructor.prototype = factory.prototype = prototype;
1984   prototype.constructor = constructor;
1985 };
1986
1987 function extend(parent, definition) {
1988   var prototype = Object.create(parent.prototype);
1989   for (var key in definition) prototype[key] = definition[key];
1990   return prototype;
1991 }
1992
1993 function Color() {}
1994
1995 var darker = 0.7;
1996 var brighter = 1 / darker;
1997
1998 var reI = "\\s*([+-]?\\d+)\\s*";
1999 var reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*";
2000 var reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
2001 var reHex3 = /^#([0-9a-f]{3})$/;
2002 var reHex6 = /^#([0-9a-f]{6})$/;
2003 var reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$");
2004 var reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$");
2005 var reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$");
2006 var reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$");
2007 var reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$");
2008 var reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
2009
2010 var named = {
2011   aliceblue: 0xf0f8ff,
2012   antiquewhite: 0xfaebd7,
2013   aqua: 0x00ffff,
2014   aquamarine: 0x7fffd4,
2015   azure: 0xf0ffff,
2016   beige: 0xf5f5dc,
2017   bisque: 0xffe4c4,
2018   black: 0x000000,
2019   blanchedalmond: 0xffebcd,
2020   blue: 0x0000ff,
2021   blueviolet: 0x8a2be2,
2022   brown: 0xa52a2a,
2023   burlywood: 0xdeb887,
2024   cadetblue: 0x5f9ea0,
2025   chartreuse: 0x7fff00,
2026   chocolate: 0xd2691e,
2027   coral: 0xff7f50,
2028   cornflowerblue: 0x6495ed,
2029   cornsilk: 0xfff8dc,
2030   crimson: 0xdc143c,
2031   cyan: 0x00ffff,
2032   darkblue: 0x00008b,
2033   darkcyan: 0x008b8b,
2034   darkgoldenrod: 0xb8860b,
2035   darkgray: 0xa9a9a9,
2036   darkgreen: 0x006400,
2037   darkgrey: 0xa9a9a9,
2038   darkkhaki: 0xbdb76b,
2039   darkmagenta: 0x8b008b,
2040   darkolivegreen: 0x556b2f,
2041   darkorange: 0xff8c00,
2042   darkorchid: 0x9932cc,
2043   darkred: 0x8b0000,
2044   darksalmon: 0xe9967a,
2045   darkseagreen: 0x8fbc8f,
2046   darkslateblue: 0x483d8b,
2047   darkslategray: 0x2f4f4f,
2048   darkslategrey: 0x2f4f4f,
2049   darkturquoise: 0x00ced1,
2050   darkviolet: 0x9400d3,
2051   deeppink: 0xff1493,
2052   deepskyblue: 0x00bfff,
2053   dimgray: 0x696969,
2054   dimgrey: 0x696969,
2055   dodgerblue: 0x1e90ff,
2056   firebrick: 0xb22222,
2057   floralwhite: 0xfffaf0,
2058   forestgreen: 0x228b22,
2059   fuchsia: 0xff00ff,
2060   gainsboro: 0xdcdcdc,
2061   ghostwhite: 0xf8f8ff,
2062   gold: 0xffd700,
2063   goldenrod: 0xdaa520,
2064   gray: 0x808080,
2065   green: 0x008000,
2066   greenyellow: 0xadff2f,
2067   grey: 0x808080,
2068   honeydew: 0xf0fff0,
2069   hotpink: 0xff69b4,
2070   indianred: 0xcd5c5c,
2071   indigo: 0x4b0082,
2072   ivory: 0xfffff0,
2073   khaki: 0xf0e68c,
2074   lavender: 0xe6e6fa,
2075   lavenderblush: 0xfff0f5,
2076   lawngreen: 0x7cfc00,
2077   lemonchiffon: 0xfffacd,
2078   lightblue: 0xadd8e6,
2079   lightcoral: 0xf08080,
2080   lightcyan: 0xe0ffff,
2081   lightgoldenrodyellow: 0xfafad2,
2082   lightgray: 0xd3d3d3,
2083   lightgreen: 0x90ee90,
2084   lightgrey: 0xd3d3d3,
2085   lightpink: 0xffb6c1,
2086   lightsalmon: 0xffa07a,
2087   lightseagreen: 0x20b2aa,
2088   lightskyblue: 0x87cefa,
2089   lightslategray: 0x778899,
2090   lightslategrey: 0x778899,
2091   lightsteelblue: 0xb0c4de,
2092   lightyellow: 0xffffe0,
2093   lime: 0x00ff00,
2094   limegreen: 0x32cd32,
2095   linen: 0xfaf0e6,
2096   magenta: 0xff00ff,
2097   maroon: 0x800000,
2098   mediumaquamarine: 0x66cdaa,
2099   mediumblue: 0x0000cd,
2100   mediumorchid: 0xba55d3,
2101   mediumpurple: 0x9370db,
2102   mediumseagreen: 0x3cb371,
2103   mediumslateblue: 0x7b68ee,
2104   mediumspringgreen: 0x00fa9a,
2105   mediumturquoise: 0x48d1cc,
2106   mediumvioletred: 0xc71585,
2107   midnightblue: 0x191970,
2108   mintcream: 0xf5fffa,
2109   mistyrose: 0xffe4e1,
2110   moccasin: 0xffe4b5,
2111   navajowhite: 0xffdead,
2112   navy: 0x000080,
2113   oldlace: 0xfdf5e6,
2114   olive: 0x808000,
2115   olivedrab: 0x6b8e23,
2116   orange: 0xffa500,
2117   orangered: 0xff4500,
2118   orchid: 0xda70d6,
2119   palegoldenrod: 0xeee8aa,
2120   palegreen: 0x98fb98,
2121   paleturquoise: 0xafeeee,
2122   palevioletred: 0xdb7093,
2123   papayawhip: 0xffefd5,
2124   peachpuff: 0xffdab9,
2125   peru: 0xcd853f,
2126   pink: 0xffc0cb,
2127   plum: 0xdda0dd,
2128   powderblue: 0xb0e0e6,
2129   purple: 0x800080,
2130   rebeccapurple: 0x663399,
2131   red: 0xff0000,
2132   rosybrown: 0xbc8f8f,
2133   royalblue: 0x4169e1,
2134   saddlebrown: 0x8b4513,
2135   salmon: 0xfa8072,
2136   sandybrown: 0xf4a460,
2137   seagreen: 0x2e8b57,
2138   seashell: 0xfff5ee,
2139   sienna: 0xa0522d,
2140   silver: 0xc0c0c0,
2141   skyblue: 0x87ceeb,
2142   slateblue: 0x6a5acd,
2143   slategray: 0x708090,
2144   slategrey: 0x708090,
2145   snow: 0xfffafa,
2146   springgreen: 0x00ff7f,
2147   steelblue: 0x4682b4,
2148   tan: 0xd2b48c,
2149   teal: 0x008080,
2150   thistle: 0xd8bfd8,
2151   tomato: 0xff6347,
2152   turquoise: 0x40e0d0,
2153   violet: 0xee82ee,
2154   wheat: 0xf5deb3,
2155   white: 0xffffff,
2156   whitesmoke: 0xf5f5f5,
2157   yellow: 0xffff00,
2158   yellowgreen: 0x9acd32
2159 };
2160
2161 define(Color, color, {
2162   displayable: function() {
2163     return this.rgb().displayable();
2164   },
2165   toString: function() {
2166     return this.rgb() + "";
2167   }
2168 });
2169
2170 function color(format) {
2171   var m;
2172   format = (format + "").trim().toLowerCase();
2173   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
2174       : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
2175       : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
2176       : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
2177       : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
2178       : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
2179       : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
2180       : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
2181       : named.hasOwnProperty(format) ? rgbn(named[format])
2182       : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
2183       : null;
2184 }
2185
2186 function rgbn(n) {
2187   return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2188 }
2189
2190 function rgba(r, g, b, a) {
2191   if (a <= 0) r = g = b = NaN;
2192   return new Rgb(r, g, b, a);
2193 }
2194
2195 function rgbConvert(o) {
2196   if (!(o instanceof Color)) o = color(o);
2197   if (!o) return new Rgb;
2198   o = o.rgb();
2199   return new Rgb(o.r, o.g, o.b, o.opacity);
2200 }
2201
2202 function rgb(r, g, b, opacity) {
2203   return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2204 }
2205
2206 function Rgb(r, g, b, opacity) {
2207   this.r = +r;
2208   this.g = +g;
2209   this.b = +b;
2210   this.opacity = +opacity;
2211 }
2212
2213 define(Rgb, rgb, extend(Color, {
2214   brighter: function(k) {
2215     k = k == null ? brighter : Math.pow(brighter, k);
2216     return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2217   },
2218   darker: function(k) {
2219     k = k == null ? darker : Math.pow(darker, k);
2220     return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2221   },
2222   rgb: function() {
2223     return this;
2224   },
2225   displayable: function() {
2226     return (0 <= this.r && this.r <= 255)
2227         && (0 <= this.g && this.g <= 255)
2228         && (0 <= this.b && this.b <= 255)
2229         && (0 <= this.opacity && this.opacity <= 1);
2230   },
2231   toString: function() {
2232     var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
2233     return (a === 1 ? "rgb(" : "rgba(")
2234         + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
2235         + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
2236         + Math.max(0, Math.min(255, Math.round(this.b) || 0))
2237         + (a === 1 ? ")" : ", " + a + ")");
2238   }
2239 }));
2240
2241 function hsla(h, s, l, a) {
2242   if (a <= 0) h = s = l = NaN;
2243   else if (l <= 0 || l >= 1) h = s = NaN;
2244   else if (s <= 0) h = NaN;
2245   return new Hsl(h, s, l, a);
2246 }
2247
2248 function hslConvert(o) {
2249   if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2250   if (!(o instanceof Color)) o = color(o);
2251   if (!o) return new Hsl;
2252   if (o instanceof Hsl) return o;
2253   o = o.rgb();
2254   var r = o.r / 255,
2255       g = o.g / 255,
2256       b = o.b / 255,
2257       min = Math.min(r, g, b),
2258       max = Math.max(r, g, b),
2259       h = NaN,
2260       s = max - min,
2261       l = (max + min) / 2;
2262   if (s) {
2263     if (r === max) h = (g - b) / s + (g < b) * 6;
2264     else if (g === max) h = (b - r) / s + 2;
2265     else h = (r - g) / s + 4;
2266     s /= l < 0.5 ? max + min : 2 - max - min;
2267     h *= 60;
2268   } else {
2269     s = l > 0 && l < 1 ? 0 : h;
2270   }
2271   return new Hsl(h, s, l, o.opacity);
2272 }
2273
2274 function hsl(h, s, l, opacity) {
2275   return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2276 }
2277
2278 function Hsl(h, s, l, opacity) {
2279   this.h = +h;
2280   this.s = +s;
2281   this.l = +l;
2282   this.opacity = +opacity;
2283 }
2284
2285 define(Hsl, hsl, extend(Color, {
2286   brighter: function(k) {
2287     k = k == null ? brighter : Math.pow(brighter, k);
2288     return new Hsl(this.h, this.s, this.l * k, this.opacity);
2289   },
2290   darker: function(k) {
2291     k = k == null ? darker : Math.pow(darker, k);
2292     return new Hsl(this.h, this.s, this.l * k, this.opacity);
2293   },
2294   rgb: function() {
2295     var h = this.h % 360 + (this.h < 0) * 360,
2296         s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2297         l = this.l,
2298         m2 = l + (l < 0.5 ? l : 1 - l) * s,
2299         m1 = 2 * l - m2;
2300     return new Rgb(
2301       hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2302       hsl2rgb(h, m1, m2),
2303       hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2304       this.opacity
2305     );
2306   },
2307   displayable: function() {
2308     return (0 <= this.s && this.s <= 1 || isNaN(this.s))
2309         && (0 <= this.l && this.l <= 1)
2310         && (0 <= this.opacity && this.opacity <= 1);
2311   }
2312 }));
2313
2314 /* From FvD 13.37, CSS Color Module Level 3 */
2315 function hsl2rgb(h, m1, m2) {
2316   return (h < 60 ? m1 + (m2 - m1) * h / 60
2317       : h < 180 ? m2
2318       : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2319       : m1) * 255;
2320 }
2321
2322 var deg2rad = Math.PI / 180;
2323 var rad2deg = 180 / Math.PI;
2324
2325 var Kn = 18;
2326 var Xn = 0.950470;
2327 var Yn = 1;
2328 var Zn = 1.088830;
2329 var t0 = 4 / 29;
2330 var t1 = 6 / 29;
2331 var t2 = 3 * t1 * t1;
2332 var t3 = t1 * t1 * t1;
2333
2334 function labConvert(o) {
2335   if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
2336   if (o instanceof Hcl) {
2337     var h = o.h * deg2rad;
2338     return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
2339   }
2340   if (!(o instanceof Rgb)) o = rgbConvert(o);
2341   var b = rgb2xyz(o.r),
2342       a = rgb2xyz(o.g),
2343       l = rgb2xyz(o.b),
2344       x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
2345       y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
2346       z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
2347   return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
2348 }
2349
2350 function lab(l, a, b, opacity) {
2351   return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2352 }
2353
2354 function Lab(l, a, b, opacity) {
2355   this.l = +l;
2356   this.a = +a;
2357   this.b = +b;
2358   this.opacity = +opacity;
2359 }
2360
2361 define(Lab, lab, extend(Color, {
2362   brighter: function(k) {
2363     return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2364   },
2365   darker: function(k) {
2366     return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2367   },
2368   rgb: function() {
2369     var y = (this.l + 16) / 116,
2370         x = isNaN(this.a) ? y : y + this.a / 500,
2371         z = isNaN(this.b) ? y : y - this.b / 200;
2372     y = Yn * lab2xyz(y);
2373     x = Xn * lab2xyz(x);
2374     z = Zn * lab2xyz(z);
2375     return new Rgb(
2376       xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
2377       xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
2378       xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
2379       this.opacity
2380     );
2381   }
2382 }));
2383
2384 function xyz2lab(t) {
2385   return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2386 }
2387
2388 function lab2xyz(t) {
2389   return t > t1 ? t * t * t : t2 * (t - t0);
2390 }
2391
2392 function xyz2rgb(x) {
2393   return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2394 }
2395
2396 function rgb2xyz(x) {
2397   return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2398 }
2399
2400 function hclConvert(o) {
2401   if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
2402   if (!(o instanceof Lab)) o = labConvert(o);
2403   var h = Math.atan2(o.b, o.a) * rad2deg;
2404   return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
2405 }
2406
2407 function hcl(h, c, l, opacity) {
2408   return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2409 }
2410
2411 function Hcl(h, c, l, opacity) {
2412   this.h = +h;
2413   this.c = +c;
2414   this.l = +l;
2415   this.opacity = +opacity;
2416 }
2417
2418 define(Hcl, hcl, extend(Color, {
2419   brighter: function(k) {
2420     return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
2421   },
2422   darker: function(k) {
2423     return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2424   },
2425   rgb: function() {
2426     return labConvert(this).rgb();
2427   }
2428 }));
2429
2430 var A = -0.14861;
2431 var B = +1.78277;
2432 var C = -0.29227;
2433 var D = -0.90649;
2434 var E = +1.97294;
2435 var ED = E * D;
2436 var EB = E * B;
2437 var BC_DA = B * C - D * A;
2438
2439 function cubehelixConvert(o) {
2440   if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
2441   if (!(o instanceof Rgb)) o = rgbConvert(o);
2442   var r = o.r / 255,
2443       g = o.g / 255,
2444       b = o.b / 255,
2445       l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2446       bl = b - l,
2447       k = (E * (g - l) - C * bl) / D,
2448       s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
2449       h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
2450   return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
2451 }
2452
2453 function cubehelix(h, s, l, opacity) {
2454   return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2455 }
2456
2457 function Cubehelix(h, s, l, opacity) {
2458   this.h = +h;
2459   this.s = +s;
2460   this.l = +l;
2461   this.opacity = +opacity;
2462 }
2463
2464 define(Cubehelix, cubehelix, extend(Color, {
2465   brighter: function(k) {
2466     k = k == null ? brighter : Math.pow(brighter, k);
2467     return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2468   },
2469   darker: function(k) {
2470     k = k == null ? darker : Math.pow(darker, k);
2471     return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2472   },
2473   rgb: function() {
2474     var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2475         l = +this.l,
2476         a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2477         cosh = Math.cos(h),
2478         sinh = Math.sin(h);
2479     return new Rgb(
2480       255 * (l + a * (A * cosh + B * sinh)),
2481       255 * (l + a * (C * cosh + D * sinh)),
2482       255 * (l + a * (E * cosh)),
2483       this.opacity
2484     );
2485   }
2486 }));
2487
2488 function basis(t1, v0, v1, v2, v3) {
2489   var t2 = t1 * t1, t3 = t2 * t1;
2490   return ((1 - 3 * t1 + 3 * t2 - t3) * v0
2491       + (4 - 6 * t2 + 3 * t3) * v1
2492       + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
2493       + t3 * v3) / 6;
2494 }
2495
2496 var basis$1 = function(values) {
2497   var n = values.length - 1;
2498   return function(t) {
2499     var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
2500         v1 = values[i],
2501         v2 = values[i + 1],
2502         v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
2503         v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
2504     return basis((t - i / n) * n, v0, v1, v2, v3);
2505   };
2506 };
2507
2508 var basisClosed = function(values) {
2509   var n = values.length;
2510   return function(t) {
2511     var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
2512         v0 = values[(i + n - 1) % n],
2513         v1 = values[i % n],
2514         v2 = values[(i + 1) % n],
2515         v3 = values[(i + 2) % n];
2516     return basis((t - i / n) * n, v0, v1, v2, v3);
2517   };
2518 };
2519
2520 var constant$3 = function(x) {
2521   return function() {
2522     return x;
2523   };
2524 };
2525
2526 function linear(a, d) {
2527   return function(t) {
2528     return a + t * d;
2529   };
2530 }
2531
2532 function exponential(a, b, y) {
2533   return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
2534     return Math.pow(a + t * b, y);
2535   };
2536 }
2537
2538 function hue(a, b) {
2539   var d = b - a;
2540   return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2541 }
2542
2543 function gamma(y) {
2544   return (y = +y) === 1 ? nogamma : function(a, b) {
2545     return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2546   };
2547 }
2548
2549 function nogamma(a, b) {
2550   var d = b - a;
2551   return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2552 }
2553
2554 var d3_interpolateRgb = (function rgbGamma(y) {
2555   var color$$1 = gamma(y);
2556
2557   function rgb$$1(start, end) {
2558     var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
2559         g = color$$1(start.g, end.g),
2560         b = color$$1(start.b, end.b),
2561         opacity = nogamma(start.opacity, end.opacity);
2562     return function(t) {
2563       start.r = r(t);
2564       start.g = g(t);
2565       start.b = b(t);
2566       start.opacity = opacity(t);
2567       return start + "";
2568     };
2569   }
2570
2571   rgb$$1.gamma = rgbGamma;
2572
2573   return rgb$$1;
2574 })(1);
2575
2576 function rgbSpline(spline) {
2577   return function(colors) {
2578     var n = colors.length,
2579         r = new Array(n),
2580         g = new Array(n),
2581         b = new Array(n),
2582         i, color$$1;
2583     for (i = 0; i < n; ++i) {
2584       color$$1 = rgb(colors[i]);
2585       r[i] = color$$1.r || 0;
2586       g[i] = color$$1.g || 0;
2587       b[i] = color$$1.b || 0;
2588     }
2589     r = spline(r);
2590     g = spline(g);
2591     b = spline(b);
2592     color$$1.opacity = 1;
2593     return function(t) {
2594       color$$1.r = r(t);
2595       color$$1.g = g(t);
2596       color$$1.b = b(t);
2597       return color$$1 + "";
2598     };
2599   };
2600 }
2601
2602 var rgbBasis = rgbSpline(basis$1);
2603 var rgbBasisClosed = rgbSpline(basisClosed);
2604
2605 var array$1 = function(a, b) {
2606   var nb = b ? b.length : 0,
2607       na = a ? Math.min(nb, a.length) : 0,
2608       x = new Array(nb),
2609       c = new Array(nb),
2610       i;
2611
2612   for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
2613   for (; i < nb; ++i) c[i] = b[i];
2614
2615   return function(t) {
2616     for (i = 0; i < na; ++i) c[i] = x[i](t);
2617     return c;
2618   };
2619 };
2620
2621 var date = function(a, b) {
2622   var d = new Date;
2623   return a = +a, b -= a, function(t) {
2624     return d.setTime(a + b * t), d;
2625   };
2626 };
2627
2628 var d3_interpolateNumber = function(a, b) {
2629   return a = +a, b -= a, function(t) {
2630     return a + b * t;
2631   };
2632 };
2633
2634 var object = function(a, b) {
2635   var i = {},
2636       c = {},
2637       k;
2638
2639   if (a === null || typeof a !== "object") a = {};
2640   if (b === null || typeof b !== "object") b = {};
2641
2642   for (k in b) {
2643     if (k in a) {
2644       i[k] = d3_interpolate(a[k], b[k]);
2645     } else {
2646       c[k] = b[k];
2647     }
2648   }
2649
2650   return function(t) {
2651     for (k in i) c[k] = i[k](t);
2652     return c;
2653   };
2654 };
2655
2656 var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
2657 var reB = new RegExp(reA.source, "g");
2658
2659 function zero(b) {
2660   return function() {
2661     return b;
2662   };
2663 }
2664
2665 function one(b) {
2666   return function(t) {
2667     return b(t) + "";
2668   };
2669 }
2670
2671 var interpolateString = function(a, b) {
2672   var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
2673       am, // current match in a
2674       bm, // current match in b
2675       bs, // string preceding current number in b, if any
2676       i = -1, // index in s
2677       s = [], // string constants and placeholders
2678       q = []; // number interpolators
2679
2680   // Coerce inputs to strings.
2681   a = a + "", b = b + "";
2682
2683   // Interpolate pairs of numbers in a & b.
2684   while ((am = reA.exec(a))
2685       && (bm = reB.exec(b))) {
2686     if ((bs = bm.index) > bi) { // a string precedes the next number in b
2687       bs = b.slice(bi, bs);
2688       if (s[i]) s[i] += bs; // coalesce with previous string
2689       else s[++i] = bs;
2690     }
2691     if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2692       if (s[i]) s[i] += bm; // coalesce with previous string
2693       else s[++i] = bm;
2694     } else { // interpolate non-matching numbers
2695       s[++i] = null;
2696       q.push({i: i, x: d3_interpolateNumber(am, bm)});
2697     }
2698     bi = reB.lastIndex;
2699   }
2700
2701   // Add remains of b.
2702   if (bi < b.length) {
2703     bs = b.slice(bi);
2704     if (s[i]) s[i] += bs; // coalesce with previous string
2705     else s[++i] = bs;
2706   }
2707
2708   // Special optimization for only a single match.
2709   // Otherwise, interpolate each of the numbers and rejoin the string.
2710   return s.length < 2 ? (q[0]
2711       ? one(q[0].x)
2712       : zero(b))
2713       : (b = q.length, function(t) {
2714           for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2715           return s.join("");
2716         });
2717 };
2718
2719 var d3_interpolate = function(a, b) {
2720   var t = typeof b, c;
2721   return b == null || t === "boolean" ? constant$3(b)
2722       : (t === "number" ? d3_interpolateNumber
2723       : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
2724       : b instanceof color ? d3_interpolateRgb
2725       : b instanceof Date ? date
2726       : Array.isArray(b) ? array$1
2727       : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
2728       : d3_interpolateNumber)(a, b);
2729 };
2730
2731 var interpolateRound = function(a, b) {
2732   return a = +a, b -= a, function(t) {
2733     return Math.round(a + b * t);
2734   };
2735 };
2736
2737 var degrees = 180 / Math.PI;
2738
2739 var identity$2 = {
2740   translateX: 0,
2741   translateY: 0,
2742   rotate: 0,
2743   skewX: 0,
2744   scaleX: 1,
2745   scaleY: 1
2746 };
2747
2748 var decompose = function(a, b, c, d, e, f) {
2749   var scaleX, scaleY, skewX;
2750   if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
2751   if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
2752   if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
2753   if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
2754   return {
2755     translateX: e,
2756     translateY: f,
2757     rotate: Math.atan2(b, a) * degrees,
2758     skewX: Math.atan(skewX) * degrees,
2759     scaleX: scaleX,
2760     scaleY: scaleY
2761   };
2762 };
2763
2764 var cssNode;
2765 var cssRoot;
2766 var cssView;
2767 var svgNode;
2768
2769 function parseCss(value) {
2770   if (value === "none") return identity$2;
2771   if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
2772   cssNode.style.transform = value;
2773   value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
2774   cssRoot.removeChild(cssNode);
2775   value = value.slice(7, -1).split(",");
2776   return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
2777 }
2778
2779 function parseSvg(value) {
2780   if (value == null) return identity$2;
2781   if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
2782   svgNode.setAttribute("transform", value);
2783   if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
2784   value = value.matrix;
2785   return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
2786 }
2787
2788 function interpolateTransform(parse, pxComma, pxParen, degParen) {
2789
2790   function pop(s) {
2791     return s.length ? s.pop() + " " : "";
2792   }
2793
2794   function translate(xa, ya, xb, yb, s, q) {
2795     if (xa !== xb || ya !== yb) {
2796       var i = s.push("translate(", null, pxComma, null, pxParen);
2797       q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2798     } else if (xb || yb) {
2799       s.push("translate(" + xb + pxComma + yb + pxParen);
2800     }
2801   }
2802
2803   function rotate(a, b, s, q) {
2804     if (a !== b) {
2805       if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
2806       q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2807     } else if (b) {
2808       s.push(pop(s) + "rotate(" + b + degParen);
2809     }
2810   }
2811
2812   function skewX(a, b, s, q) {
2813     if (a !== b) {
2814       q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2815     } else if (b) {
2816       s.push(pop(s) + "skewX(" + b + degParen);
2817     }
2818   }
2819
2820   function scale(xa, ya, xb, yb, s, q) {
2821     if (xa !== xb || ya !== yb) {
2822       var i = s.push(pop(s) + "scale(", null, ",", null, ")");
2823       q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2824     } else if (xb !== 1 || yb !== 1) {
2825       s.push(pop(s) + "scale(" + xb + "," + yb + ")");
2826     }
2827   }
2828
2829   return function(a, b) {
2830     var s = [], // string constants and placeholders
2831         q = []; // number interpolators
2832     a = parse(a), b = parse(b);
2833     translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
2834     rotate(a.rotate, b.rotate, s, q);
2835     skewX(a.skewX, b.skewX, s, q);
2836     scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
2837     a = b = null; // gc
2838     return function(t) {
2839       var i = -1, n = q.length, o;
2840       while (++i < n) s[(o = q[i]).i] = o.x(t);
2841       return s.join("");
2842     };
2843   };
2844 }
2845
2846 var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2847 var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2848
2849 var rho = Math.SQRT2;
2850 var rho2 = 2;
2851 var rho4 = 4;
2852 var epsilon2 = 1e-12;
2853
2854 function cosh(x) {
2855   return ((x = Math.exp(x)) + 1 / x) / 2;
2856 }
2857
2858 function sinh(x) {
2859   return ((x = Math.exp(x)) - 1 / x) / 2;
2860 }
2861
2862 function tanh(x) {
2863   return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2864 }
2865
2866 // p0 = [ux0, uy0, w0]
2867 // p1 = [ux1, uy1, w1]
2868 var interpolateZoom = function(p0, p1) {
2869   var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
2870       ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
2871       dx = ux1 - ux0,
2872       dy = uy1 - uy0,
2873       d2 = dx * dx + dy * dy,
2874       i,
2875       S;
2876
2877   // Special case for u0 ≅ u1.
2878   if (d2 < epsilon2) {
2879     S = Math.log(w1 / w0) / rho;
2880     i = function(t) {
2881       return [
2882         ux0 + t * dx,
2883         uy0 + t * dy,
2884         w0 * Math.exp(rho * t * S)
2885       ];
2886     };
2887   }
2888
2889   // General case.
2890   else {
2891     var d1 = Math.sqrt(d2),
2892         b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
2893         b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
2894         r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
2895         r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
2896     S = (r1 - r0) / rho;
2897     i = function(t) {
2898       var s = t * S,
2899           coshr0 = cosh(r0),
2900           u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2901       return [
2902         ux0 + u * dx,
2903         uy0 + u * dy,
2904         w0 * coshr0 / cosh(rho * s + r0)
2905       ];
2906     };
2907   }
2908
2909   i.duration = S * 1000;
2910
2911   return i;
2912 };
2913
2914 function hsl$1(hue$$1) {
2915   return function(start, end) {
2916     var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h),
2917         s = nogamma(start.s, end.s),
2918         l = nogamma(start.l, end.l),
2919         opacity = nogamma(start.opacity, end.opacity);
2920     return function(t) {
2921       start.h = h(t);
2922       start.s = s(t);
2923       start.l = l(t);
2924       start.opacity = opacity(t);
2925       return start + "";
2926     };
2927   }
2928 }
2929
2930 var hsl$2 = hsl$1(hue);
2931 var hslLong = hsl$1(nogamma);
2932
2933 function lab$1(start, end) {
2934   var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
2935       a = nogamma(start.a, end.a),
2936       b = nogamma(start.b, end.b),
2937       opacity = nogamma(start.opacity, end.opacity);
2938   return function(t) {
2939     start.l = l(t);
2940     start.a = a(t);
2941     start.b = b(t);
2942     start.opacity = opacity(t);
2943     return start + "";
2944   };
2945 }
2946
2947 function hcl$1(hue$$1) {
2948   return function(start, end) {
2949     var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h),
2950         c = nogamma(start.c, end.c),
2951         l = nogamma(start.l, end.l),
2952         opacity = nogamma(start.opacity, end.opacity);
2953     return function(t) {
2954       start.h = h(t);
2955       start.c = c(t);
2956       start.l = l(t);
2957       start.opacity = opacity(t);
2958       return start + "";
2959     };
2960   }
2961 }
2962
2963 var hcl$2 = hcl$1(hue);
2964 var hclLong = hcl$1(nogamma);
2965
2966 function cubehelix$1(hue$$1) {
2967   return (function cubehelixGamma(y) {
2968     y = +y;
2969
2970     function cubehelix$$1(start, end) {
2971       var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h),
2972           s = nogamma(start.s, end.s),
2973           l = nogamma(start.l, end.l),
2974           opacity = nogamma(start.opacity, end.opacity);
2975       return function(t) {
2976         start.h = h(t);
2977         start.s = s(t);
2978         start.l = l(Math.pow(t, y));
2979         start.opacity = opacity(t);
2980         return start + "";
2981       };
2982     }
2983
2984     cubehelix$$1.gamma = cubehelixGamma;
2985
2986     return cubehelix$$1;
2987   })(1);
2988 }
2989
2990 var cubehelix$2 = cubehelix$1(hue);
2991 var cubehelixLong = cubehelix$1(nogamma);
2992
2993 var d3_quantize = function(interpolator, n) {
2994   var samples = new Array(n);
2995   for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
2996   return samples;
2997 };
2998
2999 var frame = 0;
3000 var timeout = 0;
3001 var interval = 0;
3002 var pokeDelay = 1000;
3003 var taskHead;
3004 var taskTail;
3005 var clockLast = 0;
3006 var clockNow = 0;
3007 var clockSkew = 0;
3008 var clock = typeof performance === "object" && performance.now ? performance : Date;
3009 var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
3010
3011 function now() {
3012   return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3013 }
3014
3015 function clearNow() {
3016   clockNow = 0;
3017 }
3018
3019 function Timer() {
3020   this._call =
3021   this._time =
3022   this._next = null;
3023 }
3024
3025 Timer.prototype = timer.prototype = {
3026   constructor: Timer,
3027   restart: function(callback, delay, time) {
3028     if (typeof callback !== "function") throw new TypeError("callback is not a function");
3029     time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
3030     if (!this._next && taskTail !== this) {
3031       if (taskTail) taskTail._next = this;
3032       else taskHead = this;
3033       taskTail = this;
3034     }
3035     this._call = callback;
3036     this._time = time;
3037     sleep();
3038   },
3039   stop: function() {
3040     if (this._call) {
3041       this._call = null;
3042       this._time = Infinity;
3043       sleep();
3044     }
3045   }
3046 };
3047
3048 function timer(callback, delay, time) {
3049   var t = new Timer;
3050   t.restart(callback, delay, time);
3051   return t;
3052 }
3053
3054 function timerFlush() {
3055   now(); // Get the current time, if not already set.
3056   ++frame; // Pretend we’ve set an alarm, if we haven’t already.
3057   var t = taskHead, e;
3058   while (t) {
3059     if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3060     t = t._next;
3061   }
3062   --frame;
3063 }
3064
3065 function wake() {
3066   clockNow = (clockLast = clock.now()) + clockSkew;
3067   frame = timeout = 0;
3068   try {
3069     timerFlush();
3070   } finally {
3071     frame = 0;
3072     nap();
3073     clockNow = 0;
3074   }
3075 }
3076
3077 function poke() {
3078   var now = clock.now(), delay = now - clockLast;
3079   if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3080 }
3081
3082 function nap() {
3083   var t0, t1 = taskHead, t2, time = Infinity;
3084   while (t1) {
3085     if (t1._call) {
3086       if (time > t1._time) time = t1._time;
3087       t0 = t1, t1 = t1._next;
3088     } else {
3089       t2 = t1._next, t1._next = null;
3090       t1 = t0 ? t0._next = t2 : taskHead = t2;
3091     }
3092   }
3093   taskTail = t0;
3094   sleep(time);
3095 }
3096
3097 function sleep(time) {
3098   if (frame) return; // Soonest alarm already set, or will be.
3099   if (timeout) timeout = clearTimeout(timeout);
3100   var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
3101   if (delay > 24) {
3102     if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3103     if (interval) interval = clearInterval(interval);
3104   } else {
3105     if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3106     frame = 1, setFrame(wake);
3107   }
3108 }
3109
3110 var d3_timeout = function(callback, delay, time) {
3111   var t = new Timer;
3112   delay = delay == null ? 0 : +delay;
3113   t.restart(function(elapsed) {
3114     t.stop();
3115     callback(elapsed + delay);
3116   }, delay, time);
3117   return t;
3118 };
3119
3120 var interval$1 = function(callback, delay, time) {
3121   var t = new Timer, total = delay;
3122   if (delay == null) return t.restart(callback, delay, time), t;
3123   delay = +delay, time = time == null ? now() : +time;
3124   t.restart(function tick(elapsed) {
3125     elapsed += total;
3126     t.restart(tick, total += delay, time);
3127     callback(elapsed);
3128   }, delay, time);
3129   return t;
3130 };
3131
3132 var emptyOn = dispatch("start", "end", "interrupt");
3133 var emptyTween = [];
3134
3135 var CREATED = 0;
3136 var SCHEDULED = 1;
3137 var STARTING = 2;
3138 var STARTED = 3;
3139 var RUNNING = 4;
3140 var ENDING = 5;
3141 var ENDED = 6;
3142
3143 var schedule = function(node, name, id, index, group, timing) {
3144   var schedules = node.__transition;
3145   if (!schedules) node.__transition = {};
3146   else if (id in schedules) return;
3147   create(node, id, {
3148     name: name,
3149     index: index, // For context during callback.
3150     group: group, // For context during callback.
3151     on: emptyOn,
3152     tween: emptyTween,
3153     time: timing.time,
3154     delay: timing.delay,
3155     duration: timing.duration,
3156     ease: timing.ease,
3157     timer: null,
3158     state: CREATED
3159   });
3160 };
3161
3162 function init(node, id) {
3163   var schedule = node.__transition;
3164   if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late");
3165   return schedule;
3166 }
3167
3168 function set$1(node, id) {
3169   var schedule = node.__transition;
3170   if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late");
3171   return schedule;
3172 }
3173
3174 function get$1(node, id) {
3175   var schedule = node.__transition;
3176   if (!schedule || !(schedule = schedule[id])) throw new Error("too late");
3177   return schedule;
3178 }
3179
3180 function create(node, id, self) {
3181   var schedules = node.__transition,
3182       tween;
3183
3184   // Initialize the self timer when the transition is created.
3185   // Note the actual delay is not known until the first callback!
3186   schedules[id] = self;
3187   self.timer = timer(schedule, 0, self.time);
3188
3189   function schedule(elapsed) {
3190     self.state = SCHEDULED;
3191     self.timer.restart(start, self.delay, self.time);
3192
3193     // If the elapsed delay is less than our first sleep, start immediately.
3194     if (self.delay <= elapsed) start(elapsed - self.delay);
3195   }
3196
3197   function start(elapsed) {
3198     var i, j, n, o;
3199
3200     // If the state is not SCHEDULED, then we previously errored on start.
3201     if (self.state !== SCHEDULED) return stop();
3202
3203     for (i in schedules) {
3204       o = schedules[i];
3205       if (o.name !== self.name) continue;
3206
3207       // While this element already has a starting transition during this frame,
3208       // defer starting an interrupting transition until that transition has a
3209       // chance to tick (and possibly end); see d3/d3-transition#54!
3210       if (o.state === STARTED) return d3_timeout(start);
3211
3212       // Interrupt the active transition, if any.
3213       // Dispatch the interrupt event.
3214       if (o.state === RUNNING) {
3215         o.state = ENDED;
3216         o.timer.stop();
3217         o.on.call("interrupt", node, node.__data__, o.index, o.group);
3218         delete schedules[i];
3219       }
3220
3221       // Cancel any pre-empted transitions. No interrupt event is dispatched
3222       // because the cancelled transitions never started. Note that this also
3223       // removes this transition from the pending list!
3224       else if (+i < id) {
3225         o.state = ENDED;
3226         o.timer.stop();
3227         delete schedules[i];
3228       }
3229     }
3230
3231     // Defer the first tick to end of the current frame; see d3/d3#1576.
3232     // Note the transition may be canceled after start and before the first tick!
3233     // Note this must be scheduled before the start event; see d3/d3-transition#16!
3234     // Assuming this is successful, subsequent callbacks go straight to tick.
3235     d3_timeout(function() {
3236       if (self.state === STARTED) {
3237         self.state = RUNNING;
3238         self.timer.restart(tick, self.delay, self.time);
3239         tick(elapsed);
3240       }
3241     });
3242
3243     // Dispatch the start event.
3244     // Note this must be done before the tween are initialized.
3245     self.state = STARTING;
3246     self.on.call("start", node, node.__data__, self.index, self.group);
3247     if (self.state !== STARTING) return; // interrupted
3248     self.state = STARTED;
3249
3250     // Initialize the tween, deleting null tween.
3251     tween = new Array(n = self.tween.length);
3252     for (i = 0, j = -1; i < n; ++i) {
3253       if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
3254         tween[++j] = o;
3255       }
3256     }
3257     tween.length = j + 1;
3258   }
3259
3260   function tick(elapsed) {
3261     var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
3262         i = -1,
3263         n = tween.length;
3264
3265     while (++i < n) {
3266       tween[i].call(null, t);
3267     }
3268
3269     // Dispatch the end event.
3270     if (self.state === ENDING) {
3271       self.on.call("end", node, node.__data__, self.index, self.group);
3272       stop();
3273     }
3274   }
3275
3276   function stop() {
3277     self.state = ENDED;
3278     self.timer.stop();
3279     delete schedules[id];
3280     for (var i in schedules) return; // eslint-disable-line no-unused-vars
3281     delete node.__transition;
3282   }
3283 }
3284
3285 var interrupt = function(node, name) {
3286   var schedules = node.__transition,
3287       schedule$$1,
3288       active,
3289       empty = true,
3290       i;
3291
3292   if (!schedules) return;
3293
3294   name = name == null ? null : name + "";
3295
3296   for (i in schedules) {
3297     if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; }
3298     active = schedule$$1.state > STARTING && schedule$$1.state < ENDING;
3299     schedule$$1.state = ENDED;
3300     schedule$$1.timer.stop();
3301     if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group);
3302     delete schedules[i];
3303   }
3304
3305   if (empty) delete node.__transition;
3306 };
3307
3308 var selection_interrupt = function(name) {
3309   return this.each(function() {
3310     interrupt(this, name);
3311   });
3312 };
3313
3314 function tweenRemove(id, name) {
3315   var tween0, tween1;
3316   return function() {
3317     var schedule$$1 = set$1(this, id),
3318         tween = schedule$$1.tween;
3319
3320     // If this node shared tween with the previous node,
3321     // just assign the updated shared tween and we’re done!
3322     // Otherwise, copy-on-write.
3323     if (tween !== tween0) {
3324       tween1 = tween0 = tween;
3325       for (var i = 0, n = tween1.length; i < n; ++i) {
3326         if (tween1[i].name === name) {
3327           tween1 = tween1.slice();
3328           tween1.splice(i, 1);
3329           break;
3330         }
3331       }
3332     }
3333
3334     schedule$$1.tween = tween1;
3335   };
3336 }
3337
3338 function tweenFunction(id, name, value) {
3339   var tween0, tween1;
3340   if (typeof value !== "function") throw new Error;
3341   return function() {
3342     var schedule$$1 = set$1(this, id),
3343         tween = schedule$$1.tween;
3344
3345     // If this node shared tween with the previous node,
3346     // just assign the updated shared tween and we’re done!
3347     // Otherwise, copy-on-write.
3348     if (tween !== tween0) {
3349       tween1 = (tween0 = tween).slice();
3350       for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
3351         if (tween1[i].name === name) {
3352           tween1[i] = t;
3353           break;
3354         }
3355       }
3356       if (i === n) tween1.push(t);
3357     }
3358
3359     schedule$$1.tween = tween1;
3360   };
3361 }
3362
3363 var transition_tween = function(name, value) {
3364   var id = this._id;
3365
3366   name += "";
3367
3368   if (arguments.length < 2) {
3369     var tween = get$1(this.node(), id).tween;
3370     for (var i = 0, n = tween.length, t; i < n; ++i) {
3371       if ((t = tween[i]).name === name) {
3372         return t.value;
3373       }
3374     }
3375     return null;
3376   }
3377
3378   return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3379 };
3380
3381 function tweenValue(transition, name, value) {
3382   var id = transition._id;
3383
3384   transition.each(function() {
3385     var schedule$$1 = set$1(this, id);
3386     (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3387   });
3388
3389   return function(node) {
3390     return get$1(node, id).value[name];
3391   };
3392 }
3393
3394 var interpolate = function(a, b) {
3395   var c;
3396   return (typeof b === "number" ? d3_interpolateNumber
3397       : b instanceof color ? d3_interpolateRgb
3398       : (c = color(b)) ? (b = c, d3_interpolateRgb)
3399       : interpolateString)(a, b);
3400 };
3401
3402 function attrRemove$1(name) {
3403   return function() {
3404     this.removeAttribute(name);
3405   };
3406 }
3407
3408 function attrRemoveNS$1(fullname) {
3409   return function() {
3410     this.removeAttributeNS(fullname.space, fullname.local);
3411   };
3412 }
3413
3414 function attrConstant$1(name, interpolate$$1, value1) {
3415   var value00,
3416       interpolate0;
3417   return function() {
3418     var value0 = this.getAttribute(name);
3419     return value0 === value1 ? null
3420         : value0 === value00 ? interpolate0
3421         : interpolate0 = interpolate$$1(value00 = value0, value1);
3422   };
3423 }
3424
3425 function attrConstantNS$1(fullname, interpolate$$1, value1) {
3426   var value00,
3427       interpolate0;
3428   return function() {
3429     var value0 = this.getAttributeNS(fullname.space, fullname.local);
3430     return value0 === value1 ? null
3431         : value0 === value00 ? interpolate0
3432         : interpolate0 = interpolate$$1(value00 = value0, value1);
3433   };
3434 }
3435
3436 function attrFunction$1(name, interpolate$$1, value) {
3437   var value00,
3438       value10,
3439       interpolate0;
3440   return function() {
3441     var value0, value1 = value(this);
3442     if (value1 == null) return void this.removeAttribute(name);
3443     value0 = this.getAttribute(name);
3444     return value0 === value1 ? null
3445         : value0 === value00 && value1 === value10 ? interpolate0
3446         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3447   };
3448 }
3449
3450 function attrFunctionNS$1(fullname, interpolate$$1, value) {
3451   var value00,
3452       value10,
3453       interpolate0;
3454   return function() {
3455     var value0, value1 = value(this);
3456     if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
3457     value0 = this.getAttributeNS(fullname.space, fullname.local);
3458     return value0 === value1 ? null
3459         : value0 === value00 && value1 === value10 ? interpolate0
3460         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3461   };
3462 }
3463
3464 var transition_attr = function(name, value) {
3465   var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
3466   return this.attrTween(name, typeof value === "function"
3467       ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
3468       : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
3469       : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
3470 };
3471
3472 function attrTweenNS(fullname, value) {
3473   function tween() {
3474     var node = this, i = value.apply(node, arguments);
3475     return i && function(t) {
3476       node.setAttributeNS(fullname.space, fullname.local, i(t));
3477     };
3478   }
3479   tween._value = value;
3480   return tween;
3481 }
3482
3483 function attrTween(name, value) {
3484   function tween() {
3485     var node = this, i = value.apply(node, arguments);
3486     return i && function(t) {
3487       node.setAttribute(name, i(t));
3488     };
3489   }
3490   tween._value = value;
3491   return tween;
3492 }
3493
3494 var transition_attrTween = function(name, value) {
3495   var key = "attr." + name;
3496   if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3497   if (value == null) return this.tween(key, null);
3498   if (typeof value !== "function") throw new Error;
3499   var fullname = namespace(name);
3500   return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
3501 };
3502
3503 function delayFunction(id, value) {
3504   return function() {
3505     init(this, id).delay = +value.apply(this, arguments);
3506   };
3507 }
3508
3509 function delayConstant(id, value) {
3510   return value = +value, function() {
3511     init(this, id).delay = value;
3512   };
3513 }
3514
3515 var transition_delay = function(value) {
3516   var id = this._id;
3517
3518   return arguments.length
3519       ? this.each((typeof value === "function"
3520           ? delayFunction
3521           : delayConstant)(id, value))
3522       : get$1(this.node(), id).delay;
3523 };
3524
3525 function durationFunction(id, value) {
3526   return function() {
3527     set$1(this, id).duration = +value.apply(this, arguments);
3528   };
3529 }
3530
3531 function durationConstant(id, value) {
3532   return value = +value, function() {
3533     set$1(this, id).duration = value;
3534   };
3535 }
3536
3537 var transition_duration = function(value) {
3538   var id = this._id;
3539
3540   return arguments.length
3541       ? this.each((typeof value === "function"
3542           ? durationFunction
3543           : durationConstant)(id, value))
3544       : get$1(this.node(), id).duration;
3545 };
3546
3547 function easeConstant(id, value) {
3548   if (typeof value !== "function") throw new Error;
3549   return function() {
3550     set$1(this, id).ease = value;
3551   };
3552 }
3553
3554 var transition_ease = function(value) {
3555   var id = this._id;
3556
3557   return arguments.length
3558       ? this.each(easeConstant(id, value))
3559       : get$1(this.node(), id).ease;
3560 };
3561
3562 var transition_filter = function(match) {
3563   if (typeof match !== "function") match = matcher$1(match);
3564
3565   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3566     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
3567       if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
3568         subgroup.push(node);
3569       }
3570     }
3571   }
3572
3573   return new Transition(subgroups, this._parents, this._name, this._id);
3574 };
3575
3576 var transition_merge = function(transition$$1) {
3577   if (transition$$1._id !== this._id) throw new Error;
3578
3579   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) {
3580     for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
3581       if (node = group0[i] || group1[i]) {
3582         merge[i] = node;
3583       }
3584     }
3585   }
3586
3587   for (; j < m0; ++j) {
3588     merges[j] = groups0[j];
3589   }
3590
3591   return new Transition(merges, this._parents, this._name, this._id);
3592 };
3593
3594 function start(name) {
3595   return (name + "").trim().split(/^|\s+/).every(function(t) {
3596     var i = t.indexOf(".");
3597     if (i >= 0) t = t.slice(0, i);
3598     return !t || t === "start";
3599   });
3600 }
3601
3602 function onFunction(id, name, listener) {
3603   var on0, on1, sit = start(name) ? init : set$1;
3604   return function() {
3605     var schedule$$1 = sit(this, id),
3606         on = schedule$$1.on;
3607
3608     // If this node shared a dispatch with the previous node,
3609     // just assign the updated shared dispatch and we’re done!
3610     // Otherwise, copy-on-write.
3611     if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
3612
3613     schedule$$1.on = on1;
3614   };
3615 }
3616
3617 var transition_on = function(name, listener) {
3618   var id = this._id;
3619
3620   return arguments.length < 2
3621       ? get$1(this.node(), id).on.on(name)
3622       : this.each(onFunction(id, name, listener));
3623 };
3624
3625 function removeFunction(id) {
3626   return function() {
3627     var parent = this.parentNode;
3628     for (var i in this.__transition) if (+i !== id) return;
3629     if (parent) parent.removeChild(this);
3630   };
3631 }
3632
3633 var transition_remove = function() {
3634   return this.on("end.remove", removeFunction(this._id));
3635 };
3636
3637 var transition_select = function(select) {
3638   var name = this._name,
3639       id = this._id;
3640
3641   if (typeof select !== "function") select = selector(select);
3642
3643   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3644     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
3645       if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
3646         if ("__data__" in node) subnode.__data__ = node.__data__;
3647         subgroup[i] = subnode;
3648         schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
3649       }
3650     }
3651   }
3652
3653   return new Transition(subgroups, this._parents, name, id);
3654 };
3655
3656 var transition_selectAll = function(select) {
3657   var name = this._name,
3658       id = this._id;
3659
3660   if (typeof select !== "function") select = selectorAll(select);
3661
3662   for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
3663     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3664       if (node = group[i]) {
3665         for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
3666           if (child = children[k]) {
3667             schedule(child, name, id, k, children, inherit);
3668           }
3669         }
3670         subgroups.push(children);
3671         parents.push(node);
3672       }
3673     }
3674   }
3675
3676   return new Transition(subgroups, parents, name, id);
3677 };
3678
3679 var Selection$1 = selection.prototype.constructor;
3680
3681 var transition_selection = function() {
3682   return new Selection$1(this._groups, this._parents);
3683 };
3684
3685 function styleRemove$1(name, interpolate$$1) {
3686   var value00,
3687       value10,
3688       interpolate0;
3689   return function() {
3690     var value0 = styleValue(this, name),
3691         value1 = (this.style.removeProperty(name), styleValue(this, name));
3692     return value0 === value1 ? null
3693         : value0 === value00 && value1 === value10 ? interpolate0
3694         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3695   };
3696 }
3697
3698 function styleRemoveEnd(name) {
3699   return function() {
3700     this.style.removeProperty(name);
3701   };
3702 }
3703
3704 function styleConstant$1(name, interpolate$$1, value1) {
3705   var value00,
3706       interpolate0;
3707   return function() {
3708     var value0 = styleValue(this, name);
3709     return value0 === value1 ? null
3710         : value0 === value00 ? interpolate0
3711         : interpolate0 = interpolate$$1(value00 = value0, value1);
3712   };
3713 }
3714
3715 function styleFunction$1(name, interpolate$$1, value) {
3716   var value00,
3717       value10,
3718       interpolate0;
3719   return function() {
3720     var value0 = styleValue(this, name),
3721         value1 = value(this);
3722     if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
3723     return value0 === value1 ? null
3724         : value0 === value00 && value1 === value10 ? interpolate0
3725         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3726   };
3727 }
3728
3729 var transition_style = function(name, value, priority) {
3730   var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
3731   return value == null ? this
3732           .styleTween(name, styleRemove$1(name, i))
3733           .on("end.style." + name, styleRemoveEnd(name))
3734       : this.styleTween(name, typeof value === "function"
3735           ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
3736           : styleConstant$1(name, i, value + ""), priority);
3737 };
3738
3739 function styleTween(name, value, priority) {
3740   function tween() {
3741     var node = this, i = value.apply(node, arguments);
3742     return i && function(t) {
3743       node.style.setProperty(name, i(t), priority);
3744     };
3745   }
3746   tween._value = value;
3747   return tween;
3748 }
3749
3750 var transition_styleTween = function(name, value, priority) {
3751   var key = "style." + (name += "");
3752   if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3753   if (value == null) return this.tween(key, null);
3754   if (typeof value !== "function") throw new Error;
3755   return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
3756 };
3757
3758 function textConstant$1(value) {
3759   return function() {
3760     this.textContent = value;
3761   };
3762 }
3763
3764 function textFunction$1(value) {
3765   return function() {
3766     var value1 = value(this);
3767     this.textContent = value1 == null ? "" : value1;
3768   };
3769 }
3770
3771 var transition_text = function(value) {
3772   return this.tween("text", typeof value === "function"
3773       ? textFunction$1(tweenValue(this, "text", value))
3774       : textConstant$1(value == null ? "" : value + ""));
3775 };
3776
3777 var transition_transition = function() {
3778   var name = this._name,
3779       id0 = this._id,
3780       id1 = newId();
3781
3782   for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
3783     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3784       if (node = group[i]) {
3785         var inherit = get$1(node, id0);
3786         schedule(node, name, id1, i, group, {
3787           time: inherit.time + inherit.delay + inherit.duration,
3788           delay: 0,
3789           duration: inherit.duration,
3790           ease: inherit.ease
3791         });
3792       }
3793     }
3794   }
3795
3796   return new Transition(groups, this._parents, name, id1);
3797 };
3798
3799 var id = 0;
3800
3801 function Transition(groups, parents, name, id) {
3802   this._groups = groups;
3803   this._parents = parents;
3804   this._name = name;
3805   this._id = id;
3806 }
3807
3808 function transition(name) {
3809   return selection().transition(name);
3810 }
3811
3812 function newId() {
3813   return ++id;
3814 }
3815
3816 var selection_prototype = selection.prototype;
3817
3818 Transition.prototype = transition.prototype = {
3819   constructor: Transition,
3820   select: transition_select,
3821   selectAll: transition_selectAll,
3822   filter: transition_filter,
3823   merge: transition_merge,
3824   selection: transition_selection,
3825   transition: transition_transition,
3826   call: selection_prototype.call,
3827   nodes: selection_prototype.nodes,
3828   node: selection_prototype.node,
3829   size: selection_prototype.size,
3830   empty: selection_prototype.empty,
3831   each: selection_prototype.each,
3832   on: transition_on,
3833   attr: transition_attr,
3834   attrTween: transition_attrTween,
3835   style: transition_style,
3836   styleTween: transition_styleTween,
3837   text: transition_text,
3838   remove: transition_remove,
3839   tween: transition_tween,
3840   delay: transition_delay,
3841   duration: transition_duration,
3842   ease: transition_ease
3843 };
3844
3845 function linear$1(t) {
3846   return +t;
3847 }
3848
3849 function quadIn(t) {
3850   return t * t;
3851 }
3852
3853 function quadOut(t) {
3854   return t * (2 - t);
3855 }
3856
3857 function quadInOut(t) {
3858   return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3859 }
3860
3861 function cubicIn(t) {
3862   return t * t * t;
3863 }
3864
3865 function cubicOut(t) {
3866   return --t * t * t + 1;
3867 }
3868
3869 function cubicInOut(t) {
3870   return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3871 }
3872
3873 var exponent = 3;
3874
3875 var polyIn = (function custom(e) {
3876   e = +e;
3877
3878   function polyIn(t) {
3879     return Math.pow(t, e);
3880   }
3881
3882   polyIn.exponent = custom;
3883
3884   return polyIn;
3885 })(exponent);
3886
3887 var polyOut = (function custom(e) {
3888   e = +e;
3889
3890   function polyOut(t) {
3891     return 1 - Math.pow(1 - t, e);
3892   }
3893
3894   polyOut.exponent = custom;
3895
3896   return polyOut;
3897 })(exponent);
3898
3899 var polyInOut = (function custom(e) {
3900   e = +e;
3901
3902   function polyInOut(t) {
3903     return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3904   }
3905
3906   polyInOut.exponent = custom;
3907
3908   return polyInOut;
3909 })(exponent);
3910
3911 var pi = Math.PI;
3912 var halfPi = pi / 2;
3913
3914 function sinIn(t) {
3915   return 1 - Math.cos(t * halfPi);
3916 }
3917
3918 function sinOut(t) {
3919   return Math.sin(t * halfPi);
3920 }
3921
3922 function sinInOut(t) {
3923   return (1 - Math.cos(pi * t)) / 2;
3924 }
3925
3926 function expIn(t) {
3927   return Math.pow(2, 10 * t - 10);
3928 }
3929
3930 function expOut(t) {
3931   return 1 - Math.pow(2, -10 * t);
3932 }
3933
3934 function expInOut(t) {
3935   return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3936 }
3937
3938 function circleIn(t) {
3939   return 1 - Math.sqrt(1 - t * t);
3940 }
3941
3942 function circleOut(t) {
3943   return Math.sqrt(1 - --t * t);
3944 }
3945
3946 function circleInOut(t) {
3947   return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3948 }
3949
3950 var b1 = 4 / 11;
3951 var b2 = 6 / 11;
3952 var b3 = 8 / 11;
3953 var b4 = 3 / 4;
3954 var b5 = 9 / 11;
3955 var b6 = 10 / 11;
3956 var b7 = 15 / 16;
3957 var b8 = 21 / 22;
3958 var b9 = 63 / 64;
3959 var b0 = 1 / b1 / b1;
3960
3961 function bounceIn(t) {
3962   return 1 - bounceOut(1 - t);
3963 }
3964
3965 function bounceOut(t) {
3966   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;
3967 }
3968
3969 function bounceInOut(t) {
3970   return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3971 }
3972
3973 var overshoot = 1.70158;
3974
3975 var backIn = (function custom(s) {
3976   s = +s;
3977
3978   function backIn(t) {
3979     return t * t * ((s + 1) * t - s);
3980   }
3981
3982   backIn.overshoot = custom;
3983
3984   return backIn;
3985 })(overshoot);
3986
3987 var backOut = (function custom(s) {
3988   s = +s;
3989
3990   function backOut(t) {
3991     return --t * t * ((s + 1) * t + s) + 1;
3992   }
3993
3994   backOut.overshoot = custom;
3995
3996   return backOut;
3997 })(overshoot);
3998
3999 var backInOut = (function custom(s) {
4000   s = +s;
4001
4002   function backInOut(t) {
4003     return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4004   }
4005
4006   backInOut.overshoot = custom;
4007
4008   return backInOut;
4009 })(overshoot);
4010
4011 var tau = 2 * Math.PI;
4012 var amplitude = 1;
4013 var period = 0.3;
4014
4015 var elasticIn = (function custom(a, p) {
4016   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4017
4018   function elasticIn(t) {
4019     return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4020   }
4021
4022   elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4023   elasticIn.period = function(p) { return custom(a, p); };
4024
4025   return elasticIn;
4026 })(amplitude, period);
4027
4028 var elasticOut = (function custom(a, p) {
4029   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4030
4031   function elasticOut(t) {
4032     return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4033   }
4034
4035   elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4036   elasticOut.period = function(p) { return custom(a, p); };
4037
4038   return elasticOut;
4039 })(amplitude, period);
4040
4041 var elasticInOut = (function custom(a, p) {
4042   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4043
4044   function elasticInOut(t) {
4045     return ((t = t * 2 - 1) < 0
4046         ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
4047         : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
4048   }
4049
4050   elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4051   elasticInOut.period = function(p) { return custom(a, p); };
4052
4053   return elasticInOut;
4054 })(amplitude, period);
4055
4056 var defaultTiming = {
4057   time: null, // Set on use.
4058   delay: 0,
4059   duration: 250,
4060   ease: cubicInOut
4061 };
4062
4063 function inherit(node, id) {
4064   var timing;
4065   while (!(timing = node.__transition) || !(timing = timing[id])) {
4066     if (!(node = node.parentNode)) {
4067       return defaultTiming.time = now(), defaultTiming;
4068     }
4069   }
4070   return timing;
4071 }
4072
4073 var selection_transition = function(name) {
4074   var id,
4075       timing;
4076
4077   if (name instanceof Transition) {
4078     id = name._id, name = name._name;
4079   } else {
4080     id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4081   }
4082
4083   for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
4084     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
4085       if (node = group[i]) {
4086         schedule(node, name, id, i, group, timing || inherit(node, id));
4087       }
4088     }
4089   }
4090
4091   return new Transition(groups, this._parents, name, id);
4092 };
4093
4094 selection.prototype.interrupt = selection_interrupt;
4095 selection.prototype.transition = selection_transition;
4096
4097 var root$1 = [null];
4098
4099 var active = function(node, name) {
4100   var schedules = node.__transition,
4101       schedule$$1,
4102       i;
4103
4104   if (schedules) {
4105     name = name == null ? null : name + "";
4106     for (i in schedules) {
4107       if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) {
4108         return new Transition([[node]], root$1, name, +i);
4109       }
4110     }
4111   }
4112
4113   return null;
4114 };
4115
4116 var constant$4 = function(x) {
4117   return function() {
4118     return x;
4119   };
4120 };
4121
4122 var BrushEvent = function(target, type, selection) {
4123   this.target = target;
4124   this.type = type;
4125   this.selection = selection;
4126 };
4127
4128 function nopropagation$1() {
4129   event.stopImmediatePropagation();
4130 }
4131
4132 var noevent$1 = function() {
4133   event.preventDefault();
4134   event.stopImmediatePropagation();
4135 };
4136
4137 var MODE_DRAG = {name: "drag"};
4138 var MODE_SPACE = {name: "space"};
4139 var MODE_HANDLE = {name: "handle"};
4140 var MODE_CENTER = {name: "center"};
4141
4142 var X = {
4143   name: "x",
4144   handles: ["e", "w"].map(type),
4145   input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
4146   output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
4147 };
4148
4149 var Y = {
4150   name: "y",
4151   handles: ["n", "s"].map(type),
4152   input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
4153   output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
4154 };
4155
4156 var XY = {
4157   name: "xy",
4158   handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4159   input: function(xy) { return xy; },
4160   output: function(xy) { return xy; }
4161 };
4162
4163 var cursors = {
4164   overlay: "crosshair",
4165   selection: "move",
4166   n: "ns-resize",
4167   e: "ew-resize",
4168   s: "ns-resize",
4169   w: "ew-resize",
4170   nw: "nwse-resize",
4171   ne: "nesw-resize",
4172   se: "nwse-resize",
4173   sw: "nesw-resize"
4174 };
4175
4176 var flipX = {
4177   e: "w",
4178   w: "e",
4179   nw: "ne",
4180   ne: "nw",
4181   se: "sw",
4182   sw: "se"
4183 };
4184
4185 var flipY = {
4186   n: "s",
4187   s: "n",
4188   nw: "sw",
4189   ne: "se",
4190   se: "ne",
4191   sw: "nw"
4192 };
4193
4194 var signsX = {
4195   overlay: +1,
4196   selection: +1,
4197   n: null,
4198   e: +1,
4199   s: null,
4200   w: -1,
4201   nw: -1,
4202   ne: +1,
4203   se: +1,
4204   sw: -1
4205 };
4206
4207 var signsY = {
4208   overlay: +1,
4209   selection: +1,
4210   n: -1,
4211   e: null,
4212   s: +1,
4213   w: null,
4214   nw: -1,
4215   ne: -1,
4216   se: +1,
4217   sw: +1
4218 };
4219
4220 function type(t) {
4221   return {type: t};
4222 }
4223
4224 // Ignore right-click, since that should open the context menu.
4225 function defaultFilter() {
4226   return !event.button;
4227 }
4228
4229 function defaultExtent() {
4230   var svg = this.ownerSVGElement || this;
4231   return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4232 }
4233
4234 // Like d3.local, but with the name “__brush” rather than auto-generated.
4235 function local$$1(node) {
4236   while (!node.__brush) if (!(node = node.parentNode)) return;
4237   return node.__brush;
4238 }
4239
4240 function empty(extent) {
4241   return extent[0][0] === extent[1][0]
4242       || extent[0][1] === extent[1][1];
4243 }
4244
4245 function brushSelection(node) {
4246   var state = node.__brush;
4247   return state ? state.dim.output(state.selection) : null;
4248 }
4249
4250 function brushX() {
4251   return brush$1(X);
4252 }
4253
4254 function brushY() {
4255   return brush$1(Y);
4256 }
4257
4258 var brush = function() {
4259   return brush$1(XY);
4260 };
4261
4262 function brush$1(dim) {
4263   var extent = defaultExtent,
4264       filter = defaultFilter,
4265       listeners = dispatch(brush, "start", "brush", "end"),
4266       handleSize = 6,
4267       touchending;
4268
4269   function brush(group) {
4270     var overlay = group
4271         .property("__brush", initialize)
4272       .selectAll(".overlay")
4273       .data([type("overlay")]);
4274
4275     overlay.enter().append("rect")
4276         .attr("class", "overlay")
4277         .attr("pointer-events", "all")
4278         .attr("cursor", cursors.overlay)
4279       .merge(overlay)
4280         .each(function() {
4281           var extent = local$$1(this).extent;
4282           d3_select(this)
4283               .attr("x", extent[0][0])
4284               .attr("y", extent[0][1])
4285               .attr("width", extent[1][0] - extent[0][0])
4286               .attr("height", extent[1][1] - extent[0][1]);
4287         });
4288
4289     group.selectAll(".selection")
4290       .data([type("selection")])
4291       .enter().append("rect")
4292         .attr("class", "selection")
4293         .attr("cursor", cursors.selection)
4294         .attr("fill", "#777")
4295         .attr("fill-opacity", 0.3)
4296         .attr("stroke", "#fff")
4297         .attr("shape-rendering", "crispEdges");
4298
4299     var handle = group.selectAll(".handle")
4300       .data(dim.handles, function(d) { return d.type; });
4301
4302     handle.exit().remove();
4303
4304     handle.enter().append("rect")
4305         .attr("class", function(d) { return "handle handle--" + d.type; })
4306         .attr("cursor", function(d) { return cursors[d.type]; });
4307
4308     group
4309         .each(redraw)
4310         .attr("fill", "none")
4311         .attr("pointer-events", "all")
4312         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
4313         .on("mousedown.brush touchstart.brush", started);
4314   }
4315
4316   brush.move = function(group, selection) {
4317     if (group.selection) {
4318       group
4319           .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
4320           .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
4321           .tween("brush", function() {
4322             var that = this,
4323                 state = that.__brush,
4324                 emit = emitter(that, arguments),
4325                 selection0 = state.selection,
4326                 selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
4327                 i = d3_interpolate(selection0, selection1);
4328
4329             function tween(t) {
4330               state.selection = t === 1 && empty(selection1) ? null : i(t);
4331               redraw.call(that);
4332               emit.brush();
4333             }
4334
4335             return selection0 && selection1 ? tween : tween(1);
4336           });
4337     } else {
4338       group
4339           .each(function() {
4340             var that = this,
4341                 args = arguments,
4342                 state = that.__brush,
4343                 selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
4344                 emit = emitter(that, args).beforestart();
4345
4346             interrupt(that);
4347             state.selection = selection1 == null || empty(selection1) ? null : selection1;
4348             redraw.call(that);
4349             emit.start().brush().end();
4350           });
4351     }
4352   };
4353
4354   function redraw() {
4355     var group = d3_select(this),
4356         selection = local$$1(this).selection;
4357
4358     if (selection) {
4359       group.selectAll(".selection")
4360           .style("display", null)
4361           .attr("x", selection[0][0])
4362           .attr("y", selection[0][1])
4363           .attr("width", selection[1][0] - selection[0][0])
4364           .attr("height", selection[1][1] - selection[0][1]);
4365
4366       group.selectAll(".handle")
4367           .style("display", null)
4368           .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
4369           .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
4370           .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
4371           .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
4372     }
4373
4374     else {
4375       group.selectAll(".selection,.handle")
4376           .style("display", "none")
4377           .attr("x", null)
4378           .attr("y", null)
4379           .attr("width", null)
4380           .attr("height", null);
4381     }
4382   }
4383
4384   function emitter(that, args) {
4385     return that.__brush.emitter || new Emitter(that, args);
4386   }
4387
4388   function Emitter(that, args) {
4389     this.that = that;
4390     this.args = args;
4391     this.state = that.__brush;
4392     this.active = 0;
4393   }
4394
4395   Emitter.prototype = {
4396     beforestart: function() {
4397       if (++this.active === 1) this.state.emitter = this, this.starting = true;
4398       return this;
4399     },
4400     start: function() {
4401       if (this.starting) this.starting = false, this.emit("start");
4402       return this;
4403     },
4404     brush: function() {
4405       this.emit("brush");
4406       return this;
4407     },
4408     end: function() {
4409       if (--this.active === 0) delete this.state.emitter, this.emit("end");
4410       return this;
4411     },
4412     emit: function(type) {
4413       customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4414     }
4415   };
4416
4417   function started() {
4418     if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
4419     else if (touchending) return;
4420     if (!filter.apply(this, arguments)) return;
4421
4422     var that = this,
4423         type = event.target.__data__.type,
4424         mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
4425         signX = dim === Y ? null : signsX[type],
4426         signY = dim === X ? null : signsY[type],
4427         state = local$$1(that),
4428         extent = state.extent,
4429         selection = state.selection,
4430         W = extent[0][0], w0, w1,
4431         N = extent[0][1], n0, n1,
4432         E = extent[1][0], e0, e1,
4433         S = extent[1][1], s0, s1,
4434         dx,
4435         dy,
4436         moving,
4437         shifting = signX && signY && event.shiftKey,
4438         lockX,
4439         lockY,
4440         point0 = d3_mouse(that),
4441         point = point0,
4442         emit = emitter(that, arguments).beforestart();
4443
4444     if (type === "overlay") {
4445       state.selection = selection = [
4446         [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4447         [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4448       ];
4449     } else {
4450       w0 = selection[0][0];
4451       n0 = selection[0][1];
4452       e0 = selection[1][0];
4453       s0 = selection[1][1];
4454     }
4455
4456     w1 = w0;
4457     n1 = n0;
4458     e1 = e0;
4459     s1 = s0;
4460
4461     var group = d3_select(that)
4462         .attr("pointer-events", "none");
4463
4464     var overlay = group.selectAll(".overlay")
4465         .attr("cursor", cursors[type]);
4466
4467     if (event.touches) {
4468       group
4469           .on("touchmove.brush", moved, true)
4470           .on("touchend.brush touchcancel.brush", ended, true);
4471     } else {
4472       var view = d3_select(event.view)
4473           .on("keydown.brush", keydowned, true)
4474           .on("keyup.brush", keyupped, true)
4475           .on("mousemove.brush", moved, true)
4476           .on("mouseup.brush", ended, true);
4477
4478       dragDisable(event.view);
4479     }
4480
4481     nopropagation$1();
4482     interrupt(that);
4483     redraw.call(that);
4484     emit.start();
4485
4486     function moved() {
4487       var point1 = d3_mouse(that);
4488       if (shifting && !lockX && !lockY) {
4489         if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
4490         else lockX = true;
4491       }
4492       point = point1;
4493       moving = true;
4494       noevent$1();
4495       move();
4496     }
4497
4498     function move() {
4499       var t;
4500
4501       dx = point[0] - point0[0];
4502       dy = point[1] - point0[1];
4503
4504       switch (mode) {
4505         case MODE_SPACE:
4506         case MODE_DRAG: {
4507           if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
4508           if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
4509           break;
4510         }
4511         case MODE_HANDLE: {
4512           if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
4513           else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
4514           if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
4515           else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
4516           break;
4517         }
4518         case MODE_CENTER: {
4519           if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
4520           if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
4521           break;
4522         }
4523       }
4524
4525       if (e1 < w1) {
4526         signX *= -1;
4527         t = w0, w0 = e0, e0 = t;
4528         t = w1, w1 = e1, e1 = t;
4529         if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
4530       }
4531
4532       if (s1 < n1) {
4533         signY *= -1;
4534         t = n0, n0 = s0, s0 = t;
4535         t = n1, n1 = s1, s1 = t;
4536         if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
4537       }
4538
4539       if (state.selection) selection = state.selection; // May be set by brush.move!
4540       if (lockX) w1 = selection[0][0], e1 = selection[1][0];
4541       if (lockY) n1 = selection[0][1], s1 = selection[1][1];
4542
4543       if (selection[0][0] !== w1
4544           || selection[0][1] !== n1
4545           || selection[1][0] !== e1
4546           || selection[1][1] !== s1) {
4547         state.selection = [[w1, n1], [e1, s1]];
4548         redraw.call(that);
4549         emit.brush();
4550       }
4551     }
4552
4553     function ended() {
4554       nopropagation$1();
4555       if (event.touches) {
4556         if (event.touches.length) return;
4557         if (touchending) clearTimeout(touchending);
4558         touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
4559         group.on("touchmove.brush touchend.brush touchcancel.brush", null);
4560       } else {
4561         yesdrag(event.view, moving);
4562         view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4563       }
4564       group.attr("pointer-events", "all");
4565       overlay.attr("cursor", cursors.overlay);
4566       if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
4567       if (empty(selection)) state.selection = null, redraw.call(that);
4568       emit.end();
4569     }
4570
4571     function keydowned() {
4572       switch (event.keyCode) {
4573         case 16: { // SHIFT
4574           shifting = signX && signY;
4575           break;
4576         }
4577         case 18: { // ALT
4578           if (mode === MODE_HANDLE) {
4579             if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4580             if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4581             mode = MODE_CENTER;
4582             move();
4583           }
4584           break;
4585         }
4586         case 32: { // SPACE; takes priority over ALT
4587           if (mode === MODE_HANDLE || mode === MODE_CENTER) {
4588             if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
4589             if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
4590             mode = MODE_SPACE;
4591             overlay.attr("cursor", cursors.selection);
4592             move();
4593           }
4594           break;
4595         }
4596         default: return;
4597       }
4598       noevent$1();
4599     }
4600
4601     function keyupped() {
4602       switch (event.keyCode) {
4603         case 16: { // SHIFT
4604           if (shifting) {
4605             lockX = lockY = shifting = false;
4606             move();
4607           }
4608           break;
4609         }
4610         case 18: { // ALT
4611           if (mode === MODE_CENTER) {
4612             if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4613             if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4614             mode = MODE_HANDLE;
4615             move();
4616           }
4617           break;
4618         }
4619         case 32: { // SPACE
4620           if (mode === MODE_SPACE) {
4621             if (event.altKey) {
4622               if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4623               if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4624               mode = MODE_CENTER;
4625             } else {
4626               if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4627               if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4628               mode = MODE_HANDLE;
4629             }
4630             overlay.attr("cursor", cursors[type]);
4631             move();
4632           }
4633           break;
4634         }
4635         default: return;
4636       }
4637       noevent$1();
4638     }
4639   }
4640
4641   function initialize() {
4642     var state = this.__brush || {selection: null};
4643     state.extent = extent.apply(this, arguments);
4644     state.dim = dim;
4645     return state;
4646   }
4647
4648   brush.extent = function(_) {
4649     return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4650   };
4651
4652   brush.filter = function(_) {
4653     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4654   };
4655
4656   brush.handleSize = function(_) {
4657     return arguments.length ? (handleSize = +_, brush) : handleSize;
4658   };
4659
4660   brush.on = function() {
4661     var value = listeners.on.apply(listeners, arguments);
4662     return value === listeners ? brush : value;
4663   };
4664
4665   return brush;
4666 }
4667
4668 var cos = Math.cos;
4669 var sin = Math.sin;
4670 var pi$1 = Math.PI;
4671 var halfPi$1 = pi$1 / 2;
4672 var tau$1 = pi$1 * 2;
4673 var max$1 = Math.max;
4674
4675 function compareValue(compare) {
4676   return function(a, b) {
4677     return compare(
4678       a.source.value + a.target.value,
4679       b.source.value + b.target.value
4680     );
4681   };
4682 }
4683
4684 var chord = function() {
4685   var padAngle = 0,
4686       sortGroups = null,
4687       sortSubgroups = null,
4688       sortChords = null;
4689
4690   function chord(matrix) {
4691     var n = matrix.length,
4692         groupSums = [],
4693         groupIndex = d3_range(n),
4694         subgroupIndex = [],
4695         chords = [],
4696         groups = chords.groups = new Array(n),
4697         subgroups = new Array(n * n),
4698         k,
4699         x,
4700         x0,
4701         dx,
4702         i,
4703         j;
4704
4705     // Compute the sum.
4706     k = 0, i = -1; while (++i < n) {
4707       x = 0, j = -1; while (++j < n) {
4708         x += matrix[i][j];
4709       }
4710       groupSums.push(x);
4711       subgroupIndex.push(d3_range(n));
4712       k += x;
4713     }
4714
4715     // Sort groups…
4716     if (sortGroups) groupIndex.sort(function(a, b) {
4717       return sortGroups(groupSums[a], groupSums[b]);
4718     });
4719
4720     // Sort subgroups…
4721     if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4722       d.sort(function(a, b) {
4723         return sortSubgroups(matrix[i][a], matrix[i][b]);
4724       });
4725     });
4726
4727     // Convert the sum to scaling factor for [0, 2pi].
4728     // TODO Allow start and end angle to be specified?
4729     // TODO Allow padding to be specified as percentage?
4730     k = max$1(0, tau$1 - padAngle * n) / k;
4731     dx = k ? padAngle : tau$1 / n;
4732
4733     // Compute the start and end angle for each group and subgroup.
4734     // Note: Opera has a bug reordering object literal properties!
4735     x = 0, i = -1; while (++i < n) {
4736       x0 = x, j = -1; while (++j < n) {
4737         var di = groupIndex[i],
4738             dj = subgroupIndex[di][j],
4739             v = matrix[di][dj],
4740             a0 = x,
4741             a1 = x += v * k;
4742         subgroups[dj * n + di] = {
4743           index: di,
4744           subindex: dj,
4745           startAngle: a0,
4746           endAngle: a1,
4747           value: v
4748         };
4749       }
4750       groups[di] = {
4751         index: di,
4752         startAngle: x0,
4753         endAngle: x,
4754         value: groupSums[di]
4755       };
4756       x += dx;
4757     }
4758
4759     // Generate chords for each (non-empty) subgroup-subgroup link.
4760     i = -1; while (++i < n) {
4761       j = i - 1; while (++j < n) {
4762         var source = subgroups[j * n + i],
4763             target = subgroups[i * n + j];
4764         if (source.value || target.value) {
4765           chords.push(source.value < target.value
4766               ? {source: target, target: source}
4767               : {source: source, target: target});
4768         }
4769       }
4770     }
4771
4772     return sortChords ? chords.sort(sortChords) : chords;
4773   }
4774
4775   chord.padAngle = function(_) {
4776     return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4777   };
4778
4779   chord.sortGroups = function(_) {
4780     return arguments.length ? (sortGroups = _, chord) : sortGroups;
4781   };
4782
4783   chord.sortSubgroups = function(_) {
4784     return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4785   };
4786
4787   chord.sortChords = function(_) {
4788     return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4789   };
4790
4791   return chord;
4792 };
4793
4794 var slice$2 = Array.prototype.slice;
4795
4796 var constant$5 = function(x) {
4797   return function() {
4798     return x;
4799   };
4800 };
4801
4802 var pi$2 = Math.PI;
4803 var tau$2 = 2 * pi$2;
4804 var epsilon$1 = 1e-6;
4805 var tauEpsilon = tau$2 - epsilon$1;
4806
4807 function Path() {
4808   this._x0 = this._y0 = // start of current subpath
4809   this._x1 = this._y1 = null; // end of current subpath
4810   this._ = "";
4811 }
4812
4813 function path() {
4814   return new Path;
4815 }
4816
4817 Path.prototype = path.prototype = {
4818   constructor: Path,
4819   moveTo: function(x, y) {
4820     this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4821   },
4822   closePath: function() {
4823     if (this._x1 !== null) {
4824       this._x1 = this._x0, this._y1 = this._y0;
4825       this._ += "Z";
4826     }
4827   },
4828   lineTo: function(x, y) {
4829     this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4830   },
4831   quadraticCurveTo: function(x1, y1, x, y) {
4832     this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4833   },
4834   bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4835     this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4836   },
4837   arcTo: function(x1, y1, x2, y2, r) {
4838     x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4839     var x0 = this._x1,
4840         y0 = this._y1,
4841         x21 = x2 - x1,
4842         y21 = y2 - y1,
4843         x01 = x0 - x1,
4844         y01 = y0 - y1,
4845         l01_2 = x01 * x01 + y01 * y01;
4846
4847     // Is the radius negative? Error.
4848     if (r < 0) throw new Error("negative radius: " + r);
4849
4850     // Is this path empty? Move to (x1,y1).
4851     if (this._x1 === null) {
4852       this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4853     }
4854
4855     // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4856     else if (!(l01_2 > epsilon$1)) {}
4857
4858     // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
4859     // Equivalently, is (x1,y1) coincident with (x2,y2)?
4860     // Or, is the radius zero? Line to (x1,y1).
4861     else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
4862       this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
4863     }
4864
4865     // Otherwise, draw an arc!
4866     else {
4867       var x20 = x2 - x0,
4868           y20 = y2 - y0,
4869           l21_2 = x21 * x21 + y21 * y21,
4870           l20_2 = x20 * x20 + y20 * y20,
4871           l21 = Math.sqrt(l21_2),
4872           l01 = Math.sqrt(l01_2),
4873           l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
4874           t01 = l / l01,
4875           t21 = l / l21;
4876
4877       // If the start tangent is not coincident with (x0,y0), line to.
4878       if (Math.abs(t01 - 1) > epsilon$1) {
4879         this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
4880       }
4881
4882       this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4883     }
4884   },
4885   arc: function(x, y, r, a0, a1, ccw) {
4886     x = +x, y = +y, r = +r;
4887     var dx = r * Math.cos(a0),
4888         dy = r * Math.sin(a0),
4889         x0 = x + dx,
4890         y0 = y + dy,
4891         cw = 1 ^ ccw,
4892         da = ccw ? a0 - a1 : a1 - a0;
4893
4894     // Is the radius negative? Error.
4895     if (r < 0) throw new Error("negative radius: " + r);
4896
4897     // Is this path empty? Move to (x0,y0).
4898     if (this._x1 === null) {
4899       this._ += "M" + x0 + "," + y0;
4900     }
4901
4902     // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
4903     else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
4904       this._ += "L" + x0 + "," + y0;
4905     }
4906
4907     // Is this arc empty? We’re done.
4908     if (!r) return;
4909
4910     // Does the angle go the wrong way? Flip the direction.
4911     if (da < 0) da = da % tau$2 + tau$2;
4912
4913     // Is this a complete circle? Draw two arcs to complete the circle.
4914     if (da > tauEpsilon) {
4915       this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
4916     }
4917
4918     // Is this arc non-empty? Draw an arc!
4919     else if (da > epsilon$1) {
4920       this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
4921     }
4922   },
4923   rect: function(x, y, w, h) {
4924     this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
4925   },
4926   toString: function() {
4927     return this._;
4928   }
4929 };
4930
4931 function defaultSource(d) {
4932   return d.source;
4933 }
4934
4935 function defaultTarget(d) {
4936   return d.target;
4937 }
4938
4939 function defaultRadius(d) {
4940   return d.radius;
4941 }
4942
4943 function defaultStartAngle(d) {
4944   return d.startAngle;
4945 }
4946
4947 function defaultEndAngle(d) {
4948   return d.endAngle;
4949 }
4950
4951 var ribbon = function() {
4952   var source = defaultSource,
4953       target = defaultTarget,
4954       radius = defaultRadius,
4955       startAngle = defaultStartAngle,
4956       endAngle = defaultEndAngle,
4957       context = null;
4958
4959   function ribbon() {
4960     var buffer,
4961         argv = slice$2.call(arguments),
4962         s = source.apply(this, argv),
4963         t = target.apply(this, argv),
4964         sr = +radius.apply(this, (argv[0] = s, argv)),
4965         sa0 = startAngle.apply(this, argv) - halfPi$1,
4966         sa1 = endAngle.apply(this, argv) - halfPi$1,
4967         sx0 = sr * cos(sa0),
4968         sy0 = sr * sin(sa0),
4969         tr = +radius.apply(this, (argv[0] = t, argv)),
4970         ta0 = startAngle.apply(this, argv) - halfPi$1,
4971         ta1 = endAngle.apply(this, argv) - halfPi$1;
4972
4973     if (!context) context = buffer = path();
4974
4975     context.moveTo(sx0, sy0);
4976     context.arc(0, 0, sr, sa0, sa1);
4977     if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
4978       context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
4979       context.arc(0, 0, tr, ta0, ta1);
4980     }
4981     context.quadraticCurveTo(0, 0, sx0, sy0);
4982     context.closePath();
4983
4984     if (buffer) return context = null, buffer + "" || null;
4985   }
4986
4987   ribbon.radius = function(_) {
4988     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
4989   };
4990
4991   ribbon.startAngle = function(_) {
4992     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
4993   };
4994
4995   ribbon.endAngle = function(_) {
4996     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
4997   };
4998
4999   ribbon.source = function(_) {
5000     return arguments.length ? (source = _, ribbon) : source;
5001   };
5002
5003   ribbon.target = function(_) {
5004     return arguments.length ? (target = _, ribbon) : target;
5005   };
5006
5007   ribbon.context = function(_) {
5008     return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
5009   };
5010
5011   return ribbon;
5012 };
5013
5014 var prefix = "$";
5015
5016 function Map() {}
5017
5018 Map.prototype = map$1.prototype = {
5019   constructor: Map,
5020   has: function(key) {
5021     return (prefix + key) in this;
5022   },
5023   get: function(key) {
5024     return this[prefix + key];
5025   },
5026   set: function(key, value) {
5027     this[prefix + key] = value;
5028     return this;
5029   },
5030   remove: function(key) {
5031     var property = prefix + key;
5032     return property in this && delete this[property];
5033   },
5034   clear: function() {
5035     for (var property in this) if (property[0] === prefix) delete this[property];
5036   },
5037   keys: function() {
5038     var keys = [];
5039     for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5040     return keys;
5041   },
5042   values: function() {
5043     var values = [];
5044     for (var property in this) if (property[0] === prefix) values.push(this[property]);
5045     return values;
5046   },
5047   entries: function() {
5048     var entries = [];
5049     for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5050     return entries;
5051   },
5052   size: function() {
5053     var size = 0;
5054     for (var property in this) if (property[0] === prefix) ++size;
5055     return size;
5056   },
5057   empty: function() {
5058     for (var property in this) if (property[0] === prefix) return false;
5059     return true;
5060   },
5061   each: function(f) {
5062     for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5063   }
5064 };
5065
5066 function map$1(object, f) {
5067   var map = new Map;
5068
5069   // Copy constructor.
5070   if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5071
5072   // Index array by numeric index or specified key function.
5073   else if (Array.isArray(object)) {
5074     var i = -1,
5075         n = object.length,
5076         o;
5077
5078     if (f == null) while (++i < n) map.set(i, object[i]);
5079     else while (++i < n) map.set(f(o = object[i], i, object), o);
5080   }
5081
5082   // Convert object to map.
5083   else if (object) for (var key in object) map.set(key, object[key]);
5084
5085   return map;
5086 }
5087
5088 var nest = function() {
5089   var keys = [],
5090       sortKeys = [],
5091       sortValues,
5092       rollup,
5093       nest;
5094
5095   function apply(array, depth, createResult, setResult) {
5096     if (depth >= keys.length) {
5097       if (sortValues != null) array.sort(sortValues);
5098       return rollup != null ? rollup(array) : array;
5099     }
5100
5101     var i = -1,
5102         n = array.length,
5103         key = keys[depth++],
5104         keyValue,
5105         value,
5106         valuesByKey = map$1(),
5107         values,
5108         result = createResult();
5109
5110     while (++i < n) {
5111       if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5112         values.push(value);
5113       } else {
5114         valuesByKey.set(keyValue, [value]);
5115       }
5116     }
5117
5118     valuesByKey.each(function(values, key) {
5119       setResult(result, key, apply(values, depth, createResult, setResult));
5120     });
5121
5122     return result;
5123   }
5124
5125   function entries(map, depth) {
5126     if (++depth > keys.length) return map;
5127     var array, sortKey = sortKeys[depth - 1];
5128     if (rollup != null && depth >= keys.length) array = map.entries();
5129     else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
5130     return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
5131   }
5132
5133   return nest = {
5134     object: function(array) { return apply(array, 0, createObject, setObject); },
5135     map: function(array) { return apply(array, 0, createMap, setMap); },
5136     entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
5137     key: function(d) { keys.push(d); return nest; },
5138     sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
5139     sortValues: function(order) { sortValues = order; return nest; },
5140     rollup: function(f) { rollup = f; return nest; }
5141   };
5142 };
5143
5144 function createObject() {
5145   return {};
5146 }
5147
5148 function setObject(object, key, value) {
5149   object[key] = value;
5150 }
5151
5152 function createMap() {
5153   return map$1();
5154 }
5155
5156 function setMap(map, key, value) {
5157   map.set(key, value);
5158 }
5159
5160 function Set() {}
5161
5162 var proto = map$1.prototype;
5163
5164 Set.prototype = set$2.prototype = {
5165   constructor: Set,
5166   has: proto.has,
5167   add: function(value) {
5168     value += "";
5169     this[prefix + value] = value;
5170     return this;
5171   },
5172   remove: proto.remove,
5173   clear: proto.clear,
5174   values: proto.keys,
5175   size: proto.size,
5176   empty: proto.empty,
5177   each: proto.each
5178 };
5179
5180 function set$2(object, f) {
5181   var set = new Set;
5182
5183   // Copy constructor.
5184   if (object instanceof Set) object.each(function(value) { set.add(value); });
5185
5186   // Otherwise, assume it’s an array.
5187   else if (object) {
5188     var i = -1, n = object.length;
5189     if (f == null) while (++i < n) set.add(object[i]);
5190     else while (++i < n) set.add(f(object[i], i, object));
5191   }
5192
5193   return set;
5194 }
5195
5196 var keys = function(map) {
5197   var keys = [];
5198   for (var key in map) keys.push(key);
5199   return keys;
5200 };
5201
5202 var values = function(map) {
5203   var values = [];
5204   for (var key in map) values.push(map[key]);
5205   return values;
5206 };
5207
5208 var entries = function(map) {
5209   var entries = [];
5210   for (var key in map) entries.push({key: key, value: map[key]});
5211   return entries;
5212 };
5213
5214 var EOL = {};
5215 var EOF = {};
5216 var QUOTE = 34;
5217 var NEWLINE = 10;
5218 var RETURN = 13;
5219
5220 function objectConverter(columns) {
5221   return new Function("d", "return {" + columns.map(function(name, i) {
5222     return JSON.stringify(name) + ": d[" + i + "]";
5223   }).join(",") + "}");
5224 }
5225
5226 function customConverter(columns, f) {
5227   var object = objectConverter(columns);
5228   return function(row, i) {
5229     return f(object(row), i, columns);
5230   };
5231 }
5232
5233 // Compute unique columns in order of discovery.
5234 function inferColumns(rows) {
5235   var columnSet = Object.create(null),
5236       columns = [];
5237
5238   rows.forEach(function(row) {
5239     for (var column in row) {
5240       if (!(column in columnSet)) {
5241         columns.push(columnSet[column] = column);
5242       }
5243     }
5244   });
5245
5246   return columns;
5247 }
5248
5249 var dsv = function(delimiter) {
5250   var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5251       DELIMITER = delimiter.charCodeAt(0);
5252
5253   function parse(text, f) {
5254     var convert, columns, rows = parseRows(text, function(row, i) {
5255       if (convert) return convert(row, i - 1);
5256       columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
5257     });
5258     rows.columns = columns;
5259     return rows;
5260   }
5261
5262   function parseRows(text, f) {
5263     var rows = [], // output rows
5264         N = text.length,
5265         I = 0, // current character index
5266         n = 0, // current line number
5267         t, // current token
5268         eof = N <= 0, // current token followed by EOF?
5269         eol = false; // current token followed by EOL?
5270
5271     // Strip the trailing newline.
5272     if (text.charCodeAt(N - 1) === NEWLINE) --N;
5273     if (text.charCodeAt(N - 1) === RETURN) --N;
5274
5275     function token() {
5276       if (eof) return EOF;
5277       if (eol) return eol = false, EOL;
5278
5279       // Unescape quotes.
5280       var i, j = I, c;
5281       if (text.charCodeAt(j) === QUOTE) {
5282         while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
5283         if ((i = I) >= N) eof = true;
5284         else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
5285         else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5286         return text.slice(j + 1, i - 1).replace(/""/g, "\"");
5287       }
5288
5289       // Find next delimiter or newline.
5290       while (I < N) {
5291         if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
5292         else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5293         else if (c !== DELIMITER) continue;
5294         return text.slice(j, i);
5295       }
5296
5297       // Return last token before EOF.
5298       return eof = true, text.slice(j, N);
5299     }
5300
5301     while ((t = token()) !== EOF) {
5302       var row = [];
5303       while (t !== EOL && t !== EOF) row.push(t), t = token();
5304       if (f && (row = f(row, n++)) == null) continue;
5305       rows.push(row);
5306     }
5307
5308     return rows;
5309   }
5310
5311   function format(rows, columns) {
5312     if (columns == null) columns = inferColumns(rows);
5313     return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
5314       return columns.map(function(column) {
5315         return formatValue(row[column]);
5316       }).join(delimiter);
5317     })).join("\n");
5318   }
5319
5320   function formatRows(rows) {
5321     return rows.map(formatRow).join("\n");
5322   }
5323
5324   function formatRow(row) {
5325     return row.map(formatValue).join(delimiter);
5326   }
5327
5328   function formatValue(text) {
5329     return text == null ? ""
5330         : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5331         : text;
5332   }
5333
5334   return {
5335     parse: parse,
5336     parseRows: parseRows,
5337     format: format,
5338     formatRows: formatRows
5339   };
5340 };
5341
5342 var csv = dsv(",");
5343
5344 var csvParse = csv.parse;
5345 var csvParseRows = csv.parseRows;
5346 var csvFormat = csv.format;
5347 var csvFormatRows = csv.formatRows;
5348
5349 var tsv = dsv("\t");
5350
5351 var tsvParse = tsv.parse;
5352 var tsvParseRows = tsv.parseRows;
5353 var tsvFormat = tsv.format;
5354 var tsvFormatRows = tsv.formatRows;
5355
5356 var center$1 = function(x, y) {
5357   var nodes;
5358
5359   if (x == null) x = 0;
5360   if (y == null) y = 0;
5361
5362   function force() {
5363     var i,
5364         n = nodes.length,
5365         node,
5366         sx = 0,
5367         sy = 0;
5368
5369     for (i = 0; i < n; ++i) {
5370       node = nodes[i], sx += node.x, sy += node.y;
5371     }
5372
5373     for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
5374       node = nodes[i], node.x -= sx, node.y -= sy;
5375     }
5376   }
5377
5378   force.initialize = function(_) {
5379     nodes = _;
5380   };
5381
5382   force.x = function(_) {
5383     return arguments.length ? (x = +_, force) : x;
5384   };
5385
5386   force.y = function(_) {
5387     return arguments.length ? (y = +_, force) : y;
5388   };
5389
5390   return force;
5391 };
5392
5393 var constant$6 = function(x) {
5394   return function() {
5395     return x;
5396   };
5397 };
5398
5399 var jiggle = function() {
5400   return (Math.random() - 0.5) * 1e-6;
5401 };
5402
5403 var tree_add = function(d) {
5404   var x = +this._x.call(null, d),
5405       y = +this._y.call(null, d);
5406   return add(this.cover(x, y), x, y, d);
5407 };
5408
5409 function add(tree, x, y, d) {
5410   if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5411
5412   var parent,
5413       node = tree._root,
5414       leaf = {data: d},
5415       x0 = tree._x0,
5416       y0 = tree._y0,
5417       x1 = tree._x1,
5418       y1 = tree._y1,
5419       xm,
5420       ym,
5421       xp,
5422       yp,
5423       right,
5424       bottom,
5425       i,
5426       j;
5427
5428   // If the tree is empty, initialize the root as a leaf.
5429   if (!node) return tree._root = leaf, tree;
5430
5431   // Find the existing leaf for the new point, or add it.
5432   while (node.length) {
5433     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5434     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5435     if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
5436   }
5437
5438   // Is the new point is exactly coincident with the existing point?
5439   xp = +tree._x.call(null, node.data);
5440   yp = +tree._y.call(null, node.data);
5441   if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
5442
5443   // Otherwise, split the leaf node until the old and new point are separated.
5444   do {
5445     parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
5446     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5447     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5448   } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
5449   return parent[j] = node, parent[i] = leaf, tree;
5450 }
5451
5452 function addAll(data) {
5453   var d, i, n = data.length,
5454       x,
5455       y,
5456       xz = new Array(n),
5457       yz = new Array(n),
5458       x0 = Infinity,
5459       y0 = Infinity,
5460       x1 = -Infinity,
5461       y1 = -Infinity;
5462
5463   // Compute the points and their extent.
5464   for (i = 0; i < n; ++i) {
5465     if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
5466     xz[i] = x;
5467     yz[i] = y;
5468     if (x < x0) x0 = x;
5469     if (x > x1) x1 = x;
5470     if (y < y0) y0 = y;
5471     if (y > y1) y1 = y;
5472   }
5473
5474   // If there were no (valid) points, inherit the existing extent.
5475   if (x1 < x0) x0 = this._x0, x1 = this._x1;
5476   if (y1 < y0) y0 = this._y0, y1 = this._y1;
5477
5478   // Expand the tree to cover the new points.
5479   this.cover(x0, y0).cover(x1, y1);
5480
5481   // Add the new points.
5482   for (i = 0; i < n; ++i) {
5483     add(this, xz[i], yz[i], data[i]);
5484   }
5485
5486   return this;
5487 }
5488
5489 var tree_cover = function(x, y) {
5490   if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5491
5492   var x0 = this._x0,
5493       y0 = this._y0,
5494       x1 = this._x1,
5495       y1 = this._y1;
5496
5497   // If the quadtree has no extent, initialize them.
5498   // Integer extent are necessary so that if we later double the extent,
5499   // the existing quadrant boundaries don’t change due to floating point error!
5500   if (isNaN(x0)) {
5501     x1 = (x0 = Math.floor(x)) + 1;
5502     y1 = (y0 = Math.floor(y)) + 1;
5503   }
5504
5505   // Otherwise, double repeatedly to cover.
5506   else if (x0 > x || x > x1 || y0 > y || y > y1) {
5507     var z = x1 - x0,
5508         node = this._root,
5509         parent,
5510         i;
5511
5512     switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5513       case 0: {
5514         do parent = new Array(4), parent[i] = node, node = parent;
5515         while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
5516         break;
5517       }
5518       case 1: {
5519         do parent = new Array(4), parent[i] = node, node = parent;
5520         while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
5521         break;
5522       }
5523       case 2: {
5524         do parent = new Array(4), parent[i] = node, node = parent;
5525         while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
5526         break;
5527       }
5528       case 3: {
5529         do parent = new Array(4), parent[i] = node, node = parent;
5530         while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
5531         break;
5532       }
5533     }
5534
5535     if (this._root && this._root.length) this._root = node;
5536   }
5537
5538   // If the quadtree covers the point already, just return.
5539   else return this;
5540
5541   this._x0 = x0;
5542   this._y0 = y0;
5543   this._x1 = x1;
5544   this._y1 = y1;
5545   return this;
5546 };
5547
5548 var tree_data = function() {
5549   var data = [];
5550   this.visit(function(node) {
5551     if (!node.length) do data.push(node.data); while (node = node.next)
5552   });
5553   return data;
5554 };
5555
5556 var tree_extent = function(_) {
5557   return arguments.length
5558       ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
5559       : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
5560 };
5561
5562 var Quad = function(node, x0, y0, x1, y1) {
5563   this.node = node;
5564   this.x0 = x0;
5565   this.y0 = y0;
5566   this.x1 = x1;
5567   this.y1 = y1;
5568 };
5569
5570 var tree_find = function(x, y, radius) {
5571   var data,
5572       x0 = this._x0,
5573       y0 = this._y0,
5574       x1,
5575       y1,
5576       x2,
5577       y2,
5578       x3 = this._x1,
5579       y3 = this._y1,
5580       quads = [],
5581       node = this._root,
5582       q,
5583       i;
5584
5585   if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5586   if (radius == null) radius = Infinity;
5587   else {
5588     x0 = x - radius, y0 = y - radius;
5589     x3 = x + radius, y3 = y + radius;
5590     radius *= radius;
5591   }
5592
5593   while (q = quads.pop()) {
5594
5595     // Stop searching if this quadrant can’t contain a closer node.
5596     if (!(node = q.node)
5597         || (x1 = q.x0) > x3
5598         || (y1 = q.y0) > y3
5599         || (x2 = q.x1) < x0
5600         || (y2 = q.y1) < y0) continue;
5601
5602     // Bisect the current quadrant.
5603     if (node.length) {
5604       var xm = (x1 + x2) / 2,
5605           ym = (y1 + y2) / 2;
5606
5607       quads.push(
5608         new Quad(node[3], xm, ym, x2, y2),
5609         new Quad(node[2], x1, ym, xm, y2),
5610         new Quad(node[1], xm, y1, x2, ym),
5611         new Quad(node[0], x1, y1, xm, ym)
5612       );
5613
5614       // Visit the closest quadrant first.
5615       if (i = (y >= ym) << 1 | (x >= xm)) {
5616         q = quads[quads.length - 1];
5617         quads[quads.length - 1] = quads[quads.length - 1 - i];
5618         quads[quads.length - 1 - i] = q;
5619       }
5620     }
5621
5622     // Visit this point. (Visiting coincident points isn’t necessary!)
5623     else {
5624       var dx = x - +this._x.call(null, node.data),
5625           dy = y - +this._y.call(null, node.data),
5626           d2 = dx * dx + dy * dy;
5627       if (d2 < radius) {
5628         var d = Math.sqrt(radius = d2);
5629         x0 = x - d, y0 = y - d;
5630         x3 = x + d, y3 = y + d;
5631         data = node.data;
5632       }
5633     }
5634   }
5635
5636   return data;
5637 };
5638
5639 var tree_remove = function(d) {
5640   if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
5641
5642   var parent,
5643       node = this._root,
5644       retainer,
5645       previous,
5646       next,
5647       x0 = this._x0,
5648       y0 = this._y0,
5649       x1 = this._x1,
5650       y1 = this._y1,
5651       x,
5652       y,
5653       xm,
5654       ym,
5655       right,
5656       bottom,
5657       i,
5658       j;
5659
5660   // If the tree is empty, initialize the root as a leaf.
5661   if (!node) return this;
5662
5663   // Find the leaf node for the point.
5664   // While descending, also retain the deepest parent with a non-removed sibling.
5665   if (node.length) while (true) {
5666     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5667     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5668     if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
5669     if (!node.length) break;
5670     if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
5671   }
5672
5673   // Find the point to remove.
5674   while (node.data !== d) if (!(previous = node, node = node.next)) return this;
5675   if (next = node.next) delete node.next;
5676
5677   // If there are multiple coincident points, remove just the point.
5678   if (previous) return (next ? previous.next = next : delete previous.next), this;
5679
5680   // If this is the root point, remove it.
5681   if (!parent) return this._root = next, this;
5682
5683   // Remove this leaf.
5684   next ? parent[i] = next : delete parent[i];
5685
5686   // If the parent now contains exactly one leaf, collapse superfluous parents.
5687   if ((node = parent[0] || parent[1] || parent[2] || parent[3])
5688       && node === (parent[3] || parent[2] || parent[1] || parent[0])
5689       && !node.length) {
5690     if (retainer) retainer[j] = node;
5691     else this._root = node;
5692   }
5693
5694   return this;
5695 };
5696
5697 function removeAll(data) {
5698   for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5699   return this;
5700 }
5701
5702 var tree_root = function() {
5703   return this._root;
5704 };
5705
5706 var tree_size = function() {
5707   var size = 0;
5708   this.visit(function(node) {
5709     if (!node.length) do ++size; while (node = node.next)
5710   });
5711   return size;
5712 };
5713
5714 var tree_visit = function(callback) {
5715   var quads = [], q, node = this._root, child, x0, y0, x1, y1;
5716   if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
5717   while (q = quads.pop()) {
5718     if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
5719       var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5720       if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5721       if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5722       if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5723       if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5724     }
5725   }
5726   return this;
5727 };
5728
5729 var tree_visitAfter = function(callback) {
5730   var quads = [], next = [], q;
5731   if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
5732   while (q = quads.pop()) {
5733     var node = q.node;
5734     if (node.length) {
5735       var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5736       if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5737       if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5738       if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5739       if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5740     }
5741     next.push(q);
5742   }
5743   while (q = next.pop()) {
5744     callback(q.node, q.x0, q.y0, q.x1, q.y1);
5745   }
5746   return this;
5747 };
5748
5749 function defaultX(d) {
5750   return d[0];
5751 }
5752
5753 var tree_x = function(_) {
5754   return arguments.length ? (this._x = _, this) : this._x;
5755 };
5756
5757 function defaultY(d) {
5758   return d[1];
5759 }
5760
5761 var tree_y = function(_) {
5762   return arguments.length ? (this._y = _, this) : this._y;
5763 };
5764
5765 function quadtree(nodes, x, y) {
5766   var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
5767   return nodes == null ? tree : tree.addAll(nodes);
5768 }
5769
5770 function Quadtree(x, y, x0, y0, x1, y1) {
5771   this._x = x;
5772   this._y = y;
5773   this._x0 = x0;
5774   this._y0 = y0;
5775   this._x1 = x1;
5776   this._y1 = y1;
5777   this._root = undefined;
5778 }
5779
5780 function leaf_copy(leaf) {
5781   var copy = {data: leaf.data}, next = copy;
5782   while (leaf = leaf.next) next = next.next = {data: leaf.data};
5783   return copy;
5784 }
5785
5786 var treeProto = quadtree.prototype = Quadtree.prototype;
5787
5788 treeProto.copy = function() {
5789   var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5790       node = this._root,
5791       nodes,
5792       child;
5793
5794   if (!node) return copy;
5795
5796   if (!node.length) return copy._root = leaf_copy(node), copy;
5797
5798   nodes = [{source: node, target: copy._root = new Array(4)}];
5799   while (node = nodes.pop()) {
5800     for (var i = 0; i < 4; ++i) {
5801       if (child = node.source[i]) {
5802         if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
5803         else node.target[i] = leaf_copy(child);
5804       }
5805     }
5806   }
5807
5808   return copy;
5809 };
5810
5811 treeProto.add = tree_add;
5812 treeProto.addAll = addAll;
5813 treeProto.cover = tree_cover;
5814 treeProto.data = tree_data;
5815 treeProto.extent = tree_extent;
5816 treeProto.find = tree_find;
5817 treeProto.remove = tree_remove;
5818 treeProto.removeAll = removeAll;
5819 treeProto.root = tree_root;
5820 treeProto.size = tree_size;
5821 treeProto.visit = tree_visit;
5822 treeProto.visitAfter = tree_visitAfter;
5823 treeProto.x = tree_x;
5824 treeProto.y = tree_y;
5825
5826 function x(d) {
5827   return d.x + d.vx;
5828 }
5829
5830 function y(d) {
5831   return d.y + d.vy;
5832 }
5833
5834 var collide = function(radius) {
5835   var nodes,
5836       radii,
5837       strength = 1,
5838       iterations = 1;
5839
5840   if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5841
5842   function force() {
5843     var i, n = nodes.length,
5844         tree,
5845         node,
5846         xi,
5847         yi,
5848         ri,
5849         ri2;
5850
5851     for (var k = 0; k < iterations; ++k) {
5852       tree = quadtree(nodes, x, y).visitAfter(prepare);
5853       for (i = 0; i < n; ++i) {
5854         node = nodes[i];
5855         ri = radii[node.index], ri2 = ri * ri;
5856         xi = node.x + node.vx;
5857         yi = node.y + node.vy;
5858         tree.visit(apply);
5859       }
5860     }
5861
5862     function apply(quad, x0, y0, x1, y1) {
5863       var data = quad.data, rj = quad.r, r = ri + rj;
5864       if (data) {
5865         if (data.index > node.index) {
5866           var x = xi - data.x - data.vx,
5867               y = yi - data.y - data.vy,
5868               l = x * x + y * y;
5869           if (l < r * r) {
5870             if (x === 0) x = jiggle(), l += x * x;
5871             if (y === 0) y = jiggle(), l += y * y;
5872             l = (r - (l = Math.sqrt(l))) / l * strength;
5873             node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
5874             node.vy += (y *= l) * r;
5875             data.vx -= x * (r = 1 - r);
5876             data.vy -= y * r;
5877           }
5878         }
5879         return;
5880       }
5881       return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5882     }
5883   }
5884
5885   function prepare(quad) {
5886     if (quad.data) return quad.r = radii[quad.data.index];
5887     for (var i = quad.r = 0; i < 4; ++i) {
5888       if (quad[i] && quad[i].r > quad.r) {
5889         quad.r = quad[i].r;
5890       }
5891     }
5892   }
5893
5894   function initialize() {
5895     if (!nodes) return;
5896     var i, n = nodes.length, node;
5897     radii = new Array(n);
5898     for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
5899   }
5900
5901   force.initialize = function(_) {
5902     nodes = _;
5903     initialize();
5904   };
5905
5906   force.iterations = function(_) {
5907     return arguments.length ? (iterations = +_, force) : iterations;
5908   };
5909
5910   force.strength = function(_) {
5911     return arguments.length ? (strength = +_, force) : strength;
5912   };
5913
5914   force.radius = function(_) {
5915     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5916   };
5917
5918   return force;
5919 };
5920
5921 function index$1(d) {
5922   return d.index;
5923 }
5924
5925 function find(nodeById, nodeId) {
5926   var node = nodeById.get(nodeId);
5927   if (!node) throw new Error("missing: " + nodeId);
5928   return node;
5929 }
5930
5931 var link = function(links) {
5932   var id = index$1,
5933       strength = defaultStrength,
5934       strengths,
5935       distance = constant$6(30),
5936       distances,
5937       nodes,
5938       count,
5939       bias,
5940       iterations = 1;
5941
5942   if (links == null) links = [];
5943
5944   function defaultStrength(link) {
5945     return 1 / Math.min(count[link.source.index], count[link.target.index]);
5946   }
5947
5948   function force(alpha) {
5949     for (var k = 0, n = links.length; k < iterations; ++k) {
5950       for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
5951         link = links[i], source = link.source, target = link.target;
5952         x = target.x + target.vx - source.x - source.vx || jiggle();
5953         y = target.y + target.vy - source.y - source.vy || jiggle();
5954         l = Math.sqrt(x * x + y * y);
5955         l = (l - distances[i]) / l * alpha * strengths[i];
5956         x *= l, y *= l;
5957         target.vx -= x * (b = bias[i]);
5958         target.vy -= y * b;
5959         source.vx += x * (b = 1 - b);
5960         source.vy += y * b;
5961       }
5962     }
5963   }
5964
5965   function initialize() {
5966     if (!nodes) return;
5967
5968     var i,
5969         n = nodes.length,
5970         m = links.length,
5971         nodeById = map$1(nodes, id),
5972         link;
5973
5974     for (i = 0, count = new Array(n); i < m; ++i) {
5975       link = links[i], link.index = i;
5976       if (typeof link.source !== "object") link.source = find(nodeById, link.source);
5977       if (typeof link.target !== "object") link.target = find(nodeById, link.target);
5978       count[link.source.index] = (count[link.source.index] || 0) + 1;
5979       count[link.target.index] = (count[link.target.index] || 0) + 1;
5980     }
5981
5982     for (i = 0, bias = new Array(m); i < m; ++i) {
5983       link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
5984     }
5985
5986     strengths = new Array(m), initializeStrength();
5987     distances = new Array(m), initializeDistance();
5988   }
5989
5990   function initializeStrength() {
5991     if (!nodes) return;
5992
5993     for (var i = 0, n = links.length; i < n; ++i) {
5994       strengths[i] = +strength(links[i], i, links);
5995     }
5996   }
5997
5998   function initializeDistance() {
5999     if (!nodes) return;
6000
6001     for (var i = 0, n = links.length; i < n; ++i) {
6002       distances[i] = +distance(links[i], i, links);
6003     }
6004   }
6005
6006   force.initialize = function(_) {
6007     nodes = _;
6008     initialize();
6009   };
6010
6011   force.links = function(_) {
6012     return arguments.length ? (links = _, initialize(), force) : links;
6013   };
6014
6015   force.id = function(_) {
6016     return arguments.length ? (id = _, force) : id;
6017   };
6018
6019   force.iterations = function(_) {
6020     return arguments.length ? (iterations = +_, force) : iterations;
6021   };
6022
6023   force.strength = function(_) {
6024     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6025   };
6026
6027   force.distance = function(_) {
6028     return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6029   };
6030
6031   return force;
6032 };
6033
6034 function x$1(d) {
6035   return d.x;
6036 }
6037
6038 function y$1(d) {
6039   return d.y;
6040 }
6041
6042 var initialRadius = 10;
6043 var initialAngle = Math.PI * (3 - Math.sqrt(5));
6044
6045 var simulation = function(nodes) {
6046   var simulation,
6047       alpha = 1,
6048       alphaMin = 0.001,
6049       alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6050       alphaTarget = 0,
6051       velocityDecay = 0.6,
6052       forces = map$1(),
6053       stepper = timer(step),
6054       event = dispatch("tick", "end");
6055
6056   if (nodes == null) nodes = [];
6057
6058   function step() {
6059     tick();
6060     event.call("tick", simulation);
6061     if (alpha < alphaMin) {
6062       stepper.stop();
6063       event.call("end", simulation);
6064     }
6065   }
6066
6067   function tick() {
6068     var i, n = nodes.length, node;
6069
6070     alpha += (alphaTarget - alpha) * alphaDecay;
6071
6072     forces.each(function(force) {
6073       force(alpha);
6074     });
6075
6076     for (i = 0; i < n; ++i) {
6077       node = nodes[i];
6078       if (node.fx == null) node.x += node.vx *= velocityDecay;
6079       else node.x = node.fx, node.vx = 0;
6080       if (node.fy == null) node.y += node.vy *= velocityDecay;
6081       else node.y = node.fy, node.vy = 0;
6082     }
6083   }
6084
6085   function initializeNodes() {
6086     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6087       node = nodes[i], node.index = i;
6088       if (isNaN(node.x) || isNaN(node.y)) {
6089         var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
6090         node.x = radius * Math.cos(angle);
6091         node.y = radius * Math.sin(angle);
6092       }
6093       if (isNaN(node.vx) || isNaN(node.vy)) {
6094         node.vx = node.vy = 0;
6095       }
6096     }
6097   }
6098
6099   function initializeForce(force) {
6100     if (force.initialize) force.initialize(nodes);
6101     return force;
6102   }
6103
6104   initializeNodes();
6105
6106   return simulation = {
6107     tick: tick,
6108
6109     restart: function() {
6110       return stepper.restart(step), simulation;
6111     },
6112
6113     stop: function() {
6114       return stepper.stop(), simulation;
6115     },
6116
6117     nodes: function(_) {
6118       return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6119     },
6120
6121     alpha: function(_) {
6122       return arguments.length ? (alpha = +_, simulation) : alpha;
6123     },
6124
6125     alphaMin: function(_) {
6126       return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6127     },
6128
6129     alphaDecay: function(_) {
6130       return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6131     },
6132
6133     alphaTarget: function(_) {
6134       return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6135     },
6136
6137     velocityDecay: function(_) {
6138       return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6139     },
6140
6141     force: function(name, _) {
6142       return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
6143     },
6144
6145     find: function(x, y, radius) {
6146       var i = 0,
6147           n = nodes.length,
6148           dx,
6149           dy,
6150           d2,
6151           node,
6152           closest;
6153
6154       if (radius == null) radius = Infinity;
6155       else radius *= radius;
6156
6157       for (i = 0; i < n; ++i) {
6158         node = nodes[i];
6159         dx = x - node.x;
6160         dy = y - node.y;
6161         d2 = dx * dx + dy * dy;
6162         if (d2 < radius) closest = node, radius = d2;
6163       }
6164
6165       return closest;
6166     },
6167
6168     on: function(name, _) {
6169       return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6170     }
6171   };
6172 };
6173
6174 var manyBody = function() {
6175   var nodes,
6176       node,
6177       alpha,
6178       strength = constant$6(-30),
6179       strengths,
6180       distanceMin2 = 1,
6181       distanceMax2 = Infinity,
6182       theta2 = 0.81;
6183
6184   function force(_) {
6185     var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
6186     for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
6187   }
6188
6189   function initialize() {
6190     if (!nodes) return;
6191     var i, n = nodes.length, node;
6192     strengths = new Array(n);
6193     for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
6194   }
6195
6196   function accumulate(quad) {
6197     var strength = 0, q, c, weight = 0, x, y, i;
6198
6199     // For internal nodes, accumulate forces from child quadrants.
6200     if (quad.length) {
6201       for (x = y = i = 0; i < 4; ++i) {
6202         if ((q = quad[i]) && (c = Math.abs(q.value))) {
6203           strength += q.value, weight += c, x += c * q.x, y += c * q.y;
6204         }
6205       }
6206       quad.x = x / weight;
6207       quad.y = y / weight;
6208     }
6209
6210     // For leaf nodes, accumulate forces from coincident quadrants.
6211     else {
6212       q = quad;
6213       q.x = q.data.x;
6214       q.y = q.data.y;
6215       do strength += strengths[q.data.index];
6216       while (q = q.next);
6217     }
6218
6219     quad.value = strength;
6220   }
6221
6222   function apply(quad, x1, _, x2) {
6223     if (!quad.value) return true;
6224
6225     var x = quad.x - node.x,
6226         y = quad.y - node.y,
6227         w = x2 - x1,
6228         l = x * x + y * y;
6229
6230     // Apply the Barnes-Hut approximation if possible.
6231     // Limit forces for very close nodes; randomize direction if coincident.
6232     if (w * w / theta2 < l) {
6233       if (l < distanceMax2) {
6234         if (x === 0) x = jiggle(), l += x * x;
6235         if (y === 0) y = jiggle(), l += y * y;
6236         if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6237         node.vx += x * quad.value * alpha / l;
6238         node.vy += y * quad.value * alpha / l;
6239       }
6240       return true;
6241     }
6242
6243     // Otherwise, process points directly.
6244     else if (quad.length || l >= distanceMax2) return;
6245
6246     // Limit forces for very close nodes; randomize direction if coincident.
6247     if (quad.data !== node || quad.next) {
6248       if (x === 0) x = jiggle(), l += x * x;
6249       if (y === 0) y = jiggle(), l += y * y;
6250       if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6251     }
6252
6253     do if (quad.data !== node) {
6254       w = strengths[quad.data.index] * alpha / l;
6255       node.vx += x * w;
6256       node.vy += y * w;
6257     } while (quad = quad.next);
6258   }
6259
6260   force.initialize = function(_) {
6261     nodes = _;
6262     initialize();
6263   };
6264
6265   force.strength = function(_) {
6266     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6267   };
6268
6269   force.distanceMin = function(_) {
6270     return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6271   };
6272
6273   force.distanceMax = function(_) {
6274     return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6275   };
6276
6277   force.theta = function(_) {
6278     return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6279   };
6280
6281   return force;
6282 };
6283
6284 var radial = function(radius, x, y) {
6285   var nodes,
6286       strength = constant$6(0.1),
6287       strengths,
6288       radiuses;
6289
6290   if (typeof radius !== "function") radius = constant$6(+radius);
6291   if (x == null) x = 0;
6292   if (y == null) y = 0;
6293
6294   function force(alpha) {
6295     for (var i = 0, n = nodes.length; i < n; ++i) {
6296       var node = nodes[i],
6297           dx = node.x - x || 1e-6,
6298           dy = node.y - y || 1e-6,
6299           r = Math.sqrt(dx * dx + dy * dy),
6300           k = (radiuses[i] - r) * strengths[i] * alpha / r;
6301       node.vx += dx * k;
6302       node.vy += dy * k;
6303     }
6304   }
6305
6306   function initialize() {
6307     if (!nodes) return;
6308     var i, n = nodes.length;
6309     strengths = new Array(n);
6310     radiuses = new Array(n);
6311     for (i = 0; i < n; ++i) {
6312       radiuses[i] = +radius(nodes[i], i, nodes);
6313       strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
6314     }
6315   }
6316
6317   force.initialize = function(_) {
6318     nodes = _, initialize();
6319   };
6320
6321   force.strength = function(_) {
6322     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6323   };
6324
6325   force.radius = function(_) {
6326     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6327   };
6328
6329   force.x = function(_) {
6330     return arguments.length ? (x = +_, force) : x;
6331   };
6332
6333   force.y = function(_) {
6334     return arguments.length ? (y = +_, force) : y;
6335   };
6336
6337   return force;
6338 };
6339
6340 var x$2 = function(x) {
6341   var strength = constant$6(0.1),
6342       nodes,
6343       strengths,
6344       xz;
6345
6346   if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6347
6348   function force(alpha) {
6349     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6350       node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
6351     }
6352   }
6353
6354   function initialize() {
6355     if (!nodes) return;
6356     var i, n = nodes.length;
6357     strengths = new Array(n);
6358     xz = new Array(n);
6359     for (i = 0; i < n; ++i) {
6360       strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6361     }
6362   }
6363
6364   force.initialize = function(_) {
6365     nodes = _;
6366     initialize();
6367   };
6368
6369   force.strength = function(_) {
6370     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6371   };
6372
6373   force.x = function(_) {
6374     return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6375   };
6376
6377   return force;
6378 };
6379
6380 var y$2 = function(y) {
6381   var strength = constant$6(0.1),
6382       nodes,
6383       strengths,
6384       yz;
6385
6386   if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6387
6388   function force(alpha) {
6389     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6390       node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
6391     }
6392   }
6393
6394   function initialize() {
6395     if (!nodes) return;
6396     var i, n = nodes.length;
6397     strengths = new Array(n);
6398     yz = new Array(n);
6399     for (i = 0; i < n; ++i) {
6400       strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6401     }
6402   }
6403
6404   force.initialize = function(_) {
6405     nodes = _;
6406     initialize();
6407   };
6408
6409   force.strength = function(_) {
6410     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6411   };
6412
6413   force.y = function(_) {
6414     return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6415   };
6416
6417   return force;
6418 };
6419
6420 // Computes the decimal coefficient and exponent of the specified number x with
6421 // significant digits p, where x is positive and p is in [1, 21] or undefined.
6422 // For example, formatDecimal(1.23) returns ["123", 0].
6423 var formatDecimal = function(x, p) {
6424   if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
6425   var i, coefficient = x.slice(0, i);
6426
6427   // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
6428   // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
6429   return [
6430     coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6431     +x.slice(i + 1)
6432   ];
6433 };
6434
6435 var exponent$1 = function(x) {
6436   return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6437 };
6438
6439 var formatGroup = function(grouping, thousands) {
6440   return function(value, width) {
6441     var i = value.length,
6442         t = [],
6443         j = 0,
6444         g = grouping[0],
6445         length = 0;
6446
6447     while (i > 0 && g > 0) {
6448       if (length + g + 1 > width) g = Math.max(1, width - length);
6449       t.push(value.substring(i -= g, i + g));
6450       if ((length += g + 1) > width) break;
6451       g = grouping[j = (j + 1) % grouping.length];
6452     }
6453
6454     return t.reverse().join(thousands);
6455   };
6456 };
6457
6458 var formatNumerals = function(numerals) {
6459   return function(value) {
6460     return value.replace(/[0-9]/g, function(i) {
6461       return numerals[+i];
6462     });
6463   };
6464 };
6465
6466 var formatDefault = function(x, p) {
6467   x = x.toPrecision(p);
6468
6469   out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6470     switch (x[i]) {
6471       case ".": i0 = i1 = i; break;
6472       case "0": if (i0 === 0) i0 = i; i1 = i; break;
6473       case "e": break out;
6474       default: if (i0 > 0) i0 = 0; break;
6475     }
6476   }
6477
6478   return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6479 };
6480
6481 var prefixExponent;
6482
6483 var formatPrefixAuto = function(x, p) {
6484   var d = formatDecimal(x, p);
6485   if (!d) return x + "";
6486   var coefficient = d[0],
6487       exponent = d[1],
6488       i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
6489       n = coefficient.length;
6490   return i === n ? coefficient
6491       : i > n ? coefficient + new Array(i - n + 1).join("0")
6492       : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
6493       : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
6494 };
6495
6496 var formatRounded = function(x, p) {
6497   var d = formatDecimal(x, p);
6498   if (!d) return x + "";
6499   var coefficient = d[0],
6500       exponent = d[1];
6501   return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
6502       : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
6503       : coefficient + new Array(exponent - coefficient.length + 2).join("0");
6504 };
6505
6506 var formatTypes = {
6507   "": formatDefault,
6508   "%": function(x, p) { return (x * 100).toFixed(p); },
6509   "b": function(x) { return Math.round(x).toString(2); },
6510   "c": function(x) { return x + ""; },
6511   "d": function(x) { return Math.round(x).toString(10); },
6512   "e": function(x, p) { return x.toExponential(p); },
6513   "f": function(x, p) { return x.toFixed(p); },
6514   "g": function(x, p) { return x.toPrecision(p); },
6515   "o": function(x) { return Math.round(x).toString(8); },
6516   "p": function(x, p) { return formatRounded(x * 100, p); },
6517   "r": formatRounded,
6518   "s": formatPrefixAuto,
6519   "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6520   "x": function(x) { return Math.round(x).toString(16); }
6521 };
6522
6523 // [[fill]align][sign][symbol][0][width][,][.precision][type]
6524 var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6525
6526 function formatSpecifier(specifier) {
6527   return new FormatSpecifier(specifier);
6528 }
6529
6530 formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6531
6532 function FormatSpecifier(specifier) {
6533   if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6534
6535   var match,
6536       fill = match[1] || " ",
6537       align = match[2] || ">",
6538       sign = match[3] || "-",
6539       symbol = match[4] || "",
6540       zero = !!match[5],
6541       width = match[6] && +match[6],
6542       comma = !!match[7],
6543       precision = match[8] && +match[8].slice(1),
6544       type = match[9] || "";
6545
6546   // The "n" type is an alias for ",g".
6547   if (type === "n") comma = true, type = "g";
6548
6549   // Map invalid types to the default format.
6550   else if (!formatTypes[type]) type = "";
6551
6552   // If zero fill is specified, padding goes after sign and before digits.
6553   if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6554
6555   this.fill = fill;
6556   this.align = align;
6557   this.sign = sign;
6558   this.symbol = symbol;
6559   this.zero = zero;
6560   this.width = width;
6561   this.comma = comma;
6562   this.precision = precision;
6563   this.type = type;
6564 }
6565
6566 FormatSpecifier.prototype.toString = function() {
6567   return this.fill
6568       + this.align
6569       + this.sign
6570       + this.symbol
6571       + (this.zero ? "0" : "")
6572       + (this.width == null ? "" : Math.max(1, this.width | 0))
6573       + (this.comma ? "," : "")
6574       + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
6575       + this.type;
6576 };
6577
6578 var identity$3 = function(x) {
6579   return x;
6580 };
6581
6582 var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6583
6584 var formatLocale = function(locale) {
6585   var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
6586       currency = locale.currency,
6587       decimal = locale.decimal,
6588       numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
6589       percent = locale.percent || "%";
6590
6591   function newFormat(specifier) {
6592     specifier = formatSpecifier(specifier);
6593
6594     var fill = specifier.fill,
6595         align = specifier.align,
6596         sign = specifier.sign,
6597         symbol = specifier.symbol,
6598         zero = specifier.zero,
6599         width = specifier.width,
6600         comma = specifier.comma,
6601         precision = specifier.precision,
6602         type = specifier.type;
6603
6604     // Compute the prefix and suffix.
6605     // For SI-prefix, the suffix is lazily computed.
6606     var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
6607         suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
6608
6609     // What format function should we use?
6610     // Is this an integer type?
6611     // Can this type generate exponential notation?
6612     var formatType = formatTypes[type],
6613         maybeSuffix = !type || /[defgprs%]/.test(type);
6614
6615     // Set the default precision if not specified,
6616     // or clamp the specified precision to the supported range.
6617     // For significant precision, it must be in [1, 21].
6618     // For fixed precision, it must be in [0, 20].
6619     precision = precision == null ? (type ? 6 : 12)
6620         : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
6621         : Math.max(0, Math.min(20, precision));
6622
6623     function format(value) {
6624       var valuePrefix = prefix,
6625           valueSuffix = suffix,
6626           i, n, c;
6627
6628       if (type === "c") {
6629         valueSuffix = formatType(value) + valueSuffix;
6630         value = "";
6631       } else {
6632         value = +value;
6633
6634         // Perform the initial formatting.
6635         var valueNegative = value < 0;
6636         value = formatType(Math.abs(value), precision);
6637
6638         // If a negative value rounds to zero during formatting, treat as positive.
6639         if (valueNegative && +value === 0) valueNegative = false;
6640
6641         // Compute the prefix and suffix.
6642         valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
6643         valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : "");
6644
6645         // Break the formatted value into the integer “value” part that can be
6646         // grouped, and fractional or exponential “suffix” part that is not.
6647         if (maybeSuffix) {
6648           i = -1, n = value.length;
6649           while (++i < n) {
6650             if (c = value.charCodeAt(i), 48 > c || c > 57) {
6651               valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
6652               value = value.slice(0, i);
6653               break;
6654             }
6655           }
6656         }
6657       }
6658
6659       // If the fill character is not "0", grouping is applied before padding.
6660       if (comma && !zero) value = group(value, Infinity);
6661
6662       // Compute the padding.
6663       var length = valuePrefix.length + value.length + valueSuffix.length,
6664           padding = length < width ? new Array(width - length + 1).join(fill) : "";
6665
6666       // If the fill character is "0", grouping is applied after padding.
6667       if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
6668
6669       // Reconstruct the final output based on the desired alignment.
6670       switch (align) {
6671         case "<": value = valuePrefix + value + valueSuffix + padding; break;
6672         case "=": value = valuePrefix + padding + value + valueSuffix; break;
6673         case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
6674         default: value = padding + valuePrefix + value + valueSuffix; break;
6675       }
6676
6677       return numerals(value);
6678     }
6679
6680     format.toString = function() {
6681       return specifier + "";
6682     };
6683
6684     return format;
6685   }
6686
6687   function formatPrefix(specifier, value) {
6688     var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
6689         e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
6690         k = Math.pow(10, -e),
6691         prefix = prefixes[8 + e / 3];
6692     return function(value) {
6693       return f(k * value) + prefix;
6694     };
6695   }
6696
6697   return {
6698     format: newFormat,
6699     formatPrefix: formatPrefix
6700   };
6701 };
6702
6703 var locale$1;
6704 var format;
6705 var formatPrefix;
6706
6707 defaultLocale({
6708   decimal: ".",
6709   thousands: ",",
6710   grouping: [3],
6711   currency: ["$", ""]
6712 });
6713
6714 function defaultLocale(definition) {
6715   locale$1 = formatLocale(definition);
6716   format = locale$1.format;
6717   formatPrefix = locale$1.formatPrefix;
6718   return locale$1;
6719 }
6720
6721 var precisionFixed = function(step) {
6722   return Math.max(0, -exponent$1(Math.abs(step)));
6723 };
6724
6725 var precisionPrefix = function(step, value) {
6726   return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
6727 };
6728
6729 var precisionRound = function(step, max) {
6730   step = Math.abs(step), max = Math.abs(max) - step;
6731   return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
6732 };
6733
6734 // Adds floating point numbers with twice the normal precision.
6735 // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
6736 // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
6737 // 305–363 (1997).
6738 // Code adapted from GeographicLib by Charles F. F. Karney,
6739 // http://geographiclib.sourceforge.net/
6740
6741 var adder = function() {
6742   return new Adder;
6743 };
6744
6745 function Adder() {
6746   this.reset();
6747 }
6748
6749 Adder.prototype = {
6750   constructor: Adder,
6751   reset: function() {
6752     this.s = // rounded value
6753     this.t = 0; // exact error
6754   },
6755   add: function(y) {
6756     add$1(temp, y, this.t);
6757     add$1(this, temp.s, this.s);
6758     if (this.s) this.t += temp.t;
6759     else this.s = temp.t;
6760   },
6761   valueOf: function() {
6762     return this.s;
6763   }
6764 };
6765
6766 var temp = new Adder;
6767
6768 function add$1(adder, a, b) {
6769   var x = adder.s = a + b,
6770       bv = x - a,
6771       av = x - bv;
6772   adder.t = (a - av) + (b - bv);
6773 }
6774
6775 var epsilon$2 = 1e-6;
6776 var epsilon2$1 = 1e-12;
6777 var pi$3 = Math.PI;
6778 var halfPi$2 = pi$3 / 2;
6779 var quarterPi = pi$3 / 4;
6780 var tau$3 = pi$3 * 2;
6781
6782 var degrees$1 = 180 / pi$3;
6783 var radians = pi$3 / 180;
6784
6785 var abs = Math.abs;
6786 var atan = Math.atan;
6787 var atan2 = Math.atan2;
6788 var cos$1 = Math.cos;
6789 var ceil = Math.ceil;
6790 var exp = Math.exp;
6791
6792 var log = Math.log;
6793 var pow = Math.pow;
6794 var sin$1 = Math.sin;
6795 var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
6796 var sqrt = Math.sqrt;
6797 var tan = Math.tan;
6798
6799 function acos(x) {
6800   return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6801 }
6802
6803 function asin(x) {
6804   return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6805 }
6806
6807 function haversin(x) {
6808   return (x = sin$1(x / 2)) * x;
6809 }
6810
6811 function noop$1() {}
6812
6813 function streamGeometry(geometry, stream) {
6814   if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6815     streamGeometryType[geometry.type](geometry, stream);
6816   }
6817 }
6818
6819 var streamObjectType = {
6820   Feature: function(object, stream) {
6821     streamGeometry(object.geometry, stream);
6822   },
6823   FeatureCollection: function(object, stream) {
6824     var features = object.features, i = -1, n = features.length;
6825     while (++i < n) streamGeometry(features[i].geometry, stream);
6826   }
6827 };
6828
6829 var streamGeometryType = {
6830   Sphere: function(object, stream) {
6831     stream.sphere();
6832   },
6833   Point: function(object, stream) {
6834     object = object.coordinates;
6835     stream.point(object[0], object[1], object[2]);
6836   },
6837   MultiPoint: function(object, stream) {
6838     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6839     while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
6840   },
6841   LineString: function(object, stream) {
6842     streamLine(object.coordinates, stream, 0);
6843   },
6844   MultiLineString: function(object, stream) {
6845     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6846     while (++i < n) streamLine(coordinates[i], stream, 0);
6847   },
6848   Polygon: function(object, stream) {
6849     streamPolygon(object.coordinates, stream);
6850   },
6851   MultiPolygon: function(object, stream) {
6852     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6853     while (++i < n) streamPolygon(coordinates[i], stream);
6854   },
6855   GeometryCollection: function(object, stream) {
6856     var geometries = object.geometries, i = -1, n = geometries.length;
6857     while (++i < n) streamGeometry(geometries[i], stream);
6858   }
6859 };
6860
6861 function streamLine(coordinates, stream, closed) {
6862   var i = -1, n = coordinates.length - closed, coordinate;
6863   stream.lineStart();
6864   while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6865   stream.lineEnd();
6866 }
6867
6868 function streamPolygon(coordinates, stream) {
6869   var i = -1, n = coordinates.length;
6870   stream.polygonStart();
6871   while (++i < n) streamLine(coordinates[i], stream, 1);
6872   stream.polygonEnd();
6873 }
6874
6875 var d3_geoStream = function(object, stream) {
6876   if (object && streamObjectType.hasOwnProperty(object.type)) {
6877     streamObjectType[object.type](object, stream);
6878   } else {
6879     streamGeometry(object, stream);
6880   }
6881 };
6882
6883 var areaRingSum = adder();
6884
6885 var areaSum = adder();
6886 var lambda00;
6887 var phi00;
6888 var lambda0;
6889 var cosPhi0;
6890 var sinPhi0;
6891
6892 var areaStream = {
6893   point: noop$1,
6894   lineStart: noop$1,
6895   lineEnd: noop$1,
6896   polygonStart: function() {
6897     areaRingSum.reset();
6898     areaStream.lineStart = areaRingStart;
6899     areaStream.lineEnd = areaRingEnd;
6900   },
6901   polygonEnd: function() {
6902     var areaRing = +areaRingSum;
6903     areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
6904     this.lineStart = this.lineEnd = this.point = noop$1;
6905   },
6906   sphere: function() {
6907     areaSum.add(tau$3);
6908   }
6909 };
6910
6911 function areaRingStart() {
6912   areaStream.point = areaPointFirst;
6913 }
6914
6915 function areaRingEnd() {
6916   areaPoint(lambda00, phi00);
6917 }
6918
6919 function areaPointFirst(lambda, phi) {
6920   areaStream.point = areaPoint;
6921   lambda00 = lambda, phi00 = phi;
6922   lambda *= radians, phi *= radians;
6923   lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
6924 }
6925
6926 function areaPoint(lambda, phi) {
6927   lambda *= radians, phi *= radians;
6928   phi = phi / 2 + quarterPi; // half the angular distance from south pole
6929
6930   // Spherical excess E for a spherical triangle with vertices: south pole,
6931   // previous point, current point.  Uses a formula derived from Cagnoli’s
6932   // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
6933   var dLambda = lambda - lambda0,
6934       sdLambda = dLambda >= 0 ? 1 : -1,
6935       adLambda = sdLambda * dLambda,
6936       cosPhi = cos$1(phi),
6937       sinPhi = sin$1(phi),
6938       k = sinPhi0 * sinPhi,
6939       u = cosPhi0 * cosPhi + k * cos$1(adLambda),
6940       v = k * sdLambda * sin$1(adLambda);
6941   areaRingSum.add(atan2(v, u));
6942
6943   // Advance the previous points.
6944   lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6945 }
6946
6947 var d3_geoArea = function(object) {
6948   areaSum.reset();
6949   d3_geoStream(object, areaStream);
6950   return areaSum * 2;
6951 };
6952
6953 function spherical(cartesian) {
6954   return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6955 }
6956
6957 function cartesian(spherical) {
6958   var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
6959   return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
6960 }
6961
6962 function cartesianDot(a, b) {
6963   return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6964 }
6965
6966 function cartesianCross(a, b) {
6967   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]];
6968 }
6969
6970 // TODO return a
6971 function cartesianAddInPlace(a, b) {
6972   a[0] += b[0], a[1] += b[1], a[2] += b[2];
6973 }
6974
6975 function cartesianScale(vector, k) {
6976   return [vector[0] * k, vector[1] * k, vector[2] * k];
6977 }
6978
6979 // TODO return d
6980 function cartesianNormalizeInPlace(d) {
6981   var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
6982   d[0] /= l, d[1] /= l, d[2] /= l;
6983 }
6984
6985 var lambda0$1;
6986 var phi0;
6987 var lambda1;
6988 var phi1;
6989 var lambda2;
6990 var lambda00$1;
6991 var phi00$1;
6992 var p0;
6993 var deltaSum = adder();
6994 var ranges;
6995 var range;
6996
6997 var boundsStream = {
6998   point: boundsPoint,
6999   lineStart: boundsLineStart,
7000   lineEnd: boundsLineEnd,
7001   polygonStart: function() {
7002     boundsStream.point = boundsRingPoint;
7003     boundsStream.lineStart = boundsRingStart;
7004     boundsStream.lineEnd = boundsRingEnd;
7005     deltaSum.reset();
7006     areaStream.polygonStart();
7007   },
7008   polygonEnd: function() {
7009     areaStream.polygonEnd();
7010     boundsStream.point = boundsPoint;
7011     boundsStream.lineStart = boundsLineStart;
7012     boundsStream.lineEnd = boundsLineEnd;
7013     if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
7014     else if (deltaSum > epsilon$2) phi1 = 90;
7015     else if (deltaSum < -epsilon$2) phi0 = -90;
7016     range[0] = lambda0$1, range[1] = lambda1;
7017   }
7018 };
7019
7020 function boundsPoint(lambda, phi) {
7021   ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7022   if (phi < phi0) phi0 = phi;
7023   if (phi > phi1) phi1 = phi;
7024 }
7025
7026 function linePoint(lambda, phi) {
7027   var p = cartesian([lambda * radians, phi * radians]);
7028   if (p0) {
7029     var normal = cartesianCross(p0, p),
7030         equatorial = [normal[1], -normal[0], 0],
7031         inflection = cartesianCross(equatorial, normal);
7032     cartesianNormalizeInPlace(inflection);
7033     inflection = spherical(inflection);
7034     var delta = lambda - lambda2,
7035         sign$$1 = delta > 0 ? 1 : -1,
7036         lambdai = inflection[0] * degrees$1 * sign$$1,
7037         phii,
7038         antimeridian = abs(delta) > 180;
7039     if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7040       phii = inflection[1] * degrees$1;
7041       if (phii > phi1) phi1 = phii;
7042     } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7043       phii = -inflection[1] * degrees$1;
7044       if (phii < phi0) phi0 = phii;
7045     } else {
7046       if (phi < phi0) phi0 = phi;
7047       if (phi > phi1) phi1 = phi;
7048     }
7049     if (antimeridian) {
7050       if (lambda < lambda2) {
7051         if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7052       } else {
7053         if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7054       }
7055     } else {
7056       if (lambda1 >= lambda0$1) {
7057         if (lambda < lambda0$1) lambda0$1 = lambda;
7058         if (lambda > lambda1) lambda1 = lambda;
7059       } else {
7060         if (lambda > lambda2) {
7061           if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7062         } else {
7063           if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7064         }
7065       }
7066     }
7067   } else {
7068     ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7069   }
7070   if (phi < phi0) phi0 = phi;
7071   if (phi > phi1) phi1 = phi;
7072   p0 = p, lambda2 = lambda;
7073 }
7074
7075 function boundsLineStart() {
7076   boundsStream.point = linePoint;
7077 }
7078
7079 function boundsLineEnd() {
7080   range[0] = lambda0$1, range[1] = lambda1;
7081   boundsStream.point = boundsPoint;
7082   p0 = null;
7083 }
7084
7085 function boundsRingPoint(lambda, phi) {
7086   if (p0) {
7087     var delta = lambda - lambda2;
7088     deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7089   } else {
7090     lambda00$1 = lambda, phi00$1 = phi;
7091   }
7092   areaStream.point(lambda, phi);
7093   linePoint(lambda, phi);
7094 }
7095
7096 function boundsRingStart() {
7097   areaStream.lineStart();
7098 }
7099
7100 function boundsRingEnd() {
7101   boundsRingPoint(lambda00$1, phi00$1);
7102   areaStream.lineEnd();
7103   if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
7104   range[0] = lambda0$1, range[1] = lambda1;
7105   p0 = null;
7106 }
7107
7108 // Finds the left-right distance between two longitudes.
7109 // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
7110 // the distance between ±180° to be 360°.
7111 function angle(lambda0, lambda1) {
7112   return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
7113 }
7114
7115 function rangeCompare(a, b) {
7116   return a[0] - b[0];
7117 }
7118
7119 function rangeContains(range, x) {
7120   return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7121 }
7122
7123 var d3_geoBounds = function(feature) {
7124   var i, n, a, b, merged, deltaMax, delta;
7125
7126   phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7127   ranges = [];
7128   d3_geoStream(feature, boundsStream);
7129
7130   // First, sort ranges by their minimum longitudes.
7131   if (n = ranges.length) {
7132     ranges.sort(rangeCompare);
7133
7134     // Then, merge any ranges that overlap.
7135     for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7136       b = ranges[i];
7137       if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
7138         if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
7139         if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
7140       } else {
7141         merged.push(a = b);
7142       }
7143     }
7144
7145     // Finally, find the largest gap between the merged ranges.
7146     // The final bounding box will be the inverse of this gap.
7147     for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
7148       b = merged[i];
7149       if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7150     }
7151   }
7152
7153   ranges = range = null;
7154
7155   return lambda0$1 === Infinity || phi0 === Infinity
7156       ? [[NaN, NaN], [NaN, NaN]]
7157       : [[lambda0$1, phi0], [lambda1, phi1]];
7158 };
7159
7160 var W0;
7161 var W1;
7162 var X0;
7163 var Y0;
7164 var Z0;
7165 var X1;
7166 var Y1;
7167 var Z1;
7168 var X2;
7169 var Y2;
7170 var Z2;
7171 var lambda00$2;
7172 var phi00$2;
7173 var x0;
7174 var y0;
7175 var z0; // previous point
7176
7177 var centroidStream = {
7178   sphere: noop$1,
7179   point: centroidPoint,
7180   lineStart: centroidLineStart,
7181   lineEnd: centroidLineEnd,
7182   polygonStart: function() {
7183     centroidStream.lineStart = centroidRingStart;
7184     centroidStream.lineEnd = centroidRingEnd;
7185   },
7186   polygonEnd: function() {
7187     centroidStream.lineStart = centroidLineStart;
7188     centroidStream.lineEnd = centroidLineEnd;
7189   }
7190 };
7191
7192 // Arithmetic mean of Cartesian vectors.
7193 function centroidPoint(lambda, phi) {
7194   lambda *= radians, phi *= radians;
7195   var cosPhi = cos$1(phi);
7196   centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
7197 }
7198
7199 function centroidPointCartesian(x, y, z) {
7200   ++W0;
7201   X0 += (x - X0) / W0;
7202   Y0 += (y - Y0) / W0;
7203   Z0 += (z - Z0) / W0;
7204 }
7205
7206 function centroidLineStart() {
7207   centroidStream.point = centroidLinePointFirst;
7208 }
7209
7210 function centroidLinePointFirst(lambda, phi) {
7211   lambda *= radians, phi *= radians;
7212   var cosPhi = cos$1(phi);
7213   x0 = cosPhi * cos$1(lambda);
7214   y0 = cosPhi * sin$1(lambda);
7215   z0 = sin$1(phi);
7216   centroidStream.point = centroidLinePoint;
7217   centroidPointCartesian(x0, y0, z0);
7218 }
7219
7220 function centroidLinePoint(lambda, phi) {
7221   lambda *= radians, phi *= radians;
7222   var cosPhi = cos$1(phi),
7223       x = cosPhi * cos$1(lambda),
7224       y = cosPhi * sin$1(lambda),
7225       z = sin$1(phi),
7226       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);
7227   W1 += w;
7228   X1 += w * (x0 + (x0 = x));
7229   Y1 += w * (y0 + (y0 = y));
7230   Z1 += w * (z0 + (z0 = z));
7231   centroidPointCartesian(x0, y0, z0);
7232 }
7233
7234 function centroidLineEnd() {
7235   centroidStream.point = centroidPoint;
7236 }
7237
7238 // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
7239 // J. Applied Mechanics 42, 239 (1975).
7240 function centroidRingStart() {
7241   centroidStream.point = centroidRingPointFirst;
7242 }
7243
7244 function centroidRingEnd() {
7245   centroidRingPoint(lambda00$2, phi00$2);
7246   centroidStream.point = centroidPoint;
7247 }
7248
7249 function centroidRingPointFirst(lambda, phi) {
7250   lambda00$2 = lambda, phi00$2 = phi;
7251   lambda *= radians, phi *= radians;
7252   centroidStream.point = centroidRingPoint;
7253   var cosPhi = cos$1(phi);
7254   x0 = cosPhi * cos$1(lambda);
7255   y0 = cosPhi * sin$1(lambda);
7256   z0 = sin$1(phi);
7257   centroidPointCartesian(x0, y0, z0);
7258 }
7259
7260 function centroidRingPoint(lambda, phi) {
7261   lambda *= radians, phi *= radians;
7262   var cosPhi = cos$1(phi),
7263       x = cosPhi * cos$1(lambda),
7264       y = cosPhi * sin$1(lambda),
7265       z = sin$1(phi),
7266       cx = y0 * z - z0 * y,
7267       cy = z0 * x - x0 * z,
7268       cz = x0 * y - y0 * x,
7269       m = sqrt(cx * cx + cy * cy + cz * cz),
7270       w = asin(m), // line weight = angle
7271       v = m && -w / m; // area weight multiplier
7272   X2 += v * cx;
7273   Y2 += v * cy;
7274   Z2 += v * cz;
7275   W1 += w;
7276   X1 += w * (x0 + (x0 = x));
7277   Y1 += w * (y0 + (y0 = y));
7278   Z1 += w * (z0 + (z0 = z));
7279   centroidPointCartesian(x0, y0, z0);
7280 }
7281
7282 var d3_geoCentroid = function(object) {
7283   W0 = W1 =
7284   X0 = Y0 = Z0 =
7285   X1 = Y1 = Z1 =
7286   X2 = Y2 = Z2 = 0;
7287   d3_geoStream(object, centroidStream);
7288
7289   var x = X2,
7290       y = Y2,
7291       z = Z2,
7292       m = x * x + y * y + z * z;
7293
7294   // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
7295   if (m < epsilon2$1) {
7296     x = X1, y = Y1, z = Z1;
7297     // If the feature has zero length, fall back to arithmetic mean of point vectors.
7298     if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
7299     m = x * x + y * y + z * z;
7300     // If the feature still has an undefined ccentroid, then return.
7301     if (m < epsilon2$1) return [NaN, NaN];
7302   }
7303
7304   return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7305 };
7306
7307 var constant$7 = function(x) {
7308   return function() {
7309     return x;
7310   };
7311 };
7312
7313 var compose = function(a, b) {
7314
7315   function compose(x, y) {
7316     return x = a(x, y), b(x[0], x[1]);
7317   }
7318
7319   if (a.invert && b.invert) compose.invert = function(x, y) {
7320     return x = b.invert(x, y), x && a.invert(x[0], x[1]);
7321   };
7322
7323   return compose;
7324 };
7325
7326 function rotationIdentity(lambda, phi) {
7327   return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7328 }
7329
7330 rotationIdentity.invert = rotationIdentity;
7331
7332 function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
7333   return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
7334     : rotationLambda(deltaLambda))
7335     : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
7336     : rotationIdentity);
7337 }
7338
7339 function forwardRotationLambda(deltaLambda) {
7340   return function(lambda, phi) {
7341     return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7342   };
7343 }
7344
7345 function rotationLambda(deltaLambda) {
7346   var rotation = forwardRotationLambda(deltaLambda);
7347   rotation.invert = forwardRotationLambda(-deltaLambda);
7348   return rotation;
7349 }
7350
7351 function rotationPhiGamma(deltaPhi, deltaGamma) {
7352   var cosDeltaPhi = cos$1(deltaPhi),
7353       sinDeltaPhi = sin$1(deltaPhi),
7354       cosDeltaGamma = cos$1(deltaGamma),
7355       sinDeltaGamma = sin$1(deltaGamma);
7356
7357   function rotation(lambda, phi) {
7358     var cosPhi = cos$1(phi),
7359         x = cos$1(lambda) * cosPhi,
7360         y = sin$1(lambda) * cosPhi,
7361         z = sin$1(phi),
7362         k = z * cosDeltaPhi + x * sinDeltaPhi;
7363     return [
7364       atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7365       asin(k * cosDeltaGamma + y * sinDeltaGamma)
7366     ];
7367   }
7368
7369   rotation.invert = function(lambda, phi) {
7370     var cosPhi = cos$1(phi),
7371         x = cos$1(lambda) * cosPhi,
7372         y = sin$1(lambda) * cosPhi,
7373         z = sin$1(phi),
7374         k = z * cosDeltaGamma - y * sinDeltaGamma;
7375     return [
7376       atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7377       asin(k * cosDeltaPhi - x * sinDeltaPhi)
7378     ];
7379   };
7380
7381   return rotation;
7382 }
7383
7384 var rotation = function(rotate) {
7385   rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7386
7387   function forward(coordinates) {
7388     coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7389     return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7390   }
7391
7392   forward.invert = function(coordinates) {
7393     coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
7394     return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7395   };
7396
7397   return forward;
7398 };
7399
7400 // Generates a circle centered at [0°, 0°], with a given radius and precision.
7401 function circleStream(stream, radius, delta, direction, t0, t1) {
7402   if (!delta) return;
7403   var cosRadius = cos$1(radius),
7404       sinRadius = sin$1(radius),
7405       step = direction * delta;
7406   if (t0 == null) {
7407     t0 = radius + direction * tau$3;
7408     t1 = radius - step / 2;
7409   } else {
7410     t0 = circleRadius(cosRadius, t0);
7411     t1 = circleRadius(cosRadius, t1);
7412     if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7413   }
7414   for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
7415     point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
7416     stream.point(point[0], point[1]);
7417   }
7418 }
7419
7420 // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
7421 function circleRadius(cosRadius, point) {
7422   point = cartesian(point), point[0] -= cosRadius;
7423   cartesianNormalizeInPlace(point);
7424   var radius = acos(-point[1]);
7425   return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
7426 }
7427
7428 var circle = function() {
7429   var center = constant$7([0, 0]),
7430       radius = constant$7(90),
7431       precision = constant$7(6),
7432       ring,
7433       rotate,
7434       stream = {point: point};
7435
7436   function point(x, y) {
7437     ring.push(x = rotate(x, y));
7438     x[0] *= degrees$1, x[1] *= degrees$1;
7439   }
7440
7441   function circle() {
7442     var c = center.apply(this, arguments),
7443         r = radius.apply(this, arguments) * radians,
7444         p = precision.apply(this, arguments) * radians;
7445     ring = [];
7446     rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
7447     circleStream(stream, r, p, 1);
7448     c = {type: "Polygon", coordinates: [ring]};
7449     ring = rotate = null;
7450     return c;
7451   }
7452
7453   circle.center = function(_) {
7454     return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7455   };
7456
7457   circle.radius = function(_) {
7458     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7459   };
7460
7461   circle.precision = function(_) {
7462     return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7463   };
7464
7465   return circle;
7466 };
7467
7468 var clipBuffer = function() {
7469   var lines = [],
7470       line;
7471   return {
7472     point: function(x, y) {
7473       line.push([x, y]);
7474     },
7475     lineStart: function() {
7476       lines.push(line = []);
7477     },
7478     lineEnd: noop$1,
7479     rejoin: function() {
7480       if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7481     },
7482     result: function() {
7483       var result = lines;
7484       lines = [];
7485       line = null;
7486       return result;
7487     }
7488   };
7489 };
7490
7491 var pointEqual = function(a, b) {
7492   return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7493 };
7494
7495 function Intersection(point, points, other, entry) {
7496   this.x = point;
7497   this.z = points;
7498   this.o = other; // another intersection
7499   this.e = entry; // is an entry?
7500   this.v = false; // visited
7501   this.n = this.p = null; // next & previous
7502 }
7503
7504 // A generalized polygon clipping algorithm: given a polygon that has been cut
7505 // into its visible line segments, and rejoins the segments by interpolating
7506 // along the clip edge.
7507 var clipRejoin = function(segments, compareIntersection, startInside, interpolate, stream) {
7508   var subject = [],
7509       clip = [],
7510       i,
7511       n;
7512
7513   segments.forEach(function(segment) {
7514     if ((n = segment.length - 1) <= 0) return;
7515     var n, p0 = segment[0], p1 = segment[n], x;
7516
7517     // If the first and last points of a segment are coincident, then treat as a
7518     // closed ring. TODO if all rings are closed, then the winding order of the
7519     // exterior ring should be checked.
7520     if (pointEqual(p0, p1)) {
7521       stream.lineStart();
7522       for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7523       stream.lineEnd();
7524       return;
7525     }
7526
7527     subject.push(x = new Intersection(p0, segment, null, true));
7528     clip.push(x.o = new Intersection(p0, null, x, false));
7529     subject.push(x = new Intersection(p1, segment, null, false));
7530     clip.push(x.o = new Intersection(p1, null, x, true));
7531   });
7532
7533   if (!subject.length) return;
7534
7535   clip.sort(compareIntersection);
7536   link$1(subject);
7537   link$1(clip);
7538
7539   for (i = 0, n = clip.length; i < n; ++i) {
7540     clip[i].e = startInside = !startInside;
7541   }
7542
7543   var start = subject[0],
7544       points,
7545       point;
7546
7547   while (1) {
7548     // Find first unvisited intersection.
7549     var current = start,
7550         isSubject = true;
7551     while (current.v) if ((current = current.n) === start) return;
7552     points = current.z;
7553     stream.lineStart();
7554     do {
7555       current.v = current.o.v = true;
7556       if (current.e) {
7557         if (isSubject) {
7558           for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7559         } else {
7560           interpolate(current.x, current.n.x, 1, stream);
7561         }
7562         current = current.n;
7563       } else {
7564         if (isSubject) {
7565           points = current.p.z;
7566           for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7567         } else {
7568           interpolate(current.x, current.p.x, -1, stream);
7569         }
7570         current = current.p;
7571       }
7572       current = current.o;
7573       points = current.z;
7574       isSubject = !isSubject;
7575     } while (!current.v);
7576     stream.lineEnd();
7577   }
7578 };
7579
7580 function link$1(array) {
7581   if (!(n = array.length)) return;
7582   var n,
7583       i = 0,
7584       a = array[0],
7585       b;
7586   while (++i < n) {
7587     a.n = b = array[i];
7588     b.p = a;
7589     a = b;
7590   }
7591   a.n = b = array[0];
7592   b.p = a;
7593 }
7594
7595 var sum$1 = adder();
7596
7597 var polygonContains = function(polygon, point) {
7598   var lambda = point[0],
7599       phi = point[1],
7600       normal = [sin$1(lambda), -cos$1(lambda), 0],
7601       angle = 0,
7602       winding = 0;
7603
7604   sum$1.reset();
7605
7606   for (var i = 0, n = polygon.length; i < n; ++i) {
7607     if (!(m = (ring = polygon[i]).length)) continue;
7608     var ring,
7609         m,
7610         point0 = ring[m - 1],
7611         lambda0 = point0[0],
7612         phi0 = point0[1] / 2 + quarterPi,
7613         sinPhi0 = sin$1(phi0),
7614         cosPhi0 = cos$1(phi0);
7615
7616     for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
7617       var point1 = ring[j],
7618           lambda1 = point1[0],
7619           phi1 = point1[1] / 2 + quarterPi,
7620           sinPhi1 = sin$1(phi1),
7621           cosPhi1 = cos$1(phi1),
7622           delta = lambda1 - lambda0,
7623           sign$$1 = delta >= 0 ? 1 : -1,
7624           absDelta = sign$$1 * delta,
7625           antimeridian = absDelta > pi$3,
7626           k = sinPhi0 * sinPhi1;
7627
7628       sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7629       angle += antimeridian ? delta + sign$$1 * tau$3 : delta;
7630
7631       // Are the longitudes either side of the point’s meridian (lambda),
7632       // and are the latitudes smaller than the parallel (phi)?
7633       if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
7634         var arc = cartesianCross(cartesian(point0), cartesian(point1));
7635         cartesianNormalizeInPlace(arc);
7636         var intersection = cartesianCross(normal, arc);
7637         cartesianNormalizeInPlace(intersection);
7638         var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
7639         if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
7640           winding += antimeridian ^ delta >= 0 ? 1 : -1;
7641         }
7642       }
7643     }
7644   }
7645
7646   // First, determine whether the South pole is inside or outside:
7647   //
7648   // It is inside if:
7649   // * the polygon winds around it in a clockwise direction.
7650   // * the polygon does not (cumulatively) wind around it, but has a negative
7651   //   (counter-clockwise) area.
7652   //
7653   // Second, count the (signed) number of times a segment crosses a lambda
7654   // from the point to the South pole.  If it is zero, then the point is the
7655   // same side as the South pole.
7656
7657   return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7658 };
7659
7660 var clip = function(pointVisible, clipLine, interpolate, start) {
7661   return function(sink) {
7662     var line = clipLine(sink),
7663         ringBuffer = clipBuffer(),
7664         ringSink = clipLine(ringBuffer),
7665         polygonStarted = false,
7666         polygon,
7667         segments,
7668         ring;
7669
7670     var clip = {
7671       point: point,
7672       lineStart: lineStart,
7673       lineEnd: lineEnd,
7674       polygonStart: function() {
7675         clip.point = pointRing;
7676         clip.lineStart = ringStart;
7677         clip.lineEnd = ringEnd;
7678         segments = [];
7679         polygon = [];
7680       },
7681       polygonEnd: function() {
7682         clip.point = point;
7683         clip.lineStart = lineStart;
7684         clip.lineEnd = lineEnd;
7685         segments = merge(segments);
7686         var startInside = polygonContains(polygon, start);
7687         if (segments.length) {
7688           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7689           clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
7690         } else if (startInside) {
7691           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7692           sink.lineStart();
7693           interpolate(null, null, 1, sink);
7694           sink.lineEnd();
7695         }
7696         if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7697         segments = polygon = null;
7698       },
7699       sphere: function() {
7700         sink.polygonStart();
7701         sink.lineStart();
7702         interpolate(null, null, 1, sink);
7703         sink.lineEnd();
7704         sink.polygonEnd();
7705       }
7706     };
7707
7708     function point(lambda, phi) {
7709       if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7710     }
7711
7712     function pointLine(lambda, phi) {
7713       line.point(lambda, phi);
7714     }
7715
7716     function lineStart() {
7717       clip.point = pointLine;
7718       line.lineStart();
7719     }
7720
7721     function lineEnd() {
7722       clip.point = point;
7723       line.lineEnd();
7724     }
7725
7726     function pointRing(lambda, phi) {
7727       ring.push([lambda, phi]);
7728       ringSink.point(lambda, phi);
7729     }
7730
7731     function ringStart() {
7732       ringSink.lineStart();
7733       ring = [];
7734     }
7735
7736     function ringEnd() {
7737       pointRing(ring[0][0], ring[0][1]);
7738       ringSink.lineEnd();
7739
7740       var clean = ringSink.clean(),
7741           ringSegments = ringBuffer.result(),
7742           i, n = ringSegments.length, m,
7743           segment,
7744           point;
7745
7746       ring.pop();
7747       polygon.push(ring);
7748       ring = null;
7749
7750       if (!n) return;
7751
7752       // No intersections.
7753       if (clean & 1) {
7754         segment = ringSegments[0];
7755         if ((m = segment.length - 1) > 0) {
7756           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7757           sink.lineStart();
7758           for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7759           sink.lineEnd();
7760         }
7761         return;
7762       }
7763
7764       // Rejoin connected segments.
7765       // TODO reuse ringBuffer.rejoin()?
7766       if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7767
7768       segments.push(ringSegments.filter(validSegment));
7769     }
7770
7771     return clip;
7772   };
7773 };
7774
7775 function validSegment(segment) {
7776   return segment.length > 1;
7777 }
7778
7779 // Intersections are sorted along the clip edge. For both antimeridian cutting
7780 // and circle clipping, the same comparison is used.
7781 function compareIntersection(a, b) {
7782   return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
7783        - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
7784 }
7785
7786 var clipAntimeridian = clip(
7787   function() { return true; },
7788   clipAntimeridianLine,
7789   clipAntimeridianInterpolate,
7790   [-pi$3, -halfPi$2]
7791 );
7792
7793 // Takes a line and cuts into visible segments. Return values: 0 - there were
7794 // intersections or the line was empty; 1 - no intersections; 2 - there were
7795 // intersections, and the first and last segments should be rejoined.
7796 function clipAntimeridianLine(stream) {
7797   var lambda0 = NaN,
7798       phi0 = NaN,
7799       sign0 = NaN,
7800       clean; // no intersections
7801
7802   return {
7803     lineStart: function() {
7804       stream.lineStart();
7805       clean = 1;
7806     },
7807     point: function(lambda1, phi1) {
7808       var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
7809           delta = abs(lambda1 - lambda0);
7810       if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole
7811         stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
7812         stream.point(sign0, phi0);
7813         stream.lineEnd();
7814         stream.lineStart();
7815         stream.point(sign1, phi0);
7816         stream.point(lambda1, phi0);
7817         clean = 0;
7818       } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
7819         if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
7820         if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
7821         phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
7822         stream.point(sign0, phi0);
7823         stream.lineEnd();
7824         stream.lineStart();
7825         stream.point(sign1, phi0);
7826         clean = 0;
7827       }
7828       stream.point(lambda0 = lambda1, phi0 = phi1);
7829       sign0 = sign1;
7830     },
7831     lineEnd: function() {
7832       stream.lineEnd();
7833       lambda0 = phi0 = NaN;
7834     },
7835     clean: function() {
7836       return 2 - clean; // if intersections, rejoin first and last segments
7837     }
7838   };
7839 }
7840
7841 function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7842   var cosPhi0,
7843       cosPhi1,
7844       sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
7845   return abs(sinLambda0Lambda1) > epsilon$2
7846       ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
7847           - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
7848           / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
7849       : (phi0 + phi1) / 2;
7850 }
7851
7852 function clipAntimeridianInterpolate(from, to, direction, stream) {
7853   var phi;
7854   if (from == null) {
7855     phi = direction * halfPi$2;
7856     stream.point(-pi$3, phi);
7857     stream.point(0, phi);
7858     stream.point(pi$3, phi);
7859     stream.point(pi$3, 0);
7860     stream.point(pi$3, -phi);
7861     stream.point(0, -phi);
7862     stream.point(-pi$3, -phi);
7863     stream.point(-pi$3, 0);
7864     stream.point(-pi$3, phi);
7865   } else if (abs(from[0] - to[0]) > epsilon$2) {
7866     var lambda = from[0] < to[0] ? pi$3 : -pi$3;
7867     phi = direction * lambda / 2;
7868     stream.point(-lambda, phi);
7869     stream.point(0, phi);
7870     stream.point(lambda, phi);
7871   } else {
7872     stream.point(to[0], to[1]);
7873   }
7874 }
7875
7876 var clipCircle = function(radius) {
7877   var cr = cos$1(radius),
7878       delta = 6 * radians,
7879       smallRadius = cr > 0,
7880       notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case
7881
7882   function interpolate(from, to, direction, stream) {
7883     circleStream(stream, radius, delta, direction, from, to);
7884   }
7885
7886   function visible(lambda, phi) {
7887     return cos$1(lambda) * cos$1(phi) > cr;
7888   }
7889
7890   // Takes a line and cuts into visible segments. Return values used for polygon
7891   // clipping: 0 - there were intersections or the line was empty; 1 - no
7892   // intersections 2 - there were intersections, and the first and last segments
7893   // should be rejoined.
7894   function clipLine(stream) {
7895     var point0, // previous point
7896         c0, // code for previous point
7897         v0, // visibility of previous point
7898         v00, // visibility of first point
7899         clean; // no intersections
7900     return {
7901       lineStart: function() {
7902         v00 = v0 = false;
7903         clean = 1;
7904       },
7905       point: function(lambda, phi) {
7906         var point1 = [lambda, phi],
7907             point2,
7908             v = visible(lambda, phi),
7909             c = smallRadius
7910               ? v ? 0 : code(lambda, phi)
7911               : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
7912         if (!point0 && (v00 = v0 = v)) stream.lineStart();
7913         // Handle degeneracies.
7914         // TODO ignore if not clipping polygons.
7915         if (v !== v0) {
7916           point2 = intersect(point0, point1);
7917           if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
7918             point1[0] += epsilon$2;
7919             point1[1] += epsilon$2;
7920             v = visible(point1[0], point1[1]);
7921           }
7922         }
7923         if (v !== v0) {
7924           clean = 0;
7925           if (v) {
7926             // outside going in
7927             stream.lineStart();
7928             point2 = intersect(point1, point0);
7929             stream.point(point2[0], point2[1]);
7930           } else {
7931             // inside going out
7932             point2 = intersect(point0, point1);
7933             stream.point(point2[0], point2[1]);
7934             stream.lineEnd();
7935           }
7936           point0 = point2;
7937         } else if (notHemisphere && point0 && smallRadius ^ v) {
7938           var t;
7939           // If the codes for two points are different, or are both zero,
7940           // and there this segment intersects with the small circle.
7941           if (!(c & c0) && (t = intersect(point1, point0, true))) {
7942             clean = 0;
7943             if (smallRadius) {
7944               stream.lineStart();
7945               stream.point(t[0][0], t[0][1]);
7946               stream.point(t[1][0], t[1][1]);
7947               stream.lineEnd();
7948             } else {
7949               stream.point(t[1][0], t[1][1]);
7950               stream.lineEnd();
7951               stream.lineStart();
7952               stream.point(t[0][0], t[0][1]);
7953             }
7954           }
7955         }
7956         if (v && (!point0 || !pointEqual(point0, point1))) {
7957           stream.point(point1[0], point1[1]);
7958         }
7959         point0 = point1, v0 = v, c0 = c;
7960       },
7961       lineEnd: function() {
7962         if (v0) stream.lineEnd();
7963         point0 = null;
7964       },
7965       // Rejoin first and last segments if there were intersections and the first
7966       // and last points were visible.
7967       clean: function() {
7968         return clean | ((v00 && v0) << 1);
7969       }
7970     };
7971   }
7972
7973   // Intersects the great circle between a and b with the clip circle.
7974   function intersect(a, b, two) {
7975     var pa = cartesian(a),
7976         pb = cartesian(b);
7977
7978     // We have two planes, n1.p = d1 and n2.p = d2.
7979     // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
7980     var n1 = [1, 0, 0], // normal
7981         n2 = cartesianCross(pa, pb),
7982         n2n2 = cartesianDot(n2, n2),
7983         n1n2 = n2[0], // cartesianDot(n1, n2),
7984         determinant = n2n2 - n1n2 * n1n2;
7985
7986     // Two polar points.
7987     if (!determinant) return !two && a;
7988
7989     var c1 =  cr * n2n2 / determinant,
7990         c2 = -cr * n1n2 / determinant,
7991         n1xn2 = cartesianCross(n1, n2),
7992         A = cartesianScale(n1, c1),
7993         B = cartesianScale(n2, c2);
7994     cartesianAddInPlace(A, B);
7995
7996     // Solve |p(t)|^2 = 1.
7997     var u = n1xn2,
7998         w = cartesianDot(A, u),
7999         uu = cartesianDot(u, u),
8000         t2 = w * w - uu * (cartesianDot(A, A) - 1);
8001
8002     if (t2 < 0) return;
8003
8004     var t = sqrt(t2),
8005         q = cartesianScale(u, (-w - t) / uu);
8006     cartesianAddInPlace(q, A);
8007     q = spherical(q);
8008
8009     if (!two) return q;
8010
8011     // Two intersection points.
8012     var lambda0 = a[0],
8013         lambda1 = b[0],
8014         phi0 = a[1],
8015         phi1 = b[1],
8016         z;
8017
8018     if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8019
8020     var delta = lambda1 - lambda0,
8021         polar = abs(delta - pi$3) < epsilon$2,
8022         meridian = polar || delta < epsilon$2;
8023
8024     if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8025
8026     // Check that the first point is between a and b.
8027     if (meridian
8028         ? polar
8029           ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
8030           : phi0 <= q[1] && q[1] <= phi1
8031         : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
8032       var q1 = cartesianScale(u, (-w + t) / uu);
8033       cartesianAddInPlace(q1, A);
8034       return [q, spherical(q1)];
8035     }
8036   }
8037
8038   // Generates a 4-bit vector representing the location of a point relative to
8039   // the small circle's bounding box.
8040   function code(lambda, phi) {
8041     var r = smallRadius ? radius : pi$3 - radius,
8042         code = 0;
8043     if (lambda < -r) code |= 1; // left
8044     else if (lambda > r) code |= 2; // right
8045     if (phi < -r) code |= 4; // below
8046     else if (phi > r) code |= 8; // above
8047     return code;
8048   }
8049
8050   return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8051 };
8052
8053 var clipLine = function(a, b, x0, y0, x1, y1) {
8054   var ax = a[0],
8055       ay = a[1],
8056       bx = b[0],
8057       by = b[1],
8058       t0 = 0,
8059       t1 = 1,
8060       dx = bx - ax,
8061       dy = by - ay,
8062       r;
8063
8064   r = x0 - ax;
8065   if (!dx && r > 0) return;
8066   r /= dx;
8067   if (dx < 0) {
8068     if (r < t0) return;
8069     if (r < t1) t1 = r;
8070   } else if (dx > 0) {
8071     if (r > t1) return;
8072     if (r > t0) t0 = r;
8073   }
8074
8075   r = x1 - ax;
8076   if (!dx && r < 0) return;
8077   r /= dx;
8078   if (dx < 0) {
8079     if (r > t1) return;
8080     if (r > t0) t0 = r;
8081   } else if (dx > 0) {
8082     if (r < t0) return;
8083     if (r < t1) t1 = r;
8084   }
8085
8086   r = y0 - ay;
8087   if (!dy && r > 0) return;
8088   r /= dy;
8089   if (dy < 0) {
8090     if (r < t0) return;
8091     if (r < t1) t1 = r;
8092   } else if (dy > 0) {
8093     if (r > t1) return;
8094     if (r > t0) t0 = r;
8095   }
8096
8097   r = y1 - ay;
8098   if (!dy && r < 0) return;
8099   r /= dy;
8100   if (dy < 0) {
8101     if (r > t1) return;
8102     if (r > t0) t0 = r;
8103   } else if (dy > 0) {
8104     if (r < t0) return;
8105     if (r < t1) t1 = r;
8106   }
8107
8108   if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
8109   if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
8110   return true;
8111 };
8112
8113 var clipMax = 1e9;
8114 var clipMin = -clipMax;
8115
8116 // TODO Use d3-polygon’s polygonContains here for the ring check?
8117 // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8118
8119 function clipRectangle(x0, y0, x1, y1) {
8120
8121   function visible(x, y) {
8122     return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8123   }
8124
8125   function interpolate(from, to, direction, stream) {
8126     var a = 0, a1 = 0;
8127     if (from == null
8128         || (a = corner(from, direction)) !== (a1 = corner(to, direction))
8129         || comparePoint(from, to) < 0 ^ direction > 0) {
8130       do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
8131       while ((a = (a + direction + 4) % 4) !== a1);
8132     } else {
8133       stream.point(to[0], to[1]);
8134     }
8135   }
8136
8137   function corner(p, direction) {
8138     return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
8139         : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
8140         : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
8141         : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
8142   }
8143
8144   function compareIntersection(a, b) {
8145     return comparePoint(a.x, b.x);
8146   }
8147
8148   function comparePoint(a, b) {
8149     var ca = corner(a, 1),
8150         cb = corner(b, 1);
8151     return ca !== cb ? ca - cb
8152         : ca === 0 ? b[1] - a[1]
8153         : ca === 1 ? a[0] - b[0]
8154         : ca === 2 ? a[1] - b[1]
8155         : b[0] - a[0];
8156   }
8157
8158   return function(stream) {
8159     var activeStream = stream,
8160         bufferStream = clipBuffer(),
8161         segments,
8162         polygon,
8163         ring,
8164         x__, y__, v__, // first point
8165         x_, y_, v_, // previous point
8166         first,
8167         clean;
8168
8169     var clipStream = {
8170       point: point,
8171       lineStart: lineStart,
8172       lineEnd: lineEnd,
8173       polygonStart: polygonStart,
8174       polygonEnd: polygonEnd
8175     };
8176
8177     function point(x, y) {
8178       if (visible(x, y)) activeStream.point(x, y);
8179     }
8180
8181     function polygonInside() {
8182       var winding = 0;
8183
8184       for (var i = 0, n = polygon.length; i < n; ++i) {
8185         for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
8186           a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
8187           if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
8188           else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
8189         }
8190       }
8191
8192       return winding;
8193     }
8194
8195     // Buffer geometry within a polygon and then clip it en masse.
8196     function polygonStart() {
8197       activeStream = bufferStream, segments = [], polygon = [], clean = true;
8198     }
8199
8200     function polygonEnd() {
8201       var startInside = polygonInside(),
8202           cleanInside = clean && startInside,
8203           visible = (segments = merge(segments)).length;
8204       if (cleanInside || visible) {
8205         stream.polygonStart();
8206         if (cleanInside) {
8207           stream.lineStart();
8208           interpolate(null, null, 1, stream);
8209           stream.lineEnd();
8210         }
8211         if (visible) {
8212           clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8213         }
8214         stream.polygonEnd();
8215       }
8216       activeStream = stream, segments = polygon = ring = null;
8217     }
8218
8219     function lineStart() {
8220       clipStream.point = linePoint;
8221       if (polygon) polygon.push(ring = []);
8222       first = true;
8223       v_ = false;
8224       x_ = y_ = NaN;
8225     }
8226
8227     // TODO rather than special-case polygons, simply handle them separately.
8228     // Ideally, coincident intersection points should be jittered to avoid
8229     // clipping issues.
8230     function lineEnd() {
8231       if (segments) {
8232         linePoint(x__, y__);
8233         if (v__ && v_) bufferStream.rejoin();
8234         segments.push(bufferStream.result());
8235       }
8236       clipStream.point = point;
8237       if (v_) activeStream.lineEnd();
8238     }
8239
8240     function linePoint(x, y) {
8241       var v = visible(x, y);
8242       if (polygon) ring.push([x, y]);
8243       if (first) {
8244         x__ = x, y__ = y, v__ = v;
8245         first = false;
8246         if (v) {
8247           activeStream.lineStart();
8248           activeStream.point(x, y);
8249         }
8250       } else {
8251         if (v && v_) activeStream.point(x, y);
8252         else {
8253           var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
8254               b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
8255           if (clipLine(a, b, x0, y0, x1, y1)) {
8256             if (!v_) {
8257               activeStream.lineStart();
8258               activeStream.point(a[0], a[1]);
8259             }
8260             activeStream.point(b[0], b[1]);
8261             if (!v) activeStream.lineEnd();
8262             clean = false;
8263           } else if (v) {
8264             activeStream.lineStart();
8265             activeStream.point(x, y);
8266             clean = false;
8267           }
8268         }
8269       }
8270       x_ = x, y_ = y, v_ = v;
8271     }
8272
8273     return clipStream;
8274   };
8275 }
8276
8277 var extent$1 = function() {
8278   var x0 = 0,
8279       y0 = 0,
8280       x1 = 960,
8281       y1 = 500,
8282       cache,
8283       cacheStream,
8284       clip;
8285
8286   return clip = {
8287     stream: function(stream) {
8288       return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8289     },
8290     extent: function(_) {
8291       return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
8292     }
8293   };
8294 };
8295
8296 var lengthSum = adder();
8297 var lambda0$2;
8298 var sinPhi0$1;
8299 var cosPhi0$1;
8300
8301 var lengthStream = {
8302   sphere: noop$1,
8303   point: noop$1,
8304   lineStart: lengthLineStart,
8305   lineEnd: noop$1,
8306   polygonStart: noop$1,
8307   polygonEnd: noop$1
8308 };
8309
8310 function lengthLineStart() {
8311   lengthStream.point = lengthPointFirst;
8312   lengthStream.lineEnd = lengthLineEnd;
8313 }
8314
8315 function lengthLineEnd() {
8316   lengthStream.point = lengthStream.lineEnd = noop$1;
8317 }
8318
8319 function lengthPointFirst(lambda, phi) {
8320   lambda *= radians, phi *= radians;
8321   lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
8322   lengthStream.point = lengthPoint;
8323 }
8324
8325 function lengthPoint(lambda, phi) {
8326   lambda *= radians, phi *= radians;
8327   var sinPhi = sin$1(phi),
8328       cosPhi = cos$1(phi),
8329       delta = abs(lambda - lambda0$2),
8330       cosDelta = cos$1(delta),
8331       sinDelta = sin$1(delta),
8332       x = cosPhi * sinDelta,
8333       y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
8334       z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
8335   lengthSum.add(atan2(sqrt(x * x + y * y), z));
8336   lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
8337 }
8338
8339 var d3_geoLength = function(object) {
8340   lengthSum.reset();
8341   d3_geoStream(object, lengthStream);
8342   return +lengthSum;
8343 };
8344
8345 var coordinates = [null, null];
8346 var object$1 = {type: "LineString", coordinates: coordinates};
8347
8348 var distance = function(a, b) {
8349   coordinates[0] = a;
8350   coordinates[1] = b;
8351   return d3_geoLength(object$1);
8352 };
8353
8354 var containsObjectType = {
8355   Feature: function(object, point) {
8356     return containsGeometry(object.geometry, point);
8357   },
8358   FeatureCollection: function(object, point) {
8359     var features = object.features, i = -1, n = features.length;
8360     while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
8361     return false;
8362   }
8363 };
8364
8365 var containsGeometryType = {
8366   Sphere: function() {
8367     return true;
8368   },
8369   Point: function(object, point) {
8370     return containsPoint(object.coordinates, point);
8371   },
8372   MultiPoint: function(object, point) {
8373     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8374     while (++i < n) if (containsPoint(coordinates[i], point)) return true;
8375     return false;
8376   },
8377   LineString: function(object, point) {
8378     return containsLine(object.coordinates, point);
8379   },
8380   MultiLineString: function(object, point) {
8381     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8382     while (++i < n) if (containsLine(coordinates[i], point)) return true;
8383     return false;
8384   },
8385   Polygon: function(object, point) {
8386     return containsPolygon(object.coordinates, point);
8387   },
8388   MultiPolygon: function(object, point) {
8389     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8390     while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
8391     return false;
8392   },
8393   GeometryCollection: function(object, point) {
8394     var geometries = object.geometries, i = -1, n = geometries.length;
8395     while (++i < n) if (containsGeometry(geometries[i], point)) return true;
8396     return false;
8397   }
8398 };
8399
8400 function containsGeometry(geometry, point) {
8401   return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8402       ? containsGeometryType[geometry.type](geometry, point)
8403       : false;
8404 }
8405
8406 function containsPoint(coordinates, point) {
8407   return distance(coordinates, point) === 0;
8408 }
8409
8410 function containsLine(coordinates, point) {
8411   var ab = distance(coordinates[0], coordinates[1]),
8412       ao = distance(coordinates[0], point),
8413       ob = distance(point, coordinates[1]);
8414   return ao + ob <= ab + epsilon$2;
8415 }
8416
8417 function containsPolygon(coordinates, point) {
8418   return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8419 }
8420
8421 function ringRadians(ring) {
8422   return ring = ring.map(pointRadians), ring.pop(), ring;
8423 }
8424
8425 function pointRadians(point) {
8426   return [point[0] * radians, point[1] * radians];
8427 }
8428
8429 var contains = function(object, point) {
8430   return (object && containsObjectType.hasOwnProperty(object.type)
8431       ? containsObjectType[object.type]
8432       : containsGeometry)(object, point);
8433 };
8434
8435 function graticuleX(y0, y1, dy) {
8436   var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
8437   return function(x) { return y.map(function(y) { return [x, y]; }); };
8438 }
8439
8440 function graticuleY(x0, x1, dx) {
8441   var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
8442   return function(y) { return x.map(function(x) { return [x, y]; }); };
8443 }
8444
8445 function graticule() {
8446   var x1, x0, X1, X0,
8447       y1, y0, Y1, Y0,
8448       dx = 10, dy = dx, DX = 90, DY = 360,
8449       x, y, X, Y,
8450       precision = 2.5;
8451
8452   function graticule() {
8453     return {type: "MultiLineString", coordinates: lines()};
8454   }
8455
8456   function lines() {
8457     return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
8458         .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8459         .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8460         .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y));
8461   }
8462
8463   graticule.lines = function() {
8464     return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8465   };
8466
8467   graticule.outline = function() {
8468     return {
8469       type: "Polygon",
8470       coordinates: [
8471         X(X0).concat(
8472         Y(Y1).slice(1),
8473         X(X1).reverse().slice(1),
8474         Y(Y0).reverse().slice(1))
8475       ]
8476     };
8477   };
8478
8479   graticule.extent = function(_) {
8480     if (!arguments.length) return graticule.extentMinor();
8481     return graticule.extentMajor(_).extentMinor(_);
8482   };
8483
8484   graticule.extentMajor = function(_) {
8485     if (!arguments.length) return [[X0, Y0], [X1, Y1]];
8486     X0 = +_[0][0], X1 = +_[1][0];
8487     Y0 = +_[0][1], Y1 = +_[1][1];
8488     if (X0 > X1) _ = X0, X0 = X1, X1 = _;
8489     if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
8490     return graticule.precision(precision);
8491   };
8492
8493   graticule.extentMinor = function(_) {
8494     if (!arguments.length) return [[x0, y0], [x1, y1]];
8495     x0 = +_[0][0], x1 = +_[1][0];
8496     y0 = +_[0][1], y1 = +_[1][1];
8497     if (x0 > x1) _ = x0, x0 = x1, x1 = _;
8498     if (y0 > y1) _ = y0, y0 = y1, y1 = _;
8499     return graticule.precision(precision);
8500   };
8501
8502   graticule.step = function(_) {
8503     if (!arguments.length) return graticule.stepMinor();
8504     return graticule.stepMajor(_).stepMinor(_);
8505   };
8506
8507   graticule.stepMajor = function(_) {
8508     if (!arguments.length) return [DX, DY];
8509     DX = +_[0], DY = +_[1];
8510     return graticule;
8511   };
8512
8513   graticule.stepMinor = function(_) {
8514     if (!arguments.length) return [dx, dy];
8515     dx = +_[0], dy = +_[1];
8516     return graticule;
8517   };
8518
8519   graticule.precision = function(_) {
8520     if (!arguments.length) return precision;
8521     precision = +_;
8522     x = graticuleX(y0, y1, 90);
8523     y = graticuleY(x0, x1, precision);
8524     X = graticuleX(Y0, Y1, 90);
8525     Y = graticuleY(X0, X1, precision);
8526     return graticule;
8527   };
8528
8529   return graticule
8530       .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8531       .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8532 }
8533
8534 function graticule10() {
8535   return graticule()();
8536 }
8537
8538 var interpolate$1 = function(a, b) {
8539   var x0 = a[0] * radians,
8540       y0 = a[1] * radians,
8541       x1 = b[0] * radians,
8542       y1 = b[1] * radians,
8543       cy0 = cos$1(y0),
8544       sy0 = sin$1(y0),
8545       cy1 = cos$1(y1),
8546       sy1 = sin$1(y1),
8547       kx0 = cy0 * cos$1(x0),
8548       ky0 = cy0 * sin$1(x0),
8549       kx1 = cy1 * cos$1(x1),
8550       ky1 = cy1 * sin$1(x1),
8551       d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
8552       k = sin$1(d);
8553
8554   var interpolate = d ? function(t) {
8555     var B = sin$1(t *= d) / k,
8556         A = sin$1(d - t) / k,
8557         x = A * kx0 + B * kx1,
8558         y = A * ky0 + B * ky1,
8559         z = A * sy0 + B * sy1;
8560     return [
8561       atan2(y, x) * degrees$1,
8562       atan2(z, sqrt(x * x + y * y)) * degrees$1
8563     ];
8564   } : function() {
8565     return [x0 * degrees$1, y0 * degrees$1];
8566   };
8567
8568   interpolate.distance = d;
8569
8570   return interpolate;
8571 };
8572
8573 var identity$4 = function(x) {
8574   return x;
8575 };
8576
8577 var areaSum$1 = adder();
8578 var areaRingSum$1 = adder();
8579 var x00;
8580 var y00;
8581 var x0$1;
8582 var y0$1;
8583
8584 var areaStream$1 = {
8585   point: noop$1,
8586   lineStart: noop$1,
8587   lineEnd: noop$1,
8588   polygonStart: function() {
8589     areaStream$1.lineStart = areaRingStart$1;
8590     areaStream$1.lineEnd = areaRingEnd$1;
8591   },
8592   polygonEnd: function() {
8593     areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1;
8594     areaSum$1.add(abs(areaRingSum$1));
8595     areaRingSum$1.reset();
8596   },
8597   result: function() {
8598     var area = areaSum$1 / 2;
8599     areaSum$1.reset();
8600     return area;
8601   }
8602 };
8603
8604 function areaRingStart$1() {
8605   areaStream$1.point = areaPointFirst$1;
8606 }
8607
8608 function areaPointFirst$1(x, y) {
8609   areaStream$1.point = areaPoint$1;
8610   x00 = x0$1 = x, y00 = y0$1 = y;
8611 }
8612
8613 function areaPoint$1(x, y) {
8614   areaRingSum$1.add(y0$1 * x - x0$1 * y);
8615   x0$1 = x, y0$1 = y;
8616 }
8617
8618 function areaRingEnd$1() {
8619   areaPoint$1(x00, y00);
8620 }
8621
8622 var x0$2 = Infinity;
8623 var y0$2 = x0$2;
8624 var x1 = -x0$2;
8625 var y1 = x1;
8626
8627 var boundsStream$1 = {
8628   point: boundsPoint$1,
8629   lineStart: noop$1,
8630   lineEnd: noop$1,
8631   polygonStart: noop$1,
8632   polygonEnd: noop$1,
8633   result: function() {
8634     var bounds = [[x0$2, y0$2], [x1, y1]];
8635     x1 = y1 = -(y0$2 = x0$2 = Infinity);
8636     return bounds;
8637   }
8638 };
8639
8640 function boundsPoint$1(x, y) {
8641   if (x < x0$2) x0$2 = x;
8642   if (x > x1) x1 = x;
8643   if (y < y0$2) y0$2 = y;
8644   if (y > y1) y1 = y;
8645 }
8646
8647 // TODO Enforce positive area for exterior, negative area for interior?
8648
8649 var X0$1 = 0;
8650 var Y0$1 = 0;
8651 var Z0$1 = 0;
8652 var X1$1 = 0;
8653 var Y1$1 = 0;
8654 var Z1$1 = 0;
8655 var X2$1 = 0;
8656 var Y2$1 = 0;
8657 var Z2$1 = 0;
8658 var x00$1;
8659 var y00$1;
8660 var x0$3;
8661 var y0$3;
8662
8663 var centroidStream$1 = {
8664   point: centroidPoint$1,
8665   lineStart: centroidLineStart$1,
8666   lineEnd: centroidLineEnd$1,
8667   polygonStart: function() {
8668     centroidStream$1.lineStart = centroidRingStart$1;
8669     centroidStream$1.lineEnd = centroidRingEnd$1;
8670   },
8671   polygonEnd: function() {
8672     centroidStream$1.point = centroidPoint$1;
8673     centroidStream$1.lineStart = centroidLineStart$1;
8674     centroidStream$1.lineEnd = centroidLineEnd$1;
8675   },
8676   result: function() {
8677     var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
8678         : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
8679         : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
8680         : [NaN, NaN];
8681     X0$1 = Y0$1 = Z0$1 =
8682     X1$1 = Y1$1 = Z1$1 =
8683     X2$1 = Y2$1 = Z2$1 = 0;
8684     return centroid;
8685   }
8686 };
8687
8688 function centroidPoint$1(x, y) {
8689   X0$1 += x;
8690   Y0$1 += y;
8691   ++Z0$1;
8692 }
8693
8694 function centroidLineStart$1() {
8695   centroidStream$1.point = centroidPointFirstLine;
8696 }
8697
8698 function centroidPointFirstLine(x, y) {
8699   centroidStream$1.point = centroidPointLine;
8700   centroidPoint$1(x0$3 = x, y0$3 = y);
8701 }
8702
8703 function centroidPointLine(x, y) {
8704   var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
8705   X1$1 += z * (x0$3 + x) / 2;
8706   Y1$1 += z * (y0$3 + y) / 2;
8707   Z1$1 += z;
8708   centroidPoint$1(x0$3 = x, y0$3 = y);
8709 }
8710
8711 function centroidLineEnd$1() {
8712   centroidStream$1.point = centroidPoint$1;
8713 }
8714
8715 function centroidRingStart$1() {
8716   centroidStream$1.point = centroidPointFirstRing;
8717 }
8718
8719 function centroidRingEnd$1() {
8720   centroidPointRing(x00$1, y00$1);
8721 }
8722
8723 function centroidPointFirstRing(x, y) {
8724   centroidStream$1.point = centroidPointRing;
8725   centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8726 }
8727
8728 function centroidPointRing(x, y) {
8729   var dx = x - x0$3,
8730       dy = y - y0$3,
8731       z = sqrt(dx * dx + dy * dy);
8732
8733   X1$1 += z * (x0$3 + x) / 2;
8734   Y1$1 += z * (y0$3 + y) / 2;
8735   Z1$1 += z;
8736
8737   z = y0$3 * x - x0$3 * y;
8738   X2$1 += z * (x0$3 + x);
8739   Y2$1 += z * (y0$3 + y);
8740   Z2$1 += z * 3;
8741   centroidPoint$1(x0$3 = x, y0$3 = y);
8742 }
8743
8744 function PathContext(context) {
8745   this._context = context;
8746 }
8747
8748 PathContext.prototype = {
8749   _radius: 4.5,
8750   pointRadius: function(_) {
8751     return this._radius = _, this;
8752   },
8753   polygonStart: function() {
8754     this._line = 0;
8755   },
8756   polygonEnd: function() {
8757     this._line = NaN;
8758   },
8759   lineStart: function() {
8760     this._point = 0;
8761   },
8762   lineEnd: function() {
8763     if (this._line === 0) this._context.closePath();
8764     this._point = NaN;
8765   },
8766   point: function(x, y) {
8767     switch (this._point) {
8768       case 0: {
8769         this._context.moveTo(x, y);
8770         this._point = 1;
8771         break;
8772       }
8773       case 1: {
8774         this._context.lineTo(x, y);
8775         break;
8776       }
8777       default: {
8778         this._context.moveTo(x + this._radius, y);
8779         this._context.arc(x, y, this._radius, 0, tau$3);
8780         break;
8781       }
8782     }
8783   },
8784   result: noop$1
8785 };
8786
8787 var lengthSum$1 = adder();
8788 var lengthRing;
8789 var x00$2;
8790 var y00$2;
8791 var x0$4;
8792 var y0$4;
8793
8794 var lengthStream$1 = {
8795   point: noop$1,
8796   lineStart: function() {
8797     lengthStream$1.point = lengthPointFirst$1;
8798   },
8799   lineEnd: function() {
8800     if (lengthRing) lengthPoint$1(x00$2, y00$2);
8801     lengthStream$1.point = noop$1;
8802   },
8803   polygonStart: function() {
8804     lengthRing = true;
8805   },
8806   polygonEnd: function() {
8807     lengthRing = null;
8808   },
8809   result: function() {
8810     var length = +lengthSum$1;
8811     lengthSum$1.reset();
8812     return length;
8813   }
8814 };
8815
8816 function lengthPointFirst$1(x, y) {
8817   lengthStream$1.point = lengthPoint$1;
8818   x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8819 }
8820
8821 function lengthPoint$1(x, y) {
8822   x0$4 -= x, y0$4 -= y;
8823   lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
8824   x0$4 = x, y0$4 = y;
8825 }
8826
8827 function PathString() {
8828   this._string = [];
8829 }
8830
8831 PathString.prototype = {
8832   _radius: 4.5,
8833   _circle: circle$1(4.5),
8834   pointRadius: function(_) {
8835     if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8836     return this;
8837   },
8838   polygonStart: function() {
8839     this._line = 0;
8840   },
8841   polygonEnd: function() {
8842     this._line = NaN;
8843   },
8844   lineStart: function() {
8845     this._point = 0;
8846   },
8847   lineEnd: function() {
8848     if (this._line === 0) this._string.push("Z");
8849     this._point = NaN;
8850   },
8851   point: function(x, y) {
8852     switch (this._point) {
8853       case 0: {
8854         this._string.push("M", x, ",", y);
8855         this._point = 1;
8856         break;
8857       }
8858       case 1: {
8859         this._string.push("L", x, ",", y);
8860         break;
8861       }
8862       default: {
8863         if (this._circle == null) this._circle = circle$1(this._radius);
8864         this._string.push("M", x, ",", y, this._circle);
8865         break;
8866       }
8867     }
8868   },
8869   result: function() {
8870     if (this._string.length) {
8871       var result = this._string.join("");
8872       this._string = [];
8873       return result;
8874     } else {
8875       return null;
8876     }
8877   }
8878 };
8879
8880 function circle$1(radius) {
8881   return "m0," + radius
8882       + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
8883       + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
8884       + "z";
8885 }
8886
8887 var d3_geoPath = function(projection, context) {
8888   var pointRadius = 4.5,
8889       projectionStream,
8890       contextStream;
8891
8892   function path(object) {
8893     if (object) {
8894       if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8895       d3_geoStream(object, projectionStream(contextStream));
8896     }
8897     return contextStream.result();
8898   }
8899
8900   path.area = function(object) {
8901     d3_geoStream(object, projectionStream(areaStream$1));
8902     return areaStream$1.result();
8903   };
8904
8905   path.measure = function(object) {
8906     d3_geoStream(object, projectionStream(lengthStream$1));
8907     return lengthStream$1.result();
8908   };
8909
8910   path.bounds = function(object) {
8911     d3_geoStream(object, projectionStream(boundsStream$1));
8912     return boundsStream$1.result();
8913   };
8914
8915   path.centroid = function(object) {
8916     d3_geoStream(object, projectionStream(centroidStream$1));
8917     return centroidStream$1.result();
8918   };
8919
8920   path.projection = function(_) {
8921     return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8922   };
8923
8924   path.context = function(_) {
8925     if (!arguments.length) return context;
8926     contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
8927     if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
8928     return path;
8929   };
8930
8931   path.pointRadius = function(_) {
8932     if (!arguments.length) return pointRadius;
8933     pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8934     return path;
8935   };
8936
8937   return path.projection(projection).context(context);
8938 };
8939
8940 var d3_geoTransform = function(methods) {
8941   return {
8942     stream: transformer(methods)
8943   };
8944 };
8945
8946 function transformer(methods) {
8947   return function(stream) {
8948     var s = new TransformStream;
8949     for (var key in methods) s[key] = methods[key];
8950     s.stream = stream;
8951     return s;
8952   };
8953 }
8954
8955 function TransformStream() {}
8956
8957 TransformStream.prototype = {
8958   constructor: TransformStream,
8959   point: function(x, y) { this.stream.point(x, y); },
8960   sphere: function() { this.stream.sphere(); },
8961   lineStart: function() { this.stream.lineStart(); },
8962   lineEnd: function() { this.stream.lineEnd(); },
8963   polygonStart: function() { this.stream.polygonStart(); },
8964   polygonEnd: function() { this.stream.polygonEnd(); }
8965 };
8966
8967 function fitExtent(projection, extent, object) {
8968   var w = extent[1][0] - extent[0][0],
8969       h = extent[1][1] - extent[0][1],
8970       clip = projection.clipExtent && projection.clipExtent();
8971
8972   projection
8973       .scale(150)
8974       .translate([0, 0]);
8975
8976   if (clip != null) projection.clipExtent(null);
8977
8978   d3_geoStream(object, projection.stream(boundsStream$1));
8979
8980   var b = boundsStream$1.result(),
8981       k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
8982       x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
8983       y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
8984
8985   if (clip != null) projection.clipExtent(clip);
8986
8987   return projection
8988       .scale(k * 150)
8989       .translate([x, y]);
8990 }
8991
8992 function fitSize(projection, size, object) {
8993   return fitExtent(projection, [[0, 0], size], object);
8994 }
8995
8996 var maxDepth = 16;
8997 var cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
8998
8999 var resample = function(project, delta2) {
9000   return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9001 };
9002
9003 function resampleNone(project) {
9004   return transformer({
9005     point: function(x, y) {
9006       x = project(x, y);
9007       this.stream.point(x[0], x[1]);
9008     }
9009   });
9010 }
9011
9012 function resample$1(project, delta2) {
9013
9014   function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9015     var dx = x1 - x0,
9016         dy = y1 - y0,
9017         d2 = dx * dx + dy * dy;
9018     if (d2 > 4 * delta2 && depth--) {
9019       var a = a0 + a1,
9020           b = b0 + b1,
9021           c = c0 + c1,
9022           m = sqrt(a * a + b * b + c * c),
9023           phi2 = asin(c /= m),
9024           lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
9025           p = project(lambda2, phi2),
9026           x2 = p[0],
9027           y2 = p[1],
9028           dx2 = x2 - x0,
9029           dy2 = y2 - y0,
9030           dz = dy * dx2 - dx * dy2;
9031       if (dz * dz / d2 > delta2 // perpendicular projected distance
9032           || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
9033           || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
9034         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
9035         stream.point(x2, y2);
9036         resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
9037       }
9038     }
9039   }
9040   return function(stream) {
9041     var lambda00, x00, y00, a00, b00, c00, // first point
9042         lambda0, x0, y0, a0, b0, c0; // previous point
9043
9044     var resampleStream = {
9045       point: point,
9046       lineStart: lineStart,
9047       lineEnd: lineEnd,
9048       polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9049       polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9050     };
9051
9052     function point(x, y) {
9053       x = project(x, y);
9054       stream.point(x[0], x[1]);
9055     }
9056
9057     function lineStart() {
9058       x0 = NaN;
9059       resampleStream.point = linePoint;
9060       stream.lineStart();
9061     }
9062
9063     function linePoint(lambda, phi) {
9064       var c = cartesian([lambda, phi]), p = project(lambda, phi);
9065       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);
9066       stream.point(x0, y0);
9067     }
9068
9069     function lineEnd() {
9070       resampleStream.point = point;
9071       stream.lineEnd();
9072     }
9073
9074     function ringStart() {
9075       lineStart();
9076       resampleStream.point = ringPoint;
9077       resampleStream.lineEnd = ringEnd;
9078     }
9079
9080     function ringPoint(lambda, phi) {
9081       linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9082       resampleStream.point = linePoint;
9083     }
9084
9085     function ringEnd() {
9086       resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9087       resampleStream.lineEnd = lineEnd;
9088       lineEnd();
9089     }
9090
9091     return resampleStream;
9092   };
9093 }
9094
9095 var transformRadians = transformer({
9096   point: function(x, y) {
9097     this.stream.point(x * radians, y * radians);
9098   }
9099 });
9100
9101 function transformRotate(rotate) {
9102   return transformer({
9103     point: function(x, y) {
9104       var r = rotate(x, y);
9105       return this.stream.point(r[0], r[1]);
9106     }
9107   });
9108 }
9109
9110 function projection(project) {
9111   return projectionMutator(function() { return project; })();
9112 }
9113
9114 function projectionMutator(projectAt) {
9115   var project,
9116       k = 150, // scale
9117       x = 480, y = 250, // translate
9118       dx, dy, lambda = 0, phi = 0, // center
9119       deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
9120       theta = null, preclip = clipAntimeridian, // clip angle
9121       x0 = null, y0, x1, y1, postclip = identity$4, // clip extent
9122       delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
9123       cache,
9124       cacheStream;
9125
9126   function projection(point) {
9127     point = projectRotate(point[0] * radians, point[1] * radians);
9128     return [point[0] * k + dx, dy - point[1] * k];
9129   }
9130
9131   function invert(point) {
9132     point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
9133     return point && [point[0] * degrees$1, point[1] * degrees$1];
9134   }
9135
9136   function projectTransform(x, y) {
9137     return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9138   }
9139
9140   projection.stream = function(stream) {
9141     return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9142   };
9143
9144   projection.preclip = function(_) {
9145     return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9146   };
9147
9148   projection.postclip = function(_) {
9149     return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9150   };
9151
9152   projection.clipAngle = function(_) {
9153     return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9154   };
9155
9156   projection.clipExtent = function(_) {
9157     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]];
9158   };
9159
9160   projection.scale = function(_) {
9161     return arguments.length ? (k = +_, recenter()) : k;
9162   };
9163
9164   projection.translate = function(_) {
9165     return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9166   };
9167
9168   projection.center = function(_) {
9169     return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9170   };
9171
9172   projection.rotate = function(_) {
9173     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];
9174   };
9175
9176   projection.precision = function(_) {
9177     return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9178   };
9179
9180   projection.fitExtent = function(extent, object) {
9181     return fitExtent(projection, extent, object);
9182   };
9183
9184   projection.fitSize = function(size, object) {
9185     return fitSize(projection, size, object);
9186   };
9187
9188   function recenter() {
9189     projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
9190     var center = project(lambda, phi);
9191     dx = x - center[0] * k;
9192     dy = y + center[1] * k;
9193     return reset();
9194   }
9195
9196   function reset() {
9197     cache = cacheStream = null;
9198     return projection;
9199   }
9200
9201   return function() {
9202     project = projectAt.apply(this, arguments);
9203     projection.invert = project.invert && invert;
9204     return recenter();
9205   };
9206 }
9207
9208 function conicProjection(projectAt) {
9209   var phi0 = 0,
9210       phi1 = pi$3 / 3,
9211       m = projectionMutator(projectAt),
9212       p = m(phi0, phi1);
9213
9214   p.parallels = function(_) {
9215     return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9216   };
9217
9218   return p;
9219 }
9220
9221 function cylindricalEqualAreaRaw(phi0) {
9222   var cosPhi0 = cos$1(phi0);
9223
9224   function forward(lambda, phi) {
9225     return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9226   }
9227
9228   forward.invert = function(x, y) {
9229     return [x / cosPhi0, asin(y * cosPhi0)];
9230   };
9231
9232   return forward;
9233 }
9234
9235 function conicEqualAreaRaw(y0, y1) {
9236   var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9237
9238   // Are the parallels symmetrical around the Equator?
9239   if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9240
9241   var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9242
9243   function project(x, y) {
9244     var r = sqrt(c - 2 * n * sin$1(y)) / n;
9245     return [r * sin$1(x *= n), r0 - r * cos$1(x)];
9246   }
9247
9248   project.invert = function(x, y) {
9249     var r0y = r0 - y;
9250     return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9251   };
9252
9253   return project;
9254 }
9255
9256 var conicEqualArea = function() {
9257   return conicProjection(conicEqualAreaRaw)
9258       .scale(155.424)
9259       .center([0, 33.6442]);
9260 };
9261
9262 var albers = function() {
9263   return conicEqualArea()
9264       .parallels([29.5, 45.5])
9265       .scale(1070)
9266       .translate([480, 250])
9267       .rotate([96, 0])
9268       .center([-0.6, 38.7]);
9269 };
9270
9271 // The projections must have mutually exclusive clip regions on the sphere,
9272 // as this will avoid emitting interleaving lines and polygons.
9273 function multiplex(streams) {
9274   var n = streams.length;
9275   return {
9276     point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
9277     sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
9278     lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
9279     lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
9280     polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
9281     polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
9282   };
9283 }
9284
9285 // A composite projection for the United States, configured by default for
9286 // 960×500. The projection also works quite well at 960×600 if you change the
9287 // scale to 1285 and adjust the translate accordingly. The set of standard
9288 // parallels for each region comes from USGS, which is published here:
9289 // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
9290 var albersUsa = function() {
9291   var cache,
9292       cacheStream,
9293       lower48 = albers(), lower48Point,
9294       alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
9295       hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
9296       point, pointStream = {point: function(x, y) { point = [x, y]; }};
9297
9298   function albersUsa(coordinates) {
9299     var x = coordinates[0], y = coordinates[1];
9300     return point = null,
9301         (lower48Point.point(x, y), point)
9302         || (alaskaPoint.point(x, y), point)
9303         || (hawaiiPoint.point(x, y), point);
9304   }
9305
9306   albersUsa.invert = function(coordinates) {
9307     var k = lower48.scale(),
9308         t = lower48.translate(),
9309         x = (coordinates[0] - t[0]) / k,
9310         y = (coordinates[1] - t[1]) / k;
9311     return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9312         : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9313         : lower48).invert(coordinates);
9314   };
9315
9316   albersUsa.stream = function(stream) {
9317     return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9318   };
9319
9320   albersUsa.precision = function(_) {
9321     if (!arguments.length) return lower48.precision();
9322     lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9323     return reset();
9324   };
9325
9326   albersUsa.scale = function(_) {
9327     if (!arguments.length) return lower48.scale();
9328     lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9329     return albersUsa.translate(lower48.translate());
9330   };
9331
9332   albersUsa.translate = function(_) {
9333     if (!arguments.length) return lower48.translate();
9334     var k = lower48.scale(), x = +_[0], y = +_[1];
9335
9336     lower48Point = lower48
9337         .translate(_)
9338         .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9339         .stream(pointStream);
9340
9341     alaskaPoint = alaska
9342         .translate([x - 0.307 * k, y + 0.201 * k])
9343         .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]])
9344         .stream(pointStream);
9345
9346     hawaiiPoint = hawaii
9347         .translate([x - 0.205 * k, y + 0.212 * k])
9348         .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]])
9349         .stream(pointStream);
9350
9351     return reset();
9352   };
9353
9354   albersUsa.fitExtent = function(extent, object) {
9355     return fitExtent(albersUsa, extent, object);
9356   };
9357
9358   albersUsa.fitSize = function(size, object) {
9359     return fitSize(albersUsa, size, object);
9360   };
9361
9362   function reset() {
9363     cache = cacheStream = null;
9364     return albersUsa;
9365   }
9366
9367   return albersUsa.scale(1070);
9368 };
9369
9370 function azimuthalRaw(scale) {
9371   return function(x, y) {
9372     var cx = cos$1(x),
9373         cy = cos$1(y),
9374         k = scale(cx * cy);
9375     return [
9376       k * cy * sin$1(x),
9377       k * sin$1(y)
9378     ];
9379   }
9380 }
9381
9382 function azimuthalInvert(angle) {
9383   return function(x, y) {
9384     var z = sqrt(x * x + y * y),
9385         c = angle(z),
9386         sc = sin$1(c),
9387         cc = cos$1(c);
9388     return [
9389       atan2(x * sc, z * cc),
9390       asin(z && y * sc / z)
9391     ];
9392   }
9393 }
9394
9395 var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9396   return sqrt(2 / (1 + cxcy));
9397 });
9398
9399 azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9400   return 2 * asin(z / 2);
9401 });
9402
9403 var azimuthalEqualArea = function() {
9404   return projection(azimuthalEqualAreaRaw)
9405       .scale(124.75)
9406       .clipAngle(180 - 1e-3);
9407 };
9408
9409 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9410   return (c = acos(c)) && c / sin$1(c);
9411 });
9412
9413 azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9414   return z;
9415 });
9416
9417 var azimuthalEquidistant = function() {
9418   return projection(azimuthalEquidistantRaw)
9419       .scale(79.4188)
9420       .clipAngle(180 - 1e-3);
9421 };
9422
9423 function mercatorRaw(lambda, phi) {
9424   return [lambda, log(tan((halfPi$2 + phi) / 2))];
9425 }
9426
9427 mercatorRaw.invert = function(x, y) {
9428   return [x, 2 * atan(exp(y)) - halfPi$2];
9429 };
9430
9431 var mercator = function() {
9432   return mercatorProjection(mercatorRaw)
9433       .scale(961 / tau$3);
9434 };
9435
9436 function mercatorProjection(project) {
9437   var m = projection(project),
9438       center = m.center,
9439       scale = m.scale,
9440       translate = m.translate,
9441       clipExtent = m.clipExtent,
9442       x0 = null, y0, x1, y1; // clip extent
9443
9444   m.scale = function(_) {
9445     return arguments.length ? (scale(_), reclip()) : scale();
9446   };
9447
9448   m.translate = function(_) {
9449     return arguments.length ? (translate(_), reclip()) : translate();
9450   };
9451
9452   m.center = function(_) {
9453     return arguments.length ? (center(_), reclip()) : center();
9454   };
9455
9456   m.clipExtent = function(_) {
9457     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]];
9458   };
9459
9460   function reclip() {
9461     var k = pi$3 * scale(),
9462         t = m(rotation(m.rotate()).invert([0, 0]));
9463     return clipExtent(x0 == null
9464         ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9465         ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9466         : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9467   }
9468
9469   return reclip();
9470 }
9471
9472 function tany(y) {
9473   return tan((halfPi$2 + y) / 2);
9474 }
9475
9476 function conicConformalRaw(y0, y1) {
9477   var cy0 = cos$1(y0),
9478       n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9479       f = cy0 * pow(tany(y0), n) / n;
9480
9481   if (!n) return mercatorRaw;
9482
9483   function project(x, y) {
9484     if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9485     else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9486     var r = f / pow(tany(y), n);
9487     return [r * sin$1(n * x), f - r * cos$1(n * x)];
9488   }
9489
9490   project.invert = function(x, y) {
9491     var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9492     return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9493   };
9494
9495   return project;
9496 }
9497
9498 var conicConformal = function() {
9499   return conicProjection(conicConformalRaw)
9500       .scale(109.5)
9501       .parallels([30, 30]);
9502 };
9503
9504 function equirectangularRaw(lambda, phi) {
9505   return [lambda, phi];
9506 }
9507
9508 equirectangularRaw.invert = equirectangularRaw;
9509
9510 var equirectangular = function() {
9511   return projection(equirectangularRaw)
9512       .scale(152.63);
9513 };
9514
9515 function conicEquidistantRaw(y0, y1) {
9516   var cy0 = cos$1(y0),
9517       n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9518       g = cy0 / n + y0;
9519
9520   if (abs(n) < epsilon$2) return equirectangularRaw;
9521
9522   function project(x, y) {
9523     var gy = g - y, nx = n * x;
9524     return [gy * sin$1(nx), g - gy * cos$1(nx)];
9525   }
9526
9527   project.invert = function(x, y) {
9528     var gy = g - y;
9529     return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9530   };
9531
9532   return project;
9533 }
9534
9535 var conicEquidistant = function() {
9536   return conicProjection(conicEquidistantRaw)
9537       .scale(131.154)
9538       .center([0, 13.9389]);
9539 };
9540
9541 function gnomonicRaw(x, y) {
9542   var cy = cos$1(y), k = cos$1(x) * cy;
9543   return [cy * sin$1(x) / k, sin$1(y) / k];
9544 }
9545
9546 gnomonicRaw.invert = azimuthalInvert(atan);
9547
9548 var gnomonic = function() {
9549   return projection(gnomonicRaw)
9550       .scale(144.049)
9551       .clipAngle(60);
9552 };
9553
9554 function scaleTranslate(kx, ky, tx, ty) {
9555   return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9556     point: function(x, y) {
9557       this.stream.point(x * kx + tx, y * ky + ty);
9558     }
9559   });
9560 }
9561
9562 var d3_geoIdentity = function() {
9563   var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9564       x0 = null, y0, x1, y1, // clip extent
9565       postclip = identity$4,
9566       cache,
9567       cacheStream,
9568       projection;
9569
9570   function reset() {
9571     cache = cacheStream = null;
9572     return projection;
9573   }
9574
9575   return projection = {
9576     stream: function(stream) {
9577       return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9578     },
9579     postclip: function(_) {
9580       return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9581     },
9582     clipExtent: function(_) {
9583       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]];
9584     },
9585     scale: function(_) {
9586       return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9587     },
9588     translate: function(_) {
9589       return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9590     },
9591     reflectX: function(_) {
9592       return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9593     },
9594     reflectY: function(_) {
9595       return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9596     },
9597     fitExtent: function(extent, object) {
9598       return fitExtent(projection, extent, object);
9599     },
9600     fitSize: function(size, object) {
9601       return fitSize(projection, size, object);
9602     }
9603   };
9604 };
9605
9606 function naturalEarth1Raw(lambda, phi) {
9607   var phi2 = phi * phi, phi4 = phi2 * phi2;
9608   return [
9609     lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9610     phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9611   ];
9612 }
9613
9614 naturalEarth1Raw.invert = function(x, y) {
9615   var phi = y, i = 25, delta;
9616   do {
9617     var phi2 = phi * phi, phi4 = phi2 * phi2;
9618     phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9619         (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9620   } while (abs(delta) > epsilon$2 && --i > 0);
9621   return [
9622     x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9623     phi
9624   ];
9625 };
9626
9627 var naturalEarth1 = function() {
9628   return projection(naturalEarth1Raw)
9629       .scale(175.295);
9630 };
9631
9632 function orthographicRaw(x, y) {
9633   return [cos$1(y) * sin$1(x), sin$1(y)];
9634 }
9635
9636 orthographicRaw.invert = azimuthalInvert(asin);
9637
9638 var orthographic = function() {
9639   return projection(orthographicRaw)
9640       .scale(249.5)
9641       .clipAngle(90 + epsilon$2);
9642 };
9643
9644 function stereographicRaw(x, y) {
9645   var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9646   return [cy * sin$1(x) / k, sin$1(y) / k];
9647 }
9648
9649 stereographicRaw.invert = azimuthalInvert(function(z) {
9650   return 2 * atan(z);
9651 });
9652
9653 var stereographic = function() {
9654   return projection(stereographicRaw)
9655       .scale(250)
9656       .clipAngle(142);
9657 };
9658
9659 function transverseMercatorRaw(lambda, phi) {
9660   return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9661 }
9662
9663 transverseMercatorRaw.invert = function(x, y) {
9664   return [-y, 2 * atan(exp(x)) - halfPi$2];
9665 };
9666
9667 var transverseMercator = function() {
9668   var m = mercatorProjection(transverseMercatorRaw),
9669       center = m.center,
9670       rotate = m.rotate;
9671
9672   m.center = function(_) {
9673     return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9674   };
9675
9676   m.rotate = function(_) {
9677     return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9678   };
9679
9680   return rotate([0, 0, 90])
9681       .scale(159.155);
9682 };
9683
9684 function defaultSeparation(a, b) {
9685   return a.parent === b.parent ? 1 : 2;
9686 }
9687
9688 function meanX(children) {
9689   return children.reduce(meanXReduce, 0) / children.length;
9690 }
9691
9692 function meanXReduce(x, c) {
9693   return x + c.x;
9694 }
9695
9696 function maxY(children) {
9697   return 1 + children.reduce(maxYReduce, 0);
9698 }
9699
9700 function maxYReduce(y, c) {
9701   return Math.max(y, c.y);
9702 }
9703
9704 function leafLeft(node) {
9705   var children;
9706   while (children = node.children) node = children[0];
9707   return node;
9708 }
9709
9710 function leafRight(node) {
9711   var children;
9712   while (children = node.children) node = children[children.length - 1];
9713   return node;
9714 }
9715
9716 var cluster = function() {
9717   var separation = defaultSeparation,
9718       dx = 1,
9719       dy = 1,
9720       nodeSize = false;
9721
9722   function cluster(root) {
9723     var previousNode,
9724         x = 0;
9725
9726     // First walk, computing the initial x & y values.
9727     root.eachAfter(function(node) {
9728       var children = node.children;
9729       if (children) {
9730         node.x = meanX(children);
9731         node.y = maxY(children);
9732       } else {
9733         node.x = previousNode ? x += separation(node, previousNode) : 0;
9734         node.y = 0;
9735         previousNode = node;
9736       }
9737     });
9738
9739     var left = leafLeft(root),
9740         right = leafRight(root),
9741         x0 = left.x - separation(left, right) / 2,
9742         x1 = right.x + separation(right, left) / 2;
9743
9744     // Second walk, normalizing x & y to the desired size.
9745     return root.eachAfter(nodeSize ? function(node) {
9746       node.x = (node.x - root.x) * dx;
9747       node.y = (root.y - node.y) * dy;
9748     } : function(node) {
9749       node.x = (node.x - x0) / (x1 - x0) * dx;
9750       node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9751     });
9752   }
9753
9754   cluster.separation = function(x) {
9755     return arguments.length ? (separation = x, cluster) : separation;
9756   };
9757
9758   cluster.size = function(x) {
9759     return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9760   };
9761
9762   cluster.nodeSize = function(x) {
9763     return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9764   };
9765
9766   return cluster;
9767 };
9768
9769 function count(node) {
9770   var sum = 0,
9771       children = node.children,
9772       i = children && children.length;
9773   if (!i) sum = 1;
9774   else while (--i >= 0) sum += children[i].value;
9775   node.value = sum;
9776 }
9777
9778 var node_count = function() {
9779   return this.eachAfter(count);
9780 };
9781
9782 var node_each = function(callback) {
9783   var node = this, current, next = [node], children, i, n;
9784   do {
9785     current = next.reverse(), next = [];
9786     while (node = current.pop()) {
9787       callback(node), children = node.children;
9788       if (children) for (i = 0, n = children.length; i < n; ++i) {
9789         next.push(children[i]);
9790       }
9791     }
9792   } while (next.length);
9793   return this;
9794 };
9795
9796 var node_eachBefore = function(callback) {
9797   var node = this, nodes = [node], children, i;
9798   while (node = nodes.pop()) {
9799     callback(node), children = node.children;
9800     if (children) for (i = children.length - 1; i >= 0; --i) {
9801       nodes.push(children[i]);
9802     }
9803   }
9804   return this;
9805 };
9806
9807 var node_eachAfter = function(callback) {
9808   var node = this, nodes = [node], next = [], children, i, n;
9809   while (node = nodes.pop()) {
9810     next.push(node), children = node.children;
9811     if (children) for (i = 0, n = children.length; i < n; ++i) {
9812       nodes.push(children[i]);
9813     }
9814   }
9815   while (node = next.pop()) {
9816     callback(node);
9817   }
9818   return this;
9819 };
9820
9821 var node_sum = function(value) {
9822   return this.eachAfter(function(node) {
9823     var sum = +value(node.data) || 0,
9824         children = node.children,
9825         i = children && children.length;
9826     while (--i >= 0) sum += children[i].value;
9827     node.value = sum;
9828   });
9829 };
9830
9831 var node_sort = function(compare) {
9832   return this.eachBefore(function(node) {
9833     if (node.children) {
9834       node.children.sort(compare);
9835     }
9836   });
9837 };
9838
9839 var node_path = function(end) {
9840   var start = this,
9841       ancestor = leastCommonAncestor(start, end),
9842       nodes = [start];
9843   while (start !== ancestor) {
9844     start = start.parent;
9845     nodes.push(start);
9846   }
9847   var k = nodes.length;
9848   while (end !== ancestor) {
9849     nodes.splice(k, 0, end);
9850     end = end.parent;
9851   }
9852   return nodes;
9853 };
9854
9855 function leastCommonAncestor(a, b) {
9856   if (a === b) return a;
9857   var aNodes = a.ancestors(),
9858       bNodes = b.ancestors(),
9859       c = null;
9860   a = aNodes.pop();
9861   b = bNodes.pop();
9862   while (a === b) {
9863     c = a;
9864     a = aNodes.pop();
9865     b = bNodes.pop();
9866   }
9867   return c;
9868 }
9869
9870 var node_ancestors = function() {
9871   var node = this, nodes = [node];
9872   while (node = node.parent) {
9873     nodes.push(node);
9874   }
9875   return nodes;
9876 };
9877
9878 var node_descendants = function() {
9879   var nodes = [];
9880   this.each(function(node) {
9881     nodes.push(node);
9882   });
9883   return nodes;
9884 };
9885
9886 var node_leaves = function() {
9887   var leaves = [];
9888   this.eachBefore(function(node) {
9889     if (!node.children) {
9890       leaves.push(node);
9891     }
9892   });
9893   return leaves;
9894 };
9895
9896 var node_links = function() {
9897   var root = this, links = [];
9898   root.each(function(node) {
9899     if (node !== root) { // Don’t include the root’s parent, if any.
9900       links.push({source: node.parent, target: node});
9901     }
9902   });
9903   return links;
9904 };
9905
9906 function hierarchy(data, children) {
9907   var root = new Node(data),
9908       valued = +data.value && (root.value = data.value),
9909       node,
9910       nodes = [root],
9911       child,
9912       childs,
9913       i,
9914       n;
9915
9916   if (children == null) children = defaultChildren;
9917
9918   while (node = nodes.pop()) {
9919     if (valued) node.value = +node.data.value;
9920     if ((childs = children(node.data)) && (n = childs.length)) {
9921       node.children = new Array(n);
9922       for (i = n - 1; i >= 0; --i) {
9923         nodes.push(child = node.children[i] = new Node(childs[i]));
9924         child.parent = node;
9925         child.depth = node.depth + 1;
9926       }
9927     }
9928   }
9929
9930   return root.eachBefore(computeHeight);
9931 }
9932
9933 function node_copy() {
9934   return hierarchy(this).eachBefore(copyData);
9935 }
9936
9937 function defaultChildren(d) {
9938   return d.children;
9939 }
9940
9941 function copyData(node) {
9942   node.data = node.data.data;
9943 }
9944
9945 function computeHeight(node) {
9946   var height = 0;
9947   do node.height = height;
9948   while ((node = node.parent) && (node.height < ++height));
9949 }
9950
9951 function Node(data) {
9952   this.data = data;
9953   this.depth =
9954   this.height = 0;
9955   this.parent = null;
9956 }
9957
9958 Node.prototype = hierarchy.prototype = {
9959   constructor: Node,
9960   count: node_count,
9961   each: node_each,
9962   eachAfter: node_eachAfter,
9963   eachBefore: node_eachBefore,
9964   sum: node_sum,
9965   sort: node_sort,
9966   path: node_path,
9967   ancestors: node_ancestors,
9968   descendants: node_descendants,
9969   leaves: node_leaves,
9970   links: node_links,
9971   copy: node_copy
9972 };
9973
9974 var slice$3 = Array.prototype.slice;
9975
9976 function shuffle$1(array) {
9977   var m = array.length,
9978       t,
9979       i;
9980
9981   while (m) {
9982     i = Math.random() * m-- | 0;
9983     t = array[m];
9984     array[m] = array[i];
9985     array[i] = t;
9986   }
9987
9988   return array;
9989 }
9990
9991 var enclose = function(circles) {
9992   var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
9993
9994   while (i < n) {
9995     p = circles[i];
9996     if (e && enclosesWeak(e, p)) ++i;
9997     else e = encloseBasis(B = extendBasis(B, p)), i = 0;
9998   }
9999
10000   return e;
10001 };
10002
10003 function extendBasis(B, p) {
10004   var i, j;
10005
10006   if (enclosesWeakAll(p, B)) return [p];
10007
10008   // If we get here then B must have at least one element.
10009   for (i = 0; i < B.length; ++i) {
10010     if (enclosesNot(p, B[i])
10011         && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10012       return [B[i], p];
10013     }
10014   }
10015
10016   // If we get here then B must have at least two elements.
10017   for (i = 0; i < B.length - 1; ++i) {
10018     for (j = i + 1; j < B.length; ++j) {
10019       if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10020           && enclosesNot(encloseBasis2(B[i], p), B[j])
10021           && enclosesNot(encloseBasis2(B[j], p), B[i])
10022           && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10023         return [B[i], B[j], p];
10024       }
10025     }
10026   }
10027
10028   // If we get here then something is very wrong.
10029   throw new Error;
10030 }
10031
10032 function enclosesNot(a, b) {
10033   var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10034   return dr < 0 || dr * dr < dx * dx + dy * dy;
10035 }
10036
10037 function enclosesWeak(a, b) {
10038   var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10039   return dr > 0 && dr * dr > dx * dx + dy * dy;
10040 }
10041
10042 function enclosesWeakAll(a, B) {
10043   for (var i = 0; i < B.length; ++i) {
10044     if (!enclosesWeak(a, B[i])) {
10045       return false;
10046     }
10047   }
10048   return true;
10049 }
10050
10051 function encloseBasis(B) {
10052   switch (B.length) {
10053     case 1: return encloseBasis1(B[0]);
10054     case 2: return encloseBasis2(B[0], B[1]);
10055     case 3: return encloseBasis3(B[0], B[1], B[2]);
10056   }
10057 }
10058
10059 function encloseBasis1(a) {
10060   return {
10061     x: a.x,
10062     y: a.y,
10063     r: a.r
10064   };
10065 }
10066
10067 function encloseBasis2(a, b) {
10068   var x1 = a.x, y1 = a.y, r1 = a.r,
10069       x2 = b.x, y2 = b.y, r2 = b.r,
10070       x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10071       l = Math.sqrt(x21 * x21 + y21 * y21);
10072   return {
10073     x: (x1 + x2 + x21 / l * r21) / 2,
10074     y: (y1 + y2 + y21 / l * r21) / 2,
10075     r: (l + r1 + r2) / 2
10076   };
10077 }
10078
10079 function encloseBasis3(a, b, c) {
10080   var x1 = a.x, y1 = a.y, r1 = a.r,
10081       x2 = b.x, y2 = b.y, r2 = b.r,
10082       x3 = c.x, y3 = c.y, r3 = c.r,
10083       a2 = x1 - x2,
10084       a3 = x1 - x3,
10085       b2 = y1 - y2,
10086       b3 = y1 - y3,
10087       c2 = r2 - r1,
10088       c3 = r3 - r1,
10089       d1 = x1 * x1 + y1 * y1 - r1 * r1,
10090       d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10091       d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10092       ab = a3 * b2 - a2 * b3,
10093       xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10094       xb = (b3 * c2 - b2 * c3) / ab,
10095       ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10096       yb = (a2 * c3 - a3 * c2) / ab,
10097       A = xb * xb + yb * yb - 1,
10098       B = 2 * (r1 + xa * xb + ya * yb),
10099       C = xa * xa + ya * ya - r1 * r1,
10100       r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10101   return {
10102     x: x1 + xa + xb * r,
10103     y: y1 + ya + yb * r,
10104     r: r
10105   };
10106 }
10107
10108 function place(a, b, c) {
10109   var ax = a.x,
10110       ay = a.y,
10111       da = b.r + c.r,
10112       db = a.r + c.r,
10113       dx = b.x - ax,
10114       dy = b.y - ay,
10115       dc = dx * dx + dy * dy;
10116   if (dc) {
10117     var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10118         y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10119     c.x = ax + x * dx + y * dy;
10120     c.y = ay + x * dy - y * dx;
10121   } else {
10122     c.x = ax + db;
10123     c.y = ay;
10124   }
10125 }
10126
10127 function intersects(a, b) {
10128   var dx = b.x - a.x,
10129       dy = b.y - a.y,
10130       dr = a.r + b.r;
10131   return dr * dr - 1e-6 > dx * dx + dy * dy;
10132 }
10133
10134 function score(node) {
10135   var a = node._,
10136       b = node.next._,
10137       ab = a.r + b.r,
10138       dx = (a.x * b.r + b.x * a.r) / ab,
10139       dy = (a.y * b.r + b.y * a.r) / ab;
10140   return dx * dx + dy * dy;
10141 }
10142
10143 function Node$1(circle) {
10144   this._ = circle;
10145   this.next = null;
10146   this.previous = null;
10147 }
10148
10149 function packEnclose(circles) {
10150   if (!(n = circles.length)) return 0;
10151
10152   var a, b, c, n, aa, ca, i, j, k, sj, sk;
10153
10154   // Place the first circle.
10155   a = circles[0], a.x = 0, a.y = 0;
10156   if (!(n > 1)) return a.r;
10157
10158   // Place the second circle.
10159   b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10160   if (!(n > 2)) return a.r + b.r;
10161
10162   // Place the third circle.
10163   place(b, a, c = circles[2]);
10164
10165   // Initialize the front-chain using the first three circles a, b and c.
10166   a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10167   a.next = c.previous = b;
10168   b.next = a.previous = c;
10169   c.next = b.previous = a;
10170
10171   // Attempt to place each remaining circle…
10172   pack: for (i = 3; i < n; ++i) {
10173     place(a._, b._, c = circles[i]), c = new Node$1(c);
10174
10175     // Find the closest intersecting circle on the front-chain, if any.
10176     // “Closeness” is determined by linear distance along the front-chain.
10177     // “Ahead” or “behind” is likewise determined by linear distance.
10178     j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10179     do {
10180       if (sj <= sk) {
10181         if (intersects(j._, c._)) {
10182           b = j, a.next = b, b.previous = a, --i;
10183           continue pack;
10184         }
10185         sj += j._.r, j = j.next;
10186       } else {
10187         if (intersects(k._, c._)) {
10188           a = k, a.next = b, b.previous = a, --i;
10189           continue pack;
10190         }
10191         sk += k._.r, k = k.previous;
10192       }
10193     } while (j !== k.next);
10194
10195     // Success! Insert the new circle c between a and b.
10196     c.previous = a, c.next = b, a.next = b.previous = b = c;
10197
10198     // Compute the new closest circle pair to the centroid.
10199     aa = score(a);
10200     while ((c = c.next) !== b) {
10201       if ((ca = score(c)) < aa) {
10202         a = c, aa = ca;
10203       }
10204     }
10205     b = a.next;
10206   }
10207
10208   // Compute the enclosing circle of the front chain.
10209   a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10210
10211   // Translate the circles to put the enclosing circle around the origin.
10212   for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10213
10214   return c.r;
10215 }
10216
10217 var siblings = function(circles) {
10218   packEnclose(circles);
10219   return circles;
10220 };
10221
10222 function optional(f) {
10223   return f == null ? null : required(f);
10224 }
10225
10226 function required(f) {
10227   if (typeof f !== "function") throw new Error;
10228   return f;
10229 }
10230
10231 function constantZero() {
10232   return 0;
10233 }
10234
10235 var constant$8 = function(x) {
10236   return function() {
10237     return x;
10238   };
10239 };
10240
10241 function defaultRadius$1(d) {
10242   return Math.sqrt(d.value);
10243 }
10244
10245 var index$2 = function() {
10246   var radius = null,
10247       dx = 1,
10248       dy = 1,
10249       padding = constantZero;
10250
10251   function pack(root) {
10252     root.x = dx / 2, root.y = dy / 2;
10253     if (radius) {
10254       root.eachBefore(radiusLeaf(radius))
10255           .eachAfter(packChildren(padding, 0.5))
10256           .eachBefore(translateChild(1));
10257     } else {
10258       root.eachBefore(radiusLeaf(defaultRadius$1))
10259           .eachAfter(packChildren(constantZero, 1))
10260           .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10261           .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10262     }
10263     return root;
10264   }
10265
10266   pack.radius = function(x) {
10267     return arguments.length ? (radius = optional(x), pack) : radius;
10268   };
10269
10270   pack.size = function(x) {
10271     return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10272   };
10273
10274   pack.padding = function(x) {
10275     return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10276   };
10277
10278   return pack;
10279 };
10280
10281 function radiusLeaf(radius) {
10282   return function(node) {
10283     if (!node.children) {
10284       node.r = Math.max(0, +radius(node) || 0);
10285     }
10286   };
10287 }
10288
10289 function packChildren(padding, k) {
10290   return function(node) {
10291     if (children = node.children) {
10292       var children,
10293           i,
10294           n = children.length,
10295           r = padding(node) * k || 0,
10296           e;
10297
10298       if (r) for (i = 0; i < n; ++i) children[i].r += r;
10299       e = packEnclose(children);
10300       if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10301       node.r = e + r;
10302     }
10303   };
10304 }
10305
10306 function translateChild(k) {
10307   return function(node) {
10308     var parent = node.parent;
10309     node.r *= k;
10310     if (parent) {
10311       node.x = parent.x + k * node.x;
10312       node.y = parent.y + k * node.y;
10313     }
10314   };
10315 }
10316
10317 var roundNode = function(node) {
10318   node.x0 = Math.round(node.x0);
10319   node.y0 = Math.round(node.y0);
10320   node.x1 = Math.round(node.x1);
10321   node.y1 = Math.round(node.y1);
10322 };
10323
10324 var treemapDice = function(parent, x0, y0, x1, y1) {
10325   var nodes = parent.children,
10326       node,
10327       i = -1,
10328       n = nodes.length,
10329       k = parent.value && (x1 - x0) / parent.value;
10330
10331   while (++i < n) {
10332     node = nodes[i], node.y0 = y0, node.y1 = y1;
10333     node.x0 = x0, node.x1 = x0 += node.value * k;
10334   }
10335 };
10336
10337 var partition = function() {
10338   var dx = 1,
10339       dy = 1,
10340       padding = 0,
10341       round = false;
10342
10343   function partition(root) {
10344     var n = root.height + 1;
10345     root.x0 =
10346     root.y0 = padding;
10347     root.x1 = dx;
10348     root.y1 = dy / n;
10349     root.eachBefore(positionNode(dy, n));
10350     if (round) root.eachBefore(roundNode);
10351     return root;
10352   }
10353
10354   function positionNode(dy, n) {
10355     return function(node) {
10356       if (node.children) {
10357         treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10358       }
10359       var x0 = node.x0,
10360           y0 = node.y0,
10361           x1 = node.x1 - padding,
10362           y1 = node.y1 - padding;
10363       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10364       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10365       node.x0 = x0;
10366       node.y0 = y0;
10367       node.x1 = x1;
10368       node.y1 = y1;
10369     };
10370   }
10371
10372   partition.round = function(x) {
10373     return arguments.length ? (round = !!x, partition) : round;
10374   };
10375
10376   partition.size = function(x) {
10377     return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10378   };
10379
10380   partition.padding = function(x) {
10381     return arguments.length ? (padding = +x, partition) : padding;
10382   };
10383
10384   return partition;
10385 };
10386
10387 var keyPrefix$1 = "$";
10388 var preroot = {depth: -1};
10389 var ambiguous = {};
10390
10391 function defaultId(d) {
10392   return d.id;
10393 }
10394
10395 function defaultParentId(d) {
10396   return d.parentId;
10397 }
10398
10399 var stratify = function() {
10400   var id = defaultId,
10401       parentId = defaultParentId;
10402
10403   function stratify(data) {
10404     var d,
10405         i,
10406         n = data.length,
10407         root,
10408         parent,
10409         node,
10410         nodes = new Array(n),
10411         nodeId,
10412         nodeKey,
10413         nodeByKey = {};
10414
10415     for (i = 0; i < n; ++i) {
10416       d = data[i], node = nodes[i] = new Node(d);
10417       if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10418         nodeKey = keyPrefix$1 + (node.id = nodeId);
10419         nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10420       }
10421     }
10422
10423     for (i = 0; i < n; ++i) {
10424       node = nodes[i], nodeId = parentId(data[i], i, data);
10425       if (nodeId == null || !(nodeId += "")) {
10426         if (root) throw new Error("multiple roots");
10427         root = node;
10428       } else {
10429         parent = nodeByKey[keyPrefix$1 + nodeId];
10430         if (!parent) throw new Error("missing: " + nodeId);
10431         if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10432         if (parent.children) parent.children.push(node);
10433         else parent.children = [node];
10434         node.parent = parent;
10435       }
10436     }
10437
10438     if (!root) throw new Error("no root");
10439     root.parent = preroot;
10440     root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10441     root.parent = null;
10442     if (n > 0) throw new Error("cycle");
10443
10444     return root;
10445   }
10446
10447   stratify.id = function(x) {
10448     return arguments.length ? (id = required(x), stratify) : id;
10449   };
10450
10451   stratify.parentId = function(x) {
10452     return arguments.length ? (parentId = required(x), stratify) : parentId;
10453   };
10454
10455   return stratify;
10456 };
10457
10458 function defaultSeparation$1(a, b) {
10459   return a.parent === b.parent ? 1 : 2;
10460 }
10461
10462 // function radialSeparation(a, b) {
10463 //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10464 // }
10465
10466 // This function is used to traverse the left contour of a subtree (or
10467 // subforest). It returns the successor of v on this contour. This successor is
10468 // either given by the leftmost child of v or by the thread of v. The function
10469 // returns null if and only if v is on the highest level of its subtree.
10470 function nextLeft(v) {
10471   var children = v.children;
10472   return children ? children[0] : v.t;
10473 }
10474
10475 // This function works analogously to nextLeft.
10476 function nextRight(v) {
10477   var children = v.children;
10478   return children ? children[children.length - 1] : v.t;
10479 }
10480
10481 // Shifts the current subtree rooted at w+. This is done by increasing
10482 // prelim(w+) and mod(w+) by shift.
10483 function moveSubtree(wm, wp, shift) {
10484   var change = shift / (wp.i - wm.i);
10485   wp.c -= change;
10486   wp.s += shift;
10487   wm.c += change;
10488   wp.z += shift;
10489   wp.m += shift;
10490 }
10491
10492 // All other shifts, applied to the smaller subtrees between w- and w+, are
10493 // performed by this function. To prepare the shifts, we have to adjust
10494 // change(w+), shift(w+), and change(w-).
10495 function executeShifts(v) {
10496   var shift = 0,
10497       change = 0,
10498       children = v.children,
10499       i = children.length,
10500       w;
10501   while (--i >= 0) {
10502     w = children[i];
10503     w.z += shift;
10504     w.m += shift;
10505     shift += w.s + (change += w.c);
10506   }
10507 }
10508
10509 // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10510 // returns the specified (default) ancestor.
10511 function nextAncestor(vim, v, ancestor) {
10512   return vim.a.parent === v.parent ? vim.a : ancestor;
10513 }
10514
10515 function TreeNode(node, i) {
10516   this._ = node;
10517   this.parent = null;
10518   this.children = null;
10519   this.A = null; // default ancestor
10520   this.a = this; // ancestor
10521   this.z = 0; // prelim
10522   this.m = 0; // mod
10523   this.c = 0; // change
10524   this.s = 0; // shift
10525   this.t = null; // thread
10526   this.i = i; // number
10527 }
10528
10529 TreeNode.prototype = Object.create(Node.prototype);
10530
10531 function treeRoot(root) {
10532   var tree = new TreeNode(root, 0),
10533       node,
10534       nodes = [tree],
10535       child,
10536       children,
10537       i,
10538       n;
10539
10540   while (node = nodes.pop()) {
10541     if (children = node._.children) {
10542       node.children = new Array(n = children.length);
10543       for (i = n - 1; i >= 0; --i) {
10544         nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10545         child.parent = node;
10546       }
10547     }
10548   }
10549
10550   (tree.parent = new TreeNode(null, 0)).children = [tree];
10551   return tree;
10552 }
10553
10554 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10555 var tree = function() {
10556   var separation = defaultSeparation$1,
10557       dx = 1,
10558       dy = 1,
10559       nodeSize = null;
10560
10561   function tree(root) {
10562     var t = treeRoot(root);
10563
10564     // Compute the layout using Buchheim et al.’s algorithm.
10565     t.eachAfter(firstWalk), t.parent.m = -t.z;
10566     t.eachBefore(secondWalk);
10567
10568     // If a fixed node size is specified, scale x and y.
10569     if (nodeSize) root.eachBefore(sizeNode);
10570
10571     // If a fixed tree size is specified, scale x and y based on the extent.
10572     // Compute the left-most, right-most, and depth-most nodes for extents.
10573     else {
10574       var left = root,
10575           right = root,
10576           bottom = root;
10577       root.eachBefore(function(node) {
10578         if (node.x < left.x) left = node;
10579         if (node.x > right.x) right = node;
10580         if (node.depth > bottom.depth) bottom = node;
10581       });
10582       var s = left === right ? 1 : separation(left, right) / 2,
10583           tx = s - left.x,
10584           kx = dx / (right.x + s + tx),
10585           ky = dy / (bottom.depth || 1);
10586       root.eachBefore(function(node) {
10587         node.x = (node.x + tx) * kx;
10588         node.y = node.depth * ky;
10589       });
10590     }
10591
10592     return root;
10593   }
10594
10595   // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10596   // applied recursively to the children of v, as well as the function
10597   // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10598   // node v is placed to the midpoint of its outermost children.
10599   function firstWalk(v) {
10600     var children = v.children,
10601         siblings = v.parent.children,
10602         w = v.i ? siblings[v.i - 1] : null;
10603     if (children) {
10604       executeShifts(v);
10605       var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10606       if (w) {
10607         v.z = w.z + separation(v._, w._);
10608         v.m = v.z - midpoint;
10609       } else {
10610         v.z = midpoint;
10611       }
10612     } else if (w) {
10613       v.z = w.z + separation(v._, w._);
10614     }
10615     v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10616   }
10617
10618   // Computes all real x-coordinates by summing up the modifiers recursively.
10619   function secondWalk(v) {
10620     v._.x = v.z + v.parent.m;
10621     v.m += v.parent.m;
10622   }
10623
10624   // The core of the algorithm. Here, a new subtree is combined with the
10625   // previous subtrees. Threads are used to traverse the inside and outside
10626   // contours of the left and right subtree up to the highest common level. The
10627   // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10628   // superscript o means outside and i means inside, the subscript - means left
10629   // subtree and + means right subtree. For summing up the modifiers along the
10630   // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10631   // nodes of the inside contours conflict, we compute the left one of the
10632   // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10633   // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10634   // Finally, we add a new thread (if necessary).
10635   function apportion(v, w, ancestor) {
10636     if (w) {
10637       var vip = v,
10638           vop = v,
10639           vim = w,
10640           vom = vip.parent.children[0],
10641           sip = vip.m,
10642           sop = vop.m,
10643           sim = vim.m,
10644           som = vom.m,
10645           shift;
10646       while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10647         vom = nextLeft(vom);
10648         vop = nextRight(vop);
10649         vop.a = v;
10650         shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10651         if (shift > 0) {
10652           moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10653           sip += shift;
10654           sop += shift;
10655         }
10656         sim += vim.m;
10657         sip += vip.m;
10658         som += vom.m;
10659         sop += vop.m;
10660       }
10661       if (vim && !nextRight(vop)) {
10662         vop.t = vim;
10663         vop.m += sim - sop;
10664       }
10665       if (vip && !nextLeft(vom)) {
10666         vom.t = vip;
10667         vom.m += sip - som;
10668         ancestor = v;
10669       }
10670     }
10671     return ancestor;
10672   }
10673
10674   function sizeNode(node) {
10675     node.x *= dx;
10676     node.y = node.depth * dy;
10677   }
10678
10679   tree.separation = function(x) {
10680     return arguments.length ? (separation = x, tree) : separation;
10681   };
10682
10683   tree.size = function(x) {
10684     return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10685   };
10686
10687   tree.nodeSize = function(x) {
10688     return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10689   };
10690
10691   return tree;
10692 };
10693
10694 var treemapSlice = function(parent, x0, y0, x1, y1) {
10695   var nodes = parent.children,
10696       node,
10697       i = -1,
10698       n = nodes.length,
10699       k = parent.value && (y1 - y0) / parent.value;
10700
10701   while (++i < n) {
10702     node = nodes[i], node.x0 = x0, node.x1 = x1;
10703     node.y0 = y0, node.y1 = y0 += node.value * k;
10704   }
10705 };
10706
10707 var phi = (1 + Math.sqrt(5)) / 2;
10708
10709 function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10710   var rows = [],
10711       nodes = parent.children,
10712       row,
10713       nodeValue,
10714       i0 = 0,
10715       i1 = 0,
10716       n = nodes.length,
10717       dx, dy,
10718       value = parent.value,
10719       sumValue,
10720       minValue,
10721       maxValue,
10722       newRatio,
10723       minRatio,
10724       alpha,
10725       beta;
10726
10727   while (i0 < n) {
10728     dx = x1 - x0, dy = y1 - y0;
10729
10730     // Find the next non-empty node.
10731     do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10732     minValue = maxValue = sumValue;
10733     alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10734     beta = sumValue * sumValue * alpha;
10735     minRatio = Math.max(maxValue / beta, beta / minValue);
10736
10737     // Keep adding nodes while the aspect ratio maintains or improves.
10738     for (; i1 < n; ++i1) {
10739       sumValue += nodeValue = nodes[i1].value;
10740       if (nodeValue < minValue) minValue = nodeValue;
10741       if (nodeValue > maxValue) maxValue = nodeValue;
10742       beta = sumValue * sumValue * alpha;
10743       newRatio = Math.max(maxValue / beta, beta / minValue);
10744       if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10745       minRatio = newRatio;
10746     }
10747
10748     // Position and record the row orientation.
10749     rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10750     if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10751     else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10752     value -= sumValue, i0 = i1;
10753   }
10754
10755   return rows;
10756 }
10757
10758 var squarify = (function custom(ratio) {
10759
10760   function squarify(parent, x0, y0, x1, y1) {
10761     squarifyRatio(ratio, parent, x0, y0, x1, y1);
10762   }
10763
10764   squarify.ratio = function(x) {
10765     return custom((x = +x) > 1 ? x : 1);
10766   };
10767
10768   return squarify;
10769 })(phi);
10770
10771 var index$3 = function() {
10772   var tile = squarify,
10773       round = false,
10774       dx = 1,
10775       dy = 1,
10776       paddingStack = [0],
10777       paddingInner = constantZero,
10778       paddingTop = constantZero,
10779       paddingRight = constantZero,
10780       paddingBottom = constantZero,
10781       paddingLeft = constantZero;
10782
10783   function treemap(root) {
10784     root.x0 =
10785     root.y0 = 0;
10786     root.x1 = dx;
10787     root.y1 = dy;
10788     root.eachBefore(positionNode);
10789     paddingStack = [0];
10790     if (round) root.eachBefore(roundNode);
10791     return root;
10792   }
10793
10794   function positionNode(node) {
10795     var p = paddingStack[node.depth],
10796         x0 = node.x0 + p,
10797         y0 = node.y0 + p,
10798         x1 = node.x1 - p,
10799         y1 = node.y1 - p;
10800     if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10801     if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10802     node.x0 = x0;
10803     node.y0 = y0;
10804     node.x1 = x1;
10805     node.y1 = y1;
10806     if (node.children) {
10807       p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10808       x0 += paddingLeft(node) - p;
10809       y0 += paddingTop(node) - p;
10810       x1 -= paddingRight(node) - p;
10811       y1 -= paddingBottom(node) - p;
10812       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10813       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10814       tile(node, x0, y0, x1, y1);
10815     }
10816   }
10817
10818   treemap.round = function(x) {
10819     return arguments.length ? (round = !!x, treemap) : round;
10820   };
10821
10822   treemap.size = function(x) {
10823     return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10824   };
10825
10826   treemap.tile = function(x) {
10827     return arguments.length ? (tile = required(x), treemap) : tile;
10828   };
10829
10830   treemap.padding = function(x) {
10831     return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10832   };
10833
10834   treemap.paddingInner = function(x) {
10835     return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10836   };
10837
10838   treemap.paddingOuter = function(x) {
10839     return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10840   };
10841
10842   treemap.paddingTop = function(x) {
10843     return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10844   };
10845
10846   treemap.paddingRight = function(x) {
10847     return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10848   };
10849
10850   treemap.paddingBottom = function(x) {
10851     return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10852   };
10853
10854   treemap.paddingLeft = function(x) {
10855     return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10856   };
10857
10858   return treemap;
10859 };
10860
10861 var binary = function(parent, x0, y0, x1, y1) {
10862   var nodes = parent.children,
10863       i, n = nodes.length,
10864       sum, sums = new Array(n + 1);
10865
10866   for (sums[0] = sum = i = 0; i < n; ++i) {
10867     sums[i + 1] = sum += nodes[i].value;
10868   }
10869
10870   partition(0, n, parent.value, x0, y0, x1, y1);
10871
10872   function partition(i, j, value, x0, y0, x1, y1) {
10873     if (i >= j - 1) {
10874       var node = nodes[i];
10875       node.x0 = x0, node.y0 = y0;
10876       node.x1 = x1, node.y1 = y1;
10877       return;
10878     }
10879
10880     var valueOffset = sums[i],
10881         valueTarget = (value / 2) + valueOffset,
10882         k = i + 1,
10883         hi = j - 1;
10884
10885     while (k < hi) {
10886       var mid = k + hi >>> 1;
10887       if (sums[mid] < valueTarget) k = mid + 1;
10888       else hi = mid;
10889     }
10890
10891     if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10892
10893     var valueLeft = sums[k] - valueOffset,
10894         valueRight = value - valueLeft;
10895
10896     if ((x1 - x0) > (y1 - y0)) {
10897       var xk = (x0 * valueRight + x1 * valueLeft) / value;
10898       partition(i, k, valueLeft, x0, y0, xk, y1);
10899       partition(k, j, valueRight, xk, y0, x1, y1);
10900     } else {
10901       var yk = (y0 * valueRight + y1 * valueLeft) / value;
10902       partition(i, k, valueLeft, x0, y0, x1, yk);
10903       partition(k, j, valueRight, x0, yk, x1, y1);
10904     }
10905   }
10906 };
10907
10908 var sliceDice = function(parent, x0, y0, x1, y1) {
10909   (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10910 };
10911
10912 var resquarify = (function custom(ratio) {
10913
10914   function resquarify(parent, x0, y0, x1, y1) {
10915     if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10916       var rows,
10917           row,
10918           nodes,
10919           i,
10920           j = -1,
10921           n,
10922           m = rows.length,
10923           value = parent.value;
10924
10925       while (++j < m) {
10926         row = rows[j], nodes = row.children;
10927         for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10928         if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10929         else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10930         value -= row.value;
10931       }
10932     } else {
10933       parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10934       rows.ratio = ratio;
10935     }
10936   }
10937
10938   resquarify.ratio = function(x) {
10939     return custom((x = +x) > 1 ? x : 1);
10940   };
10941
10942   return resquarify;
10943 })(phi);
10944
10945 var d3_polygonArea = function(polygon) {
10946   var i = -1,
10947       n = polygon.length,
10948       a,
10949       b = polygon[n - 1],
10950       area = 0;
10951
10952   while (++i < n) {
10953     a = b;
10954     b = polygon[i];
10955     area += a[1] * b[0] - a[0] * b[1];
10956   }
10957
10958   return area / 2;
10959 };
10960
10961 var d3_polygonCentroid = function(polygon) {
10962   var i = -1,
10963       n = polygon.length,
10964       x = 0,
10965       y = 0,
10966       a,
10967       b = polygon[n - 1],
10968       c,
10969       k = 0;
10970
10971   while (++i < n) {
10972     a = b;
10973     b = polygon[i];
10974     k += c = a[0] * b[1] - b[0] * a[1];
10975     x += (a[0] + b[0]) * c;
10976     y += (a[1] + b[1]) * c;
10977   }
10978
10979   return k *= 3, [x / k, y / k];
10980 };
10981
10982 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
10983 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
10984 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
10985 // negative if clockwise, and zero if the points are collinear.
10986 var cross$1 = function(a, b, c) {
10987   return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
10988 };
10989
10990 function lexicographicOrder(a, b) {
10991   return a[0] - b[0] || a[1] - b[1];
10992 }
10993
10994 // Computes the upper convex hull per the monotone chain algorithm.
10995 // Assumes points.length >= 3, is sorted by x, unique in y.
10996 // Returns an array of indices into points in left-to-right order.
10997 function computeUpperHullIndexes(points) {
10998   var n = points.length,
10999       indexes = [0, 1],
11000       size = 2;
11001
11002   for (var i = 2; i < n; ++i) {
11003     while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11004     indexes[size++] = i;
11005   }
11006
11007   return indexes.slice(0, size); // remove popped points
11008 }
11009
11010 var d3_polygonHull = function(points) {
11011   if ((n = points.length) < 3) return null;
11012
11013   var i,
11014       n,
11015       sortedPoints = new Array(n),
11016       flippedPoints = new Array(n);
11017
11018   for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11019   sortedPoints.sort(lexicographicOrder);
11020   for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11021
11022   var upperIndexes = computeUpperHullIndexes(sortedPoints),
11023       lowerIndexes = computeUpperHullIndexes(flippedPoints);
11024
11025   // Construct the hull polygon, removing possible duplicate endpoints.
11026   var skipLeft = lowerIndexes[0] === upperIndexes[0],
11027       skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11028       hull = [];
11029
11030   // Add upper hull in right-to-l order.
11031   // Then add lower hull in left-to-right order.
11032   for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11033   for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11034
11035   return hull;
11036 };
11037
11038 var contains$1 = function(polygon, point) {
11039   var n = polygon.length,
11040       p = polygon[n - 1],
11041       x = point[0], y = point[1],
11042       x0 = p[0], y0 = p[1],
11043       x1, y1,
11044       inside = false;
11045
11046   for (var i = 0; i < n; ++i) {
11047     p = polygon[i], x1 = p[0], y1 = p[1];
11048     if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11049     x0 = x1, y0 = y1;
11050   }
11051
11052   return inside;
11053 };
11054
11055 var length$1 = function(polygon) {
11056   var i = -1,
11057       n = polygon.length,
11058       b = polygon[n - 1],
11059       xa,
11060       ya,
11061       xb = b[0],
11062       yb = b[1],
11063       perimeter = 0;
11064
11065   while (++i < n) {
11066     xa = xb;
11067     ya = yb;
11068     b = polygon[i];
11069     xb = b[0];
11070     yb = b[1];
11071     xa -= xb;
11072     ya -= yb;
11073     perimeter += Math.sqrt(xa * xa + ya * ya);
11074   }
11075
11076   return perimeter;
11077 };
11078
11079 var slice$4 = [].slice;
11080
11081 var noabort = {};
11082
11083 function Queue(size) {
11084   this._size = size;
11085   this._call =
11086   this._error = null;
11087   this._tasks = [];
11088   this._data = [];
11089   this._waiting =
11090   this._active =
11091   this._ended =
11092   this._start = 0; // inside a synchronous task callback?
11093 }
11094
11095 Queue.prototype = queue.prototype = {
11096   constructor: Queue,
11097   defer: function(callback) {
11098     if (typeof callback !== "function") throw new Error("invalid callback");
11099     if (this._call) throw new Error("defer after await");
11100     if (this._error != null) return this;
11101     var t = slice$4.call(arguments, 1);
11102     t.push(callback);
11103     ++this._waiting, this._tasks.push(t);
11104     poke$1(this);
11105     return this;
11106   },
11107   abort: function() {
11108     if (this._error == null) abort(this, new Error("abort"));
11109     return this;
11110   },
11111   await: function(callback) {
11112     if (typeof callback !== "function") throw new Error("invalid callback");
11113     if (this._call) throw new Error("multiple await");
11114     this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11115     maybeNotify(this);
11116     return this;
11117   },
11118   awaitAll: function(callback) {
11119     if (typeof callback !== "function") throw new Error("invalid callback");
11120     if (this._call) throw new Error("multiple await");
11121     this._call = callback;
11122     maybeNotify(this);
11123     return this;
11124   }
11125 };
11126
11127 function poke$1(q) {
11128   if (!q._start) {
11129     try { start$1(q); } // let the current task complete
11130     catch (e) {
11131       if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11132       else if (!q._data) throw e; // await callback errored synchronously
11133     }
11134   }
11135 }
11136
11137 function start$1(q) {
11138   while (q._start = q._waiting && q._active < q._size) {
11139     var i = q._ended + q._active,
11140         t = q._tasks[i],
11141         j = t.length - 1,
11142         c = t[j];
11143     t[j] = end(q, i);
11144     --q._waiting, ++q._active;
11145     t = c.apply(null, t);
11146     if (!q._tasks[i]) continue; // task finished synchronously
11147     q._tasks[i] = t || noabort;
11148   }
11149 }
11150
11151 function end(q, i) {
11152   return function(e, r) {
11153     if (!q._tasks[i]) return; // ignore multiple callbacks
11154     --q._active, ++q._ended;
11155     q._tasks[i] = null;
11156     if (q._error != null) return; // ignore secondary errors
11157     if (e != null) {
11158       abort(q, e);
11159     } else {
11160       q._data[i] = r;
11161       if (q._waiting) poke$1(q);
11162       else maybeNotify(q);
11163     }
11164   };
11165 }
11166
11167 function abort(q, e) {
11168   var i = q._tasks.length, t;
11169   q._error = e; // ignore active callbacks
11170   q._data = undefined; // allow gc
11171   q._waiting = NaN; // prevent starting
11172
11173   while (--i >= 0) {
11174     if (t = q._tasks[i]) {
11175       q._tasks[i] = null;
11176       if (t.abort) {
11177         try { t.abort(); }
11178         catch (e) { /* ignore */ }
11179       }
11180     }
11181   }
11182
11183   q._active = NaN; // allow notification
11184   maybeNotify(q);
11185 }
11186
11187 function maybeNotify(q) {
11188   if (!q._active && q._call) {
11189     var d = q._data;
11190     q._data = undefined; // allow gc
11191     q._call(q._error, d);
11192   }
11193 }
11194
11195 function queue(concurrency) {
11196   if (concurrency == null) concurrency = Infinity;
11197   else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11198   return new Queue(concurrency);
11199 }
11200
11201 var defaultSource$1 = function() {
11202   return Math.random();
11203 };
11204
11205 var uniform = (function sourceRandomUniform(source) {
11206   function randomUniform(min, max) {
11207     min = min == null ? 0 : +min;
11208     max = max == null ? 1 : +max;
11209     if (arguments.length === 1) max = min, min = 0;
11210     else max -= min;
11211     return function() {
11212       return source() * max + min;
11213     };
11214   }
11215
11216   randomUniform.source = sourceRandomUniform;
11217
11218   return randomUniform;
11219 })(defaultSource$1);
11220
11221 var normal = (function sourceRandomNormal(source) {
11222   function randomNormal(mu, sigma) {
11223     var x, r;
11224     mu = mu == null ? 0 : +mu;
11225     sigma = sigma == null ? 1 : +sigma;
11226     return function() {
11227       var y;
11228
11229       // If available, use the second previously-generated uniform random.
11230       if (x != null) y = x, x = null;
11231
11232       // Otherwise, generate a new x and y.
11233       else do {
11234         x = source() * 2 - 1;
11235         y = source() * 2 - 1;
11236         r = x * x + y * y;
11237       } while (!r || r > 1);
11238
11239       return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11240     };
11241   }
11242
11243   randomNormal.source = sourceRandomNormal;
11244
11245   return randomNormal;
11246 })(defaultSource$1);
11247
11248 var logNormal = (function sourceRandomLogNormal(source) {
11249   function randomLogNormal() {
11250     var randomNormal = normal.source(source).apply(this, arguments);
11251     return function() {
11252       return Math.exp(randomNormal());
11253     };
11254   }
11255
11256   randomLogNormal.source = sourceRandomLogNormal;
11257
11258   return randomLogNormal;
11259 })(defaultSource$1);
11260
11261 var irwinHall = (function sourceRandomIrwinHall(source) {
11262   function randomIrwinHall(n) {
11263     return function() {
11264       for (var sum = 0, i = 0; i < n; ++i) sum += source();
11265       return sum;
11266     };
11267   }
11268
11269   randomIrwinHall.source = sourceRandomIrwinHall;
11270
11271   return randomIrwinHall;
11272 })(defaultSource$1);
11273
11274 var bates = (function sourceRandomBates(source) {
11275   function randomBates(n) {
11276     var randomIrwinHall = irwinHall.source(source)(n);
11277     return function() {
11278       return randomIrwinHall() / n;
11279     };
11280   }
11281
11282   randomBates.source = sourceRandomBates;
11283
11284   return randomBates;
11285 })(defaultSource$1);
11286
11287 var exponential$1 = (function sourceRandomExponential(source) {
11288   function randomExponential(lambda) {
11289     return function() {
11290       return -Math.log(1 - source()) / lambda;
11291     };
11292   }
11293
11294   randomExponential.source = sourceRandomExponential;
11295
11296   return randomExponential;
11297 })(defaultSource$1);
11298
11299 var d3_request = function(url, callback) {
11300   var request,
11301       event = dispatch("beforesend", "progress", "load", "error"),
11302       mimeType,
11303       headers = map$1(),
11304       xhr = new XMLHttpRequest,
11305       user = null,
11306       password = null,
11307       response,
11308       responseType,
11309       timeout = 0;
11310
11311   // If IE does not support CORS, use XDomainRequest.
11312   if (typeof XDomainRequest !== "undefined"
11313       && !("withCredentials" in xhr)
11314       && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11315
11316   "onload" in xhr
11317       ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11318       : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11319
11320   function respond(o) {
11321     var status = xhr.status, result;
11322     if (!status && hasResponse(xhr)
11323         || status >= 200 && status < 300
11324         || status === 304) {
11325       if (response) {
11326         try {
11327           result = response.call(request, xhr);
11328         } catch (e) {
11329           event.call("error", request, e);
11330           return;
11331         }
11332       } else {
11333         result = xhr;
11334       }
11335       event.call("load", request, result);
11336     } else {
11337       event.call("error", request, o);
11338     }
11339   }
11340
11341   xhr.onprogress = function(e) {
11342     event.call("progress", request, e);
11343   };
11344
11345   request = {
11346     header: function(name, value) {
11347       name = (name + "").toLowerCase();
11348       if (arguments.length < 2) return headers.get(name);
11349       if (value == null) headers.remove(name);
11350       else headers.set(name, value + "");
11351       return request;
11352     },
11353
11354     // If mimeType is non-null and no Accept header is set, a default is used.
11355     mimeType: function(value) {
11356       if (!arguments.length) return mimeType;
11357       mimeType = value == null ? null : value + "";
11358       return request;
11359     },
11360
11361     // Specifies what type the response value should take;
11362     // for instance, arraybuffer, blob, document, or text.
11363     responseType: function(value) {
11364       if (!arguments.length) return responseType;
11365       responseType = value;
11366       return request;
11367     },
11368
11369     timeout: function(value) {
11370       if (!arguments.length) return timeout;
11371       timeout = +value;
11372       return request;
11373     },
11374
11375     user: function(value) {
11376       return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11377     },
11378
11379     password: function(value) {
11380       return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11381     },
11382
11383     // Specify how to convert the response content to a specific type;
11384     // changes the callback value on "load" events.
11385     response: function(value) {
11386       response = value;
11387       return request;
11388     },
11389
11390     // Alias for send("GET", …).
11391     get: function(data, callback) {
11392       return request.send("GET", data, callback);
11393     },
11394
11395     // Alias for send("POST", …).
11396     post: function(data, callback) {
11397       return request.send("POST", data, callback);
11398     },
11399
11400     // If callback is non-null, it will be used for error and load events.
11401     send: function(method, data, callback) {
11402       xhr.open(method, url, true, user, password);
11403       if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11404       if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11405       if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11406       if (responseType != null) xhr.responseType = responseType;
11407       if (timeout > 0) xhr.timeout = timeout;
11408       if (callback == null && typeof data === "function") callback = data, data = null;
11409       if (callback != null && callback.length === 1) callback = fixCallback(callback);
11410       if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11411       event.call("beforesend", request, xhr);
11412       xhr.send(data == null ? null : data);
11413       return request;
11414     },
11415
11416     abort: function() {
11417       xhr.abort();
11418       return request;
11419     },
11420
11421     on: function() {
11422       var value = event.on.apply(event, arguments);
11423       return value === event ? request : value;
11424     }
11425   };
11426
11427   if (callback != null) {
11428     if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11429     return request.get(callback);
11430   }
11431
11432   return request;
11433 };
11434
11435 function fixCallback(callback) {
11436   return function(error, xhr) {
11437     callback(error == null ? xhr : null);
11438   };
11439 }
11440
11441 function hasResponse(xhr) {
11442   var type = xhr.responseType;
11443   return type && type !== "text"
11444       ? xhr.response // null on error
11445       : xhr.responseText; // "" on error
11446 }
11447
11448 var type$1 = function(defaultMimeType, response) {
11449   return function(url, callback) {
11450     var r = d3_request(url).mimeType(defaultMimeType).response(response);
11451     if (callback != null) {
11452       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11453       return r.get(callback);
11454     }
11455     return r;
11456   };
11457 };
11458
11459 var html = type$1("text/html", function(xhr) {
11460   return document.createRange().createContextualFragment(xhr.responseText);
11461 });
11462
11463 var d3_json = type$1("application/json", function(xhr) {
11464   return JSON.parse(xhr.responseText);
11465 });
11466
11467 var d3_text = type$1("text/plain", function(xhr) {
11468   return xhr.responseText;
11469 });
11470
11471 var d3_xml = type$1("application/xml", function(xhr) {
11472   var xml = xhr.responseXML;
11473   if (!xml) throw new Error("parse error");
11474   return xml;
11475 });
11476
11477 var dsv$1 = function(defaultMimeType, parse) {
11478   return function(url, row, callback) {
11479     if (arguments.length < 3) callback = row, row = null;
11480     var r = d3_request(url).mimeType(defaultMimeType);
11481     r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11482     r.row(row);
11483     return callback ? r.get(callback) : r;
11484   };
11485 };
11486
11487 function responseOf(parse, row) {
11488   return function(request) {
11489     return parse(request.responseText, row);
11490   };
11491 }
11492
11493 var csv$1 = dsv$1("text/csv", csvParse);
11494
11495 var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11496
11497 var array$2 = Array.prototype;
11498
11499 var map$3 = array$2.map;
11500 var slice$5 = array$2.slice;
11501
11502 var implicit = {name: "implicit"};
11503
11504 function ordinal(range) {
11505   var index = map$1(),
11506       domain = [],
11507       unknown = implicit;
11508
11509   range = range == null ? [] : slice$5.call(range);
11510
11511   function scale(d) {
11512     var key = d + "", i = index.get(key);
11513     if (!i) {
11514       if (unknown !== implicit) return unknown;
11515       index.set(key, i = domain.push(d));
11516     }
11517     return range[(i - 1) % range.length];
11518   }
11519
11520   scale.domain = function(_) {
11521     if (!arguments.length) return domain.slice();
11522     domain = [], index = map$1();
11523     var i = -1, n = _.length, d, key;
11524     while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11525     return scale;
11526   };
11527
11528   scale.range = function(_) {
11529     return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11530   };
11531
11532   scale.unknown = function(_) {
11533     return arguments.length ? (unknown = _, scale) : unknown;
11534   };
11535
11536   scale.copy = function() {
11537     return ordinal()
11538         .domain(domain)
11539         .range(range)
11540         .unknown(unknown);
11541   };
11542
11543   return scale;
11544 }
11545
11546 function band() {
11547   var scale = ordinal().unknown(undefined),
11548       domain = scale.domain,
11549       ordinalRange = scale.range,
11550       range = [0, 1],
11551       step,
11552       bandwidth,
11553       round = false,
11554       paddingInner = 0,
11555       paddingOuter = 0,
11556       align = 0.5;
11557
11558   delete scale.unknown;
11559
11560   function rescale() {
11561     var n = domain().length,
11562         reverse = range[1] < range[0],
11563         start = range[reverse - 0],
11564         stop = range[1 - reverse];
11565     step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11566     if (round) step = Math.floor(step);
11567     start += (stop - start - step * (n - paddingInner)) * align;
11568     bandwidth = step * (1 - paddingInner);
11569     if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11570     var values = d3_range(n).map(function(i) { return start + step * i; });
11571     return ordinalRange(reverse ? values.reverse() : values);
11572   }
11573
11574   scale.domain = function(_) {
11575     return arguments.length ? (domain(_), rescale()) : domain();
11576   };
11577
11578   scale.range = function(_) {
11579     return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
11580   };
11581
11582   scale.rangeRound = function(_) {
11583     return range = [+_[0], +_[1]], round = true, rescale();
11584   };
11585
11586   scale.bandwidth = function() {
11587     return bandwidth;
11588   };
11589
11590   scale.step = function() {
11591     return step;
11592   };
11593
11594   scale.round = function(_) {
11595     return arguments.length ? (round = !!_, rescale()) : round;
11596   };
11597
11598   scale.padding = function(_) {
11599     return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11600   };
11601
11602   scale.paddingInner = function(_) {
11603     return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11604   };
11605
11606   scale.paddingOuter = function(_) {
11607     return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11608   };
11609
11610   scale.align = function(_) {
11611     return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11612   };
11613
11614   scale.copy = function() {
11615     return band()
11616         .domain(domain())
11617         .range(range)
11618         .round(round)
11619         .paddingInner(paddingInner)
11620         .paddingOuter(paddingOuter)
11621         .align(align);
11622   };
11623
11624   return rescale();
11625 }
11626
11627 function pointish(scale) {
11628   var copy = scale.copy;
11629
11630   scale.padding = scale.paddingOuter;
11631   delete scale.paddingInner;
11632   delete scale.paddingOuter;
11633
11634   scale.copy = function() {
11635     return pointish(copy());
11636   };
11637
11638   return scale;
11639 }
11640
11641 function point$1() {
11642   return pointish(band().paddingInner(1));
11643 }
11644
11645 var constant$9 = function(x) {
11646   return function() {
11647     return x;
11648   };
11649 };
11650
11651 var number$2 = function(x) {
11652   return +x;
11653 };
11654
11655 var unit = [0, 1];
11656
11657 function deinterpolateLinear(a, b) {
11658   return (b -= (a = +a))
11659       ? function(x) { return (x - a) / b; }
11660       : constant$9(b);
11661 }
11662
11663 function deinterpolateClamp(deinterpolate) {
11664   return function(a, b) {
11665     var d = deinterpolate(a = +a, b = +b);
11666     return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11667   };
11668 }
11669
11670 function reinterpolateClamp(reinterpolate) {
11671   return function(a, b) {
11672     var r = reinterpolate(a = +a, b = +b);
11673     return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11674   };
11675 }
11676
11677 function bimap(domain, range, deinterpolate, reinterpolate) {
11678   var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
11679   if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11680   else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11681   return function(x) { return r0(d0(x)); };
11682 }
11683
11684 function polymap(domain, range, deinterpolate, reinterpolate) {
11685   var j = Math.min(domain.length, range.length) - 1,
11686       d = new Array(j),
11687       r = new Array(j),
11688       i = -1;
11689
11690   // Reverse descending domains.
11691   if (domain[j] < domain[0]) {
11692     domain = domain.slice().reverse();
11693     range = range.slice().reverse();
11694   }
11695
11696   while (++i < j) {
11697     d[i] = deinterpolate(domain[i], domain[i + 1]);
11698     r[i] = reinterpolate(range[i], range[i + 1]);
11699   }
11700
11701   return function(x) {
11702     var i = bisectRight(domain, x, 1, j) - 1;
11703     return r[i](d[i](x));
11704   };
11705 }
11706
11707 function copy(source, target) {
11708   return target
11709       .domain(source.domain())
11710       .range(source.range())
11711       .interpolate(source.interpolate())
11712       .clamp(source.clamp());
11713 }
11714
11715 // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11716 // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11717 function continuous(deinterpolate, reinterpolate) {
11718   var domain = unit,
11719       range = unit,
11720       interpolate = d3_interpolate,
11721       clamp = false,
11722       piecewise,
11723       output,
11724       input;
11725
11726   function rescale() {
11727     piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
11728     output = input = null;
11729     return scale;
11730   }
11731
11732   function scale(x) {
11733     return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);
11734   }
11735
11736   scale.invert = function(y) {
11737     return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11738   };
11739
11740   scale.domain = function(_) {
11741     return arguments.length ? (domain = map$3.call(_, number$2), rescale()) : domain.slice();
11742   };
11743
11744   scale.range = function(_) {
11745     return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
11746   };
11747
11748   scale.rangeRound = function(_) {
11749     return range = slice$5.call(_), interpolate = interpolateRound, rescale();
11750   };
11751
11752   scale.clamp = function(_) {
11753     return arguments.length ? (clamp = !!_, rescale()) : clamp;
11754   };
11755
11756   scale.interpolate = function(_) {
11757     return arguments.length ? (interpolate = _, rescale()) : interpolate;
11758   };
11759
11760   return rescale();
11761 }
11762
11763 var tickFormat = function(domain, count, specifier) {
11764   var start = domain[0],
11765       stop = domain[domain.length - 1],
11766       step = tickStep(start, stop, count == null ? 10 : count),
11767       precision;
11768   specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11769   switch (specifier.type) {
11770     case "s": {
11771       var value = Math.max(Math.abs(start), Math.abs(stop));
11772       if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11773       return formatPrefix(specifier, value);
11774     }
11775     case "":
11776     case "e":
11777     case "g":
11778     case "p":
11779     case "r": {
11780       if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11781       break;
11782     }
11783     case "f":
11784     case "%": {
11785       if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11786       break;
11787     }
11788   }
11789   return format(specifier);
11790 };
11791
11792 function linearish(scale) {
11793   var domain = scale.domain;
11794
11795   scale.ticks = function(count) {
11796     var d = domain();
11797     return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11798   };
11799
11800   scale.tickFormat = function(count, specifier) {
11801     return tickFormat(domain(), count, specifier);
11802   };
11803
11804   scale.nice = function(count) {
11805     if (count == null) count = 10;
11806
11807     var d = domain(),
11808         i0 = 0,
11809         i1 = d.length - 1,
11810         start = d[i0],
11811         stop = d[i1],
11812         step;
11813
11814     if (stop < start) {
11815       step = start, start = stop, stop = step;
11816       step = i0, i0 = i1, i1 = step;
11817     }
11818
11819     step = tickIncrement(start, stop, count);
11820
11821     if (step > 0) {
11822       start = Math.floor(start / step) * step;
11823       stop = Math.ceil(stop / step) * step;
11824       step = tickIncrement(start, stop, count);
11825     } else if (step < 0) {
11826       start = Math.ceil(start * step) / step;
11827       stop = Math.floor(stop * step) / step;
11828       step = tickIncrement(start, stop, count);
11829     }
11830
11831     if (step > 0) {
11832       d[i0] = Math.floor(start / step) * step;
11833       d[i1] = Math.ceil(stop / step) * step;
11834       domain(d);
11835     } else if (step < 0) {
11836       d[i0] = Math.ceil(start * step) / step;
11837       d[i1] = Math.floor(stop * step) / step;
11838       domain(d);
11839     }
11840
11841     return scale;
11842   };
11843
11844   return scale;
11845 }
11846
11847 function linear$2() {
11848   var scale = continuous(deinterpolateLinear, d3_interpolateNumber);
11849
11850   scale.copy = function() {
11851     return copy(scale, linear$2());
11852   };
11853
11854   return linearish(scale);
11855 }
11856
11857 function identity$5() {
11858   var domain = [0, 1];
11859
11860   function scale(x) {
11861     return +x;
11862   }
11863
11864   scale.invert = scale;
11865
11866   scale.domain = scale.range = function(_) {
11867     return arguments.length ? (domain = map$3.call(_, number$2), scale) : domain.slice();
11868   };
11869
11870   scale.copy = function() {
11871     return identity$5().domain(domain);
11872   };
11873
11874   return linearish(scale);
11875 }
11876
11877 var nice = function(domain, interval) {
11878   domain = domain.slice();
11879
11880   var i0 = 0,
11881       i1 = domain.length - 1,
11882       x0 = domain[i0],
11883       x1 = domain[i1],
11884       t;
11885
11886   if (x1 < x0) {
11887     t = i0, i0 = i1, i1 = t;
11888     t = x0, x0 = x1, x1 = t;
11889   }
11890
11891   domain[i0] = interval.floor(x0);
11892   domain[i1] = interval.ceil(x1);
11893   return domain;
11894 };
11895
11896 function deinterpolate(a, b) {
11897   return (b = Math.log(b / a))
11898       ? function(x) { return Math.log(x / a) / b; }
11899       : constant$9(b);
11900 }
11901
11902 function reinterpolate(a, b) {
11903   return a < 0
11904       ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11905       : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11906 }
11907
11908 function pow10(x) {
11909   return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11910 }
11911
11912 function powp(base) {
11913   return base === 10 ? pow10
11914       : base === Math.E ? Math.exp
11915       : function(x) { return Math.pow(base, x); };
11916 }
11917
11918 function logp(base) {
11919   return base === Math.E ? Math.log
11920       : base === 10 && Math.log10
11921       || base === 2 && Math.log2
11922       || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11923 }
11924
11925 function reflect(f) {
11926   return function(x) {
11927     return -f(-x);
11928   };
11929 }
11930
11931 function log$1() {
11932   var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11933       domain = scale.domain,
11934       base = 10,
11935       logs = logp(10),
11936       pows = powp(10);
11937
11938   function rescale() {
11939     logs = logp(base), pows = powp(base);
11940     if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11941     return scale;
11942   }
11943
11944   scale.base = function(_) {
11945     return arguments.length ? (base = +_, rescale()) : base;
11946   };
11947
11948   scale.domain = function(_) {
11949     return arguments.length ? (domain(_), rescale()) : domain();
11950   };
11951
11952   scale.ticks = function(count) {
11953     var d = domain(),
11954         u = d[0],
11955         v = d[d.length - 1],
11956         r;
11957
11958     if (r = v < u) i = u, u = v, v = i;
11959
11960     var i = logs(u),
11961         j = logs(v),
11962         p,
11963         k,
11964         t,
11965         n = count == null ? 10 : +count,
11966         z = [];
11967
11968     if (!(base % 1) && j - i < n) {
11969       i = Math.round(i) - 1, j = Math.round(j) + 1;
11970       if (u > 0) for (; i < j; ++i) {
11971         for (k = 1, p = pows(i); k < base; ++k) {
11972           t = p * k;
11973           if (t < u) continue;
11974           if (t > v) break;
11975           z.push(t);
11976         }
11977       } else for (; i < j; ++i) {
11978         for (k = base - 1, p = pows(i); k >= 1; --k) {
11979           t = p * k;
11980           if (t < u) continue;
11981           if (t > v) break;
11982           z.push(t);
11983         }
11984       }
11985     } else {
11986       z = ticks(i, j, Math.min(j - i, n)).map(pows);
11987     }
11988
11989     return r ? z.reverse() : z;
11990   };
11991
11992   scale.tickFormat = function(count, specifier) {
11993     if (specifier == null) specifier = base === 10 ? ".0e" : ",";
11994     if (typeof specifier !== "function") specifier = format(specifier);
11995     if (count === Infinity) return specifier;
11996     if (count == null) count = 10;
11997     var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
11998     return function(d) {
11999       var i = d / pows(Math.round(logs(d)));
12000       if (i * base < base - 0.5) i *= base;
12001       return i <= k ? specifier(d) : "";
12002     };
12003   };
12004
12005   scale.nice = function() {
12006     return domain(nice(domain(), {
12007       floor: function(x) { return pows(Math.floor(logs(x))); },
12008       ceil: function(x) { return pows(Math.ceil(logs(x))); }
12009     }));
12010   };
12011
12012   scale.copy = function() {
12013     return copy(scale, log$1().base(base));
12014   };
12015
12016   return scale;
12017 }
12018
12019 function raise$1(x, exponent) {
12020   return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12021 }
12022
12023 function pow$1() {
12024   var exponent = 1,
12025       scale = continuous(deinterpolate, reinterpolate),
12026       domain = scale.domain;
12027
12028   function deinterpolate(a, b) {
12029     return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12030         ? function(x) { return (raise$1(x, exponent) - a) / b; }
12031         : constant$9(b);
12032   }
12033
12034   function reinterpolate(a, b) {
12035     b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12036     return function(t) { return raise$1(a + b * t, 1 / exponent); };
12037   }
12038
12039   scale.exponent = function(_) {
12040     return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12041   };
12042
12043   scale.copy = function() {
12044     return copy(scale, pow$1().exponent(exponent));
12045   };
12046
12047   return linearish(scale);
12048 }
12049
12050 function sqrt$1() {
12051   return pow$1().exponent(0.5);
12052 }
12053
12054 function quantile() {
12055   var domain = [],
12056       range = [],
12057       thresholds = [];
12058
12059   function rescale() {
12060     var i = 0, n = Math.max(1, range.length);
12061     thresholds = new Array(n - 1);
12062     while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
12063     return scale;
12064   }
12065
12066   function scale(x) {
12067     if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
12068   }
12069
12070   scale.invertExtent = function(y) {
12071     var i = range.indexOf(y);
12072     return i < 0 ? [NaN, NaN] : [
12073       i > 0 ? thresholds[i - 1] : domain[0],
12074       i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12075     ];
12076   };
12077
12078   scale.domain = function(_) {
12079     if (!arguments.length) return domain.slice();
12080     domain = [];
12081     for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12082     domain.sort(d3_ascending);
12083     return rescale();
12084   };
12085
12086   scale.range = function(_) {
12087     return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
12088   };
12089
12090   scale.quantiles = function() {
12091     return thresholds.slice();
12092   };
12093
12094   scale.copy = function() {
12095     return quantile()
12096         .domain(domain)
12097         .range(range);
12098   };
12099
12100   return scale;
12101 }
12102
12103 function quantize() {
12104   var x0 = 0,
12105       x1 = 1,
12106       n = 1,
12107       domain = [0.5],
12108       range = [0, 1];
12109
12110   function scale(x) {
12111     if (x <= x) return range[bisectRight(domain, x, 0, n)];
12112   }
12113
12114   function rescale() {
12115     var i = -1;
12116     domain = new Array(n);
12117     while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12118     return scale;
12119   }
12120
12121   scale.domain = function(_) {
12122     return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12123   };
12124
12125   scale.range = function(_) {
12126     return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice();
12127   };
12128
12129   scale.invertExtent = function(y) {
12130     var i = range.indexOf(y);
12131     return i < 0 ? [NaN, NaN]
12132         : i < 1 ? [x0, domain[0]]
12133         : i >= n ? [domain[n - 1], x1]
12134         : [domain[i - 1], domain[i]];
12135   };
12136
12137   scale.copy = function() {
12138     return quantize()
12139         .domain([x0, x1])
12140         .range(range);
12141   };
12142
12143   return linearish(scale);
12144 }
12145
12146 function threshold$1() {
12147   var domain = [0.5],
12148       range = [0, 1],
12149       n = 1;
12150
12151   function scale(x) {
12152     if (x <= x) return range[bisectRight(domain, x, 0, n)];
12153   }
12154
12155   scale.domain = function(_) {
12156     return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
12157   };
12158
12159   scale.range = function(_) {
12160     return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
12161   };
12162
12163   scale.invertExtent = function(y) {
12164     var i = range.indexOf(y);
12165     return [domain[i - 1], domain[i]];
12166   };
12167
12168   scale.copy = function() {
12169     return threshold$1()
12170         .domain(domain)
12171         .range(range);
12172   };
12173
12174   return scale;
12175 }
12176
12177 var t0$1 = new Date;
12178 var t1$1 = new Date;
12179
12180 function newInterval(floori, offseti, count, field) {
12181
12182   function interval(date) {
12183     return floori(date = new Date(+date)), date;
12184   }
12185
12186   interval.floor = interval;
12187
12188   interval.ceil = function(date) {
12189     return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12190   };
12191
12192   interval.round = function(date) {
12193     var d0 = interval(date),
12194         d1 = interval.ceil(date);
12195     return date - d0 < d1 - date ? d0 : d1;
12196   };
12197
12198   interval.offset = function(date, step) {
12199     return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12200   };
12201
12202   interval.range = function(start, stop, step) {
12203     var range = [];
12204     start = interval.ceil(start);
12205     step = step == null ? 1 : Math.floor(step);
12206     if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12207     do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop)
12208     return range;
12209   };
12210
12211   interval.filter = function(test) {
12212     return newInterval(function(date) {
12213       if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12214     }, function(date, step) {
12215       if (date >= date) {
12216         if (step < 0) while (++step <= 0) {
12217           while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12218         } else while (--step >= 0) {
12219           while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12220         }
12221       }
12222     });
12223   };
12224
12225   if (count) {
12226     interval.count = function(start, end) {
12227       t0$1.setTime(+start), t1$1.setTime(+end);
12228       floori(t0$1), floori(t1$1);
12229       return Math.floor(count(t0$1, t1$1));
12230     };
12231
12232     interval.every = function(step) {
12233       step = Math.floor(step);
12234       return !isFinite(step) || !(step > 0) ? null
12235           : !(step > 1) ? interval
12236           : interval.filter(field
12237               ? function(d) { return field(d) % step === 0; }
12238               : function(d) { return interval.count(0, d) % step === 0; });
12239     };
12240   }
12241
12242   return interval;
12243 }
12244
12245 var millisecond = newInterval(function() {
12246   // noop
12247 }, function(date, step) {
12248   date.setTime(+date + step);
12249 }, function(start, end) {
12250   return end - start;
12251 });
12252
12253 // An optimized implementation for this simple case.
12254 millisecond.every = function(k) {
12255   k = Math.floor(k);
12256   if (!isFinite(k) || !(k > 0)) return null;
12257   if (!(k > 1)) return millisecond;
12258   return newInterval(function(date) {
12259     date.setTime(Math.floor(date / k) * k);
12260   }, function(date, step) {
12261     date.setTime(+date + step * k);
12262   }, function(start, end) {
12263     return (end - start) / k;
12264   });
12265 };
12266
12267 var milliseconds = millisecond.range;
12268
12269 var durationSecond$1 = 1e3;
12270 var durationMinute$1 = 6e4;
12271 var durationHour$1 = 36e5;
12272 var durationDay$1 = 864e5;
12273 var durationWeek$1 = 6048e5;
12274
12275 var second = newInterval(function(date) {
12276   date.setTime(Math.floor(date / durationSecond$1) * durationSecond$1);
12277 }, function(date, step) {
12278   date.setTime(+date + step * durationSecond$1);
12279 }, function(start, end) {
12280   return (end - start) / durationSecond$1;
12281 }, function(date) {
12282   return date.getUTCSeconds();
12283 });
12284
12285 var seconds = second.range;
12286
12287 var minute = newInterval(function(date) {
12288   date.setTime(Math.floor(date / durationMinute$1) * durationMinute$1);
12289 }, function(date, step) {
12290   date.setTime(+date + step * durationMinute$1);
12291 }, function(start, end) {
12292   return (end - start) / durationMinute$1;
12293 }, function(date) {
12294   return date.getMinutes();
12295 });
12296
12297 var minutes = minute.range;
12298
12299 var hour = newInterval(function(date) {
12300   var offset = date.getTimezoneOffset() * durationMinute$1 % durationHour$1;
12301   if (offset < 0) offset += durationHour$1;
12302   date.setTime(Math.floor((+date - offset) / durationHour$1) * durationHour$1 + offset);
12303 }, function(date, step) {
12304   date.setTime(+date + step * durationHour$1);
12305 }, function(start, end) {
12306   return (end - start) / durationHour$1;
12307 }, function(date) {
12308   return date.getHours();
12309 });
12310
12311 var hours = hour.range;
12312
12313 var day = newInterval(function(date) {
12314   date.setHours(0, 0, 0, 0);
12315 }, function(date, step) {
12316   date.setDate(date.getDate() + step);
12317 }, function(start, end) {
12318   return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1;
12319 }, function(date) {
12320   return date.getDate() - 1;
12321 });
12322
12323 var days = day.range;
12324
12325 function weekday(i) {
12326   return newInterval(function(date) {
12327     date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12328     date.setHours(0, 0, 0, 0);
12329   }, function(date, step) {
12330     date.setDate(date.getDate() + step * 7);
12331   }, function(start, end) {
12332     return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1;
12333   });
12334 }
12335
12336 var sunday = weekday(0);
12337 var monday = weekday(1);
12338 var tuesday = weekday(2);
12339 var wednesday = weekday(3);
12340 var thursday = weekday(4);
12341 var friday = weekday(5);
12342 var saturday = weekday(6);
12343
12344 var sundays = sunday.range;
12345 var mondays = monday.range;
12346 var tuesdays = tuesday.range;
12347 var wednesdays = wednesday.range;
12348 var thursdays = thursday.range;
12349 var fridays = friday.range;
12350 var saturdays = saturday.range;
12351
12352 var month = newInterval(function(date) {
12353   date.setDate(1);
12354   date.setHours(0, 0, 0, 0);
12355 }, function(date, step) {
12356   date.setMonth(date.getMonth() + step);
12357 }, function(start, end) {
12358   return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12359 }, function(date) {
12360   return date.getMonth();
12361 });
12362
12363 var months = month.range;
12364
12365 var year = newInterval(function(date) {
12366   date.setMonth(0, 1);
12367   date.setHours(0, 0, 0, 0);
12368 }, function(date, step) {
12369   date.setFullYear(date.getFullYear() + step);
12370 }, function(start, end) {
12371   return end.getFullYear() - start.getFullYear();
12372 }, function(date) {
12373   return date.getFullYear();
12374 });
12375
12376 // An optimized implementation for this simple case.
12377 year.every = function(k) {
12378   return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12379     date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12380     date.setMonth(0, 1);
12381     date.setHours(0, 0, 0, 0);
12382   }, function(date, step) {
12383     date.setFullYear(date.getFullYear() + step * k);
12384   });
12385 };
12386
12387 var years = year.range;
12388
12389 var utcMinute = newInterval(function(date) {
12390   date.setUTCSeconds(0, 0);
12391 }, function(date, step) {
12392   date.setTime(+date + step * durationMinute$1);
12393 }, function(start, end) {
12394   return (end - start) / durationMinute$1;
12395 }, function(date) {
12396   return date.getUTCMinutes();
12397 });
12398
12399 var utcMinutes = utcMinute.range;
12400
12401 var utcHour = newInterval(function(date) {
12402   date.setUTCMinutes(0, 0, 0);
12403 }, function(date, step) {
12404   date.setTime(+date + step * durationHour$1);
12405 }, function(start, end) {
12406   return (end - start) / durationHour$1;
12407 }, function(date) {
12408   return date.getUTCHours();
12409 });
12410
12411 var utcHours = utcHour.range;
12412
12413 var utcDay = newInterval(function(date) {
12414   date.setUTCHours(0, 0, 0, 0);
12415 }, function(date, step) {
12416   date.setUTCDate(date.getUTCDate() + step);
12417 }, function(start, end) {
12418   return (end - start) / durationDay$1;
12419 }, function(date) {
12420   return date.getUTCDate() - 1;
12421 });
12422
12423 var utcDays = utcDay.range;
12424
12425 function utcWeekday(i) {
12426   return newInterval(function(date) {
12427     date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12428     date.setUTCHours(0, 0, 0, 0);
12429   }, function(date, step) {
12430     date.setUTCDate(date.getUTCDate() + step * 7);
12431   }, function(start, end) {
12432     return (end - start) / durationWeek$1;
12433   });
12434 }
12435
12436 var utcSunday = utcWeekday(0);
12437 var utcMonday = utcWeekday(1);
12438 var utcTuesday = utcWeekday(2);
12439 var utcWednesday = utcWeekday(3);
12440 var utcThursday = utcWeekday(4);
12441 var utcFriday = utcWeekday(5);
12442 var utcSaturday = utcWeekday(6);
12443
12444 var utcSundays = utcSunday.range;
12445 var utcMondays = utcMonday.range;
12446 var utcTuesdays = utcTuesday.range;
12447 var utcWednesdays = utcWednesday.range;
12448 var utcThursdays = utcThursday.range;
12449 var utcFridays = utcFriday.range;
12450 var utcSaturdays = utcSaturday.range;
12451
12452 var utcMonth = newInterval(function(date) {
12453   date.setUTCDate(1);
12454   date.setUTCHours(0, 0, 0, 0);
12455 }, function(date, step) {
12456   date.setUTCMonth(date.getUTCMonth() + step);
12457 }, function(start, end) {
12458   return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12459 }, function(date) {
12460   return date.getUTCMonth();
12461 });
12462
12463 var utcMonths = utcMonth.range;
12464
12465 var utcYear = newInterval(function(date) {
12466   date.setUTCMonth(0, 1);
12467   date.setUTCHours(0, 0, 0, 0);
12468 }, function(date, step) {
12469   date.setUTCFullYear(date.getUTCFullYear() + step);
12470 }, function(start, end) {
12471   return end.getUTCFullYear() - start.getUTCFullYear();
12472 }, function(date) {
12473   return date.getUTCFullYear();
12474 });
12475
12476 // An optimized implementation for this simple case.
12477 utcYear.every = function(k) {
12478   return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12479     date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12480     date.setUTCMonth(0, 1);
12481     date.setUTCHours(0, 0, 0, 0);
12482   }, function(date, step) {
12483     date.setUTCFullYear(date.getUTCFullYear() + step * k);
12484   });
12485 };
12486
12487 var utcYears = utcYear.range;
12488
12489 function localDate(d) {
12490   if (0 <= d.y && d.y < 100) {
12491     var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12492     date.setFullYear(d.y);
12493     return date;
12494   }
12495   return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12496 }
12497
12498 function utcDate(d) {
12499   if (0 <= d.y && d.y < 100) {
12500     var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12501     date.setUTCFullYear(d.y);
12502     return date;
12503   }
12504   return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12505 }
12506
12507 function newYear(y) {
12508   return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12509 }
12510
12511 function formatLocale$1(locale) {
12512   var locale_dateTime = locale.dateTime,
12513       locale_date = locale.date,
12514       locale_time = locale.time,
12515       locale_periods = locale.periods,
12516       locale_weekdays = locale.days,
12517       locale_shortWeekdays = locale.shortDays,
12518       locale_months = locale.months,
12519       locale_shortMonths = locale.shortMonths;
12520
12521   var periodRe = formatRe(locale_periods),
12522       periodLookup = formatLookup(locale_periods),
12523       weekdayRe = formatRe(locale_weekdays),
12524       weekdayLookup = formatLookup(locale_weekdays),
12525       shortWeekdayRe = formatRe(locale_shortWeekdays),
12526       shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12527       monthRe = formatRe(locale_months),
12528       monthLookup = formatLookup(locale_months),
12529       shortMonthRe = formatRe(locale_shortMonths),
12530       shortMonthLookup = formatLookup(locale_shortMonths);
12531
12532   var formats = {
12533     "a": formatShortWeekday,
12534     "A": formatWeekday,
12535     "b": formatShortMonth,
12536     "B": formatMonth,
12537     "c": null,
12538     "d": formatDayOfMonth,
12539     "e": formatDayOfMonth,
12540     "H": formatHour24,
12541     "I": formatHour12,
12542     "j": formatDayOfYear,
12543     "L": formatMilliseconds,
12544     "m": formatMonthNumber,
12545     "M": formatMinutes,
12546     "p": formatPeriod,
12547     "S": formatSeconds,
12548     "U": formatWeekNumberSunday,
12549     "w": formatWeekdayNumber,
12550     "W": formatWeekNumberMonday,
12551     "x": null,
12552     "X": null,
12553     "y": formatYear,
12554     "Y": formatFullYear,
12555     "Z": formatZone,
12556     "%": formatLiteralPercent
12557   };
12558
12559   var utcFormats = {
12560     "a": formatUTCShortWeekday,
12561     "A": formatUTCWeekday,
12562     "b": formatUTCShortMonth,
12563     "B": formatUTCMonth,
12564     "c": null,
12565     "d": formatUTCDayOfMonth,
12566     "e": formatUTCDayOfMonth,
12567     "H": formatUTCHour24,
12568     "I": formatUTCHour12,
12569     "j": formatUTCDayOfYear,
12570     "L": formatUTCMilliseconds,
12571     "m": formatUTCMonthNumber,
12572     "M": formatUTCMinutes,
12573     "p": formatUTCPeriod,
12574     "S": formatUTCSeconds,
12575     "U": formatUTCWeekNumberSunday,
12576     "w": formatUTCWeekdayNumber,
12577     "W": formatUTCWeekNumberMonday,
12578     "x": null,
12579     "X": null,
12580     "y": formatUTCYear,
12581     "Y": formatUTCFullYear,
12582     "Z": formatUTCZone,
12583     "%": formatLiteralPercent
12584   };
12585
12586   var parses = {
12587     "a": parseShortWeekday,
12588     "A": parseWeekday,
12589     "b": parseShortMonth,
12590     "B": parseMonth,
12591     "c": parseLocaleDateTime,
12592     "d": parseDayOfMonth,
12593     "e": parseDayOfMonth,
12594     "H": parseHour24,
12595     "I": parseHour24,
12596     "j": parseDayOfYear,
12597     "L": parseMilliseconds,
12598     "m": parseMonthNumber,
12599     "M": parseMinutes,
12600     "p": parsePeriod,
12601     "S": parseSeconds,
12602     "U": parseWeekNumberSunday,
12603     "w": parseWeekdayNumber,
12604     "W": parseWeekNumberMonday,
12605     "x": parseLocaleDate,
12606     "X": parseLocaleTime,
12607     "y": parseYear,
12608     "Y": parseFullYear,
12609     "Z": parseZone,
12610     "%": parseLiteralPercent
12611   };
12612
12613   // These recursive directive definitions must be deferred.
12614   formats.x = newFormat(locale_date, formats);
12615   formats.X = newFormat(locale_time, formats);
12616   formats.c = newFormat(locale_dateTime, formats);
12617   utcFormats.x = newFormat(locale_date, utcFormats);
12618   utcFormats.X = newFormat(locale_time, utcFormats);
12619   utcFormats.c = newFormat(locale_dateTime, utcFormats);
12620
12621   function newFormat(specifier, formats) {
12622     return function(date) {
12623       var string = [],
12624           i = -1,
12625           j = 0,
12626           n = specifier.length,
12627           c,
12628           pad,
12629           format;
12630
12631       if (!(date instanceof Date)) date = new Date(+date);
12632
12633       while (++i < n) {
12634         if (specifier.charCodeAt(i) === 37) {
12635           string.push(specifier.slice(j, i));
12636           if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12637           else pad = c === "e" ? " " : "0";
12638           if (format = formats[c]) c = format(date, pad);
12639           string.push(c);
12640           j = i + 1;
12641         }
12642       }
12643
12644       string.push(specifier.slice(j, i));
12645       return string.join("");
12646     };
12647   }
12648
12649   function newParse(specifier, newDate) {
12650     return function(string) {
12651       var d = newYear(1900),
12652           i = parseSpecifier(d, specifier, string += "", 0);
12653       if (i != string.length) return null;
12654
12655       // The am-pm flag is 0 for AM, and 1 for PM.
12656       if ("p" in d) d.H = d.H % 12 + d.p * 12;
12657
12658       // Convert day-of-week and week-of-year to day-of-year.
12659       if ("W" in d || "U" in d) {
12660         if (!("w" in d)) d.w = "W" in d ? 1 : 0;
12661         var day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12662         d.m = 0;
12663         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;
12664       }
12665
12666       // If a time zone is specified, all fields are interpreted as UTC and then
12667       // offset according to the specified time zone.
12668       if ("Z" in d) {
12669         d.H += d.Z / 100 | 0;
12670         d.M += d.Z % 100;
12671         return utcDate(d);
12672       }
12673
12674       // Otherwise, all fields are in local time.
12675       return newDate(d);
12676     };
12677   }
12678
12679   function parseSpecifier(d, specifier, string, j) {
12680     var i = 0,
12681         n = specifier.length,
12682         m = string.length,
12683         c,
12684         parse;
12685
12686     while (i < n) {
12687       if (j >= m) return -1;
12688       c = specifier.charCodeAt(i++);
12689       if (c === 37) {
12690         c = specifier.charAt(i++);
12691         parse = parses[c in pads ? specifier.charAt(i++) : c];
12692         if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12693       } else if (c != string.charCodeAt(j++)) {
12694         return -1;
12695       }
12696     }
12697
12698     return j;
12699   }
12700
12701   function parsePeriod(d, string, i) {
12702     var n = periodRe.exec(string.slice(i));
12703     return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12704   }
12705
12706   function parseShortWeekday(d, string, i) {
12707     var n = shortWeekdayRe.exec(string.slice(i));
12708     return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12709   }
12710
12711   function parseWeekday(d, string, i) {
12712     var n = weekdayRe.exec(string.slice(i));
12713     return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12714   }
12715
12716   function parseShortMonth(d, string, i) {
12717     var n = shortMonthRe.exec(string.slice(i));
12718     return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12719   }
12720
12721   function parseMonth(d, string, i) {
12722     var n = monthRe.exec(string.slice(i));
12723     return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12724   }
12725
12726   function parseLocaleDateTime(d, string, i) {
12727     return parseSpecifier(d, locale_dateTime, string, i);
12728   }
12729
12730   function parseLocaleDate(d, string, i) {
12731     return parseSpecifier(d, locale_date, string, i);
12732   }
12733
12734   function parseLocaleTime(d, string, i) {
12735     return parseSpecifier(d, locale_time, string, i);
12736   }
12737
12738   function formatShortWeekday(d) {
12739     return locale_shortWeekdays[d.getDay()];
12740   }
12741
12742   function formatWeekday(d) {
12743     return locale_weekdays[d.getDay()];
12744   }
12745
12746   function formatShortMonth(d) {
12747     return locale_shortMonths[d.getMonth()];
12748   }
12749
12750   function formatMonth(d) {
12751     return locale_months[d.getMonth()];
12752   }
12753
12754   function formatPeriod(d) {
12755     return locale_periods[+(d.getHours() >= 12)];
12756   }
12757
12758   function formatUTCShortWeekday(d) {
12759     return locale_shortWeekdays[d.getUTCDay()];
12760   }
12761
12762   function formatUTCWeekday(d) {
12763     return locale_weekdays[d.getUTCDay()];
12764   }
12765
12766   function formatUTCShortMonth(d) {
12767     return locale_shortMonths[d.getUTCMonth()];
12768   }
12769
12770   function formatUTCMonth(d) {
12771     return locale_months[d.getUTCMonth()];
12772   }
12773
12774   function formatUTCPeriod(d) {
12775     return locale_periods[+(d.getUTCHours() >= 12)];
12776   }
12777
12778   return {
12779     format: function(specifier) {
12780       var f = newFormat(specifier += "", formats);
12781       f.toString = function() { return specifier; };
12782       return f;
12783     },
12784     parse: function(specifier) {
12785       var p = newParse(specifier += "", localDate);
12786       p.toString = function() { return specifier; };
12787       return p;
12788     },
12789     utcFormat: function(specifier) {
12790       var f = newFormat(specifier += "", utcFormats);
12791       f.toString = function() { return specifier; };
12792       return f;
12793     },
12794     utcParse: function(specifier) {
12795       var p = newParse(specifier, utcDate);
12796       p.toString = function() { return specifier; };
12797       return p;
12798     }
12799   };
12800 }
12801
12802 var pads = {"-": "", "_": " ", "0": "0"};
12803 var numberRe = /^\s*\d+/;
12804 var percentRe = /^%/;
12805 var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
12806
12807 function pad(value, fill, width) {
12808   var sign = value < 0 ? "-" : "",
12809       string = (sign ? -value : value) + "",
12810       length = string.length;
12811   return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12812 }
12813
12814 function requote(s) {
12815   return s.replace(requoteRe, "\\$&");
12816 }
12817
12818 function formatRe(names) {
12819   return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12820 }
12821
12822 function formatLookup(names) {
12823   var map = {}, i = -1, n = names.length;
12824   while (++i < n) map[names[i].toLowerCase()] = i;
12825   return map;
12826 }
12827
12828 function parseWeekdayNumber(d, string, i) {
12829   var n = numberRe.exec(string.slice(i, i + 1));
12830   return n ? (d.w = +n[0], i + n[0].length) : -1;
12831 }
12832
12833 function parseWeekNumberSunday(d, string, i) {
12834   var n = numberRe.exec(string.slice(i));
12835   return n ? (d.U = +n[0], i + n[0].length) : -1;
12836 }
12837
12838 function parseWeekNumberMonday(d, string, i) {
12839   var n = numberRe.exec(string.slice(i));
12840   return n ? (d.W = +n[0], i + n[0].length) : -1;
12841 }
12842
12843 function parseFullYear(d, string, i) {
12844   var n = numberRe.exec(string.slice(i, i + 4));
12845   return n ? (d.y = +n[0], i + n[0].length) : -1;
12846 }
12847
12848 function parseYear(d, string, i) {
12849   var n = numberRe.exec(string.slice(i, i + 2));
12850   return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12851 }
12852
12853 function parseZone(d, string, i) {
12854   var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6));
12855   return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12856 }
12857
12858 function parseMonthNumber(d, string, i) {
12859   var n = numberRe.exec(string.slice(i, i + 2));
12860   return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12861 }
12862
12863 function parseDayOfMonth(d, string, i) {
12864   var n = numberRe.exec(string.slice(i, i + 2));
12865   return n ? (d.d = +n[0], i + n[0].length) : -1;
12866 }
12867
12868 function parseDayOfYear(d, string, i) {
12869   var n = numberRe.exec(string.slice(i, i + 3));
12870   return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12871 }
12872
12873 function parseHour24(d, string, i) {
12874   var n = numberRe.exec(string.slice(i, i + 2));
12875   return n ? (d.H = +n[0], i + n[0].length) : -1;
12876 }
12877
12878 function parseMinutes(d, string, i) {
12879   var n = numberRe.exec(string.slice(i, i + 2));
12880   return n ? (d.M = +n[0], i + n[0].length) : -1;
12881 }
12882
12883 function parseSeconds(d, string, i) {
12884   var n = numberRe.exec(string.slice(i, i + 2));
12885   return n ? (d.S = +n[0], i + n[0].length) : -1;
12886 }
12887
12888 function parseMilliseconds(d, string, i) {
12889   var n = numberRe.exec(string.slice(i, i + 3));
12890   return n ? (d.L = +n[0], i + n[0].length) : -1;
12891 }
12892
12893 function parseLiteralPercent(d, string, i) {
12894   var n = percentRe.exec(string.slice(i, i + 1));
12895   return n ? i + n[0].length : -1;
12896 }
12897
12898 function formatDayOfMonth(d, p) {
12899   return pad(d.getDate(), p, 2);
12900 }
12901
12902 function formatHour24(d, p) {
12903   return pad(d.getHours(), p, 2);
12904 }
12905
12906 function formatHour12(d, p) {
12907   return pad(d.getHours() % 12 || 12, p, 2);
12908 }
12909
12910 function formatDayOfYear(d, p) {
12911   return pad(1 + day.count(year(d), d), p, 3);
12912 }
12913
12914 function formatMilliseconds(d, p) {
12915   return pad(d.getMilliseconds(), p, 3);
12916 }
12917
12918 function formatMonthNumber(d, p) {
12919   return pad(d.getMonth() + 1, p, 2);
12920 }
12921
12922 function formatMinutes(d, p) {
12923   return pad(d.getMinutes(), p, 2);
12924 }
12925
12926 function formatSeconds(d, p) {
12927   return pad(d.getSeconds(), p, 2);
12928 }
12929
12930 function formatWeekNumberSunday(d, p) {
12931   return pad(sunday.count(year(d), d), p, 2);
12932 }
12933
12934 function formatWeekdayNumber(d) {
12935   return d.getDay();
12936 }
12937
12938 function formatWeekNumberMonday(d, p) {
12939   return pad(monday.count(year(d), d), p, 2);
12940 }
12941
12942 function formatYear(d, p) {
12943   return pad(d.getFullYear() % 100, p, 2);
12944 }
12945
12946 function formatFullYear(d, p) {
12947   return pad(d.getFullYear() % 10000, p, 4);
12948 }
12949
12950 function formatZone(d) {
12951   var z = d.getTimezoneOffset();
12952   return (z > 0 ? "-" : (z *= -1, "+"))
12953       + pad(z / 60 | 0, "0", 2)
12954       + pad(z % 60, "0", 2);
12955 }
12956
12957 function formatUTCDayOfMonth(d, p) {
12958   return pad(d.getUTCDate(), p, 2);
12959 }
12960
12961 function formatUTCHour24(d, p) {
12962   return pad(d.getUTCHours(), p, 2);
12963 }
12964
12965 function formatUTCHour12(d, p) {
12966   return pad(d.getUTCHours() % 12 || 12, p, 2);
12967 }
12968
12969 function formatUTCDayOfYear(d, p) {
12970   return pad(1 + utcDay.count(utcYear(d), d), p, 3);
12971 }
12972
12973 function formatUTCMilliseconds(d, p) {
12974   return pad(d.getUTCMilliseconds(), p, 3);
12975 }
12976
12977 function formatUTCMonthNumber(d, p) {
12978   return pad(d.getUTCMonth() + 1, p, 2);
12979 }
12980
12981 function formatUTCMinutes(d, p) {
12982   return pad(d.getUTCMinutes(), p, 2);
12983 }
12984
12985 function formatUTCSeconds(d, p) {
12986   return pad(d.getUTCSeconds(), p, 2);
12987 }
12988
12989 function formatUTCWeekNumberSunday(d, p) {
12990   return pad(utcSunday.count(utcYear(d), d), p, 2);
12991 }
12992
12993 function formatUTCWeekdayNumber(d) {
12994   return d.getUTCDay();
12995 }
12996
12997 function formatUTCWeekNumberMonday(d, p) {
12998   return pad(utcMonday.count(utcYear(d), d), p, 2);
12999 }
13000
13001 function formatUTCYear(d, p) {
13002   return pad(d.getUTCFullYear() % 100, p, 2);
13003 }
13004
13005 function formatUTCFullYear(d, p) {
13006   return pad(d.getUTCFullYear() % 10000, p, 4);
13007 }
13008
13009 function formatUTCZone() {
13010   return "+0000";
13011 }
13012
13013 function formatLiteralPercent() {
13014   return "%";
13015 }
13016
13017 var locale$2;
13018 var timeFormat;
13019 var timeParse;
13020 var utcFormat;
13021 var utcParse;
13022
13023 defaultLocale$1({
13024   dateTime: "%x, %X",
13025   date: "%-m/%-d/%Y",
13026   time: "%-I:%M:%S %p",
13027   periods: ["AM", "PM"],
13028   days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13029   shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13030   months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13031   shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13032 });
13033
13034 function defaultLocale$1(definition) {
13035   locale$2 = formatLocale$1(definition);
13036   timeFormat = locale$2.format;
13037   timeParse = locale$2.parse;
13038   utcFormat = locale$2.utcFormat;
13039   utcParse = locale$2.utcParse;
13040   return locale$2;
13041 }
13042
13043 var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13044
13045 function formatIsoNative(date) {
13046   return date.toISOString();
13047 }
13048
13049 var formatIso = Date.prototype.toISOString
13050     ? formatIsoNative
13051     : utcFormat(isoSpecifier);
13052
13053 function parseIsoNative(string) {
13054   var date = new Date(string);
13055   return isNaN(date) ? null : date;
13056 }
13057
13058 var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13059     ? parseIsoNative
13060     : utcParse(isoSpecifier);
13061
13062 var durationSecond = 1000;
13063 var durationMinute = durationSecond * 60;
13064 var durationHour = durationMinute * 60;
13065 var durationDay = durationHour * 24;
13066 var durationWeek = durationDay * 7;
13067 var durationMonth = durationDay * 30;
13068 var durationYear = durationDay * 365;
13069
13070 function date$1(t) {
13071   return new Date(t);
13072 }
13073
13074 function number$3(t) {
13075   return t instanceof Date ? +t : +new Date(+t);
13076 }
13077
13078 function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13079   var scale = continuous(deinterpolateLinear, d3_interpolateNumber),
13080       invert = scale.invert,
13081       domain = scale.domain;
13082
13083   var formatMillisecond = format(".%L"),
13084       formatSecond = format(":%S"),
13085       formatMinute = format("%I:%M"),
13086       formatHour = format("%I %p"),
13087       formatDay = format("%a %d"),
13088       formatWeek = format("%b %d"),
13089       formatMonth = format("%B"),
13090       formatYear = format("%Y");
13091
13092   var tickIntervals = [
13093     [second$$1,  1,      durationSecond],
13094     [second$$1,  5,  5 * durationSecond],
13095     [second$$1, 15, 15 * durationSecond],
13096     [second$$1, 30, 30 * durationSecond],
13097     [minute$$1,  1,      durationMinute],
13098     [minute$$1,  5,  5 * durationMinute],
13099     [minute$$1, 15, 15 * durationMinute],
13100     [minute$$1, 30, 30 * durationMinute],
13101     [  hour$$1,  1,      durationHour  ],
13102     [  hour$$1,  3,  3 * durationHour  ],
13103     [  hour$$1,  6,  6 * durationHour  ],
13104     [  hour$$1, 12, 12 * durationHour  ],
13105     [   day$$1,  1,      durationDay   ],
13106     [   day$$1,  2,  2 * durationDay   ],
13107     [  week,  1,      durationWeek  ],
13108     [ month$$1,  1,      durationMonth ],
13109     [ month$$1,  3,  3 * durationMonth ],
13110     [  year$$1,  1,      durationYear  ]
13111   ];
13112
13113   function tickFormat(date$$1) {
13114     return (second$$1(date$$1) < date$$1 ? formatMillisecond
13115         : minute$$1(date$$1) < date$$1 ? formatSecond
13116         : hour$$1(date$$1) < date$$1 ? formatMinute
13117         : day$$1(date$$1) < date$$1 ? formatHour
13118         : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13119         : year$$1(date$$1) < date$$1 ? formatMonth
13120         : formatYear)(date$$1);
13121   }
13122
13123   function tickInterval(interval$$1, start, stop, step) {
13124     if (interval$$1 == null) interval$$1 = 10;
13125
13126     // If a desired tick count is specified, pick a reasonable tick interval
13127     // based on the extent of the domain and a rough estimate of tick size.
13128     // Otherwise, assume interval is already a time interval and use it.
13129     if (typeof interval$$1 === "number") {
13130       var target = Math.abs(stop - start) / interval$$1,
13131           i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13132       if (i === tickIntervals.length) {
13133         step = tickStep(start / durationYear, stop / durationYear, interval$$1);
13134         interval$$1 = year$$1;
13135       } else if (i) {
13136         i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13137         step = i[1];
13138         interval$$1 = i[0];
13139       } else {
13140         step = tickStep(start, stop, interval$$1);
13141         interval$$1 = millisecond$$1;
13142       }
13143     }
13144
13145     return step == null ? interval$$1 : interval$$1.every(step);
13146   }
13147
13148   scale.invert = function(y) {
13149     return new Date(invert(y));
13150   };
13151
13152   scale.domain = function(_) {
13153     return arguments.length ? domain(map$3.call(_, number$3)) : domain().map(date$1);
13154   };
13155
13156   scale.ticks = function(interval$$1, step) {
13157     var d = domain(),
13158         t0 = d[0],
13159         t1 = d[d.length - 1],
13160         r = t1 < t0,
13161         t;
13162     if (r) t = t0, t0 = t1, t1 = t;
13163     t = tickInterval(interval$$1, t0, t1, step);
13164     t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13165     return r ? t.reverse() : t;
13166   };
13167
13168   scale.tickFormat = function(count, specifier) {
13169     return specifier == null ? tickFormat : format(specifier);
13170   };
13171
13172   scale.nice = function(interval$$1, step) {
13173     var d = domain();
13174     return (interval$$1 = tickInterval(interval$$1, d[0], d[d.length - 1], step))
13175         ? domain(nice(d, interval$$1))
13176         : scale;
13177   };
13178
13179   scale.copy = function() {
13180     return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13181   };
13182
13183   return scale;
13184 }
13185
13186 var time = function() {
13187   return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13188 };
13189
13190 var utcTime = function() {
13191   return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13192 };
13193
13194 var colors = function(s) {
13195   return s.match(/.{6}/g).map(function(x) {
13196     return "#" + x;
13197   });
13198 };
13199
13200 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13201
13202 var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13203
13204 var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13205
13206 var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13207
13208 var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13209
13210 var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13211
13212 var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13213
13214 var rainbow = cubehelix();
13215
13216 var rainbow$1 = function(t) {
13217   if (t < 0 || t > 1) t -= Math.floor(t);
13218   var ts = Math.abs(t - 0.5);
13219   rainbow.h = 360 * t - 100;
13220   rainbow.s = 1.5 - 1.5 * ts;
13221   rainbow.l = 0.8 - 0.9 * ts;
13222   return rainbow + "";
13223 };
13224
13225 function ramp(range) {
13226   var n = range.length;
13227   return function(t) {
13228     return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13229   };
13230 }
13231
13232 var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13233
13234 var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13235
13236 var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13237
13238 var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13239
13240 function sequential(interpolator) {
13241   var x0 = 0,
13242       x1 = 1,
13243       clamp = false;
13244
13245   function scale(x) {
13246     var t = (x - x0) / (x1 - x0);
13247     return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13248   }
13249
13250   scale.domain = function(_) {
13251     return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13252   };
13253
13254   scale.clamp = function(_) {
13255     return arguments.length ? (clamp = !!_, scale) : clamp;
13256   };
13257
13258   scale.interpolator = function(_) {
13259     return arguments.length ? (interpolator = _, scale) : interpolator;
13260   };
13261
13262   scale.copy = function() {
13263     return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13264   };
13265
13266   return linearish(scale);
13267 }
13268
13269 var constant$10 = function(x) {
13270   return function constant() {
13271     return x;
13272   };
13273 };
13274
13275 var abs$1 = Math.abs;
13276 var atan2$1 = Math.atan2;
13277 var cos$2 = Math.cos;
13278 var max$2 = Math.max;
13279 var min$1 = Math.min;
13280 var sin$2 = Math.sin;
13281 var sqrt$2 = Math.sqrt;
13282
13283 var epsilon$3 = 1e-12;
13284 var pi$4 = Math.PI;
13285 var halfPi$3 = pi$4 / 2;
13286 var tau$4 = 2 * pi$4;
13287
13288 function acos$1(x) {
13289   return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13290 }
13291
13292 function asin$1(x) {
13293   return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13294 }
13295
13296 function arcInnerRadius(d) {
13297   return d.innerRadius;
13298 }
13299
13300 function arcOuterRadius(d) {
13301   return d.outerRadius;
13302 }
13303
13304 function arcStartAngle(d) {
13305   return d.startAngle;
13306 }
13307
13308 function arcEndAngle(d) {
13309   return d.endAngle;
13310 }
13311
13312 function arcPadAngle(d) {
13313   return d && d.padAngle; // Note: optional!
13314 }
13315
13316 function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13317   var x10 = x1 - x0, y10 = y1 - y0,
13318       x32 = x3 - x2, y32 = y3 - y2,
13319       t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13320   return [x0 + t * x10, y0 + t * y10];
13321 }
13322
13323 // Compute perpendicular offset line of length rc.
13324 // http://mathworld.wolfram.com/Circle-LineIntersection.html
13325 function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13326   var x01 = x0 - x1,
13327       y01 = y0 - y1,
13328       lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13329       ox = lo * y01,
13330       oy = -lo * x01,
13331       x11 = x0 + ox,
13332       y11 = y0 + oy,
13333       x10 = x1 + ox,
13334       y10 = y1 + oy,
13335       x00 = (x11 + x10) / 2,
13336       y00 = (y11 + y10) / 2,
13337       dx = x10 - x11,
13338       dy = y10 - y11,
13339       d2 = dx * dx + dy * dy,
13340       r = r1 - rc,
13341       D = x11 * y10 - x10 * y11,
13342       d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13343       cx0 = (D * dy - dx * d) / d2,
13344       cy0 = (-D * dx - dy * d) / d2,
13345       cx1 = (D * dy + dx * d) / d2,
13346       cy1 = (-D * dx + dy * d) / d2,
13347       dx0 = cx0 - x00,
13348       dy0 = cy0 - y00,
13349       dx1 = cx1 - x00,
13350       dy1 = cy1 - y00;
13351
13352   // Pick the closer of the two intersection points.
13353   // TODO Is there a faster way to determine which intersection to use?
13354   if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13355
13356   return {
13357     cx: cx0,
13358     cy: cy0,
13359     x01: -ox,
13360     y01: -oy,
13361     x11: cx0 * (r1 / r - 1),
13362     y11: cy0 * (r1 / r - 1)
13363   };
13364 }
13365
13366 var arc = function() {
13367   var innerRadius = arcInnerRadius,
13368       outerRadius = arcOuterRadius,
13369       cornerRadius = constant$10(0),
13370       padRadius = null,
13371       startAngle = arcStartAngle,
13372       endAngle = arcEndAngle,
13373       padAngle = arcPadAngle,
13374       context = null;
13375
13376   function arc() {
13377     var buffer,
13378         r,
13379         r0 = +innerRadius.apply(this, arguments),
13380         r1 = +outerRadius.apply(this, arguments),
13381         a0 = startAngle.apply(this, arguments) - halfPi$3,
13382         a1 = endAngle.apply(this, arguments) - halfPi$3,
13383         da = abs$1(a1 - a0),
13384         cw = a1 > a0;
13385
13386     if (!context) context = buffer = path();
13387
13388     // Ensure that the outer radius is always larger than the inner radius.
13389     if (r1 < r0) r = r1, r1 = r0, r0 = r;
13390
13391     // Is it a point?
13392     if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13393
13394     // Or is it a circle or annulus?
13395     else if (da > tau$4 - epsilon$3) {
13396       context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13397       context.arc(0, 0, r1, a0, a1, !cw);
13398       if (r0 > epsilon$3) {
13399         context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13400         context.arc(0, 0, r0, a1, a0, cw);
13401       }
13402     }
13403
13404     // Or is it a circular or annular sector?
13405     else {
13406       var a01 = a0,
13407           a11 = a1,
13408           a00 = a0,
13409           a10 = a1,
13410           da0 = da,
13411           da1 = da,
13412           ap = padAngle.apply(this, arguments) / 2,
13413           rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13414           rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13415           rc0 = rc,
13416           rc1 = rc,
13417           t0,
13418           t1;
13419
13420       // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13421       if (rp > epsilon$3) {
13422         var p0 = asin$1(rp / r0 * sin$2(ap)),
13423             p1 = asin$1(rp / r1 * sin$2(ap));
13424         if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13425         else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13426         if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13427         else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13428       }
13429
13430       var x01 = r1 * cos$2(a01),
13431           y01 = r1 * sin$2(a01),
13432           x10 = r0 * cos$2(a10),
13433           y10 = r0 * sin$2(a10);
13434
13435       // Apply rounded corners?
13436       if (rc > epsilon$3) {
13437         var x11 = r1 * cos$2(a11),
13438             y11 = r1 * sin$2(a11),
13439             x00 = r0 * cos$2(a00),
13440             y00 = r0 * sin$2(a00);
13441
13442         // Restrict the corner radius according to the sector angle.
13443         if (da < pi$4) {
13444           var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13445               ax = x01 - oc[0],
13446               ay = y01 - oc[1],
13447               bx = x11 - oc[0],
13448               by = y11 - oc[1],
13449               kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13450               lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13451           rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13452           rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13453         }
13454       }
13455
13456       // Is the sector collapsed to a line?
13457       if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13458
13459       // Does the sector’s outer ring have rounded corners?
13460       else if (rc1 > epsilon$3) {
13461         t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13462         t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13463
13464         context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13465
13466         // Have the corners merged?
13467         if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13468
13469         // Otherwise, draw the two corners and the ring.
13470         else {
13471           context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13472           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);
13473           context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13474         }
13475       }
13476
13477       // Or is the outer ring just a circular arc?
13478       else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13479
13480       // Is there no inner ring, and it’s a circular sector?
13481       // Or perhaps it’s an annular sector collapsed due to padding?
13482       if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13483
13484       // Does the sector’s inner ring (or point) have rounded corners?
13485       else if (rc0 > epsilon$3) {
13486         t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13487         t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13488
13489         context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13490
13491         // Have the corners merged?
13492         if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13493
13494         // Otherwise, draw the two corners and the ring.
13495         else {
13496           context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13497           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);
13498           context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13499         }
13500       }
13501
13502       // Or is the inner ring just a circular arc?
13503       else context.arc(0, 0, r0, a10, a00, cw);
13504     }
13505
13506     context.closePath();
13507
13508     if (buffer) return context = null, buffer + "" || null;
13509   }
13510
13511   arc.centroid = function() {
13512     var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13513         a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13514     return [cos$2(a) * r, sin$2(a) * r];
13515   };
13516
13517   arc.innerRadius = function(_) {
13518     return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : innerRadius;
13519   };
13520
13521   arc.outerRadius = function(_) {
13522     return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : outerRadius;
13523   };
13524
13525   arc.cornerRadius = function(_) {
13526     return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : cornerRadius;
13527   };
13528
13529   arc.padRadius = function(_) {
13530     return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), arc) : padRadius;
13531   };
13532
13533   arc.startAngle = function(_) {
13534     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : startAngle;
13535   };
13536
13537   arc.endAngle = function(_) {
13538     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : endAngle;
13539   };
13540
13541   arc.padAngle = function(_) {
13542     return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : padAngle;
13543   };
13544
13545   arc.context = function(_) {
13546     return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13547   };
13548
13549   return arc;
13550 };
13551
13552 function Linear(context) {
13553   this._context = context;
13554 }
13555
13556 Linear.prototype = {
13557   areaStart: function() {
13558     this._line = 0;
13559   },
13560   areaEnd: function() {
13561     this._line = NaN;
13562   },
13563   lineStart: function() {
13564     this._point = 0;
13565   },
13566   lineEnd: function() {
13567     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13568     this._line = 1 - this._line;
13569   },
13570   point: function(x, y) {
13571     x = +x, y = +y;
13572     switch (this._point) {
13573       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13574       case 1: this._point = 2; // proceed
13575       default: this._context.lineTo(x, y); break;
13576     }
13577   }
13578 };
13579
13580 var curveLinear = function(context) {
13581   return new Linear(context);
13582 };
13583
13584 function x$3(p) {
13585   return p[0];
13586 }
13587
13588 function y$3(p) {
13589   return p[1];
13590 }
13591
13592 var line = function() {
13593   var x = x$3,
13594       y = y$3,
13595       defined = constant$10(true),
13596       context = null,
13597       curve = curveLinear,
13598       output = null;
13599
13600   function line(data) {
13601     var i,
13602         n = data.length,
13603         d,
13604         defined0 = false,
13605         buffer;
13606
13607     if (context == null) output = curve(buffer = path());
13608
13609     for (i = 0; i <= n; ++i) {
13610       if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13611         if (defined0 = !defined0) output.lineStart();
13612         else output.lineEnd();
13613       }
13614       if (defined0) output.point(+x(d, i, data), +y(d, i, data));
13615     }
13616
13617     if (buffer) return output = null, buffer + "" || null;
13618   }
13619
13620   line.x = function(_) {
13621     return arguments.length ? (x = typeof _ === "function" ? _ : constant$10(+_), line) : x;
13622   };
13623
13624   line.y = function(_) {
13625     return arguments.length ? (y = typeof _ === "function" ? _ : constant$10(+_), line) : y;
13626   };
13627
13628   line.defined = function(_) {
13629     return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), line) : defined;
13630   };
13631
13632   line.curve = function(_) {
13633     return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13634   };
13635
13636   line.context = function(_) {
13637     return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13638   };
13639
13640   return line;
13641 };
13642
13643 var area = function() {
13644   var x0 = x$3,
13645       x1 = null,
13646       y0 = constant$10(0),
13647       y1 = y$3,
13648       defined = constant$10(true),
13649       context = null,
13650       curve = curveLinear,
13651       output = null;
13652
13653   function area(data) {
13654     var i,
13655         j,
13656         k,
13657         n = data.length,
13658         d,
13659         defined0 = false,
13660         buffer,
13661         x0z = new Array(n),
13662         y0z = new Array(n);
13663
13664     if (context == null) output = curve(buffer = path());
13665
13666     for (i = 0; i <= n; ++i) {
13667       if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13668         if (defined0 = !defined0) {
13669           j = i;
13670           output.areaStart();
13671           output.lineStart();
13672         } else {
13673           output.lineEnd();
13674           output.lineStart();
13675           for (k = i - 1; k >= j; --k) {
13676             output.point(x0z[k], y0z[k]);
13677           }
13678           output.lineEnd();
13679           output.areaEnd();
13680         }
13681       }
13682       if (defined0) {
13683         x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13684         output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13685       }
13686     }
13687
13688     if (buffer) return output = null, buffer + "" || null;
13689   }
13690
13691   function arealine() {
13692     return line().defined(defined).curve(curve).context(context);
13693   }
13694
13695   area.x = function(_) {
13696     return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), x1 = null, area) : x0;
13697   };
13698
13699   area.x0 = function(_) {
13700     return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), area) : x0;
13701   };
13702
13703   area.x1 = function(_) {
13704     return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : x1;
13705   };
13706
13707   area.y = function(_) {
13708     return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), y1 = null, area) : y0;
13709   };
13710
13711   area.y0 = function(_) {
13712     return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), area) : y0;
13713   };
13714
13715   area.y1 = function(_) {
13716     return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : y1;
13717   };
13718
13719   area.lineX0 =
13720   area.lineY0 = function() {
13721     return arealine().x(x0).y(y0);
13722   };
13723
13724   area.lineY1 = function() {
13725     return arealine().x(x0).y(y1);
13726   };
13727
13728   area.lineX1 = function() {
13729     return arealine().x(x1).y(y0);
13730   };
13731
13732   area.defined = function(_) {
13733     return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), area) : defined;
13734   };
13735
13736   area.curve = function(_) {
13737     return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13738   };
13739
13740   area.context = function(_) {
13741     return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13742   };
13743
13744   return area;
13745 };
13746
13747 var descending = function(a, b) {
13748   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13749 };
13750
13751 var identity$6 = function(d) {
13752   return d;
13753 };
13754
13755 var pie = function() {
13756   var value = identity$6,
13757       sortValues = descending,
13758       sort = null,
13759       startAngle = constant$10(0),
13760       endAngle = constant$10(tau$4),
13761       padAngle = constant$10(0);
13762
13763   function pie(data) {
13764     var i,
13765         n = data.length,
13766         j,
13767         k,
13768         sum = 0,
13769         index = new Array(n),
13770         arcs = new Array(n),
13771         a0 = +startAngle.apply(this, arguments),
13772         da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13773         a1,
13774         p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13775         pa = p * (da < 0 ? -1 : 1),
13776         v;
13777
13778     for (i = 0; i < n; ++i) {
13779       if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13780         sum += v;
13781       }
13782     }
13783
13784     // Optionally sort the arcs by previously-computed values or by data.
13785     if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13786     else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13787
13788     // Compute the arcs! They are stored in the original data's order.
13789     for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13790       j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13791         data: data[j],
13792         index: i,
13793         value: v,
13794         startAngle: a0,
13795         endAngle: a1,
13796         padAngle: p
13797       };
13798     }
13799
13800     return arcs;
13801   }
13802
13803   pie.value = function(_) {
13804     return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), pie) : value;
13805   };
13806
13807   pie.sortValues = function(_) {
13808     return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13809   };
13810
13811   pie.sort = function(_) {
13812     return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13813   };
13814
13815   pie.startAngle = function(_) {
13816     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : startAngle;
13817   };
13818
13819   pie.endAngle = function(_) {
13820     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : endAngle;
13821   };
13822
13823   pie.padAngle = function(_) {
13824     return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : padAngle;
13825   };
13826
13827   return pie;
13828 };
13829
13830 var curveRadialLinear = curveRadial(curveLinear);
13831
13832 function Radial(curve) {
13833   this._curve = curve;
13834 }
13835
13836 Radial.prototype = {
13837   areaStart: function() {
13838     this._curve.areaStart();
13839   },
13840   areaEnd: function() {
13841     this._curve.areaEnd();
13842   },
13843   lineStart: function() {
13844     this._curve.lineStart();
13845   },
13846   lineEnd: function() {
13847     this._curve.lineEnd();
13848   },
13849   point: function(a, r) {
13850     this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13851   }
13852 };
13853
13854 function curveRadial(curve) {
13855
13856   function radial(context) {
13857     return new Radial(curve(context));
13858   }
13859
13860   radial._curve = curve;
13861
13862   return radial;
13863 }
13864
13865 function lineRadial(l) {
13866   var c = l.curve;
13867
13868   l.angle = l.x, delete l.x;
13869   l.radius = l.y, delete l.y;
13870
13871   l.curve = function(_) {
13872     return arguments.length ? c(curveRadial(_)) : c()._curve;
13873   };
13874
13875   return l;
13876 }
13877
13878 var lineRadial$1 = function() {
13879   return lineRadial(line().curve(curveRadialLinear));
13880 };
13881
13882 var areaRadial = function() {
13883   var a = area().curve(curveRadialLinear),
13884       c = a.curve,
13885       x0 = a.lineX0,
13886       x1 = a.lineX1,
13887       y0 = a.lineY0,
13888       y1 = a.lineY1;
13889
13890   a.angle = a.x, delete a.x;
13891   a.startAngle = a.x0, delete a.x0;
13892   a.endAngle = a.x1, delete a.x1;
13893   a.radius = a.y, delete a.y;
13894   a.innerRadius = a.y0, delete a.y0;
13895   a.outerRadius = a.y1, delete a.y1;
13896   a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
13897   a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
13898   a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
13899   a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
13900
13901   a.curve = function(_) {
13902     return arguments.length ? c(curveRadial(_)) : c()._curve;
13903   };
13904
13905   return a;
13906 };
13907
13908 var pointRadial = function(x, y) {
13909   return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
13910 };
13911
13912 var slice$6 = Array.prototype.slice;
13913
13914 function linkSource(d) {
13915   return d.source;
13916 }
13917
13918 function linkTarget(d) {
13919   return d.target;
13920 }
13921
13922 function link$2(curve) {
13923   var source = linkSource,
13924       target = linkTarget,
13925       x = x$3,
13926       y = y$3,
13927       context = null;
13928
13929   function link() {
13930     var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
13931     if (!context) context = buffer = path();
13932     curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
13933     if (buffer) return context = null, buffer + "" || null;
13934   }
13935
13936   link.source = function(_) {
13937     return arguments.length ? (source = _, link) : source;
13938   };
13939
13940   link.target = function(_) {
13941     return arguments.length ? (target = _, link) : target;
13942   };
13943
13944   link.x = function(_) {
13945     return arguments.length ? (x = typeof _ === "function" ? _ : constant$10(+_), link) : x;
13946   };
13947
13948   link.y = function(_) {
13949     return arguments.length ? (y = typeof _ === "function" ? _ : constant$10(+_), link) : y;
13950   };
13951
13952   link.context = function(_) {
13953     return arguments.length ? ((context = _ == null ? null : _), link) : context;
13954   };
13955
13956   return link;
13957 }
13958
13959 function curveHorizontal(context, x0, y0, x1, y1) {
13960   context.moveTo(x0, y0);
13961   context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
13962 }
13963
13964 function curveVertical(context, x0, y0, x1, y1) {
13965   context.moveTo(x0, y0);
13966   context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
13967 }
13968
13969 function curveRadial$1(context, x0, y0, x1, y1) {
13970   var p0 = pointRadial(x0, y0),
13971       p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
13972       p2 = pointRadial(x1, y0),
13973       p3 = pointRadial(x1, y1);
13974   context.moveTo(p0[0], p0[1]);
13975   context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
13976 }
13977
13978 function linkHorizontal() {
13979   return link$2(curveHorizontal);
13980 }
13981
13982 function linkVertical() {
13983   return link$2(curveVertical);
13984 }
13985
13986 function linkRadial() {
13987   var l = link$2(curveRadial$1);
13988   l.angle = l.x, delete l.x;
13989   l.radius = l.y, delete l.y;
13990   return l;
13991 }
13992
13993 var circle$2 = {
13994   draw: function(context, size) {
13995     var r = Math.sqrt(size / pi$4);
13996     context.moveTo(r, 0);
13997     context.arc(0, 0, r, 0, tau$4);
13998   }
13999 };
14000
14001 var cross$2 = {
14002   draw: function(context, size) {
14003     var r = Math.sqrt(size / 5) / 2;
14004     context.moveTo(-3 * r, -r);
14005     context.lineTo(-r, -r);
14006     context.lineTo(-r, -3 * r);
14007     context.lineTo(r, -3 * r);
14008     context.lineTo(r, -r);
14009     context.lineTo(3 * r, -r);
14010     context.lineTo(3 * r, r);
14011     context.lineTo(r, r);
14012     context.lineTo(r, 3 * r);
14013     context.lineTo(-r, 3 * r);
14014     context.lineTo(-r, r);
14015     context.lineTo(-3 * r, r);
14016     context.closePath();
14017   }
14018 };
14019
14020 var tan30 = Math.sqrt(1 / 3);
14021 var tan30_2 = tan30 * 2;
14022
14023 var diamond = {
14024   draw: function(context, size) {
14025     var y = Math.sqrt(size / tan30_2),
14026         x = y * tan30;
14027     context.moveTo(0, -y);
14028     context.lineTo(x, 0);
14029     context.lineTo(0, y);
14030     context.lineTo(-x, 0);
14031     context.closePath();
14032   }
14033 };
14034
14035 var ka = 0.89081309152928522810;
14036 var kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10);
14037 var kx = Math.sin(tau$4 / 10) * kr;
14038 var ky = -Math.cos(tau$4 / 10) * kr;
14039
14040 var star = {
14041   draw: function(context, size) {
14042     var r = Math.sqrt(size * ka),
14043         x = kx * r,
14044         y = ky * r;
14045     context.moveTo(0, -r);
14046     context.lineTo(x, y);
14047     for (var i = 1; i < 5; ++i) {
14048       var a = tau$4 * i / 5,
14049           c = Math.cos(a),
14050           s = Math.sin(a);
14051       context.lineTo(s * r, -c * r);
14052       context.lineTo(c * x - s * y, s * x + c * y);
14053     }
14054     context.closePath();
14055   }
14056 };
14057
14058 var square = {
14059   draw: function(context, size) {
14060     var w = Math.sqrt(size),
14061         x = -w / 2;
14062     context.rect(x, x, w, w);
14063   }
14064 };
14065
14066 var sqrt3 = Math.sqrt(3);
14067
14068 var triangle = {
14069   draw: function(context, size) {
14070     var y = -Math.sqrt(size / (sqrt3 * 3));
14071     context.moveTo(0, y * 2);
14072     context.lineTo(-sqrt3 * y, -y);
14073     context.lineTo(sqrt3 * y, -y);
14074     context.closePath();
14075   }
14076 };
14077
14078 var c = -0.5;
14079 var s = Math.sqrt(3) / 2;
14080 var k = 1 / Math.sqrt(12);
14081 var a = (k / 2 + 1) * 3;
14082
14083 var wye = {
14084   draw: function(context, size) {
14085     var r = Math.sqrt(size / a),
14086         x0 = r / 2,
14087         y0 = r * k,
14088         x1 = x0,
14089         y1 = r * k + r,
14090         x2 = -x1,
14091         y2 = y1;
14092     context.moveTo(x0, y0);
14093     context.lineTo(x1, y1);
14094     context.lineTo(x2, y2);
14095     context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14096     context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14097     context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14098     context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14099     context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14100     context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14101     context.closePath();
14102   }
14103 };
14104
14105 var symbols = [
14106   circle$2,
14107   cross$2,
14108   diamond,
14109   square,
14110   star,
14111   triangle,
14112   wye
14113 ];
14114
14115 var symbol = function() {
14116   var type = constant$10(circle$2),
14117       size = constant$10(64),
14118       context = null;
14119
14120   function symbol() {
14121     var buffer;
14122     if (!context) context = buffer = path();
14123     type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14124     if (buffer) return context = null, buffer + "" || null;
14125   }
14126
14127   symbol.type = function(_) {
14128     return arguments.length ? (type = typeof _ === "function" ? _ : constant$10(_), symbol) : type;
14129   };
14130
14131   symbol.size = function(_) {
14132     return arguments.length ? (size = typeof _ === "function" ? _ : constant$10(+_), symbol) : size;
14133   };
14134
14135   symbol.context = function(_) {
14136     return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14137   };
14138
14139   return symbol;
14140 };
14141
14142 var noop$2 = function() {};
14143
14144 function point$2(that, x, y) {
14145   that._context.bezierCurveTo(
14146     (2 * that._x0 + that._x1) / 3,
14147     (2 * that._y0 + that._y1) / 3,
14148     (that._x0 + 2 * that._x1) / 3,
14149     (that._y0 + 2 * that._y1) / 3,
14150     (that._x0 + 4 * that._x1 + x) / 6,
14151     (that._y0 + 4 * that._y1 + y) / 6
14152   );
14153 }
14154
14155 function Basis(context) {
14156   this._context = context;
14157 }
14158
14159 Basis.prototype = {
14160   areaStart: function() {
14161     this._line = 0;
14162   },
14163   areaEnd: function() {
14164     this._line = NaN;
14165   },
14166   lineStart: function() {
14167     this._x0 = this._x1 =
14168     this._y0 = this._y1 = NaN;
14169     this._point = 0;
14170   },
14171   lineEnd: function() {
14172     switch (this._point) {
14173       case 3: point$2(this, this._x1, this._y1); // proceed
14174       case 2: this._context.lineTo(this._x1, this._y1); break;
14175     }
14176     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14177     this._line = 1 - this._line;
14178   },
14179   point: function(x, y) {
14180     x = +x, y = +y;
14181     switch (this._point) {
14182       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14183       case 1: this._point = 2; break;
14184       case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14185       default: point$2(this, x, y); break;
14186     }
14187     this._x0 = this._x1, this._x1 = x;
14188     this._y0 = this._y1, this._y1 = y;
14189   }
14190 };
14191
14192 var basis$2 = function(context) {
14193   return new Basis(context);
14194 };
14195
14196 function BasisClosed(context) {
14197   this._context = context;
14198 }
14199
14200 BasisClosed.prototype = {
14201   areaStart: noop$2,
14202   areaEnd: noop$2,
14203   lineStart: function() {
14204     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14205     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14206     this._point = 0;
14207   },
14208   lineEnd: function() {
14209     switch (this._point) {
14210       case 1: {
14211         this._context.moveTo(this._x2, this._y2);
14212         this._context.closePath();
14213         break;
14214       }
14215       case 2: {
14216         this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14217         this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14218         this._context.closePath();
14219         break;
14220       }
14221       case 3: {
14222         this.point(this._x2, this._y2);
14223         this.point(this._x3, this._y3);
14224         this.point(this._x4, this._y4);
14225         break;
14226       }
14227     }
14228   },
14229   point: function(x, y) {
14230     x = +x, y = +y;
14231     switch (this._point) {
14232       case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14233       case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14234       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;
14235       default: point$2(this, x, y); break;
14236     }
14237     this._x0 = this._x1, this._x1 = x;
14238     this._y0 = this._y1, this._y1 = y;
14239   }
14240 };
14241
14242 var basisClosed$1 = function(context) {
14243   return new BasisClosed(context);
14244 };
14245
14246 function BasisOpen(context) {
14247   this._context = context;
14248 }
14249
14250 BasisOpen.prototype = {
14251   areaStart: function() {
14252     this._line = 0;
14253   },
14254   areaEnd: function() {
14255     this._line = NaN;
14256   },
14257   lineStart: function() {
14258     this._x0 = this._x1 =
14259     this._y0 = this._y1 = NaN;
14260     this._point = 0;
14261   },
14262   lineEnd: function() {
14263     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14264     this._line = 1 - this._line;
14265   },
14266   point: function(x, y) {
14267     x = +x, y = +y;
14268     switch (this._point) {
14269       case 0: this._point = 1; break;
14270       case 1: this._point = 2; break;
14271       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;
14272       case 3: this._point = 4; // proceed
14273       default: point$2(this, x, y); break;
14274     }
14275     this._x0 = this._x1, this._x1 = x;
14276     this._y0 = this._y1, this._y1 = y;
14277   }
14278 };
14279
14280 var basisOpen = function(context) {
14281   return new BasisOpen(context);
14282 };
14283
14284 function Bundle(context, beta) {
14285   this._basis = new Basis(context);
14286   this._beta = beta;
14287 }
14288
14289 Bundle.prototype = {
14290   lineStart: function() {
14291     this._x = [];
14292     this._y = [];
14293     this._basis.lineStart();
14294   },
14295   lineEnd: function() {
14296     var x = this._x,
14297         y = this._y,
14298         j = x.length - 1;
14299
14300     if (j > 0) {
14301       var x0 = x[0],
14302           y0 = y[0],
14303           dx = x[j] - x0,
14304           dy = y[j] - y0,
14305           i = -1,
14306           t;
14307
14308       while (++i <= j) {
14309         t = i / j;
14310         this._basis.point(
14311           this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14312           this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14313         );
14314       }
14315     }
14316
14317     this._x = this._y = null;
14318     this._basis.lineEnd();
14319   },
14320   point: function(x, y) {
14321     this._x.push(+x);
14322     this._y.push(+y);
14323   }
14324 };
14325
14326 var bundle = (function custom(beta) {
14327
14328   function bundle(context) {
14329     return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14330   }
14331
14332   bundle.beta = function(beta) {
14333     return custom(+beta);
14334   };
14335
14336   return bundle;
14337 })(0.85);
14338
14339 function point$3(that, x, y) {
14340   that._context.bezierCurveTo(
14341     that._x1 + that._k * (that._x2 - that._x0),
14342     that._y1 + that._k * (that._y2 - that._y0),
14343     that._x2 + that._k * (that._x1 - x),
14344     that._y2 + that._k * (that._y1 - y),
14345     that._x2,
14346     that._y2
14347   );
14348 }
14349
14350 function Cardinal(context, tension) {
14351   this._context = context;
14352   this._k = (1 - tension) / 6;
14353 }
14354
14355 Cardinal.prototype = {
14356   areaStart: function() {
14357     this._line = 0;
14358   },
14359   areaEnd: function() {
14360     this._line = NaN;
14361   },
14362   lineStart: function() {
14363     this._x0 = this._x1 = this._x2 =
14364     this._y0 = this._y1 = this._y2 = NaN;
14365     this._point = 0;
14366   },
14367   lineEnd: function() {
14368     switch (this._point) {
14369       case 2: this._context.lineTo(this._x2, this._y2); break;
14370       case 3: point$3(this, this._x1, this._y1); break;
14371     }
14372     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14373     this._line = 1 - this._line;
14374   },
14375   point: function(x, y) {
14376     x = +x, y = +y;
14377     switch (this._point) {
14378       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14379       case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14380       case 2: this._point = 3; // proceed
14381       default: point$3(this, x, y); break;
14382     }
14383     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14384     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14385   }
14386 };
14387
14388 var cardinal = (function custom(tension) {
14389
14390   function cardinal(context) {
14391     return new Cardinal(context, tension);
14392   }
14393
14394   cardinal.tension = function(tension) {
14395     return custom(+tension);
14396   };
14397
14398   return cardinal;
14399 })(0);
14400
14401 function CardinalClosed(context, tension) {
14402   this._context = context;
14403   this._k = (1 - tension) / 6;
14404 }
14405
14406 CardinalClosed.prototype = {
14407   areaStart: noop$2,
14408   areaEnd: noop$2,
14409   lineStart: function() {
14410     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14411     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14412     this._point = 0;
14413   },
14414   lineEnd: function() {
14415     switch (this._point) {
14416       case 1: {
14417         this._context.moveTo(this._x3, this._y3);
14418         this._context.closePath();
14419         break;
14420       }
14421       case 2: {
14422         this._context.lineTo(this._x3, this._y3);
14423         this._context.closePath();
14424         break;
14425       }
14426       case 3: {
14427         this.point(this._x3, this._y3);
14428         this.point(this._x4, this._y4);
14429         this.point(this._x5, this._y5);
14430         break;
14431       }
14432     }
14433   },
14434   point: function(x, y) {
14435     x = +x, y = +y;
14436     switch (this._point) {
14437       case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14438       case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14439       case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14440       default: point$3(this, x, y); break;
14441     }
14442     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14443     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14444   }
14445 };
14446
14447 var cardinalClosed = (function custom(tension) {
14448
14449   function cardinal$$1(context) {
14450     return new CardinalClosed(context, tension);
14451   }
14452
14453   cardinal$$1.tension = function(tension) {
14454     return custom(+tension);
14455   };
14456
14457   return cardinal$$1;
14458 })(0);
14459
14460 function CardinalOpen(context, tension) {
14461   this._context = context;
14462   this._k = (1 - tension) / 6;
14463 }
14464
14465 CardinalOpen.prototype = {
14466   areaStart: function() {
14467     this._line = 0;
14468   },
14469   areaEnd: function() {
14470     this._line = NaN;
14471   },
14472   lineStart: function() {
14473     this._x0 = this._x1 = this._x2 =
14474     this._y0 = this._y1 = this._y2 = NaN;
14475     this._point = 0;
14476   },
14477   lineEnd: function() {
14478     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14479     this._line = 1 - this._line;
14480   },
14481   point: function(x, y) {
14482     x = +x, y = +y;
14483     switch (this._point) {
14484       case 0: this._point = 1; break;
14485       case 1: this._point = 2; break;
14486       case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14487       case 3: this._point = 4; // proceed
14488       default: point$3(this, x, y); break;
14489     }
14490     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14491     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14492   }
14493 };
14494
14495 var cardinalOpen = (function custom(tension) {
14496
14497   function cardinal$$1(context) {
14498     return new CardinalOpen(context, tension);
14499   }
14500
14501   cardinal$$1.tension = function(tension) {
14502     return custom(+tension);
14503   };
14504
14505   return cardinal$$1;
14506 })(0);
14507
14508 function point$4(that, x, y) {
14509   var x1 = that._x1,
14510       y1 = that._y1,
14511       x2 = that._x2,
14512       y2 = that._y2;
14513
14514   if (that._l01_a > epsilon$3) {
14515     var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14516         n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14517     x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14518     y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14519   }
14520
14521   if (that._l23_a > epsilon$3) {
14522     var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14523         m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14524     x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14525     y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14526   }
14527
14528   that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14529 }
14530
14531 function CatmullRom(context, alpha) {
14532   this._context = context;
14533   this._alpha = alpha;
14534 }
14535
14536 CatmullRom.prototype = {
14537   areaStart: function() {
14538     this._line = 0;
14539   },
14540   areaEnd: function() {
14541     this._line = NaN;
14542   },
14543   lineStart: function() {
14544     this._x0 = this._x1 = this._x2 =
14545     this._y0 = this._y1 = this._y2 = NaN;
14546     this._l01_a = this._l12_a = this._l23_a =
14547     this._l01_2a = this._l12_2a = this._l23_2a =
14548     this._point = 0;
14549   },
14550   lineEnd: function() {
14551     switch (this._point) {
14552       case 2: this._context.lineTo(this._x2, this._y2); break;
14553       case 3: this.point(this._x2, this._y2); break;
14554     }
14555     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14556     this._line = 1 - this._line;
14557   },
14558   point: function(x, y) {
14559     x = +x, y = +y;
14560
14561     if (this._point) {
14562       var x23 = this._x2 - x,
14563           y23 = this._y2 - y;
14564       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14565     }
14566
14567     switch (this._point) {
14568       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14569       case 1: this._point = 2; break;
14570       case 2: this._point = 3; // proceed
14571       default: point$4(this, x, y); break;
14572     }
14573
14574     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14575     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14576     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14577     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14578   }
14579 };
14580
14581 var catmullRom = (function custom(alpha) {
14582
14583   function catmullRom(context) {
14584     return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14585   }
14586
14587   catmullRom.alpha = function(alpha) {
14588     return custom(+alpha);
14589   };
14590
14591   return catmullRom;
14592 })(0.5);
14593
14594 function CatmullRomClosed(context, alpha) {
14595   this._context = context;
14596   this._alpha = alpha;
14597 }
14598
14599 CatmullRomClosed.prototype = {
14600   areaStart: noop$2,
14601   areaEnd: noop$2,
14602   lineStart: function() {
14603     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14604     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14605     this._l01_a = this._l12_a = this._l23_a =
14606     this._l01_2a = this._l12_2a = this._l23_2a =
14607     this._point = 0;
14608   },
14609   lineEnd: function() {
14610     switch (this._point) {
14611       case 1: {
14612         this._context.moveTo(this._x3, this._y3);
14613         this._context.closePath();
14614         break;
14615       }
14616       case 2: {
14617         this._context.lineTo(this._x3, this._y3);
14618         this._context.closePath();
14619         break;
14620       }
14621       case 3: {
14622         this.point(this._x3, this._y3);
14623         this.point(this._x4, this._y4);
14624         this.point(this._x5, this._y5);
14625         break;
14626       }
14627     }
14628   },
14629   point: function(x, y) {
14630     x = +x, y = +y;
14631
14632     if (this._point) {
14633       var x23 = this._x2 - x,
14634           y23 = this._y2 - y;
14635       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14636     }
14637
14638     switch (this._point) {
14639       case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14640       case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14641       case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14642       default: point$4(this, x, y); break;
14643     }
14644
14645     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14646     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14647     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14648     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14649   }
14650 };
14651
14652 var catmullRomClosed = (function custom(alpha) {
14653
14654   function catmullRom$$1(context) {
14655     return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14656   }
14657
14658   catmullRom$$1.alpha = function(alpha) {
14659     return custom(+alpha);
14660   };
14661
14662   return catmullRom$$1;
14663 })(0.5);
14664
14665 function CatmullRomOpen(context, alpha) {
14666   this._context = context;
14667   this._alpha = alpha;
14668 }
14669
14670 CatmullRomOpen.prototype = {
14671   areaStart: function() {
14672     this._line = 0;
14673   },
14674   areaEnd: function() {
14675     this._line = NaN;
14676   },
14677   lineStart: function() {
14678     this._x0 = this._x1 = this._x2 =
14679     this._y0 = this._y1 = this._y2 = NaN;
14680     this._l01_a = this._l12_a = this._l23_a =
14681     this._l01_2a = this._l12_2a = this._l23_2a =
14682     this._point = 0;
14683   },
14684   lineEnd: function() {
14685     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14686     this._line = 1 - this._line;
14687   },
14688   point: function(x, y) {
14689     x = +x, y = +y;
14690
14691     if (this._point) {
14692       var x23 = this._x2 - x,
14693           y23 = this._y2 - y;
14694       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14695     }
14696
14697     switch (this._point) {
14698       case 0: this._point = 1; break;
14699       case 1: this._point = 2; break;
14700       case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14701       case 3: this._point = 4; // proceed
14702       default: point$4(this, x, y); break;
14703     }
14704
14705     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14706     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14707     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14708     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14709   }
14710 };
14711
14712 var catmullRomOpen = (function custom(alpha) {
14713
14714   function catmullRom$$1(context) {
14715     return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14716   }
14717
14718   catmullRom$$1.alpha = function(alpha) {
14719     return custom(+alpha);
14720   };
14721
14722   return catmullRom$$1;
14723 })(0.5);
14724
14725 function LinearClosed(context) {
14726   this._context = context;
14727 }
14728
14729 LinearClosed.prototype = {
14730   areaStart: noop$2,
14731   areaEnd: noop$2,
14732   lineStart: function() {
14733     this._point = 0;
14734   },
14735   lineEnd: function() {
14736     if (this._point) this._context.closePath();
14737   },
14738   point: function(x, y) {
14739     x = +x, y = +y;
14740     if (this._point) this._context.lineTo(x, y);
14741     else this._point = 1, this._context.moveTo(x, y);
14742   }
14743 };
14744
14745 var linearClosed = function(context) {
14746   return new LinearClosed(context);
14747 };
14748
14749 function sign$1(x) {
14750   return x < 0 ? -1 : 1;
14751 }
14752
14753 // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14754 // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14755 // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14756 // NOV(II), P. 443, 1990.
14757 function slope3(that, x2, y2) {
14758   var h0 = that._x1 - that._x0,
14759       h1 = x2 - that._x1,
14760       s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14761       s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14762       p = (s0 * h1 + s1 * h0) / (h0 + h1);
14763   return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14764 }
14765
14766 // Calculate a one-sided slope.
14767 function slope2(that, t) {
14768   var h = that._x1 - that._x0;
14769   return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14770 }
14771
14772 // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14773 // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14774 // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14775 function point$5(that, t0, t1) {
14776   var x0 = that._x0,
14777       y0 = that._y0,
14778       x1 = that._x1,
14779       y1 = that._y1,
14780       dx = (x1 - x0) / 3;
14781   that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14782 }
14783
14784 function MonotoneX(context) {
14785   this._context = context;
14786 }
14787
14788 MonotoneX.prototype = {
14789   areaStart: function() {
14790     this._line = 0;
14791   },
14792   areaEnd: function() {
14793     this._line = NaN;
14794   },
14795   lineStart: function() {
14796     this._x0 = this._x1 =
14797     this._y0 = this._y1 =
14798     this._t0 = NaN;
14799     this._point = 0;
14800   },
14801   lineEnd: function() {
14802     switch (this._point) {
14803       case 2: this._context.lineTo(this._x1, this._y1); break;
14804       case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14805     }
14806     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14807     this._line = 1 - this._line;
14808   },
14809   point: function(x, y) {
14810     var t1 = NaN;
14811
14812     x = +x, y = +y;
14813     if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14814     switch (this._point) {
14815       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14816       case 1: this._point = 2; break;
14817       case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14818       default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14819     }
14820
14821     this._x0 = this._x1, this._x1 = x;
14822     this._y0 = this._y1, this._y1 = y;
14823     this._t0 = t1;
14824   }
14825 };
14826
14827 function MonotoneY(context) {
14828   this._context = new ReflectContext(context);
14829 }
14830
14831 (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14832   MonotoneX.prototype.point.call(this, y, x);
14833 };
14834
14835 function ReflectContext(context) {
14836   this._context = context;
14837 }
14838
14839 ReflectContext.prototype = {
14840   moveTo: function(x, y) { this._context.moveTo(y, x); },
14841   closePath: function() { this._context.closePath(); },
14842   lineTo: function(x, y) { this._context.lineTo(y, x); },
14843   bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14844 };
14845
14846 function monotoneX(context) {
14847   return new MonotoneX(context);
14848 }
14849
14850 function monotoneY(context) {
14851   return new MonotoneY(context);
14852 }
14853
14854 function Natural(context) {
14855   this._context = context;
14856 }
14857
14858 Natural.prototype = {
14859   areaStart: function() {
14860     this._line = 0;
14861   },
14862   areaEnd: function() {
14863     this._line = NaN;
14864   },
14865   lineStart: function() {
14866     this._x = [];
14867     this._y = [];
14868   },
14869   lineEnd: function() {
14870     var x = this._x,
14871         y = this._y,
14872         n = x.length;
14873
14874     if (n) {
14875       this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
14876       if (n === 2) {
14877         this._context.lineTo(x[1], y[1]);
14878       } else {
14879         var px = controlPoints(x),
14880             py = controlPoints(y);
14881         for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
14882           this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
14883         }
14884       }
14885     }
14886
14887     if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
14888     this._line = 1 - this._line;
14889     this._x = this._y = null;
14890   },
14891   point: function(x, y) {
14892     this._x.push(+x);
14893     this._y.push(+y);
14894   }
14895 };
14896
14897 // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
14898 function controlPoints(x) {
14899   var i,
14900       n = x.length - 1,
14901       m,
14902       a = new Array(n),
14903       b = new Array(n),
14904       r = new Array(n);
14905   a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
14906   for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
14907   a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
14908   for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
14909   a[n - 1] = r[n - 1] / b[n - 1];
14910   for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
14911   b[n - 1] = (x[n] + a[n - 1]) / 2;
14912   for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
14913   return [a, b];
14914 }
14915
14916 var natural = function(context) {
14917   return new Natural(context);
14918 };
14919
14920 function Step(context, t) {
14921   this._context = context;
14922   this._t = t;
14923 }
14924
14925 Step.prototype = {
14926   areaStart: function() {
14927     this._line = 0;
14928   },
14929   areaEnd: function() {
14930     this._line = NaN;
14931   },
14932   lineStart: function() {
14933     this._x = this._y = NaN;
14934     this._point = 0;
14935   },
14936   lineEnd: function() {
14937     if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
14938     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14939     if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
14940   },
14941   point: function(x, y) {
14942     x = +x, y = +y;
14943     switch (this._point) {
14944       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14945       case 1: this._point = 2; // proceed
14946       default: {
14947         if (this._t <= 0) {
14948           this._context.lineTo(this._x, y);
14949           this._context.lineTo(x, y);
14950         } else {
14951           var x1 = this._x * (1 - this._t) + x * this._t;
14952           this._context.lineTo(x1, this._y);
14953           this._context.lineTo(x1, y);
14954         }
14955         break;
14956       }
14957     }
14958     this._x = x, this._y = y;
14959   }
14960 };
14961
14962 var step = function(context) {
14963   return new Step(context, 0.5);
14964 };
14965
14966 function stepBefore(context) {
14967   return new Step(context, 0);
14968 }
14969
14970 function stepAfter(context) {
14971   return new Step(context, 1);
14972 }
14973
14974 var none$1 = function(series, order) {
14975   if (!((n = series.length) > 1)) return;
14976   for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
14977     s0 = s1, s1 = series[order[i]];
14978     for (j = 0; j < m; ++j) {
14979       s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
14980     }
14981   }
14982 };
14983
14984 var none$2 = function(series) {
14985   var n = series.length, o = new Array(n);
14986   while (--n >= 0) o[n] = n;
14987   return o;
14988 };
14989
14990 function stackValue(d, key) {
14991   return d[key];
14992 }
14993
14994 var stack = function() {
14995   var keys = constant$10([]),
14996       order = none$2,
14997       offset = none$1,
14998       value = stackValue;
14999
15000   function stack(data) {
15001     var kz = keys.apply(this, arguments),
15002         i,
15003         m = data.length,
15004         n = kz.length,
15005         sz = new Array(n),
15006         oz;
15007
15008     for (i = 0; i < n; ++i) {
15009       for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15010         si[j] = sij = [0, +value(data[j], ki, j, data)];
15011         sij.data = data[j];
15012       }
15013       si.key = ki;
15014     }
15015
15016     for (i = 0, oz = order(sz); i < n; ++i) {
15017       sz[oz[i]].index = i;
15018     }
15019
15020     offset(sz, oz);
15021     return sz;
15022   }
15023
15024   stack.keys = function(_) {
15025     return arguments.length ? (keys = typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : keys;
15026   };
15027
15028   stack.value = function(_) {
15029     return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), stack) : value;
15030   };
15031
15032   stack.order = function(_) {
15033     return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : order;
15034   };
15035
15036   stack.offset = function(_) {
15037     return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15038   };
15039
15040   return stack;
15041 };
15042
15043 var expand = function(series, order) {
15044   if (!((n = series.length) > 0)) return;
15045   for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15046     for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15047     if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15048   }
15049   none$1(series, order);
15050 };
15051
15052 var diverging = function(series, order) {
15053   if (!((n = series.length) > 1)) return;
15054   for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15055     for (yp = yn = 0, i = 0; i < n; ++i) {
15056       if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15057         d[0] = yp, d[1] = yp += dy;
15058       } else if (dy < 0) {
15059         d[1] = yn, d[0] = yn += dy;
15060       } else {
15061         d[0] = yp;
15062       }
15063     }
15064   }
15065 };
15066
15067 var silhouette = function(series, order) {
15068   if (!((n = series.length) > 0)) return;
15069   for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15070     for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15071     s0[j][1] += s0[j][0] = -y / 2;
15072   }
15073   none$1(series, order);
15074 };
15075
15076 var wiggle = function(series, order) {
15077   if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15078   for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15079     for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15080       var si = series[order[i]],
15081           sij0 = si[j][1] || 0,
15082           sij1 = si[j - 1][1] || 0,
15083           s3 = (sij0 - sij1) / 2;
15084       for (var k = 0; k < i; ++k) {
15085         var sk = series[order[k]],
15086             skj0 = sk[j][1] || 0,
15087             skj1 = sk[j - 1][1] || 0;
15088         s3 += skj0 - skj1;
15089       }
15090       s1 += sij0, s2 += s3 * sij0;
15091     }
15092     s0[j - 1][1] += s0[j - 1][0] = y;
15093     if (s1) y -= s2 / s1;
15094   }
15095   s0[j - 1][1] += s0[j - 1][0] = y;
15096   none$1(series, order);
15097 };
15098
15099 var ascending$1 = function(series) {
15100   var sums = series.map(sum$2);
15101   return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15102 };
15103
15104 function sum$2(series) {
15105   var s = 0, i = -1, n = series.length, v;
15106   while (++i < n) if (v = +series[i][1]) s += v;
15107   return s;
15108 }
15109
15110 var descending$1 = function(series) {
15111   return ascending$1(series).reverse();
15112 };
15113
15114 var insideOut = function(series) {
15115   var n = series.length,
15116       i,
15117       j,
15118       sums = series.map(sum$2),
15119       order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15120       top = 0,
15121       bottom = 0,
15122       tops = [],
15123       bottoms = [];
15124
15125   for (i = 0; i < n; ++i) {
15126     j = order[i];
15127     if (top < bottom) {
15128       top += sums[j];
15129       tops.push(j);
15130     } else {
15131       bottom += sums[j];
15132       bottoms.push(j);
15133     }
15134   }
15135
15136   return bottoms.reverse().concat(tops);
15137 };
15138
15139 var reverse = function(series) {
15140   return none$2(series).reverse();
15141 };
15142
15143 var constant$11 = function(x) {
15144   return function() {
15145     return x;
15146   };
15147 };
15148
15149 function x$4(d) {
15150   return d[0];
15151 }
15152
15153 function y$4(d) {
15154   return d[1];
15155 }
15156
15157 function RedBlackTree() {
15158   this._ = null; // root node
15159 }
15160
15161 function RedBlackNode(node) {
15162   node.U = // parent node
15163   node.C = // color - true for red, false for black
15164   node.L = // left node
15165   node.R = // right node
15166   node.P = // previous node
15167   node.N = null; // next node
15168 }
15169
15170 RedBlackTree.prototype = {
15171   constructor: RedBlackTree,
15172
15173   insert: function(after, node) {
15174     var parent, grandpa, uncle;
15175
15176     if (after) {
15177       node.P = after;
15178       node.N = after.N;
15179       if (after.N) after.N.P = node;
15180       after.N = node;
15181       if (after.R) {
15182         after = after.R;
15183         while (after.L) after = after.L;
15184         after.L = node;
15185       } else {
15186         after.R = node;
15187       }
15188       parent = after;
15189     } else if (this._) {
15190       after = RedBlackFirst(this._);
15191       node.P = null;
15192       node.N = after;
15193       after.P = after.L = node;
15194       parent = after;
15195     } else {
15196       node.P = node.N = null;
15197       this._ = node;
15198       parent = null;
15199     }
15200     node.L = node.R = null;
15201     node.U = parent;
15202     node.C = true;
15203
15204     after = node;
15205     while (parent && parent.C) {
15206       grandpa = parent.U;
15207       if (parent === grandpa.L) {
15208         uncle = grandpa.R;
15209         if (uncle && uncle.C) {
15210           parent.C = uncle.C = false;
15211           grandpa.C = true;
15212           after = grandpa;
15213         } else {
15214           if (after === parent.R) {
15215             RedBlackRotateLeft(this, parent);
15216             after = parent;
15217             parent = after.U;
15218           }
15219           parent.C = false;
15220           grandpa.C = true;
15221           RedBlackRotateRight(this, grandpa);
15222         }
15223       } else {
15224         uncle = grandpa.L;
15225         if (uncle && uncle.C) {
15226           parent.C = uncle.C = false;
15227           grandpa.C = true;
15228           after = grandpa;
15229         } else {
15230           if (after === parent.L) {
15231             RedBlackRotateRight(this, parent);
15232             after = parent;
15233             parent = after.U;
15234           }
15235           parent.C = false;
15236           grandpa.C = true;
15237           RedBlackRotateLeft(this, grandpa);
15238         }
15239       }
15240       parent = after.U;
15241     }
15242     this._.C = false;
15243   },
15244
15245   remove: function(node) {
15246     if (node.N) node.N.P = node.P;
15247     if (node.P) node.P.N = node.N;
15248     node.N = node.P = null;
15249
15250     var parent = node.U,
15251         sibling,
15252         left = node.L,
15253         right = node.R,
15254         next,
15255         red;
15256
15257     if (!left) next = right;
15258     else if (!right) next = left;
15259     else next = RedBlackFirst(right);
15260
15261     if (parent) {
15262       if (parent.L === node) parent.L = next;
15263       else parent.R = next;
15264     } else {
15265       this._ = next;
15266     }
15267
15268     if (left && right) {
15269       red = next.C;
15270       next.C = node.C;
15271       next.L = left;
15272       left.U = next;
15273       if (next !== right) {
15274         parent = next.U;
15275         next.U = node.U;
15276         node = next.R;
15277         parent.L = node;
15278         next.R = right;
15279         right.U = next;
15280       } else {
15281         next.U = parent;
15282         parent = next;
15283         node = next.R;
15284       }
15285     } else {
15286       red = node.C;
15287       node = next;
15288     }
15289
15290     if (node) node.U = parent;
15291     if (red) return;
15292     if (node && node.C) { node.C = false; return; }
15293
15294     do {
15295       if (node === this._) break;
15296       if (node === parent.L) {
15297         sibling = parent.R;
15298         if (sibling.C) {
15299           sibling.C = false;
15300           parent.C = true;
15301           RedBlackRotateLeft(this, parent);
15302           sibling = parent.R;
15303         }
15304         if ((sibling.L && sibling.L.C)
15305             || (sibling.R && sibling.R.C)) {
15306           if (!sibling.R || !sibling.R.C) {
15307             sibling.L.C = false;
15308             sibling.C = true;
15309             RedBlackRotateRight(this, sibling);
15310             sibling = parent.R;
15311           }
15312           sibling.C = parent.C;
15313           parent.C = sibling.R.C = false;
15314           RedBlackRotateLeft(this, parent);
15315           node = this._;
15316           break;
15317         }
15318       } else {
15319         sibling = parent.L;
15320         if (sibling.C) {
15321           sibling.C = false;
15322           parent.C = true;
15323           RedBlackRotateRight(this, parent);
15324           sibling = parent.L;
15325         }
15326         if ((sibling.L && sibling.L.C)
15327           || (sibling.R && sibling.R.C)) {
15328           if (!sibling.L || !sibling.L.C) {
15329             sibling.R.C = false;
15330             sibling.C = true;
15331             RedBlackRotateLeft(this, sibling);
15332             sibling = parent.L;
15333           }
15334           sibling.C = parent.C;
15335           parent.C = sibling.L.C = false;
15336           RedBlackRotateRight(this, parent);
15337           node = this._;
15338           break;
15339         }
15340       }
15341       sibling.C = true;
15342       node = parent;
15343       parent = parent.U;
15344     } while (!node.C);
15345
15346     if (node) node.C = false;
15347   }
15348 };
15349
15350 function RedBlackRotateLeft(tree, node) {
15351   var p = node,
15352       q = node.R,
15353       parent = p.U;
15354
15355   if (parent) {
15356     if (parent.L === p) parent.L = q;
15357     else parent.R = q;
15358   } else {
15359     tree._ = q;
15360   }
15361
15362   q.U = parent;
15363   p.U = q;
15364   p.R = q.L;
15365   if (p.R) p.R.U = p;
15366   q.L = p;
15367 }
15368
15369 function RedBlackRotateRight(tree, node) {
15370   var p = node,
15371       q = node.L,
15372       parent = p.U;
15373
15374   if (parent) {
15375     if (parent.L === p) parent.L = q;
15376     else parent.R = q;
15377   } else {
15378     tree._ = q;
15379   }
15380
15381   q.U = parent;
15382   p.U = q;
15383   p.L = q.R;
15384   if (p.L) p.L.U = p;
15385   q.R = p;
15386 }
15387
15388 function RedBlackFirst(node) {
15389   while (node.L) node = node.L;
15390   return node;
15391 }
15392
15393 function createEdge(left, right, v0, v1) {
15394   var edge = [null, null],
15395       index = edges.push(edge) - 1;
15396   edge.left = left;
15397   edge.right = right;
15398   if (v0) setEdgeEnd(edge, left, right, v0);
15399   if (v1) setEdgeEnd(edge, right, left, v1);
15400   cells[left.index].halfedges.push(index);
15401   cells[right.index].halfedges.push(index);
15402   return edge;
15403 }
15404
15405 function createBorderEdge(left, v0, v1) {
15406   var edge = [v0, v1];
15407   edge.left = left;
15408   return edge;
15409 }
15410
15411 function setEdgeEnd(edge, left, right, vertex) {
15412   if (!edge[0] && !edge[1]) {
15413     edge[0] = vertex;
15414     edge.left = left;
15415     edge.right = right;
15416   } else if (edge.left === right) {
15417     edge[1] = vertex;
15418   } else {
15419     edge[0] = vertex;
15420   }
15421 }
15422
15423 // Liang–Barsky line clipping.
15424 function clipEdge(edge, x0, y0, x1, y1) {
15425   var a = edge[0],
15426       b = edge[1],
15427       ax = a[0],
15428       ay = a[1],
15429       bx = b[0],
15430       by = b[1],
15431       t0 = 0,
15432       t1 = 1,
15433       dx = bx - ax,
15434       dy = by - ay,
15435       r;
15436
15437   r = x0 - ax;
15438   if (!dx && r > 0) return;
15439   r /= dx;
15440   if (dx < 0) {
15441     if (r < t0) return;
15442     if (r < t1) t1 = r;
15443   } else if (dx > 0) {
15444     if (r > t1) return;
15445     if (r > t0) t0 = r;
15446   }
15447
15448   r = x1 - ax;
15449   if (!dx && r < 0) return;
15450   r /= dx;
15451   if (dx < 0) {
15452     if (r > t1) return;
15453     if (r > t0) t0 = r;
15454   } else if (dx > 0) {
15455     if (r < t0) return;
15456     if (r < t1) t1 = r;
15457   }
15458
15459   r = y0 - ay;
15460   if (!dy && r > 0) return;
15461   r /= dy;
15462   if (dy < 0) {
15463     if (r < t0) return;
15464     if (r < t1) t1 = r;
15465   } else if (dy > 0) {
15466     if (r > t1) return;
15467     if (r > t0) t0 = r;
15468   }
15469
15470   r = y1 - ay;
15471   if (!dy && r < 0) return;
15472   r /= dy;
15473   if (dy < 0) {
15474     if (r > t1) return;
15475     if (r > t0) t0 = r;
15476   } else if (dy > 0) {
15477     if (r < t0) return;
15478     if (r < t1) t1 = r;
15479   }
15480
15481   if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15482
15483   if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15484   if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15485   return true;
15486 }
15487
15488 function connectEdge(edge, x0, y0, x1, y1) {
15489   var v1 = edge[1];
15490   if (v1) return true;
15491
15492   var v0 = edge[0],
15493       left = edge.left,
15494       right = edge.right,
15495       lx = left[0],
15496       ly = left[1],
15497       rx = right[0],
15498       ry = right[1],
15499       fx = (lx + rx) / 2,
15500       fy = (ly + ry) / 2,
15501       fm,
15502       fb;
15503
15504   if (ry === ly) {
15505     if (fx < x0 || fx >= x1) return;
15506     if (lx > rx) {
15507       if (!v0) v0 = [fx, y0];
15508       else if (v0[1] >= y1) return;
15509       v1 = [fx, y1];
15510     } else {
15511       if (!v0) v0 = [fx, y1];
15512       else if (v0[1] < y0) return;
15513       v1 = [fx, y0];
15514     }
15515   } else {
15516     fm = (lx - rx) / (ry - ly);
15517     fb = fy - fm * fx;
15518     if (fm < -1 || fm > 1) {
15519       if (lx > rx) {
15520         if (!v0) v0 = [(y0 - fb) / fm, y0];
15521         else if (v0[1] >= y1) return;
15522         v1 = [(y1 - fb) / fm, y1];
15523       } else {
15524         if (!v0) v0 = [(y1 - fb) / fm, y1];
15525         else if (v0[1] < y0) return;
15526         v1 = [(y0 - fb) / fm, y0];
15527       }
15528     } else {
15529       if (ly < ry) {
15530         if (!v0) v0 = [x0, fm * x0 + fb];
15531         else if (v0[0] >= x1) return;
15532         v1 = [x1, fm * x1 + fb];
15533       } else {
15534         if (!v0) v0 = [x1, fm * x1 + fb];
15535         else if (v0[0] < x0) return;
15536         v1 = [x0, fm * x0 + fb];
15537       }
15538     }
15539   }
15540
15541   edge[0] = v0;
15542   edge[1] = v1;
15543   return true;
15544 }
15545
15546 function clipEdges(x0, y0, x1, y1) {
15547   var i = edges.length,
15548       edge;
15549
15550   while (i--) {
15551     if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15552         || !clipEdge(edge, x0, y0, x1, y1)
15553         || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15554             || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15555       delete edges[i];
15556     }
15557   }
15558 }
15559
15560 function createCell(site) {
15561   return cells[site.index] = {
15562     site: site,
15563     halfedges: []
15564   };
15565 }
15566
15567 function cellHalfedgeAngle(cell, edge) {
15568   var site = cell.site,
15569       va = edge.left,
15570       vb = edge.right;
15571   if (site === vb) vb = va, va = site;
15572   if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15573   if (site === va) va = edge[1], vb = edge[0];
15574   else va = edge[0], vb = edge[1];
15575   return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15576 }
15577
15578 function cellHalfedgeStart(cell, edge) {
15579   return edge[+(edge.left !== cell.site)];
15580 }
15581
15582 function cellHalfedgeEnd(cell, edge) {
15583   return edge[+(edge.left === cell.site)];
15584 }
15585
15586 function sortCellHalfedges() {
15587   for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15588     if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15589       var index = new Array(m),
15590           array = new Array(m);
15591       for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15592       index.sort(function(i, j) { return array[j] - array[i]; });
15593       for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15594       for (j = 0; j < m; ++j) halfedges[j] = array[j];
15595     }
15596   }
15597 }
15598
15599 function clipCells(x0, y0, x1, y1) {
15600   var nCells = cells.length,
15601       iCell,
15602       cell,
15603       site,
15604       iHalfedge,
15605       halfedges,
15606       nHalfedges,
15607       start,
15608       startX,
15609       startY,
15610       end,
15611       endX,
15612       endY,
15613       cover = true;
15614
15615   for (iCell = 0; iCell < nCells; ++iCell) {
15616     if (cell = cells[iCell]) {
15617       site = cell.site;
15618       halfedges = cell.halfedges;
15619       iHalfedge = halfedges.length;
15620
15621       // Remove any dangling clipped edges.
15622       while (iHalfedge--) {
15623         if (!edges[halfedges[iHalfedge]]) {
15624           halfedges.splice(iHalfedge, 1);
15625         }
15626       }
15627
15628       // Insert any border edges as necessary.
15629       iHalfedge = 0, nHalfedges = halfedges.length;
15630       while (iHalfedge < nHalfedges) {
15631         end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15632         start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15633         if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15634           halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15635               Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15636               : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15637               : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15638               : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15639               : null)) - 1);
15640           ++nHalfedges;
15641         }
15642       }
15643
15644       if (nHalfedges) cover = false;
15645     }
15646   }
15647
15648   // If there weren’t any edges, have the closest site cover the extent.
15649   // It doesn’t matter which corner of the extent we measure!
15650   if (cover) {
15651     var dx, dy, d2, dc = Infinity;
15652
15653     for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15654       if (cell = cells[iCell]) {
15655         site = cell.site;
15656         dx = site[0] - x0;
15657         dy = site[1] - y0;
15658         d2 = dx * dx + dy * dy;
15659         if (d2 < dc) dc = d2, cover = cell;
15660       }
15661     }
15662
15663     if (cover) {
15664       var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15665       cover.halfedges.push(
15666         edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15667         edges.push(createBorderEdge(site, v01, v11)) - 1,
15668         edges.push(createBorderEdge(site, v11, v10)) - 1,
15669         edges.push(createBorderEdge(site, v10, v00)) - 1
15670       );
15671     }
15672   }
15673
15674   // Lastly delete any cells with no edges; these were entirely clipped.
15675   for (iCell = 0; iCell < nCells; ++iCell) {
15676     if (cell = cells[iCell]) {
15677       if (!cell.halfedges.length) {
15678         delete cells[iCell];
15679       }
15680     }
15681   }
15682 }
15683
15684 var circlePool = [];
15685
15686 var firstCircle;
15687
15688 function Circle() {
15689   RedBlackNode(this);
15690   this.x =
15691   this.y =
15692   this.arc =
15693   this.site =
15694   this.cy = null;
15695 }
15696
15697 function attachCircle(arc) {
15698   var lArc = arc.P,
15699       rArc = arc.N;
15700
15701   if (!lArc || !rArc) return;
15702
15703   var lSite = lArc.site,
15704       cSite = arc.site,
15705       rSite = rArc.site;
15706
15707   if (lSite === rSite) return;
15708
15709   var bx = cSite[0],
15710       by = cSite[1],
15711       ax = lSite[0] - bx,
15712       ay = lSite[1] - by,
15713       cx = rSite[0] - bx,
15714       cy = rSite[1] - by;
15715
15716   var d = 2 * (ax * cy - ay * cx);
15717   if (d >= -epsilon2$2) return;
15718
15719   var ha = ax * ax + ay * ay,
15720       hc = cx * cx + cy * cy,
15721       x = (cy * ha - ay * hc) / d,
15722       y = (ax * hc - cx * ha) / d;
15723
15724   var circle = circlePool.pop() || new Circle;
15725   circle.arc = arc;
15726   circle.site = cSite;
15727   circle.x = x + bx;
15728   circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15729
15730   arc.circle = circle;
15731
15732   var before = null,
15733       node = circles._;
15734
15735   while (node) {
15736     if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15737       if (node.L) node = node.L;
15738       else { before = node.P; break; }
15739     } else {
15740       if (node.R) node = node.R;
15741       else { before = node; break; }
15742     }
15743   }
15744
15745   circles.insert(before, circle);
15746   if (!before) firstCircle = circle;
15747 }
15748
15749 function detachCircle(arc) {
15750   var circle = arc.circle;
15751   if (circle) {
15752     if (!circle.P) firstCircle = circle.N;
15753     circles.remove(circle);
15754     circlePool.push(circle);
15755     RedBlackNode(circle);
15756     arc.circle = null;
15757   }
15758 }
15759
15760 var beachPool = [];
15761
15762 function Beach() {
15763   RedBlackNode(this);
15764   this.edge =
15765   this.site =
15766   this.circle = null;
15767 }
15768
15769 function createBeach(site) {
15770   var beach = beachPool.pop() || new Beach;
15771   beach.site = site;
15772   return beach;
15773 }
15774
15775 function detachBeach(beach) {
15776   detachCircle(beach);
15777   beaches.remove(beach);
15778   beachPool.push(beach);
15779   RedBlackNode(beach);
15780 }
15781
15782 function removeBeach(beach) {
15783   var circle = beach.circle,
15784       x = circle.x,
15785       y = circle.cy,
15786       vertex = [x, y],
15787       previous = beach.P,
15788       next = beach.N,
15789       disappearing = [beach];
15790
15791   detachBeach(beach);
15792
15793   var lArc = previous;
15794   while (lArc.circle
15795       && Math.abs(x - lArc.circle.x) < epsilon$4
15796       && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15797     previous = lArc.P;
15798     disappearing.unshift(lArc);
15799     detachBeach(lArc);
15800     lArc = previous;
15801   }
15802
15803   disappearing.unshift(lArc);
15804   detachCircle(lArc);
15805
15806   var rArc = next;
15807   while (rArc.circle
15808       && Math.abs(x - rArc.circle.x) < epsilon$4
15809       && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15810     next = rArc.N;
15811     disappearing.push(rArc);
15812     detachBeach(rArc);
15813     rArc = next;
15814   }
15815
15816   disappearing.push(rArc);
15817   detachCircle(rArc);
15818
15819   var nArcs = disappearing.length,
15820       iArc;
15821   for (iArc = 1; iArc < nArcs; ++iArc) {
15822     rArc = disappearing[iArc];
15823     lArc = disappearing[iArc - 1];
15824     setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15825   }
15826
15827   lArc = disappearing[0];
15828   rArc = disappearing[nArcs - 1];
15829   rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15830
15831   attachCircle(lArc);
15832   attachCircle(rArc);
15833 }
15834
15835 function addBeach(site) {
15836   var x = site[0],
15837       directrix = site[1],
15838       lArc,
15839       rArc,
15840       dxl,
15841       dxr,
15842       node = beaches._;
15843
15844   while (node) {
15845     dxl = leftBreakPoint(node, directrix) - x;
15846     if (dxl > epsilon$4) node = node.L; else {
15847       dxr = x - rightBreakPoint(node, directrix);
15848       if (dxr > epsilon$4) {
15849         if (!node.R) {
15850           lArc = node;
15851           break;
15852         }
15853         node = node.R;
15854       } else {
15855         if (dxl > -epsilon$4) {
15856           lArc = node.P;
15857           rArc = node;
15858         } else if (dxr > -epsilon$4) {
15859           lArc = node;
15860           rArc = node.N;
15861         } else {
15862           lArc = rArc = node;
15863         }
15864         break;
15865       }
15866     }
15867   }
15868
15869   createCell(site);
15870   var newArc = createBeach(site);
15871   beaches.insert(lArc, newArc);
15872
15873   if (!lArc && !rArc) return;
15874
15875   if (lArc === rArc) {
15876     detachCircle(lArc);
15877     rArc = createBeach(lArc.site);
15878     beaches.insert(newArc, rArc);
15879     newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
15880     attachCircle(lArc);
15881     attachCircle(rArc);
15882     return;
15883   }
15884
15885   if (!rArc) { // && lArc
15886     newArc.edge = createEdge(lArc.site, newArc.site);
15887     return;
15888   }
15889
15890   // else lArc !== rArc
15891   detachCircle(lArc);
15892   detachCircle(rArc);
15893
15894   var lSite = lArc.site,
15895       ax = lSite[0],
15896       ay = lSite[1],
15897       bx = site[0] - ax,
15898       by = site[1] - ay,
15899       rSite = rArc.site,
15900       cx = rSite[0] - ax,
15901       cy = rSite[1] - ay,
15902       d = 2 * (bx * cy - by * cx),
15903       hb = bx * bx + by * by,
15904       hc = cx * cx + cy * cy,
15905       vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
15906
15907   setEdgeEnd(rArc.edge, lSite, rSite, vertex);
15908   newArc.edge = createEdge(lSite, site, null, vertex);
15909   rArc.edge = createEdge(site, rSite, null, vertex);
15910   attachCircle(lArc);
15911   attachCircle(rArc);
15912 }
15913
15914 function leftBreakPoint(arc, directrix) {
15915   var site = arc.site,
15916       rfocx = site[0],
15917       rfocy = site[1],
15918       pby2 = rfocy - directrix;
15919
15920   if (!pby2) return rfocx;
15921
15922   var lArc = arc.P;
15923   if (!lArc) return -Infinity;
15924
15925   site = lArc.site;
15926   var lfocx = site[0],
15927       lfocy = site[1],
15928       plby2 = lfocy - directrix;
15929
15930   if (!plby2) return lfocx;
15931
15932   var hl = lfocx - rfocx,
15933       aby2 = 1 / pby2 - 1 / plby2,
15934       b = hl / plby2;
15935
15936   if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
15937
15938   return (rfocx + lfocx) / 2;
15939 }
15940
15941 function rightBreakPoint(arc, directrix) {
15942   var rArc = arc.N;
15943   if (rArc) return leftBreakPoint(rArc, directrix);
15944   var site = arc.site;
15945   return site[1] === directrix ? site[0] : Infinity;
15946 }
15947
15948 var epsilon$4 = 1e-6;
15949 var epsilon2$2 = 1e-12;
15950 var beaches;
15951 var cells;
15952 var circles;
15953 var edges;
15954
15955 function triangleArea(a, b, c) {
15956   return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
15957 }
15958
15959 function lexicographic(a, b) {
15960   return b[1] - a[1]
15961       || b[0] - a[0];
15962 }
15963
15964 function Diagram(sites, extent) {
15965   var site = sites.sort(lexicographic).pop(),
15966       x,
15967       y,
15968       circle;
15969
15970   edges = [];
15971   cells = new Array(sites.length);
15972   beaches = new RedBlackTree;
15973   circles = new RedBlackTree;
15974
15975   while (true) {
15976     circle = firstCircle;
15977     if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
15978       if (site[0] !== x || site[1] !== y) {
15979         addBeach(site);
15980         x = site[0], y = site[1];
15981       }
15982       site = sites.pop();
15983     } else if (circle) {
15984       removeBeach(circle.arc);
15985     } else {
15986       break;
15987     }
15988   }
15989
15990   sortCellHalfedges();
15991
15992   if (extent) {
15993     var x0 = +extent[0][0],
15994         y0 = +extent[0][1],
15995         x1 = +extent[1][0],
15996         y1 = +extent[1][1];
15997     clipEdges(x0, y0, x1, y1);
15998     clipCells(x0, y0, x1, y1);
15999   }
16000
16001   this.edges = edges;
16002   this.cells = cells;
16003
16004   beaches =
16005   circles =
16006   edges =
16007   cells = null;
16008 }
16009
16010 Diagram.prototype = {
16011   constructor: Diagram,
16012
16013   polygons: function() {
16014     var edges = this.edges;
16015
16016     return this.cells.map(function(cell) {
16017       var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16018       polygon.data = cell.site.data;
16019       return polygon;
16020     });
16021   },
16022
16023   triangles: function() {
16024     var triangles = [],
16025         edges = this.edges;
16026
16027     this.cells.forEach(function(cell, i) {
16028       if (!(m = (halfedges = cell.halfedges).length)) return;
16029       var site = cell.site,
16030           halfedges,
16031           j = -1,
16032           m,
16033           s0,
16034           e1 = edges[halfedges[m - 1]],
16035           s1 = e1.left === site ? e1.right : e1.left;
16036
16037       while (++j < m) {
16038         s0 = s1;
16039         e1 = edges[halfedges[j]];
16040         s1 = e1.left === site ? e1.right : e1.left;
16041         if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16042           triangles.push([site.data, s0.data, s1.data]);
16043         }
16044       }
16045     });
16046
16047     return triangles;
16048   },
16049
16050   links: function() {
16051     return this.edges.filter(function(edge) {
16052       return edge.right;
16053     }).map(function(edge) {
16054       return {
16055         source: edge.left.data,
16056         target: edge.right.data
16057       };
16058     });
16059   },
16060
16061   find: function(x, y, radius) {
16062     var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16063
16064     // Use the previously-found cell, or start with an arbitrary one.
16065     while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16066     var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16067
16068     // Traverse the half-edges to find a closer cell, if any.
16069     do {
16070       cell = that.cells[i0 = i1], i1 = null;
16071       cell.halfedges.forEach(function(e) {
16072         var edge = that.edges[e], v = edge.left;
16073         if ((v === cell.site || !v) && !(v = edge.right)) return;
16074         var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16075         if (v2 < d2) d2 = v2, i1 = v.index;
16076       });
16077     } while (i1 !== null);
16078
16079     that._found = i0;
16080
16081     return radius == null || d2 <= radius * radius ? cell.site : null;
16082   }
16083 };
16084
16085 var voronoi = function() {
16086   var x = x$4,
16087       y = y$4,
16088       extent = null;
16089
16090   function voronoi(data) {
16091     return new Diagram(data.map(function(d, i) {
16092       var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
16093       s.index = i;
16094       s.data = d;
16095       return s;
16096     }), extent);
16097   }
16098
16099   voronoi.polygons = function(data) {
16100     return voronoi(data).polygons();
16101   };
16102
16103   voronoi.links = function(data) {
16104     return voronoi(data).links();
16105   };
16106
16107   voronoi.triangles = function(data) {
16108     return voronoi(data).triangles();
16109   };
16110
16111   voronoi.x = function(_) {
16112     return arguments.length ? (x = typeof _ === "function" ? _ : constant$11(+_), voronoi) : x;
16113   };
16114
16115   voronoi.y = function(_) {
16116     return arguments.length ? (y = typeof _ === "function" ? _ : constant$11(+_), voronoi) : y;
16117   };
16118
16119   voronoi.extent = function(_) {
16120     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]]];
16121   };
16122
16123   voronoi.size = function(_) {
16124     return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16125   };
16126
16127   return voronoi;
16128 };
16129
16130 var constant$12 = function(x) {
16131   return function() {
16132     return x;
16133   };
16134 };
16135
16136 function ZoomEvent(target, type, transform) {
16137   this.target = target;
16138   this.type = type;
16139   this.transform = transform;
16140 }
16141
16142 function Transform(k, x, y) {
16143   this.k = k;
16144   this.x = x;
16145   this.y = y;
16146 }
16147
16148 Transform.prototype = {
16149   constructor: Transform,
16150   scale: function(k) {
16151     return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16152   },
16153   translate: function(x, y) {
16154     return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16155   },
16156   apply: function(point) {
16157     return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16158   },
16159   applyX: function(x) {
16160     return x * this.k + this.x;
16161   },
16162   applyY: function(y) {
16163     return y * this.k + this.y;
16164   },
16165   invert: function(location) {
16166     return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16167   },
16168   invertX: function(x) {
16169     return (x - this.x) / this.k;
16170   },
16171   invertY: function(y) {
16172     return (y - this.y) / this.k;
16173   },
16174   rescaleX: function(x) {
16175     return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16176   },
16177   rescaleY: function(y) {
16178     return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16179   },
16180   toString: function() {
16181     return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16182   }
16183 };
16184
16185 var identity$7 = new Transform(1, 0, 0);
16186
16187 transform.prototype = Transform.prototype;
16188
16189 function transform(node) {
16190   return node.__zoom || identity$7;
16191 }
16192
16193 function nopropagation$2() {
16194   event.stopImmediatePropagation();
16195 }
16196
16197 var noevent$2 = function() {
16198   event.preventDefault();
16199   event.stopImmediatePropagation();
16200 };
16201
16202 // Ignore right-click, since that should open the context menu.
16203 function defaultFilter$2() {
16204   return !event.button;
16205 }
16206
16207 function defaultExtent$1() {
16208   var e = this, w, h;
16209   if (e instanceof SVGElement) {
16210     e = e.ownerSVGElement || e;
16211     w = e.width.baseVal.value;
16212     h = e.height.baseVal.value;
16213   } else {
16214     w = e.clientWidth;
16215     h = e.clientHeight;
16216   }
16217   return [[0, 0], [w, h]];
16218 }
16219
16220 function defaultTransform() {
16221   return this.__zoom || identity$7;
16222 }
16223
16224 function defaultWheelDelta() {
16225   return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16226 }
16227
16228 function defaultTouchable$1() {
16229   return "ontouchstart" in this;
16230 }
16231
16232 var d3_zoom = function() {
16233   var filter = defaultFilter$2,
16234       extent = defaultExtent$1,
16235       wheelDelta = defaultWheelDelta,
16236       touchable = defaultTouchable$1,
16237       k0 = 0,
16238       k1 = Infinity,
16239       x0 = -k1,
16240       x1 = k1,
16241       y0 = x0,
16242       y1 = x1,
16243       duration = 250,
16244       interpolate = interpolateZoom,
16245       gestures = [],
16246       listeners = dispatch("start", "zoom", "end"),
16247       touchstarting,
16248       touchending,
16249       touchDelay = 500,
16250       wheelDelay = 150,
16251       clickDistance2 = 0;
16252
16253   function zoom(selection$$1) {
16254     selection$$1
16255         .property("__zoom", defaultTransform)
16256         .on("wheel.zoom", wheeled)
16257         .on("mousedown.zoom", mousedowned)
16258         .on("dblclick.zoom", dblclicked)
16259       .filter(touchable)
16260         .on("touchstart.zoom", touchstarted)
16261         .on("touchmove.zoom", touchmoved)
16262         .on("touchend.zoom touchcancel.zoom", touchended)
16263         .style("touch-action", "none")
16264         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16265   }
16266
16267   zoom.transform = function(collection, transform$$1) {
16268     var selection$$1 = collection.selection ? collection.selection() : collection;
16269     selection$$1.property("__zoom", defaultTransform);
16270     if (collection !== selection$$1) {
16271       schedule(collection, transform$$1);
16272     } else {
16273       selection$$1.interrupt().each(function() {
16274         gesture(this, arguments)
16275             .start()
16276             .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16277             .end();
16278       });
16279     }
16280   };
16281
16282   zoom.scaleBy = function(selection$$1, k) {
16283     zoom.scaleTo(selection$$1, function() {
16284       var k0 = this.__zoom.k,
16285           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16286       return k0 * k1;
16287     });
16288   };
16289
16290   zoom.scaleTo = function(selection$$1, k) {
16291     zoom.transform(selection$$1, function() {
16292       var e = extent.apply(this, arguments),
16293           t0 = this.__zoom,
16294           p0 = centroid(e),
16295           p1 = t0.invert(p0),
16296           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16297       return constrain(translate(scale(t0, k1), p0, p1), e);
16298     });
16299   };
16300
16301   zoom.translateBy = function(selection$$1, x, y) {
16302     zoom.transform(selection$$1, function() {
16303       return constrain(this.__zoom.translate(
16304         typeof x === "function" ? x.apply(this, arguments) : x,
16305         typeof y === "function" ? y.apply(this, arguments) : y
16306       ), extent.apply(this, arguments));
16307     });
16308   };
16309
16310   zoom.translateTo = function(selection$$1, x, y) {
16311     zoom.transform(selection$$1, function() {
16312       var e = extent.apply(this, arguments),
16313           t = this.__zoom,
16314           p = centroid(e);
16315       return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16316         typeof x === "function" ? -x.apply(this, arguments) : -x,
16317         typeof y === "function" ? -y.apply(this, arguments) : -y
16318       ), e);
16319     });
16320   };
16321
16322   function scale(transform$$1, k) {
16323     k = Math.max(k0, Math.min(k1, k));
16324     return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16325   }
16326
16327   function translate(transform$$1, p0, p1) {
16328     var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16329     return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16330   }
16331
16332   function constrain(transform$$1, extent) {
16333     var dx0 = transform$$1.invertX(extent[0][0]) - x0,
16334         dx1 = transform$$1.invertX(extent[1][0]) - x1,
16335         dy0 = transform$$1.invertY(extent[0][1]) - y0,
16336         dy1 = transform$$1.invertY(extent[1][1]) - y1;
16337     return transform$$1.translate(
16338       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16339       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16340     );
16341   }
16342
16343   function centroid(extent) {
16344     return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16345   }
16346
16347   function schedule(transition$$1, transform$$1, center) {
16348     transition$$1
16349         .on("start.zoom", function() { gesture(this, arguments).start(); })
16350         .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16351         .tween("zoom", function() {
16352           var that = this,
16353               args = arguments,
16354               g = gesture(that, args),
16355               e = extent.apply(that, args),
16356               p = center || centroid(e),
16357               w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16358               a = that.__zoom,
16359               b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16360               i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16361           return function(t) {
16362             if (t === 1) t = b; // Avoid rounding error on end.
16363             else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16364             g.zoom(null, t);
16365           };
16366         });
16367   }
16368
16369   function gesture(that, args) {
16370     for (var i = 0, n = gestures.length, g; i < n; ++i) {
16371       if ((g = gestures[i]).that === that) {
16372         return g;
16373       }
16374     }
16375     return new Gesture(that, args);
16376   }
16377
16378   function Gesture(that, args) {
16379     this.that = that;
16380     this.args = args;
16381     this.index = -1;
16382     this.active = 0;
16383     this.extent = extent.apply(that, args);
16384   }
16385
16386   Gesture.prototype = {
16387     start: function() {
16388       if (++this.active === 1) {
16389         this.index = gestures.push(this) - 1;
16390         this.emit("start");
16391       }
16392       return this;
16393     },
16394     zoom: function(key, transform$$1) {
16395       if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16396       if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16397       if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16398       this.that.__zoom = transform$$1;
16399       this.emit("zoom");
16400       return this;
16401     },
16402     end: function() {
16403       if (--this.active === 0) {
16404         gestures.splice(this.index, 1);
16405         this.index = -1;
16406         this.emit("end");
16407       }
16408       return this;
16409     },
16410     emit: function(type) {
16411       customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16412     }
16413   };
16414
16415   function wheeled() {
16416     if (!filter.apply(this, arguments)) return;
16417     var g = gesture(this, arguments),
16418         t = this.__zoom,
16419         k = Math.max(k0, Math.min(k1, t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16420         p = d3_mouse(this);
16421
16422     // If the mouse is in the same location as before, reuse it.
16423     // If there were recent wheel events, reset the wheel idle timeout.
16424     if (g.wheel) {
16425       if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16426         g.mouse[1] = t.invert(g.mouse[0] = p);
16427       }
16428       clearTimeout(g.wheel);
16429     }
16430
16431     // If this wheel event won’t trigger a transform change, ignore it.
16432     else if (t.k === k) return;
16433
16434     // Otherwise, capture the mouse point and location at the start.
16435     else {
16436       g.mouse = [p, t.invert(p)];
16437       interrupt(this);
16438       g.start();
16439     }
16440
16441     noevent$2();
16442     g.wheel = setTimeout(wheelidled, wheelDelay);
16443     g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent));
16444
16445     function wheelidled() {
16446       g.wheel = null;
16447       g.end();
16448     }
16449   }
16450
16451   function mousedowned() {
16452     if (touchending || !filter.apply(this, arguments)) return;
16453     var g = gesture(this, arguments),
16454         v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16455         p = d3_mouse(this),
16456         x0 = event.clientX,
16457         y0 = event.clientY;
16458
16459     dragDisable(event.view);
16460     nopropagation$2();
16461     g.mouse = [p, this.__zoom.invert(p)];
16462     interrupt(this);
16463     g.start();
16464
16465     function mousemoved() {
16466       noevent$2();
16467       if (!g.moved) {
16468         var dx = event.clientX - x0, dy = event.clientY - y0;
16469         g.moved = dx * dx + dy * dy > clickDistance2;
16470       }
16471       g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent));
16472     }
16473
16474     function mouseupped() {
16475       v.on("mousemove.zoom mouseup.zoom", null);
16476       yesdrag(event.view, g.moved);
16477       noevent$2();
16478       g.end();
16479     }
16480   }
16481
16482   function dblclicked() {
16483     if (!filter.apply(this, arguments)) return;
16484     var t0 = this.__zoom,
16485         p0 = d3_mouse(this),
16486         p1 = t0.invert(p0),
16487         k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16488         t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments));
16489
16490     noevent$2();
16491     if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
16492     else d3_select(this).call(zoom.transform, t1);
16493   }
16494
16495   function touchstarted() {
16496     if (!filter.apply(this, arguments)) return;
16497     var g = gesture(this, arguments),
16498         touches = event.changedTouches,
16499         started,
16500         n = touches.length, i, t, p;
16501
16502     nopropagation$2();
16503     for (i = 0; i < n; ++i) {
16504       t = touches[i], p = touch(this, touches, t.identifier);
16505       p = [p, this.__zoom.invert(p), t.identifier];
16506       if (!g.touch0) g.touch0 = p, started = true;
16507       else if (!g.touch1) g.touch1 = p;
16508     }
16509
16510     // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16511     if (touchstarting) {
16512       touchstarting = clearTimeout(touchstarting);
16513       if (!g.touch1) {
16514         g.end();
16515         p = d3_select(this).on("dblclick.zoom");
16516         if (p) p.apply(this, arguments);
16517         return;
16518       }
16519     }
16520
16521     if (started) {
16522       touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16523       interrupt(this);
16524       g.start();
16525     }
16526   }
16527
16528   function touchmoved() {
16529     var g = gesture(this, arguments),
16530         touches = event.changedTouches,
16531         n = touches.length, i, t, p, l;
16532
16533     noevent$2();
16534     if (touchstarting) touchstarting = clearTimeout(touchstarting);
16535     for (i = 0; i < n; ++i) {
16536       t = touches[i], p = touch(this, touches, t.identifier);
16537       if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16538       else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16539     }
16540     t = g.that.__zoom;
16541     if (g.touch1) {
16542       var p0 = g.touch0[0], l0 = g.touch0[1],
16543           p1 = g.touch1[0], l1 = g.touch1[1],
16544           dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16545           dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16546       t = scale(t, Math.sqrt(dp / dl));
16547       p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16548       l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16549     }
16550     else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16551     else return;
16552     g.zoom("touch", constrain(translate(t, p, l), g.extent));
16553   }
16554
16555   function touchended() {
16556     var g = gesture(this, arguments),
16557         touches = event.changedTouches,
16558         n = touches.length, i, t;
16559
16560     nopropagation$2();
16561     if (touchending) clearTimeout(touchending);
16562     touchending = setTimeout(function() { touchending = null; }, touchDelay);
16563     for (i = 0; i < n; ++i) {
16564       t = touches[i];
16565       if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16566       else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16567     }
16568     if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16569     if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16570     else g.end();
16571   }
16572
16573   zoom.wheelDelta = function(_) {
16574     return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$12(+_), zoom) : wheelDelta;
16575   };
16576
16577   zoom.filter = function(_) {
16578     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$12(!!_), zoom) : filter;
16579   };
16580
16581   zoom.touchable = function(_) {
16582     return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$12(!!_), zoom) : touchable;
16583   };
16584
16585   zoom.extent = function(_) {
16586     return arguments.length ? (extent = typeof _ === "function" ? _ : constant$12([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16587   };
16588
16589   zoom.scaleExtent = function(_) {
16590     return arguments.length ? (k0 = +_[0], k1 = +_[1], zoom) : [k0, k1];
16591   };
16592
16593   zoom.translateExtent = function(_) {
16594     return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], zoom) : [[x0, y0], [x1, y1]];
16595   };
16596
16597   zoom.duration = function(_) {
16598     return arguments.length ? (duration = +_, zoom) : duration;
16599   };
16600
16601   zoom.interpolate = function(_) {
16602     return arguments.length ? (interpolate = _, zoom) : interpolate;
16603   };
16604
16605   zoom.on = function() {
16606     var value = listeners.on.apply(listeners, arguments);
16607     return value === listeners ? zoom : value;
16608   };
16609
16610   zoom.clickDistance = function(_) {
16611     return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16612   };
16613
16614   return zoom;
16615 };
16616
16617
16618
16619 var index = Object.freeze({
16620         version: version,
16621         bisect: bisectRight,
16622         bisectRight: bisectRight,
16623         bisectLeft: bisectLeft,
16624         ascending: d3_ascending,
16625         bisector: d3_bisector,
16626         cross: cross,
16627         descending: d3_descending,
16628         deviation: deviation,
16629         extent: extent,
16630         histogram: histogram,
16631         thresholdFreedmanDiaconis: freedmanDiaconis,
16632         thresholdScott: scott,
16633         thresholdSturges: sturges,
16634         max: max,
16635         mean: mean,
16636         median: d3_median,
16637         merge: merge,
16638         min: min,
16639         pairs: pairs,
16640         permute: permute,
16641         quantile: threshold,
16642         range: d3_range,
16643         scan: scan,
16644         shuffle: shuffle,
16645         sum: sum,
16646         ticks: ticks,
16647         tickIncrement: tickIncrement,
16648         tickStep: tickStep,
16649         transpose: transpose,
16650         variance: variance,
16651         zip: zip,
16652         axisTop: axisTop,
16653         axisRight: axisRight,
16654         axisBottom: axisBottom,
16655         axisLeft: axisLeft,
16656         brush: brush,
16657         brushX: brushX,
16658         brushY: brushY,
16659         brushSelection: brushSelection,
16660         chord: chord,
16661         ribbon: ribbon,
16662         nest: nest,
16663         set: set$2,
16664         map: map$1,
16665         keys: keys,
16666         values: values,
16667         entries: entries,
16668         color: color,
16669         rgb: rgb,
16670         hsl: hsl,
16671         lab: lab,
16672         hcl: hcl,
16673         cubehelix: cubehelix,
16674         dispatch: dispatch,
16675         drag: drag,
16676         dragDisable: dragDisable,
16677         dragEnable: yesdrag,
16678         dsvFormat: dsv,
16679         csvParse: csvParse,
16680         csvParseRows: csvParseRows,
16681         csvFormat: csvFormat,
16682         csvFormatRows: csvFormatRows,
16683         tsvParse: tsvParse,
16684         tsvParseRows: tsvParseRows,
16685         tsvFormat: tsvFormat,
16686         tsvFormatRows: tsvFormatRows,
16687         easeLinear: linear$1,
16688         easeQuad: quadInOut,
16689         easeQuadIn: quadIn,
16690         easeQuadOut: quadOut,
16691         easeQuadInOut: quadInOut,
16692         easeCubic: cubicInOut,
16693         easeCubicIn: cubicIn,
16694         easeCubicOut: cubicOut,
16695         easeCubicInOut: cubicInOut,
16696         easePoly: polyInOut,
16697         easePolyIn: polyIn,
16698         easePolyOut: polyOut,
16699         easePolyInOut: polyInOut,
16700         easeSin: sinInOut,
16701         easeSinIn: sinIn,
16702         easeSinOut: sinOut,
16703         easeSinInOut: sinInOut,
16704         easeExp: expInOut,
16705         easeExpIn: expIn,
16706         easeExpOut: expOut,
16707         easeExpInOut: expInOut,
16708         easeCircle: circleInOut,
16709         easeCircleIn: circleIn,
16710         easeCircleOut: circleOut,
16711         easeCircleInOut: circleInOut,
16712         easeBounce: bounceOut,
16713         easeBounceIn: bounceIn,
16714         easeBounceOut: bounceOut,
16715         easeBounceInOut: bounceInOut,
16716         easeBack: backInOut,
16717         easeBackIn: backIn,
16718         easeBackOut: backOut,
16719         easeBackInOut: backInOut,
16720         easeElastic: elasticOut,
16721         easeElasticIn: elasticIn,
16722         easeElasticOut: elasticOut,
16723         easeElasticInOut: elasticInOut,
16724         forceCenter: center$1,
16725         forceCollide: collide,
16726         forceLink: link,
16727         forceManyBody: manyBody,
16728         forceRadial: radial,
16729         forceSimulation: simulation,
16730         forceX: x$2,
16731         forceY: y$2,
16732         formatDefaultLocale: defaultLocale,
16733         get format () { return format; },
16734         get formatPrefix () { return formatPrefix; },
16735         formatLocale: formatLocale,
16736         formatSpecifier: formatSpecifier,
16737         precisionFixed: precisionFixed,
16738         precisionPrefix: precisionPrefix,
16739         precisionRound: precisionRound,
16740         geoArea: d3_geoArea,
16741         geoBounds: d3_geoBounds,
16742         geoCentroid: d3_geoCentroid,
16743         geoCircle: circle,
16744         geoClipAntimeridian: clipAntimeridian,
16745         geoClipCircle: clipCircle,
16746         geoClipExtent: extent$1,
16747         geoClipRectangle: clipRectangle,
16748         geoContains: contains,
16749         geoDistance: distance,
16750         geoGraticule: graticule,
16751         geoGraticule10: graticule10,
16752         geoInterpolate: interpolate$1,
16753         geoLength: d3_geoLength,
16754         geoPath: d3_geoPath,
16755         geoAlbers: albers,
16756         geoAlbersUsa: albersUsa,
16757         geoAzimuthalEqualArea: azimuthalEqualArea,
16758         geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16759         geoAzimuthalEquidistant: azimuthalEquidistant,
16760         geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16761         geoConicConformal: conicConformal,
16762         geoConicConformalRaw: conicConformalRaw,
16763         geoConicEqualArea: conicEqualArea,
16764         geoConicEqualAreaRaw: conicEqualAreaRaw,
16765         geoConicEquidistant: conicEquidistant,
16766         geoConicEquidistantRaw: conicEquidistantRaw,
16767         geoEquirectangular: equirectangular,
16768         geoEquirectangularRaw: equirectangularRaw,
16769         geoGnomonic: gnomonic,
16770         geoGnomonicRaw: gnomonicRaw,
16771         geoIdentity: d3_geoIdentity,
16772         geoProjection: projection,
16773         geoProjectionMutator: projectionMutator,
16774         geoMercator: mercator,
16775         geoMercatorRaw: mercatorRaw,
16776         geoNaturalEarth1: naturalEarth1,
16777         geoNaturalEarth1Raw: naturalEarth1Raw,
16778         geoOrthographic: orthographic,
16779         geoOrthographicRaw: orthographicRaw,
16780         geoStereographic: stereographic,
16781         geoStereographicRaw: stereographicRaw,
16782         geoTransverseMercator: transverseMercator,
16783         geoTransverseMercatorRaw: transverseMercatorRaw,
16784         geoRotation: rotation,
16785         geoStream: d3_geoStream,
16786         geoTransform: d3_geoTransform,
16787         cluster: cluster,
16788         hierarchy: hierarchy,
16789         pack: index$2,
16790         packSiblings: siblings,
16791         packEnclose: enclose,
16792         partition: partition,
16793         stratify: stratify,
16794         tree: tree,
16795         treemap: index$3,
16796         treemapBinary: binary,
16797         treemapDice: treemapDice,
16798         treemapSlice: treemapSlice,
16799         treemapSliceDice: sliceDice,
16800         treemapSquarify: squarify,
16801         treemapResquarify: resquarify,
16802         interpolate: d3_interpolate,
16803         interpolateArray: array$1,
16804         interpolateBasis: basis$1,
16805         interpolateBasisClosed: basisClosed,
16806         interpolateDate: date,
16807         interpolateNumber: d3_interpolateNumber,
16808         interpolateObject: object,
16809         interpolateRound: interpolateRound,
16810         interpolateString: interpolateString,
16811         interpolateTransformCss: interpolateTransformCss,
16812         interpolateTransformSvg: interpolateTransformSvg,
16813         interpolateZoom: interpolateZoom,
16814         interpolateRgb: d3_interpolateRgb,
16815         interpolateRgbBasis: rgbBasis,
16816         interpolateRgbBasisClosed: rgbBasisClosed,
16817         interpolateHsl: hsl$2,
16818         interpolateHslLong: hslLong,
16819         interpolateLab: lab$1,
16820         interpolateHcl: hcl$2,
16821         interpolateHclLong: hclLong,
16822         interpolateCubehelix: cubehelix$2,
16823         interpolateCubehelixLong: cubehelixLong,
16824         quantize: d3_quantize,
16825         path: path,
16826         polygonArea: d3_polygonArea,
16827         polygonCentroid: d3_polygonCentroid,
16828         polygonHull: d3_polygonHull,
16829         polygonContains: contains$1,
16830         polygonLength: length$1,
16831         quadtree: quadtree,
16832         queue: queue,
16833         randomUniform: uniform,
16834         randomNormal: normal,
16835         randomLogNormal: logNormal,
16836         randomBates: bates,
16837         randomIrwinHall: irwinHall,
16838         randomExponential: exponential$1,
16839         request: d3_request,
16840         html: html,
16841         json: d3_json,
16842         text: d3_text,
16843         xml: d3_xml,
16844         csv: csv$1,
16845         tsv: tsv$1,
16846         scaleBand: band,
16847         scalePoint: point$1,
16848         scaleIdentity: identity$5,
16849         scaleLinear: linear$2,
16850         scaleLog: log$1,
16851         scaleOrdinal: ordinal,
16852         scaleImplicit: implicit,
16853         scalePow: pow$1,
16854         scaleSqrt: sqrt$1,
16855         scaleQuantile: quantile,
16856         scaleQuantize: quantize,
16857         scaleThreshold: threshold$1,
16858         scaleTime: time,
16859         scaleUtc: utcTime,
16860         schemeCategory10: category10,
16861         schemeCategory20b: category20b,
16862         schemeCategory20c: category20c,
16863         schemeCategory20: category20,
16864         interpolateCubehelixDefault: cubehelix$3,
16865         interpolateRainbow: rainbow$1,
16866         interpolateWarm: warm,
16867         interpolateCool: cool,
16868         interpolateViridis: viridis,
16869         interpolateMagma: magma,
16870         interpolateInferno: inferno,
16871         interpolatePlasma: plasma,
16872         scaleSequential: sequential,
16873         creator: creator,
16874         local: local$1,
16875         matcher: matcher$1,
16876         mouse: d3_mouse,
16877         namespace: namespace,
16878         namespaces: namespaces,
16879         select: d3_select,
16880         selectAll: d3_selectAll,
16881         selection: selection,
16882         selector: selector,
16883         selectorAll: selectorAll,
16884         style: styleValue,
16885         touch: touch,
16886         touches: d3_touches,
16887         window: defaultView,
16888         get event () { return event; },
16889         customEvent: customEvent,
16890         arc: arc,
16891         area: area,
16892         line: line,
16893         pie: pie,
16894         areaRadial: areaRadial,
16895         radialArea: areaRadial,
16896         lineRadial: lineRadial$1,
16897         radialLine: lineRadial$1,
16898         pointRadial: pointRadial,
16899         linkHorizontal: linkHorizontal,
16900         linkVertical: linkVertical,
16901         linkRadial: linkRadial,
16902         symbol: symbol,
16903         symbols: symbols,
16904         symbolCircle: circle$2,
16905         symbolCross: cross$2,
16906         symbolDiamond: diamond,
16907         symbolSquare: square,
16908         symbolStar: star,
16909         symbolTriangle: triangle,
16910         symbolWye: wye,
16911         curveBasisClosed: basisClosed$1,
16912         curveBasisOpen: basisOpen,
16913         curveBasis: basis$2,
16914         curveBundle: bundle,
16915         curveCardinalClosed: cardinalClosed,
16916         curveCardinalOpen: cardinalOpen,
16917         curveCardinal: cardinal,
16918         curveCatmullRomClosed: catmullRomClosed,
16919         curveCatmullRomOpen: catmullRomOpen,
16920         curveCatmullRom: catmullRom,
16921         curveLinearClosed: linearClosed,
16922         curveLinear: curveLinear,
16923         curveMonotoneX: monotoneX,
16924         curveMonotoneY: monotoneY,
16925         curveNatural: natural,
16926         curveStep: step,
16927         curveStepAfter: stepAfter,
16928         curveStepBefore: stepBefore,
16929         stack: stack,
16930         stackOffsetExpand: expand,
16931         stackOffsetDiverging: diverging,
16932         stackOffsetNone: none$1,
16933         stackOffsetSilhouette: silhouette,
16934         stackOffsetWiggle: wiggle,
16935         stackOrderAscending: ascending$1,
16936         stackOrderDescending: descending$1,
16937         stackOrderInsideOut: insideOut,
16938         stackOrderNone: none$2,
16939         stackOrderReverse: reverse,
16940         timeInterval: newInterval,
16941         timeMillisecond: millisecond,
16942         timeMilliseconds: milliseconds,
16943         utcMillisecond: millisecond,
16944         utcMilliseconds: milliseconds,
16945         timeSecond: second,
16946         timeSeconds: seconds,
16947         utcSecond: second,
16948         utcSeconds: seconds,
16949         timeMinute: minute,
16950         timeMinutes: minutes,
16951         timeHour: hour,
16952         timeHours: hours,
16953         timeDay: day,
16954         timeDays: days,
16955         timeWeek: sunday,
16956         timeWeeks: sundays,
16957         timeSunday: sunday,
16958         timeSundays: sundays,
16959         timeMonday: monday,
16960         timeMondays: mondays,
16961         timeTuesday: tuesday,
16962         timeTuesdays: tuesdays,
16963         timeWednesday: wednesday,
16964         timeWednesdays: wednesdays,
16965         timeThursday: thursday,
16966         timeThursdays: thursdays,
16967         timeFriday: friday,
16968         timeFridays: fridays,
16969         timeSaturday: saturday,
16970         timeSaturdays: saturdays,
16971         timeMonth: month,
16972         timeMonths: months,
16973         timeYear: year,
16974         timeYears: years,
16975         utcMinute: utcMinute,
16976         utcMinutes: utcMinutes,
16977         utcHour: utcHour,
16978         utcHours: utcHours,
16979         utcDay: utcDay,
16980         utcDays: utcDays,
16981         utcWeek: utcSunday,
16982         utcWeeks: utcSundays,
16983         utcSunday: utcSunday,
16984         utcSundays: utcSundays,
16985         utcMonday: utcMonday,
16986         utcMondays: utcMondays,
16987         utcTuesday: utcTuesday,
16988         utcTuesdays: utcTuesdays,
16989         utcWednesday: utcWednesday,
16990         utcWednesdays: utcWednesdays,
16991         utcThursday: utcThursday,
16992         utcThursdays: utcThursdays,
16993         utcFriday: utcFriday,
16994         utcFridays: utcFridays,
16995         utcSaturday: utcSaturday,
16996         utcSaturdays: utcSaturdays,
16997         utcMonth: utcMonth,
16998         utcMonths: utcMonths,
16999         utcYear: utcYear,
17000         utcYears: utcYears,
17001         timeFormatDefaultLocale: defaultLocale$1,
17002         get timeFormat () { return timeFormat; },
17003         get timeParse () { return timeParse; },
17004         get utcFormat () { return utcFormat; },
17005         get utcParse () { return utcParse; },
17006         timeFormatLocale: formatLocale$1,
17007         isoFormat: formatIso,
17008         isoParse: parseIso,
17009         now: now,
17010         timer: timer,
17011         timerFlush: timerFlush,
17012         timeout: d3_timeout,
17013         interval: interval$1,
17014         transition: transition,
17015         active: active,
17016         interrupt: interrupt,
17017         voronoi: voronoi,
17018         zoom: d3_zoom,
17019         zoomTransform: transform,
17020         zoomIdentity: identity$7
17021 });
17022
17023 function actionAddEntity(way) {
17024     return function(graph) {
17025         return graph.replace(way);
17026     };
17027 }
17028
17029 /**
17030  * Creates an array with all falsey values removed. The values `false`, `null`,
17031  * `0`, `""`, `undefined`, and `NaN` are falsey.
17032  *
17033  * @static
17034  * @memberOf _
17035  * @since 0.1.0
17036  * @category Array
17037  * @param {Array} array The array to compact.
17038  * @returns {Array} Returns the new array of filtered values.
17039  * @example
17040  *
17041  * _.compact([0, 1, false, 2, '', 3]);
17042  * // => [1, 2, 3]
17043  */
17044 function compact(array) {
17045   var index = -1,
17046       length = array == null ? 0 : array.length,
17047       resIndex = 0,
17048       result = [];
17049
17050   while (++index < length) {
17051     var value = array[index];
17052     if (value) {
17053       result[resIndex++] = value;
17054     }
17055   }
17056   return result;
17057 }
17058
17059 /** Detect free variable `global` from Node.js. */
17060 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17061
17062 /** Detect free variable `self`. */
17063 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17064
17065 /** Used as a reference to the global object. */
17066 var root$2 = freeGlobal || freeSelf || Function('return this')();
17067
17068 /** Built-in value references. */
17069 var Symbol = root$2.Symbol;
17070
17071 /** Used for built-in method references. */
17072 var objectProto$2 = Object.prototype;
17073
17074 /** Used to check objects for own properties. */
17075 var hasOwnProperty$2 = objectProto$2.hasOwnProperty;
17076
17077 /**
17078  * Used to resolve the
17079  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17080  * of values.
17081  */
17082 var nativeObjectToString = objectProto$2.toString;
17083
17084 /** Built-in value references. */
17085 var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17086
17087 /**
17088  * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17089  *
17090  * @private
17091  * @param {*} value The value to query.
17092  * @returns {string} Returns the raw `toStringTag`.
17093  */
17094 function getRawTag(value) {
17095   var isOwn = hasOwnProperty$2.call(value, symToStringTag$1),
17096       tag = value[symToStringTag$1];
17097
17098   try {
17099     value[symToStringTag$1] = undefined;
17100     var unmasked = true;
17101   } catch (e) {}
17102
17103   var result = nativeObjectToString.call(value);
17104   if (unmasked) {
17105     if (isOwn) {
17106       value[symToStringTag$1] = tag;
17107     } else {
17108       delete value[symToStringTag$1];
17109     }
17110   }
17111   return result;
17112 }
17113
17114 /** Used for built-in method references. */
17115 var objectProto$3 = Object.prototype;
17116
17117 /**
17118  * Used to resolve the
17119  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17120  * of values.
17121  */
17122 var nativeObjectToString$1 = objectProto$3.toString;
17123
17124 /**
17125  * Converts `value` to a string using `Object.prototype.toString`.
17126  *
17127  * @private
17128  * @param {*} value The value to convert.
17129  * @returns {string} Returns the converted string.
17130  */
17131 function objectToString(value) {
17132   return nativeObjectToString$1.call(value);
17133 }
17134
17135 /** `Object#toString` result references. */
17136 var nullTag = '[object Null]';
17137 var undefinedTag = '[object Undefined]';
17138
17139 /** Built-in value references. */
17140 var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17141
17142 /**
17143  * The base implementation of `getTag` without fallbacks for buggy environments.
17144  *
17145  * @private
17146  * @param {*} value The value to query.
17147  * @returns {string} Returns the `toStringTag`.
17148  */
17149 function baseGetTag(value) {
17150   if (value == null) {
17151     return value === undefined ? undefinedTag : nullTag;
17152   }
17153   return (symToStringTag && symToStringTag in Object(value))
17154     ? getRawTag(value)
17155     : objectToString(value);
17156 }
17157
17158 /**
17159  * Checks if `value` is the
17160  * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17161  * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17162  *
17163  * @static
17164  * @memberOf _
17165  * @since 0.1.0
17166  * @category Lang
17167  * @param {*} value The value to check.
17168  * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17169  * @example
17170  *
17171  * _.isObject({});
17172  * // => true
17173  *
17174  * _.isObject([1, 2, 3]);
17175  * // => true
17176  *
17177  * _.isObject(_.noop);
17178  * // => true
17179  *
17180  * _.isObject(null);
17181  * // => false
17182  */
17183 function isObject(value) {
17184   var type = typeof value;
17185   return value != null && (type == 'object' || type == 'function');
17186 }
17187
17188 /** `Object#toString` result references. */
17189 var asyncTag = '[object AsyncFunction]';
17190 var funcTag = '[object Function]';
17191 var genTag = '[object GeneratorFunction]';
17192 var proxyTag = '[object Proxy]';
17193
17194 /**
17195  * Checks if `value` is classified as a `Function` object.
17196  *
17197  * @static
17198  * @memberOf _
17199  * @since 0.1.0
17200  * @category Lang
17201  * @param {*} value The value to check.
17202  * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17203  * @example
17204  *
17205  * _.isFunction(_);
17206  * // => true
17207  *
17208  * _.isFunction(/abc/);
17209  * // => false
17210  */
17211 function isFunction(value) {
17212   if (!isObject(value)) {
17213     return false;
17214   }
17215   // The use of `Object#toString` avoids issues with the `typeof` operator
17216   // in Safari 9 which returns 'object' for typed arrays and other constructors.
17217   var tag = baseGetTag(value);
17218   return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17219 }
17220
17221 /** Used to detect overreaching core-js shims. */
17222 var coreJsData = root$2['__core-js_shared__'];
17223
17224 /** Used to detect methods masquerading as native. */
17225 var maskSrcKey = (function() {
17226   var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17227   return uid ? ('Symbol(src)_1.' + uid) : '';
17228 }());
17229
17230 /**
17231  * Checks if `func` has its source masked.
17232  *
17233  * @private
17234  * @param {Function} func The function to check.
17235  * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17236  */
17237 function isMasked(func) {
17238   return !!maskSrcKey && (maskSrcKey in func);
17239 }
17240
17241 /** Used for built-in method references. */
17242 var funcProto$1 = Function.prototype;
17243
17244 /** Used to resolve the decompiled source of functions. */
17245 var funcToString$1 = funcProto$1.toString;
17246
17247 /**
17248  * Converts `func` to its source code.
17249  *
17250  * @private
17251  * @param {Function} func The function to convert.
17252  * @returns {string} Returns the source code.
17253  */
17254 function toSource(func) {
17255   if (func != null) {
17256     try {
17257       return funcToString$1.call(func);
17258     } catch (e) {}
17259     try {
17260       return (func + '');
17261     } catch (e) {}
17262   }
17263   return '';
17264 }
17265
17266 /**
17267  * Used to match `RegExp`
17268  * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17269  */
17270 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17271
17272 /** Used to detect host constructors (Safari). */
17273 var reIsHostCtor = /^\[object .+?Constructor\]$/;
17274
17275 /** Used for built-in method references. */
17276 var funcProto = Function.prototype;
17277 var objectProto$1 = Object.prototype;
17278
17279 /** Used to resolve the decompiled source of functions. */
17280 var funcToString = funcProto.toString;
17281
17282 /** Used to check objects for own properties. */
17283 var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
17284
17285 /** Used to detect if a method is native. */
17286 var reIsNative = RegExp('^' +
17287   funcToString.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17288   .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17289 );
17290
17291 /**
17292  * The base implementation of `_.isNative` without bad shim checks.
17293  *
17294  * @private
17295  * @param {*} value The value to check.
17296  * @returns {boolean} Returns `true` if `value` is a native function,
17297  *  else `false`.
17298  */
17299 function baseIsNative(value) {
17300   if (!isObject(value) || isMasked(value)) {
17301     return false;
17302   }
17303   var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17304   return pattern.test(toSource(value));
17305 }
17306
17307 /**
17308  * Gets the value at `key` of `object`.
17309  *
17310  * @private
17311  * @param {Object} [object] The object to query.
17312  * @param {string} key The key of the property to get.
17313  * @returns {*} Returns the property value.
17314  */
17315 function getValue(object, key) {
17316   return object == null ? undefined : object[key];
17317 }
17318
17319 /**
17320  * Gets the native function at `key` of `object`.
17321  *
17322  * @private
17323  * @param {Object} object The object to query.
17324  * @param {string} key The key of the method to get.
17325  * @returns {*} Returns the function if it's native, else `undefined`.
17326  */
17327 function getNative(object, key) {
17328   var value = getValue(object, key);
17329   return baseIsNative(value) ? value : undefined;
17330 }
17331
17332 var defineProperty = (function() {
17333   try {
17334     var func = getNative(Object, 'defineProperty');
17335     func({}, '', {});
17336     return func;
17337   } catch (e) {}
17338 }());
17339
17340 /**
17341  * The base implementation of `assignValue` and `assignMergeValue` without
17342  * value checks.
17343  *
17344  * @private
17345  * @param {Object} object The object to modify.
17346  * @param {string} key The key of the property to assign.
17347  * @param {*} value The value to assign.
17348  */
17349 function baseAssignValue(object, key, value) {
17350   if (key == '__proto__' && defineProperty) {
17351     defineProperty(object, key, {
17352       'configurable': true,
17353       'enumerable': true,
17354       'value': value,
17355       'writable': true
17356     });
17357   } else {
17358     object[key] = value;
17359   }
17360 }
17361
17362 /**
17363  * Performs a
17364  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17365  * comparison between two values to determine if they are equivalent.
17366  *
17367  * @static
17368  * @memberOf _
17369  * @since 4.0.0
17370  * @category Lang
17371  * @param {*} value The value to compare.
17372  * @param {*} other The other value to compare.
17373  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17374  * @example
17375  *
17376  * var object = { 'a': 1 };
17377  * var other = { 'a': 1 };
17378  *
17379  * _.eq(object, object);
17380  * // => true
17381  *
17382  * _.eq(object, other);
17383  * // => false
17384  *
17385  * _.eq('a', 'a');
17386  * // => true
17387  *
17388  * _.eq('a', Object('a'));
17389  * // => false
17390  *
17391  * _.eq(NaN, NaN);
17392  * // => true
17393  */
17394 function eq(value, other) {
17395   return value === other || (value !== value && other !== other);
17396 }
17397
17398 /** Used for built-in method references. */
17399 var objectProto = Object.prototype;
17400
17401 /** Used to check objects for own properties. */
17402 var hasOwnProperty = objectProto.hasOwnProperty;
17403
17404 /**
17405  * Assigns `value` to `key` of `object` if the existing value is not equivalent
17406  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17407  * for equality comparisons.
17408  *
17409  * @private
17410  * @param {Object} object The object to modify.
17411  * @param {string} key The key of the property to assign.
17412  * @param {*} value The value to assign.
17413  */
17414 function assignValue(object, key, value) {
17415   var objValue = object[key];
17416   if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
17417       (value === undefined && !(key in object))) {
17418     baseAssignValue(object, key, value);
17419   }
17420 }
17421
17422 /**
17423  * Copies properties of `source` to `object`.
17424  *
17425  * @private
17426  * @param {Object} source The object to copy properties from.
17427  * @param {Array} props The property identifiers to copy.
17428  * @param {Object} [object={}] The object to copy properties to.
17429  * @param {Function} [customizer] The function to customize copied values.
17430  * @returns {Object} Returns `object`.
17431  */
17432 function copyObject(source, props, object, customizer) {
17433   var isNew = !object;
17434   object || (object = {});
17435
17436   var index = -1,
17437       length = props.length;
17438
17439   while (++index < length) {
17440     var key = props[index];
17441
17442     var newValue = customizer
17443       ? customizer(object[key], source[key], key, object, source)
17444       : undefined;
17445
17446     if (newValue === undefined) {
17447       newValue = source[key];
17448     }
17449     if (isNew) {
17450       baseAssignValue(object, key, newValue);
17451     } else {
17452       assignValue(object, key, newValue);
17453     }
17454   }
17455   return object;
17456 }
17457
17458 /**
17459  * This method returns the first argument it receives.
17460  *
17461  * @static
17462  * @since 0.1.0
17463  * @memberOf _
17464  * @category Util
17465  * @param {*} value Any value.
17466  * @returns {*} Returns `value`.
17467  * @example
17468  *
17469  * var object = { 'a': 1 };
17470  *
17471  * console.log(_.identity(object) === object);
17472  * // => true
17473  */
17474 function identity$8(value) {
17475   return value;
17476 }
17477
17478 /**
17479  * A faster alternative to `Function#apply`, this function invokes `func`
17480  * with the `this` binding of `thisArg` and the arguments of `args`.
17481  *
17482  * @private
17483  * @param {Function} func The function to invoke.
17484  * @param {*} thisArg The `this` binding of `func`.
17485  * @param {Array} args The arguments to invoke `func` with.
17486  * @returns {*} Returns the result of `func`.
17487  */
17488 function apply(func, thisArg, args) {
17489   switch (args.length) {
17490     case 0: return func.call(thisArg);
17491     case 1: return func.call(thisArg, args[0]);
17492     case 2: return func.call(thisArg, args[0], args[1]);
17493     case 3: return func.call(thisArg, args[0], args[1], args[2]);
17494   }
17495   return func.apply(thisArg, args);
17496 }
17497
17498 /* Built-in method references for those with the same name as other `lodash` methods. */
17499 var nativeMax = Math.max;
17500
17501 /**
17502  * A specialized version of `baseRest` which transforms the rest array.
17503  *
17504  * @private
17505  * @param {Function} func The function to apply a rest parameter to.
17506  * @param {number} [start=func.length-1] The start position of the rest parameter.
17507  * @param {Function} transform The rest array transform.
17508  * @returns {Function} Returns the new function.
17509  */
17510 function overRest(func, start, transform) {
17511   start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
17512   return function() {
17513     var args = arguments,
17514         index = -1,
17515         length = nativeMax(args.length - start, 0),
17516         array = Array(length);
17517
17518     while (++index < length) {
17519       array[index] = args[start + index];
17520     }
17521     index = -1;
17522     var otherArgs = Array(start + 1);
17523     while (++index < start) {
17524       otherArgs[index] = args[index];
17525     }
17526     otherArgs[start] = transform(array);
17527     return apply(func, this, otherArgs);
17528   };
17529 }
17530
17531 /**
17532  * Creates a function that returns `value`.
17533  *
17534  * @static
17535  * @memberOf _
17536  * @since 2.4.0
17537  * @category Util
17538  * @param {*} value The value to return from the new function.
17539  * @returns {Function} Returns the new constant function.
17540  * @example
17541  *
17542  * var objects = _.times(2, _.constant({ 'a': 1 }));
17543  *
17544  * console.log(objects);
17545  * // => [{ 'a': 1 }, { 'a': 1 }]
17546  *
17547  * console.log(objects[0] === objects[1]);
17548  * // => true
17549  */
17550 function constant$13(value) {
17551   return function() {
17552     return value;
17553   };
17554 }
17555
17556 /**
17557  * The base implementation of `setToString` without support for hot loop shorting.
17558  *
17559  * @private
17560  * @param {Function} func The function to modify.
17561  * @param {Function} string The `toString` result.
17562  * @returns {Function} Returns `func`.
17563  */
17564 var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
17565   return defineProperty(func, 'toString', {
17566     'configurable': true,
17567     'enumerable': false,
17568     'value': constant$13(string),
17569     'writable': true
17570   });
17571 };
17572
17573 /** Used to detect hot functions by number of calls within a span of milliseconds. */
17574 var HOT_COUNT = 800;
17575 var HOT_SPAN = 16;
17576
17577 /* Built-in method references for those with the same name as other `lodash` methods. */
17578 var nativeNow = Date.now;
17579
17580 /**
17581  * Creates a function that'll short out and invoke `identity` instead
17582  * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
17583  * milliseconds.
17584  *
17585  * @private
17586  * @param {Function} func The function to restrict.
17587  * @returns {Function} Returns the new shortable function.
17588  */
17589 function shortOut(func) {
17590   var count = 0,
17591       lastCalled = 0;
17592
17593   return function() {
17594     var stamp = nativeNow(),
17595         remaining = HOT_SPAN - (stamp - lastCalled);
17596
17597     lastCalled = stamp;
17598     if (remaining > 0) {
17599       if (++count >= HOT_COUNT) {
17600         return arguments[0];
17601       }
17602     } else {
17603       count = 0;
17604     }
17605     return func.apply(undefined, arguments);
17606   };
17607 }
17608
17609 /**
17610  * Sets the `toString` method of `func` to return `string`.
17611  *
17612  * @private
17613  * @param {Function} func The function to modify.
17614  * @param {Function} string The `toString` result.
17615  * @returns {Function} Returns `func`.
17616  */
17617 var setToString = shortOut(baseSetToString);
17618
17619 /**
17620  * The base implementation of `_.rest` which doesn't validate or coerce arguments.
17621  *
17622  * @private
17623  * @param {Function} func The function to apply a rest parameter to.
17624  * @param {number} [start=func.length-1] The start position of the rest parameter.
17625  * @returns {Function} Returns the new function.
17626  */
17627 function baseRest(func, start) {
17628   return setToString(overRest(func, start, identity$8), func + '');
17629 }
17630
17631 /** Used as references for various `Number` constants. */
17632 var MAX_SAFE_INTEGER = 9007199254740991;
17633
17634 /**
17635  * Checks if `value` is a valid array-like length.
17636  *
17637  * **Note:** This method is loosely based on
17638  * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
17639  *
17640  * @static
17641  * @memberOf _
17642  * @since 4.0.0
17643  * @category Lang
17644  * @param {*} value The value to check.
17645  * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
17646  * @example
17647  *
17648  * _.isLength(3);
17649  * // => true
17650  *
17651  * _.isLength(Number.MIN_VALUE);
17652  * // => false
17653  *
17654  * _.isLength(Infinity);
17655  * // => false
17656  *
17657  * _.isLength('3');
17658  * // => false
17659  */
17660 function isLength(value) {
17661   return typeof value == 'number' &&
17662     value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
17663 }
17664
17665 /**
17666  * Checks if `value` is array-like. A value is considered array-like if it's
17667  * not a function and has a `value.length` that's an integer greater than or
17668  * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
17669  *
17670  * @static
17671  * @memberOf _
17672  * @since 4.0.0
17673  * @category Lang
17674  * @param {*} value The value to check.
17675  * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
17676  * @example
17677  *
17678  * _.isArrayLike([1, 2, 3]);
17679  * // => true
17680  *
17681  * _.isArrayLike(document.body.children);
17682  * // => true
17683  *
17684  * _.isArrayLike('abc');
17685  * // => true
17686  *
17687  * _.isArrayLike(_.noop);
17688  * // => false
17689  */
17690 function isArrayLike(value) {
17691   return value != null && isLength(value.length) && !isFunction(value);
17692 }
17693
17694 /** Used as references for various `Number` constants. */
17695 var MAX_SAFE_INTEGER$1 = 9007199254740991;
17696
17697 /** Used to detect unsigned integer values. */
17698 var reIsUint = /^(?:0|[1-9]\d*)$/;
17699
17700 /**
17701  * Checks if `value` is a valid array-like index.
17702  *
17703  * @private
17704  * @param {*} value The value to check.
17705  * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
17706  * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
17707  */
17708 function isIndex(value, length) {
17709   length = length == null ? MAX_SAFE_INTEGER$1 : length;
17710   return !!length &&
17711     (typeof value == 'number' || reIsUint.test(value)) &&
17712     (value > -1 && value % 1 == 0 && value < length);
17713 }
17714
17715 /**
17716  * Checks if the given arguments are from an iteratee call.
17717  *
17718  * @private
17719  * @param {*} value The potential iteratee value argument.
17720  * @param {*} index The potential iteratee index or key argument.
17721  * @param {*} object The potential iteratee object argument.
17722  * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
17723  *  else `false`.
17724  */
17725 function isIterateeCall(value, index, object) {
17726   if (!isObject(object)) {
17727     return false;
17728   }
17729   var type = typeof index;
17730   if (type == 'number'
17731         ? (isArrayLike(object) && isIndex(index, object.length))
17732         : (type == 'string' && index in object)
17733       ) {
17734     return eq(object[index], value);
17735   }
17736   return false;
17737 }
17738
17739 /**
17740  * Creates a function like `_.assign`.
17741  *
17742  * @private
17743  * @param {Function} assigner The function to assign values.
17744  * @returns {Function} Returns the new assigner function.
17745  */
17746 function createAssigner(assigner) {
17747   return baseRest(function(object, sources) {
17748     var index = -1,
17749         length = sources.length,
17750         customizer = length > 1 ? sources[length - 1] : undefined,
17751         guard = length > 2 ? sources[2] : undefined;
17752
17753     customizer = (assigner.length > 3 && typeof customizer == 'function')
17754       ? (length--, customizer)
17755       : undefined;
17756
17757     if (guard && isIterateeCall(sources[0], sources[1], guard)) {
17758       customizer = length < 3 ? undefined : customizer;
17759       length = 1;
17760     }
17761     object = Object(object);
17762     while (++index < length) {
17763       var source = sources[index];
17764       if (source) {
17765         assigner(object, source, index, customizer);
17766       }
17767     }
17768     return object;
17769   });
17770 }
17771
17772 /**
17773  * The base implementation of `_.times` without support for iteratee shorthands
17774  * or max array length checks.
17775  *
17776  * @private
17777  * @param {number} n The number of times to invoke `iteratee`.
17778  * @param {Function} iteratee The function invoked per iteration.
17779  * @returns {Array} Returns the array of results.
17780  */
17781 function baseTimes(n, iteratee) {
17782   var index = -1,
17783       result = Array(n);
17784
17785   while (++index < n) {
17786     result[index] = iteratee(index);
17787   }
17788   return result;
17789 }
17790
17791 /**
17792  * Checks if `value` is object-like. A value is object-like if it's not `null`
17793  * and has a `typeof` result of "object".
17794  *
17795  * @static
17796  * @memberOf _
17797  * @since 4.0.0
17798  * @category Lang
17799  * @param {*} value The value to check.
17800  * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
17801  * @example
17802  *
17803  * _.isObjectLike({});
17804  * // => true
17805  *
17806  * _.isObjectLike([1, 2, 3]);
17807  * // => true
17808  *
17809  * _.isObjectLike(_.noop);
17810  * // => false
17811  *
17812  * _.isObjectLike(null);
17813  * // => false
17814  */
17815 function isObjectLike(value) {
17816   return value != null && typeof value == 'object';
17817 }
17818
17819 /** `Object#toString` result references. */
17820 var argsTag = '[object Arguments]';
17821
17822 /**
17823  * The base implementation of `_.isArguments`.
17824  *
17825  * @private
17826  * @param {*} value The value to check.
17827  * @returns {boolean} Returns `true` if `value` is an `arguments` object,
17828  */
17829 function baseIsArguments(value) {
17830   return isObjectLike(value) && baseGetTag(value) == argsTag;
17831 }
17832
17833 /** Used for built-in method references. */
17834 var objectProto$5 = Object.prototype;
17835
17836 /** Used to check objects for own properties. */
17837 var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
17838
17839 /** Built-in value references. */
17840 var propertyIsEnumerable = objectProto$5.propertyIsEnumerable;
17841
17842 /**
17843  * Checks if `value` is likely an `arguments` object.
17844  *
17845  * @static
17846  * @memberOf _
17847  * @since 0.1.0
17848  * @category Lang
17849  * @param {*} value The value to check.
17850  * @returns {boolean} Returns `true` if `value` is an `arguments` object,
17851  *  else `false`.
17852  * @example
17853  *
17854  * _.isArguments(function() { return arguments; }());
17855  * // => true
17856  *
17857  * _.isArguments([1, 2, 3]);
17858  * // => false
17859  */
17860 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
17861   return isObjectLike(value) && hasOwnProperty$4.call(value, 'callee') &&
17862     !propertyIsEnumerable.call(value, 'callee');
17863 };
17864
17865 /**
17866  * Checks if `value` is classified as an `Array` object.
17867  *
17868  * @static
17869  * @memberOf _
17870  * @since 0.1.0
17871  * @category Lang
17872  * @param {*} value The value to check.
17873  * @returns {boolean} Returns `true` if `value` is an array, else `false`.
17874  * @example
17875  *
17876  * _.isArray([1, 2, 3]);
17877  * // => true
17878  *
17879  * _.isArray(document.body.children);
17880  * // => false
17881  *
17882  * _.isArray('abc');
17883  * // => false
17884  *
17885  * _.isArray(_.noop);
17886  * // => false
17887  */
17888 var isArray = Array.isArray;
17889
17890 /**
17891  * This method returns `false`.
17892  *
17893  * @static
17894  * @memberOf _
17895  * @since 4.13.0
17896  * @category Util
17897  * @returns {boolean} Returns `false`.
17898  * @example
17899  *
17900  * _.times(2, _.stubFalse);
17901  * // => [false, false]
17902  */
17903 function stubFalse() {
17904   return false;
17905 }
17906
17907 /** Detect free variable `exports`. */
17908 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
17909
17910 /** Detect free variable `module`. */
17911 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
17912
17913 /** Detect the popular CommonJS extension `module.exports`. */
17914 var moduleExports = freeModule && freeModule.exports === freeExports;
17915
17916 /** Built-in value references. */
17917 var Buffer = moduleExports ? root$2.Buffer : undefined;
17918
17919 /* Built-in method references for those with the same name as other `lodash` methods. */
17920 var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
17921
17922 /**
17923  * Checks if `value` is a buffer.
17924  *
17925  * @static
17926  * @memberOf _
17927  * @since 4.3.0
17928  * @category Lang
17929  * @param {*} value The value to check.
17930  * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
17931  * @example
17932  *
17933  * _.isBuffer(new Buffer(2));
17934  * // => true
17935  *
17936  * _.isBuffer(new Uint8Array(2));
17937  * // => false
17938  */
17939 var isBuffer = nativeIsBuffer || stubFalse;
17940
17941 /** `Object#toString` result references. */
17942 var argsTag$1 = '[object Arguments]';
17943 var arrayTag = '[object Array]';
17944 var boolTag = '[object Boolean]';
17945 var dateTag = '[object Date]';
17946 var errorTag = '[object Error]';
17947 var funcTag$1 = '[object Function]';
17948 var mapTag = '[object Map]';
17949 var numberTag = '[object Number]';
17950 var objectTag = '[object Object]';
17951 var regexpTag = '[object RegExp]';
17952 var setTag = '[object Set]';
17953 var stringTag = '[object String]';
17954 var weakMapTag = '[object WeakMap]';
17955
17956 var arrayBufferTag = '[object ArrayBuffer]';
17957 var dataViewTag = '[object DataView]';
17958 var float32Tag = '[object Float32Array]';
17959 var float64Tag = '[object Float64Array]';
17960 var int8Tag = '[object Int8Array]';
17961 var int16Tag = '[object Int16Array]';
17962 var int32Tag = '[object Int32Array]';
17963 var uint8Tag = '[object Uint8Array]';
17964 var uint8ClampedTag = '[object Uint8ClampedArray]';
17965 var uint16Tag = '[object Uint16Array]';
17966 var uint32Tag = '[object Uint32Array]';
17967
17968 /** Used to identify `toStringTag` values of typed arrays. */
17969 var typedArrayTags = {};
17970 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
17971 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
17972 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
17973 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
17974 typedArrayTags[uint32Tag] = true;
17975 typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
17976 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
17977 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
17978 typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
17979 typedArrayTags[mapTag] = typedArrayTags[numberTag] =
17980 typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
17981 typedArrayTags[setTag] = typedArrayTags[stringTag] =
17982 typedArrayTags[weakMapTag] = false;
17983
17984 /**
17985  * The base implementation of `_.isTypedArray` without Node.js optimizations.
17986  *
17987  * @private
17988  * @param {*} value The value to check.
17989  * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
17990  */
17991 function baseIsTypedArray(value) {
17992   return isObjectLike(value) &&
17993     isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
17994 }
17995
17996 /**
17997  * The base implementation of `_.unary` without support for storing metadata.
17998  *
17999  * @private
18000  * @param {Function} func The function to cap arguments for.
18001  * @returns {Function} Returns the new capped function.
18002  */
18003 function baseUnary(func) {
18004   return function(value) {
18005     return func(value);
18006   };
18007 }
18008
18009 /** Detect free variable `exports`. */
18010 var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18011
18012 /** Detect free variable `module`. */
18013 var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18014
18015 /** Detect the popular CommonJS extension `module.exports`. */
18016 var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18017
18018 /** Detect free variable `process` from Node.js. */
18019 var freeProcess = moduleExports$1 && freeGlobal.process;
18020
18021 /** Used to access faster Node.js helpers. */
18022 var nodeUtil = (function() {
18023   try {
18024     return freeProcess && freeProcess.binding && freeProcess.binding('util');
18025   } catch (e) {}
18026 }());
18027
18028 /* Node.js helper references. */
18029 var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18030
18031 /**
18032  * Checks if `value` is classified as a typed array.
18033  *
18034  * @static
18035  * @memberOf _
18036  * @since 3.0.0
18037  * @category Lang
18038  * @param {*} value The value to check.
18039  * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18040  * @example
18041  *
18042  * _.isTypedArray(new Uint8Array);
18043  * // => true
18044  *
18045  * _.isTypedArray([]);
18046  * // => false
18047  */
18048 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18049
18050 /** Used for built-in method references. */
18051 var objectProto$4 = Object.prototype;
18052
18053 /** Used to check objects for own properties. */
18054 var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
18055
18056 /**
18057  * Creates an array of the enumerable property names of the array-like `value`.
18058  *
18059  * @private
18060  * @param {*} value The value to query.
18061  * @param {boolean} inherited Specify returning inherited property names.
18062  * @returns {Array} Returns the array of property names.
18063  */
18064 function arrayLikeKeys(value, inherited) {
18065   var isArr = isArray(value),
18066       isArg = !isArr && isArguments(value),
18067       isBuff = !isArr && !isArg && isBuffer(value),
18068       isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18069       skipIndexes = isArr || isArg || isBuff || isType,
18070       result = skipIndexes ? baseTimes(value.length, String) : [],
18071       length = result.length;
18072
18073   for (var key in value) {
18074     if ((inherited || hasOwnProperty$3.call(value, key)) &&
18075         !(skipIndexes && (
18076            // Safari 9 has enumerable `arguments.length` in strict mode.
18077            key == 'length' ||
18078            // Node.js 0.10 has enumerable non-index properties on buffers.
18079            (isBuff && (key == 'offset' || key == 'parent')) ||
18080            // PhantomJS 2 has enumerable non-index properties on typed arrays.
18081            (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18082            // Skip index properties.
18083            isIndex(key, length)
18084         ))) {
18085       result.push(key);
18086     }
18087   }
18088   return result;
18089 }
18090
18091 /** Used for built-in method references. */
18092 var objectProto$7 = Object.prototype;
18093
18094 /**
18095  * Checks if `value` is likely a prototype object.
18096  *
18097  * @private
18098  * @param {*} value The value to check.
18099  * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18100  */
18101 function isPrototype(value) {
18102   var Ctor = value && value.constructor,
18103       proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$7;
18104
18105   return value === proto;
18106 }
18107
18108 /**
18109  * This function is like
18110  * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18111  * except that it includes inherited enumerable properties.
18112  *
18113  * @private
18114  * @param {Object} object The object to query.
18115  * @returns {Array} Returns the array of property names.
18116  */
18117 function nativeKeysIn(object) {
18118   var result = [];
18119   if (object != null) {
18120     for (var key in Object(object)) {
18121       result.push(key);
18122     }
18123   }
18124   return result;
18125 }
18126
18127 /** Used for built-in method references. */
18128 var objectProto$6 = Object.prototype;
18129
18130 /** Used to check objects for own properties. */
18131 var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18132
18133 /**
18134  * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18135  *
18136  * @private
18137  * @param {Object} object The object to query.
18138  * @returns {Array} Returns the array of property names.
18139  */
18140 function baseKeysIn(object) {
18141   if (!isObject(object)) {
18142     return nativeKeysIn(object);
18143   }
18144   var isProto = isPrototype(object),
18145       result = [];
18146
18147   for (var key in object) {
18148     if (!(key == 'constructor' && (isProto || !hasOwnProperty$5.call(object, key)))) {
18149       result.push(key);
18150     }
18151   }
18152   return result;
18153 }
18154
18155 /**
18156  * Creates an array of the own and inherited enumerable property names of `object`.
18157  *
18158  * **Note:** Non-object values are coerced to objects.
18159  *
18160  * @static
18161  * @memberOf _
18162  * @since 3.0.0
18163  * @category Object
18164  * @param {Object} object The object to query.
18165  * @returns {Array} Returns the array of property names.
18166  * @example
18167  *
18168  * function Foo() {
18169  *   this.a = 1;
18170  *   this.b = 2;
18171  * }
18172  *
18173  * Foo.prototype.c = 3;
18174  *
18175  * _.keysIn(new Foo);
18176  * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18177  */
18178 function keysIn$1(object) {
18179   return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18180 }
18181
18182 /**
18183  * This method is like `_.assign` except that it iterates over own and
18184  * inherited source properties.
18185  *
18186  * **Note:** This method mutates `object`.
18187  *
18188  * @static
18189  * @memberOf _
18190  * @since 4.0.0
18191  * @alias extend
18192  * @category Object
18193  * @param {Object} object The destination object.
18194  * @param {...Object} [sources] The source objects.
18195  * @returns {Object} Returns `object`.
18196  * @see _.assign
18197  * @example
18198  *
18199  * function Foo() {
18200  *   this.a = 1;
18201  * }
18202  *
18203  * function Bar() {
18204  *   this.c = 3;
18205  * }
18206  *
18207  * Foo.prototype.b = 2;
18208  * Bar.prototype.d = 4;
18209  *
18210  * _.assignIn({ 'a': 0 }, new Foo, new Bar);
18211  * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
18212  */
18213 var assignIn$1 = createAssigner(function(object, source) {
18214   copyObject(source, keysIn$1(source), object);
18215 });
18216
18217 /**
18218  * A specialized version of `_.filter` for arrays without support for
18219  * iteratee shorthands.
18220  *
18221  * @private
18222  * @param {Array} [array] The array to iterate over.
18223  * @param {Function} predicate The function invoked per iteration.
18224  * @returns {Array} Returns the new filtered array.
18225  */
18226 function arrayFilter(array, predicate) {
18227   var index = -1,
18228       length = array == null ? 0 : array.length,
18229       resIndex = 0,
18230       result = [];
18231
18232   while (++index < length) {
18233     var value = array[index];
18234     if (predicate(value, index, array)) {
18235       result[resIndex++] = value;
18236     }
18237   }
18238   return result;
18239 }
18240
18241 /**
18242  * Creates a base function for methods like `_.forIn` and `_.forOwn`.
18243  *
18244  * @private
18245  * @param {boolean} [fromRight] Specify iterating from right to left.
18246  * @returns {Function} Returns the new base function.
18247  */
18248 function createBaseFor(fromRight) {
18249   return function(object, iteratee, keysFunc) {
18250     var index = -1,
18251         iterable = Object(object),
18252         props = keysFunc(object),
18253         length = props.length;
18254
18255     while (length--) {
18256       var key = props[fromRight ? length : ++index];
18257       if (iteratee(iterable[key], key, iterable) === false) {
18258         break;
18259       }
18260     }
18261     return object;
18262   };
18263 }
18264
18265 /**
18266  * The base implementation of `baseForOwn` which iterates over `object`
18267  * properties returned by `keysFunc` and invokes `iteratee` for each property.
18268  * Iteratee functions may exit iteration early by explicitly returning `false`.
18269  *
18270  * @private
18271  * @param {Object} object The object to iterate over.
18272  * @param {Function} iteratee The function invoked per iteration.
18273  * @param {Function} keysFunc The function to get the keys of `object`.
18274  * @returns {Object} Returns `object`.
18275  */
18276 var baseFor = createBaseFor();
18277
18278 /**
18279  * Creates a unary function that invokes `func` with its argument transformed.
18280  *
18281  * @private
18282  * @param {Function} func The function to wrap.
18283  * @param {Function} transform The argument transform.
18284  * @returns {Function} Returns the new function.
18285  */
18286 function overArg(func, transform) {
18287   return function(arg) {
18288     return func(transform(arg));
18289   };
18290 }
18291
18292 /* Built-in method references for those with the same name as other `lodash` methods. */
18293 var nativeKeys = overArg(Object.keys, Object);
18294
18295 /** Used for built-in method references. */
18296 var objectProto$8 = Object.prototype;
18297
18298 /** Used to check objects for own properties. */
18299 var hasOwnProperty$6 = objectProto$8.hasOwnProperty;
18300
18301 /**
18302  * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18303  *
18304  * @private
18305  * @param {Object} object The object to query.
18306  * @returns {Array} Returns the array of property names.
18307  */
18308 function baseKeys(object) {
18309   if (!isPrototype(object)) {
18310     return nativeKeys(object);
18311   }
18312   var result = [];
18313   for (var key in Object(object)) {
18314     if (hasOwnProperty$6.call(object, key) && key != 'constructor') {
18315       result.push(key);
18316     }
18317   }
18318   return result;
18319 }
18320
18321 /**
18322  * Creates an array of the own enumerable property names of `object`.
18323  *
18324  * **Note:** Non-object values are coerced to objects. See the
18325  * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18326  * for more details.
18327  *
18328  * @static
18329  * @since 0.1.0
18330  * @memberOf _
18331  * @category Object
18332  * @param {Object} object The object to query.
18333  * @returns {Array} Returns the array of property names.
18334  * @example
18335  *
18336  * function Foo() {
18337  *   this.a = 1;
18338  *   this.b = 2;
18339  * }
18340  *
18341  * Foo.prototype.c = 3;
18342  *
18343  * _.keys(new Foo);
18344  * // => ['a', 'b'] (iteration order is not guaranteed)
18345  *
18346  * _.keys('hi');
18347  * // => ['0', '1']
18348  */
18349 function keys$1(object) {
18350   return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18351 }
18352
18353 /**
18354  * The base implementation of `_.forOwn` without support for iteratee shorthands.
18355  *
18356  * @private
18357  * @param {Object} object The object to iterate over.
18358  * @param {Function} iteratee The function invoked per iteration.
18359  * @returns {Object} Returns `object`.
18360  */
18361 function baseForOwn(object, iteratee) {
18362   return object && baseFor(object, iteratee, keys$1);
18363 }
18364
18365 /**
18366  * Creates a `baseEach` or `baseEachRight` function.
18367  *
18368  * @private
18369  * @param {Function} eachFunc The function to iterate over a collection.
18370  * @param {boolean} [fromRight] Specify iterating from right to left.
18371  * @returns {Function} Returns the new base function.
18372  */
18373 function createBaseEach(eachFunc, fromRight) {
18374   return function(collection, iteratee) {
18375     if (collection == null) {
18376       return collection;
18377     }
18378     if (!isArrayLike(collection)) {
18379       return eachFunc(collection, iteratee);
18380     }
18381     var length = collection.length,
18382         index = fromRight ? length : -1,
18383         iterable = Object(collection);
18384
18385     while ((fromRight ? index-- : ++index < length)) {
18386       if (iteratee(iterable[index], index, iterable) === false) {
18387         break;
18388       }
18389     }
18390     return collection;
18391   };
18392 }
18393
18394 /**
18395  * The base implementation of `_.forEach` without support for iteratee shorthands.
18396  *
18397  * @private
18398  * @param {Array|Object} collection The collection to iterate over.
18399  * @param {Function} iteratee The function invoked per iteration.
18400  * @returns {Array|Object} Returns `collection`.
18401  */
18402 var baseEach = createBaseEach(baseForOwn);
18403
18404 /**
18405  * The base implementation of `_.filter` without support for iteratee shorthands.
18406  *
18407  * @private
18408  * @param {Array|Object} collection The collection to iterate over.
18409  * @param {Function} predicate The function invoked per iteration.
18410  * @returns {Array} Returns the new filtered array.
18411  */
18412 function baseFilter(collection, predicate) {
18413   var result = [];
18414   baseEach(collection, function(value, index, collection) {
18415     if (predicate(value, index, collection)) {
18416       result.push(value);
18417     }
18418   });
18419   return result;
18420 }
18421
18422 /**
18423  * Removes all key-value entries from the list cache.
18424  *
18425  * @private
18426  * @name clear
18427  * @memberOf ListCache
18428  */
18429 function listCacheClear() {
18430   this.__data__ = [];
18431   this.size = 0;
18432 }
18433
18434 /**
18435  * Gets the index at which the `key` is found in `array` of key-value pairs.
18436  *
18437  * @private
18438  * @param {Array} array The array to inspect.
18439  * @param {*} key The key to search for.
18440  * @returns {number} Returns the index of the matched value, else `-1`.
18441  */
18442 function assocIndexOf(array, key) {
18443   var length = array.length;
18444   while (length--) {
18445     if (eq(array[length][0], key)) {
18446       return length;
18447     }
18448   }
18449   return -1;
18450 }
18451
18452 /** Used for built-in method references. */
18453 var arrayProto = Array.prototype;
18454
18455 /** Built-in value references. */
18456 var splice = arrayProto.splice;
18457
18458 /**
18459  * Removes `key` and its value from the list cache.
18460  *
18461  * @private
18462  * @name delete
18463  * @memberOf ListCache
18464  * @param {string} key The key of the value to remove.
18465  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18466  */
18467 function listCacheDelete(key) {
18468   var data = this.__data__,
18469       index = assocIndexOf(data, key);
18470
18471   if (index < 0) {
18472     return false;
18473   }
18474   var lastIndex = data.length - 1;
18475   if (index == lastIndex) {
18476     data.pop();
18477   } else {
18478     splice.call(data, index, 1);
18479   }
18480   --this.size;
18481   return true;
18482 }
18483
18484 /**
18485  * Gets the list cache value for `key`.
18486  *
18487  * @private
18488  * @name get
18489  * @memberOf ListCache
18490  * @param {string} key The key of the value to get.
18491  * @returns {*} Returns the entry value.
18492  */
18493 function listCacheGet(key) {
18494   var data = this.__data__,
18495       index = assocIndexOf(data, key);
18496
18497   return index < 0 ? undefined : data[index][1];
18498 }
18499
18500 /**
18501  * Checks if a list cache value for `key` exists.
18502  *
18503  * @private
18504  * @name has
18505  * @memberOf ListCache
18506  * @param {string} key The key of the entry to check.
18507  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18508  */
18509 function listCacheHas(key) {
18510   return assocIndexOf(this.__data__, key) > -1;
18511 }
18512
18513 /**
18514  * Sets the list cache `key` to `value`.
18515  *
18516  * @private
18517  * @name set
18518  * @memberOf ListCache
18519  * @param {string} key The key of the value to set.
18520  * @param {*} value The value to set.
18521  * @returns {Object} Returns the list cache instance.
18522  */
18523 function listCacheSet(key, value) {
18524   var data = this.__data__,
18525       index = assocIndexOf(data, key);
18526
18527   if (index < 0) {
18528     ++this.size;
18529     data.push([key, value]);
18530   } else {
18531     data[index][1] = value;
18532   }
18533   return this;
18534 }
18535
18536 /**
18537  * Creates an list cache object.
18538  *
18539  * @private
18540  * @constructor
18541  * @param {Array} [entries] The key-value pairs to cache.
18542  */
18543 function ListCache(entries) {
18544   var index = -1,
18545       length = entries == null ? 0 : entries.length;
18546
18547   this.clear();
18548   while (++index < length) {
18549     var entry = entries[index];
18550     this.set(entry[0], entry[1]);
18551   }
18552 }
18553
18554 // Add methods to `ListCache`.
18555 ListCache.prototype.clear = listCacheClear;
18556 ListCache.prototype['delete'] = listCacheDelete;
18557 ListCache.prototype.get = listCacheGet;
18558 ListCache.prototype.has = listCacheHas;
18559 ListCache.prototype.set = listCacheSet;
18560
18561 /**
18562  * Removes all key-value entries from the stack.
18563  *
18564  * @private
18565  * @name clear
18566  * @memberOf Stack
18567  */
18568 function stackClear() {
18569   this.__data__ = new ListCache;
18570   this.size = 0;
18571 }
18572
18573 /**
18574  * Removes `key` and its value from the stack.
18575  *
18576  * @private
18577  * @name delete
18578  * @memberOf Stack
18579  * @param {string} key The key of the value to remove.
18580  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18581  */
18582 function stackDelete(key) {
18583   var data = this.__data__,
18584       result = data['delete'](key);
18585
18586   this.size = data.size;
18587   return result;
18588 }
18589
18590 /**
18591  * Gets the stack value for `key`.
18592  *
18593  * @private
18594  * @name get
18595  * @memberOf Stack
18596  * @param {string} key The key of the value to get.
18597  * @returns {*} Returns the entry value.
18598  */
18599 function stackGet(key) {
18600   return this.__data__.get(key);
18601 }
18602
18603 /**
18604  * Checks if a stack value for `key` exists.
18605  *
18606  * @private
18607  * @name has
18608  * @memberOf Stack
18609  * @param {string} key The key of the entry to check.
18610  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18611  */
18612 function stackHas(key) {
18613   return this.__data__.has(key);
18614 }
18615
18616 /* Built-in method references that are verified to be native. */
18617 var Map$1 = getNative(root$2, 'Map');
18618
18619 /* Built-in method references that are verified to be native. */
18620 var nativeCreate = getNative(Object, 'create');
18621
18622 /**
18623  * Removes all key-value entries from the hash.
18624  *
18625  * @private
18626  * @name clear
18627  * @memberOf Hash
18628  */
18629 function hashClear() {
18630   this.__data__ = nativeCreate ? nativeCreate(null) : {};
18631   this.size = 0;
18632 }
18633
18634 /**
18635  * Removes `key` and its value from the hash.
18636  *
18637  * @private
18638  * @name delete
18639  * @memberOf Hash
18640  * @param {Object} hash The hash to modify.
18641  * @param {string} key The key of the value to remove.
18642  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18643  */
18644 function hashDelete(key) {
18645   var result = this.has(key) && delete this.__data__[key];
18646   this.size -= result ? 1 : 0;
18647   return result;
18648 }
18649
18650 /** Used to stand-in for `undefined` hash values. */
18651 var HASH_UNDEFINED = '__lodash_hash_undefined__';
18652
18653 /** Used for built-in method references. */
18654 var objectProto$9 = Object.prototype;
18655
18656 /** Used to check objects for own properties. */
18657 var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18658
18659 /**
18660  * Gets the hash value for `key`.
18661  *
18662  * @private
18663  * @name get
18664  * @memberOf Hash
18665  * @param {string} key The key of the value to get.
18666  * @returns {*} Returns the entry value.
18667  */
18668 function hashGet(key) {
18669   var data = this.__data__;
18670   if (nativeCreate) {
18671     var result = data[key];
18672     return result === HASH_UNDEFINED ? undefined : result;
18673   }
18674   return hasOwnProperty$7.call(data, key) ? data[key] : undefined;
18675 }
18676
18677 /** Used for built-in method references. */
18678 var objectProto$10 = Object.prototype;
18679
18680 /** Used to check objects for own properties. */
18681 var hasOwnProperty$8 = objectProto$10.hasOwnProperty;
18682
18683 /**
18684  * Checks if a hash value for `key` exists.
18685  *
18686  * @private
18687  * @name has
18688  * @memberOf Hash
18689  * @param {string} key The key of the entry to check.
18690  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18691  */
18692 function hashHas(key) {
18693   var data = this.__data__;
18694   return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$8.call(data, key);
18695 }
18696
18697 /** Used to stand-in for `undefined` hash values. */
18698 var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
18699
18700 /**
18701  * Sets the hash `key` to `value`.
18702  *
18703  * @private
18704  * @name set
18705  * @memberOf Hash
18706  * @param {string} key The key of the value to set.
18707  * @param {*} value The value to set.
18708  * @returns {Object} Returns the hash instance.
18709  */
18710 function hashSet(key, value) {
18711   var data = this.__data__;
18712   this.size += this.has(key) ? 0 : 1;
18713   data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
18714   return this;
18715 }
18716
18717 /**
18718  * Creates a hash object.
18719  *
18720  * @private
18721  * @constructor
18722  * @param {Array} [entries] The key-value pairs to cache.
18723  */
18724 function Hash(entries) {
18725   var index = -1,
18726       length = entries == null ? 0 : entries.length;
18727
18728   this.clear();
18729   while (++index < length) {
18730     var entry = entries[index];
18731     this.set(entry[0], entry[1]);
18732   }
18733 }
18734
18735 // Add methods to `Hash`.
18736 Hash.prototype.clear = hashClear;
18737 Hash.prototype['delete'] = hashDelete;
18738 Hash.prototype.get = hashGet;
18739 Hash.prototype.has = hashHas;
18740 Hash.prototype.set = hashSet;
18741
18742 /**
18743  * Removes all key-value entries from the map.
18744  *
18745  * @private
18746  * @name clear
18747  * @memberOf MapCache
18748  */
18749 function mapCacheClear() {
18750   this.size = 0;
18751   this.__data__ = {
18752     'hash': new Hash,
18753     'map': new (Map$1 || ListCache),
18754     'string': new Hash
18755   };
18756 }
18757
18758 /**
18759  * Checks if `value` is suitable for use as unique object key.
18760  *
18761  * @private
18762  * @param {*} value The value to check.
18763  * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
18764  */
18765 function isKeyable(value) {
18766   var type = typeof value;
18767   return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
18768     ? (value !== '__proto__')
18769     : (value === null);
18770 }
18771
18772 /**
18773  * Gets the data for `map`.
18774  *
18775  * @private
18776  * @param {Object} map The map to query.
18777  * @param {string} key The reference key.
18778  * @returns {*} Returns the map data.
18779  */
18780 function getMapData(map, key) {
18781   var data = map.__data__;
18782   return isKeyable(key)
18783     ? data[typeof key == 'string' ? 'string' : 'hash']
18784     : data.map;
18785 }
18786
18787 /**
18788  * Removes `key` and its value from the map.
18789  *
18790  * @private
18791  * @name delete
18792  * @memberOf MapCache
18793  * @param {string} key The key of the value to remove.
18794  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18795  */
18796 function mapCacheDelete(key) {
18797   var result = getMapData(this, key)['delete'](key);
18798   this.size -= result ? 1 : 0;
18799   return result;
18800 }
18801
18802 /**
18803  * Gets the map value for `key`.
18804  *
18805  * @private
18806  * @name get
18807  * @memberOf MapCache
18808  * @param {string} key The key of the value to get.
18809  * @returns {*} Returns the entry value.
18810  */
18811 function mapCacheGet(key) {
18812   return getMapData(this, key).get(key);
18813 }
18814
18815 /**
18816  * Checks if a map value for `key` exists.
18817  *
18818  * @private
18819  * @name has
18820  * @memberOf MapCache
18821  * @param {string} key The key of the entry to check.
18822  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18823  */
18824 function mapCacheHas(key) {
18825   return getMapData(this, key).has(key);
18826 }
18827
18828 /**
18829  * Sets the map `key` to `value`.
18830  *
18831  * @private
18832  * @name set
18833  * @memberOf MapCache
18834  * @param {string} key The key of the value to set.
18835  * @param {*} value The value to set.
18836  * @returns {Object} Returns the map cache instance.
18837  */
18838 function mapCacheSet(key, value) {
18839   var data = getMapData(this, key),
18840       size = data.size;
18841
18842   data.set(key, value);
18843   this.size += data.size == size ? 0 : 1;
18844   return this;
18845 }
18846
18847 /**
18848  * Creates a map cache object to store key-value pairs.
18849  *
18850  * @private
18851  * @constructor
18852  * @param {Array} [entries] The key-value pairs to cache.
18853  */
18854 function MapCache(entries) {
18855   var index = -1,
18856       length = entries == null ? 0 : entries.length;
18857
18858   this.clear();
18859   while (++index < length) {
18860     var entry = entries[index];
18861     this.set(entry[0], entry[1]);
18862   }
18863 }
18864
18865 // Add methods to `MapCache`.
18866 MapCache.prototype.clear = mapCacheClear;
18867 MapCache.prototype['delete'] = mapCacheDelete;
18868 MapCache.prototype.get = mapCacheGet;
18869 MapCache.prototype.has = mapCacheHas;
18870 MapCache.prototype.set = mapCacheSet;
18871
18872 /** Used as the size to enable large array optimizations. */
18873 var LARGE_ARRAY_SIZE = 200;
18874
18875 /**
18876  * Sets the stack `key` to `value`.
18877  *
18878  * @private
18879  * @name set
18880  * @memberOf Stack
18881  * @param {string} key The key of the value to set.
18882  * @param {*} value The value to set.
18883  * @returns {Object} Returns the stack cache instance.
18884  */
18885 function stackSet(key, value) {
18886   var data = this.__data__;
18887   if (data instanceof ListCache) {
18888     var pairs = data.__data__;
18889     if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
18890       pairs.push([key, value]);
18891       this.size = ++data.size;
18892       return this;
18893     }
18894     data = this.__data__ = new MapCache(pairs);
18895   }
18896   data.set(key, value);
18897   this.size = data.size;
18898   return this;
18899 }
18900
18901 /**
18902  * Creates a stack cache object to store key-value pairs.
18903  *
18904  * @private
18905  * @constructor
18906  * @param {Array} [entries] The key-value pairs to cache.
18907  */
18908 function Stack(entries) {
18909   var data = this.__data__ = new ListCache(entries);
18910   this.size = data.size;
18911 }
18912
18913 // Add methods to `Stack`.
18914 Stack.prototype.clear = stackClear;
18915 Stack.prototype['delete'] = stackDelete;
18916 Stack.prototype.get = stackGet;
18917 Stack.prototype.has = stackHas;
18918 Stack.prototype.set = stackSet;
18919
18920 /** Used to stand-in for `undefined` hash values. */
18921 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
18922
18923 /**
18924  * Adds `value` to the array cache.
18925  *
18926  * @private
18927  * @name add
18928  * @memberOf SetCache
18929  * @alias push
18930  * @param {*} value The value to cache.
18931  * @returns {Object} Returns the cache instance.
18932  */
18933 function setCacheAdd(value) {
18934   this.__data__.set(value, HASH_UNDEFINED$2);
18935   return this;
18936 }
18937
18938 /**
18939  * Checks if `value` is in the array cache.
18940  *
18941  * @private
18942  * @name has
18943  * @memberOf SetCache
18944  * @param {*} value The value to search for.
18945  * @returns {number} Returns `true` if `value` is found, else `false`.
18946  */
18947 function setCacheHas(value) {
18948   return this.__data__.has(value);
18949 }
18950
18951 /**
18952  *
18953  * Creates an array cache object to store unique values.
18954  *
18955  * @private
18956  * @constructor
18957  * @param {Array} [values] The values to cache.
18958  */
18959 function SetCache(values) {
18960   var index = -1,
18961       length = values == null ? 0 : values.length;
18962
18963   this.__data__ = new MapCache;
18964   while (++index < length) {
18965     this.add(values[index]);
18966   }
18967 }
18968
18969 // Add methods to `SetCache`.
18970 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
18971 SetCache.prototype.has = setCacheHas;
18972
18973 /**
18974  * A specialized version of `_.some` for arrays without support for iteratee
18975  * shorthands.
18976  *
18977  * @private
18978  * @param {Array} [array] The array to iterate over.
18979  * @param {Function} predicate The function invoked per iteration.
18980  * @returns {boolean} Returns `true` if any element passes the predicate check,
18981  *  else `false`.
18982  */
18983 function arraySome(array, predicate) {
18984   var index = -1,
18985       length = array == null ? 0 : array.length;
18986
18987   while (++index < length) {
18988     if (predicate(array[index], index, array)) {
18989       return true;
18990     }
18991   }
18992   return false;
18993 }
18994
18995 /**
18996  * Checks if a `cache` value for `key` exists.
18997  *
18998  * @private
18999  * @param {Object} cache The cache to query.
19000  * @param {string} key The key of the entry to check.
19001  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19002  */
19003 function cacheHas(cache, key) {
19004   return cache.has(key);
19005 }
19006
19007 /** Used to compose bitmasks for value comparisons. */
19008 var COMPARE_PARTIAL_FLAG$2 = 1;
19009 var COMPARE_UNORDERED_FLAG$1 = 2;
19010
19011 /**
19012  * A specialized version of `baseIsEqualDeep` for arrays with support for
19013  * partial deep comparisons.
19014  *
19015  * @private
19016  * @param {Array} array The array to compare.
19017  * @param {Array} other The other array to compare.
19018  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19019  * @param {Function} customizer The function to customize comparisons.
19020  * @param {Function} equalFunc The function to determine equivalents of values.
19021  * @param {Object} stack Tracks traversed `array` and `other` objects.
19022  * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19023  */
19024 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19025   var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19026       arrLength = array.length,
19027       othLength = other.length;
19028
19029   if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19030     return false;
19031   }
19032   // Assume cyclic values are equal.
19033   var stacked = stack.get(array);
19034   if (stacked && stack.get(other)) {
19035     return stacked == other;
19036   }
19037   var index = -1,
19038       result = true,
19039       seen = (bitmask & COMPARE_UNORDERED_FLAG$1) ? new SetCache : undefined;
19040
19041   stack.set(array, other);
19042   stack.set(other, array);
19043
19044   // Ignore non-index properties.
19045   while (++index < arrLength) {
19046     var arrValue = array[index],
19047         othValue = other[index];
19048
19049     if (customizer) {
19050       var compared = isPartial
19051         ? customizer(othValue, arrValue, index, other, array, stack)
19052         : customizer(arrValue, othValue, index, array, other, stack);
19053     }
19054     if (compared !== undefined) {
19055       if (compared) {
19056         continue;
19057       }
19058       result = false;
19059       break;
19060     }
19061     // Recursively compare arrays (susceptible to call stack limits).
19062     if (seen) {
19063       if (!arraySome(other, function(othValue, othIndex) {
19064             if (!cacheHas(seen, othIndex) &&
19065                 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19066               return seen.push(othIndex);
19067             }
19068           })) {
19069         result = false;
19070         break;
19071       }
19072     } else if (!(
19073           arrValue === othValue ||
19074             equalFunc(arrValue, othValue, bitmask, customizer, stack)
19075         )) {
19076       result = false;
19077       break;
19078     }
19079   }
19080   stack['delete'](array);
19081   stack['delete'](other);
19082   return result;
19083 }
19084
19085 /** Built-in value references. */
19086 var Uint8Array = root$2.Uint8Array;
19087
19088 /**
19089  * Converts `map` to its key-value pairs.
19090  *
19091  * @private
19092  * @param {Object} map The map to convert.
19093  * @returns {Array} Returns the key-value pairs.
19094  */
19095 function mapToArray(map) {
19096   var index = -1,
19097       result = Array(map.size);
19098
19099   map.forEach(function(value, key) {
19100     result[++index] = [key, value];
19101   });
19102   return result;
19103 }
19104
19105 /**
19106  * Converts `set` to an array of its values.
19107  *
19108  * @private
19109  * @param {Object} set The set to convert.
19110  * @returns {Array} Returns the values.
19111  */
19112 function setToArray(set) {
19113   var index = -1,
19114       result = Array(set.size);
19115
19116   set.forEach(function(value) {
19117     result[++index] = value;
19118   });
19119   return result;
19120 }
19121
19122 /** Used to compose bitmasks for value comparisons. */
19123 var COMPARE_PARTIAL_FLAG$3 = 1;
19124 var COMPARE_UNORDERED_FLAG$2 = 2;
19125
19126 /** `Object#toString` result references. */
19127 var boolTag$1 = '[object Boolean]';
19128 var dateTag$1 = '[object Date]';
19129 var errorTag$1 = '[object Error]';
19130 var mapTag$1 = '[object Map]';
19131 var numberTag$1 = '[object Number]';
19132 var regexpTag$1 = '[object RegExp]';
19133 var setTag$1 = '[object Set]';
19134 var stringTag$1 = '[object String]';
19135 var symbolTag = '[object Symbol]';
19136
19137 var arrayBufferTag$1 = '[object ArrayBuffer]';
19138 var dataViewTag$1 = '[object DataView]';
19139
19140 /** Used to convert symbols to primitives and strings. */
19141 var symbolProto = Symbol ? Symbol.prototype : undefined;
19142 var symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19143
19144 /**
19145  * A specialized version of `baseIsEqualDeep` for comparing objects of
19146  * the same `toStringTag`.
19147  *
19148  * **Note:** This function only supports comparing values with tags of
19149  * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19150  *
19151  * @private
19152  * @param {Object} object The object to compare.
19153  * @param {Object} other The other object to compare.
19154  * @param {string} tag The `toStringTag` of the objects to compare.
19155  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19156  * @param {Function} customizer The function to customize comparisons.
19157  * @param {Function} equalFunc The function to determine equivalents of values.
19158  * @param {Object} stack Tracks traversed `object` and `other` objects.
19159  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19160  */
19161 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19162   switch (tag) {
19163     case dataViewTag$1:
19164       if ((object.byteLength != other.byteLength) ||
19165           (object.byteOffset != other.byteOffset)) {
19166         return false;
19167       }
19168       object = object.buffer;
19169       other = other.buffer;
19170
19171     case arrayBufferTag$1:
19172       if ((object.byteLength != other.byteLength) ||
19173           !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19174         return false;
19175       }
19176       return true;
19177
19178     case boolTag$1:
19179     case dateTag$1:
19180     case numberTag$1:
19181       // Coerce booleans to `1` or `0` and dates to milliseconds.
19182       // Invalid dates are coerced to `NaN`.
19183       return eq(+object, +other);
19184
19185     case errorTag$1:
19186       return object.name == other.name && object.message == other.message;
19187
19188     case regexpTag$1:
19189     case stringTag$1:
19190       // Coerce regexes to strings and treat strings, primitives and objects,
19191       // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19192       // for more details.
19193       return object == (other + '');
19194
19195     case mapTag$1:
19196       var convert = mapToArray;
19197
19198     case setTag$1:
19199       var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3;
19200       convert || (convert = setToArray);
19201
19202       if (object.size != other.size && !isPartial) {
19203         return false;
19204       }
19205       // Assume cyclic values are equal.
19206       var stacked = stack.get(object);
19207       if (stacked) {
19208         return stacked == other;
19209       }
19210       bitmask |= COMPARE_UNORDERED_FLAG$2;
19211
19212       // Recursively compare objects (susceptible to call stack limits).
19213       stack.set(object, other);
19214       var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19215       stack['delete'](object);
19216       return result;
19217
19218     case symbolTag:
19219       if (symbolValueOf) {
19220         return symbolValueOf.call(object) == symbolValueOf.call(other);
19221       }
19222   }
19223   return false;
19224 }
19225
19226 /**
19227  * Appends the elements of `values` to `array`.
19228  *
19229  * @private
19230  * @param {Array} array The array to modify.
19231  * @param {Array} values The values to append.
19232  * @returns {Array} Returns `array`.
19233  */
19234 function arrayPush(array, values) {
19235   var index = -1,
19236       length = values.length,
19237       offset = array.length;
19238
19239   while (++index < length) {
19240     array[offset + index] = values[index];
19241   }
19242   return array;
19243 }
19244
19245 /**
19246  * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
19247  * `keysFunc` and `symbolsFunc` to get the enumerable property names and
19248  * symbols of `object`.
19249  *
19250  * @private
19251  * @param {Object} object The object to query.
19252  * @param {Function} keysFunc The function to get the keys of `object`.
19253  * @param {Function} symbolsFunc The function to get the symbols of `object`.
19254  * @returns {Array} Returns the array of property names and symbols.
19255  */
19256 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
19257   var result = keysFunc(object);
19258   return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
19259 }
19260
19261 /**
19262  * This method returns a new empty array.
19263  *
19264  * @static
19265  * @memberOf _
19266  * @since 4.13.0
19267  * @category Util
19268  * @returns {Array} Returns the new empty array.
19269  * @example
19270  *
19271  * var arrays = _.times(2, _.stubArray);
19272  *
19273  * console.log(arrays);
19274  * // => [[], []]
19275  *
19276  * console.log(arrays[0] === arrays[1]);
19277  * // => false
19278  */
19279 function stubArray() {
19280   return [];
19281 }
19282
19283 /** Used for built-in method references. */
19284 var objectProto$13 = Object.prototype;
19285
19286 /** Built-in value references. */
19287 var propertyIsEnumerable$1 = objectProto$13.propertyIsEnumerable;
19288
19289 /* Built-in method references for those with the same name as other `lodash` methods. */
19290 var nativeGetSymbols = Object.getOwnPropertySymbols;
19291
19292 /**
19293  * Creates an array of the own enumerable symbols of `object`.
19294  *
19295  * @private
19296  * @param {Object} object The object to query.
19297  * @returns {Array} Returns the array of symbols.
19298  */
19299 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
19300   if (object == null) {
19301     return [];
19302   }
19303   object = Object(object);
19304   return arrayFilter(nativeGetSymbols(object), function(symbol) {
19305     return propertyIsEnumerable$1.call(object, symbol);
19306   });
19307 };
19308
19309 /**
19310  * Creates an array of own enumerable property names and symbols of `object`.
19311  *
19312  * @private
19313  * @param {Object} object The object to query.
19314  * @returns {Array} Returns the array of property names and symbols.
19315  */
19316 function getAllKeys(object) {
19317   return baseGetAllKeys(object, keys$1, getSymbols);
19318 }
19319
19320 /** Used to compose bitmasks for value comparisons. */
19321 var COMPARE_PARTIAL_FLAG$4 = 1;
19322
19323 /** Used for built-in method references. */
19324 var objectProto$12 = Object.prototype;
19325
19326 /** Used to check objects for own properties. */
19327 var hasOwnProperty$10 = objectProto$12.hasOwnProperty;
19328
19329 /**
19330  * A specialized version of `baseIsEqualDeep` for objects with support for
19331  * partial deep comparisons.
19332  *
19333  * @private
19334  * @param {Object} object The object to compare.
19335  * @param {Object} other The other object to compare.
19336  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19337  * @param {Function} customizer The function to customize comparisons.
19338  * @param {Function} equalFunc The function to determine equivalents of values.
19339  * @param {Object} stack Tracks traversed `object` and `other` objects.
19340  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19341  */
19342 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19343   var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4,
19344       objProps = getAllKeys(object),
19345       objLength = objProps.length,
19346       othProps = getAllKeys(other),
19347       othLength = othProps.length;
19348
19349   if (objLength != othLength && !isPartial) {
19350     return false;
19351   }
19352   var index = objLength;
19353   while (index--) {
19354     var key = objProps[index];
19355     if (!(isPartial ? key in other : hasOwnProperty$10.call(other, key))) {
19356       return false;
19357     }
19358   }
19359   // Assume cyclic values are equal.
19360   var stacked = stack.get(object);
19361   if (stacked && stack.get(other)) {
19362     return stacked == other;
19363   }
19364   var result = true;
19365   stack.set(object, other);
19366   stack.set(other, object);
19367
19368   var skipCtor = isPartial;
19369   while (++index < objLength) {
19370     key = objProps[index];
19371     var objValue = object[key],
19372         othValue = other[key];
19373
19374     if (customizer) {
19375       var compared = isPartial
19376         ? customizer(othValue, objValue, key, other, object, stack)
19377         : customizer(objValue, othValue, key, object, other, stack);
19378     }
19379     // Recursively compare objects (susceptible to call stack limits).
19380     if (!(compared === undefined
19381           ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19382           : compared
19383         )) {
19384       result = false;
19385       break;
19386     }
19387     skipCtor || (skipCtor = key == 'constructor');
19388   }
19389   if (result && !skipCtor) {
19390     var objCtor = object.constructor,
19391         othCtor = other.constructor;
19392
19393     // Non `Object` object instances with different constructors are not equal.
19394     if (objCtor != othCtor &&
19395         ('constructor' in object && 'constructor' in other) &&
19396         !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19397           typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19398       result = false;
19399     }
19400   }
19401   stack['delete'](object);
19402   stack['delete'](other);
19403   return result;
19404 }
19405
19406 /* Built-in method references that are verified to be native. */
19407 var DataView = getNative(root$2, 'DataView');
19408
19409 /* Built-in method references that are verified to be native. */
19410 var Promise = getNative(root$2, 'Promise');
19411
19412 /* Built-in method references that are verified to be native. */
19413 var Set$1 = getNative(root$2, 'Set');
19414
19415 /* Built-in method references that are verified to be native. */
19416 var WeakMap = getNative(root$2, 'WeakMap');
19417
19418 /** `Object#toString` result references. */
19419 var mapTag$2 = '[object Map]';
19420 var objectTag$2 = '[object Object]';
19421 var promiseTag = '[object Promise]';
19422 var setTag$2 = '[object Set]';
19423 var weakMapTag$1 = '[object WeakMap]';
19424
19425 var dataViewTag$2 = '[object DataView]';
19426
19427 /** Used to detect maps, sets, and weakmaps. */
19428 var dataViewCtorString = toSource(DataView);
19429 var mapCtorString = toSource(Map$1);
19430 var promiseCtorString = toSource(Promise);
19431 var setCtorString = toSource(Set$1);
19432 var weakMapCtorString = toSource(WeakMap);
19433
19434 /**
19435  * Gets the `toStringTag` of `value`.
19436  *
19437  * @private
19438  * @param {*} value The value to query.
19439  * @returns {string} Returns the `toStringTag`.
19440  */
19441 var getTag = baseGetTag;
19442
19443 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
19444 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$2) ||
19445     (Map$1 && getTag(new Map$1) != mapTag$2) ||
19446     (Promise && getTag(Promise.resolve()) != promiseTag) ||
19447     (Set$1 && getTag(new Set$1) != setTag$2) ||
19448     (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
19449   getTag = function(value) {
19450     var result = baseGetTag(value),
19451         Ctor = result == objectTag$2 ? value.constructor : undefined,
19452         ctorString = Ctor ? toSource(Ctor) : '';
19453
19454     if (ctorString) {
19455       switch (ctorString) {
19456         case dataViewCtorString: return dataViewTag$2;
19457         case mapCtorString: return mapTag$2;
19458         case promiseCtorString: return promiseTag;
19459         case setCtorString: return setTag$2;
19460         case weakMapCtorString: return weakMapTag$1;
19461       }
19462     }
19463     return result;
19464   };
19465 }
19466
19467 var getTag$1 = getTag;
19468
19469 /** Used to compose bitmasks for value comparisons. */
19470 var COMPARE_PARTIAL_FLAG$1 = 1;
19471
19472 /** `Object#toString` result references. */
19473 var argsTag$2 = '[object Arguments]';
19474 var arrayTag$1 = '[object Array]';
19475 var objectTag$1 = '[object Object]';
19476
19477 /** Used for built-in method references. */
19478 var objectProto$11 = Object.prototype;
19479
19480 /** Used to check objects for own properties. */
19481 var hasOwnProperty$9 = objectProto$11.hasOwnProperty;
19482
19483 /**
19484  * A specialized version of `baseIsEqual` for arrays and objects which performs
19485  * deep comparisons and tracks traversed objects enabling objects with circular
19486  * references to be compared.
19487  *
19488  * @private
19489  * @param {Object} object The object to compare.
19490  * @param {Object} other The other object to compare.
19491  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19492  * @param {Function} customizer The function to customize comparisons.
19493  * @param {Function} equalFunc The function to determine equivalents of values.
19494  * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19495  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19496  */
19497 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19498   var objIsArr = isArray(object),
19499       othIsArr = isArray(other),
19500       objTag = objIsArr ? arrayTag$1 : getTag$1(object),
19501       othTag = othIsArr ? arrayTag$1 : getTag$1(other);
19502
19503   objTag = objTag == argsTag$2 ? objectTag$1 : objTag;
19504   othTag = othTag == argsTag$2 ? objectTag$1 : othTag;
19505
19506   var objIsObj = objTag == objectTag$1,
19507       othIsObj = othTag == objectTag$1,
19508       isSameTag = objTag == othTag;
19509
19510   if (isSameTag && isBuffer(object)) {
19511     if (!isBuffer(other)) {
19512       return false;
19513     }
19514     objIsArr = true;
19515     objIsObj = false;
19516   }
19517   if (isSameTag && !objIsObj) {
19518     stack || (stack = new Stack);
19519     return (objIsArr || isTypedArray(object))
19520       ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
19521       : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
19522   }
19523   if (!(bitmask & COMPARE_PARTIAL_FLAG$1)) {
19524     var objIsWrapped = objIsObj && hasOwnProperty$9.call(object, '__wrapped__'),
19525         othIsWrapped = othIsObj && hasOwnProperty$9.call(other, '__wrapped__');
19526
19527     if (objIsWrapped || othIsWrapped) {
19528       var objUnwrapped = objIsWrapped ? object.value() : object,
19529           othUnwrapped = othIsWrapped ? other.value() : other;
19530
19531       stack || (stack = new Stack);
19532       return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
19533     }
19534   }
19535   if (!isSameTag) {
19536     return false;
19537   }
19538   stack || (stack = new Stack);
19539   return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
19540 }
19541
19542 /**
19543  * The base implementation of `_.isEqual` which supports partial comparisons
19544  * and tracks traversed objects.
19545  *
19546  * @private
19547  * @param {*} value The value to compare.
19548  * @param {*} other The other value to compare.
19549  * @param {boolean} bitmask The bitmask flags.
19550  *  1 - Unordered comparison
19551  *  2 - Partial comparison
19552  * @param {Function} [customizer] The function to customize comparisons.
19553  * @param {Object} [stack] Tracks traversed `value` and `other` objects.
19554  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
19555  */
19556 function baseIsEqual(value, other, bitmask, customizer, stack) {
19557   if (value === other) {
19558     return true;
19559   }
19560   if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
19561     return value !== value && other !== other;
19562   }
19563   return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
19564 }
19565
19566 /** Used to compose bitmasks for value comparisons. */
19567 var COMPARE_PARTIAL_FLAG = 1;
19568 var COMPARE_UNORDERED_FLAG = 2;
19569
19570 /**
19571  * The base implementation of `_.isMatch` without support for iteratee shorthands.
19572  *
19573  * @private
19574  * @param {Object} object The object to inspect.
19575  * @param {Object} source The object of property values to match.
19576  * @param {Array} matchData The property names, values, and compare flags to match.
19577  * @param {Function} [customizer] The function to customize comparisons.
19578  * @returns {boolean} Returns `true` if `object` is a match, else `false`.
19579  */
19580 function baseIsMatch(object, source, matchData, customizer) {
19581   var index = matchData.length,
19582       length = index,
19583       noCustomizer = !customizer;
19584
19585   if (object == null) {
19586     return !length;
19587   }
19588   object = Object(object);
19589   while (index--) {
19590     var data = matchData[index];
19591     if ((noCustomizer && data[2])
19592           ? data[1] !== object[data[0]]
19593           : !(data[0] in object)
19594         ) {
19595       return false;
19596     }
19597   }
19598   while (++index < length) {
19599     data = matchData[index];
19600     var key = data[0],
19601         objValue = object[key],
19602         srcValue = data[1];
19603
19604     if (noCustomizer && data[2]) {
19605       if (objValue === undefined && !(key in object)) {
19606         return false;
19607       }
19608     } else {
19609       var stack = new Stack;
19610       if (customizer) {
19611         var result = customizer(objValue, srcValue, key, object, source, stack);
19612       }
19613       if (!(result === undefined
19614             ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
19615             : result
19616           )) {
19617         return false;
19618       }
19619     }
19620   }
19621   return true;
19622 }
19623
19624 /**
19625  * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
19626  *
19627  * @private
19628  * @param {*} value The value to check.
19629  * @returns {boolean} Returns `true` if `value` if suitable for strict
19630  *  equality comparisons, else `false`.
19631  */
19632 function isStrictComparable(value) {
19633   return value === value && !isObject(value);
19634 }
19635
19636 /**
19637  * Gets the property names, values, and compare flags of `object`.
19638  *
19639  * @private
19640  * @param {Object} object The object to query.
19641  * @returns {Array} Returns the match data of `object`.
19642  */
19643 function getMatchData(object) {
19644   var result = keys$1(object),
19645       length = result.length;
19646
19647   while (length--) {
19648     var key = result[length],
19649         value = object[key];
19650
19651     result[length] = [key, value, isStrictComparable(value)];
19652   }
19653   return result;
19654 }
19655
19656 /**
19657  * A specialized version of `matchesProperty` for source values suitable
19658  * for strict equality comparisons, i.e. `===`.
19659  *
19660  * @private
19661  * @param {string} key The key of the property to get.
19662  * @param {*} srcValue The value to match.
19663  * @returns {Function} Returns the new spec function.
19664  */
19665 function matchesStrictComparable(key, srcValue) {
19666   return function(object) {
19667     if (object == null) {
19668       return false;
19669     }
19670     return object[key] === srcValue &&
19671       (srcValue !== undefined || (key in Object(object)));
19672   };
19673 }
19674
19675 /**
19676  * The base implementation of `_.matches` which doesn't clone `source`.
19677  *
19678  * @private
19679  * @param {Object} source The object of property values to match.
19680  * @returns {Function} Returns the new spec function.
19681  */
19682 function baseMatches(source) {
19683   var matchData = getMatchData(source);
19684   if (matchData.length == 1 && matchData[0][2]) {
19685     return matchesStrictComparable(matchData[0][0], matchData[0][1]);
19686   }
19687   return function(object) {
19688     return object === source || baseIsMatch(object, source, matchData);
19689   };
19690 }
19691
19692 /** `Object#toString` result references. */
19693 var symbolTag$1 = '[object Symbol]';
19694
19695 /**
19696  * Checks if `value` is classified as a `Symbol` primitive or object.
19697  *
19698  * @static
19699  * @memberOf _
19700  * @since 4.0.0
19701  * @category Lang
19702  * @param {*} value The value to check.
19703  * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
19704  * @example
19705  *
19706  * _.isSymbol(Symbol.iterator);
19707  * // => true
19708  *
19709  * _.isSymbol('abc');
19710  * // => false
19711  */
19712 function isSymbol(value) {
19713   return typeof value == 'symbol' ||
19714     (isObjectLike(value) && baseGetTag(value) == symbolTag$1);
19715 }
19716
19717 /** Used to match property names within property paths. */
19718 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/;
19719 var reIsPlainProp = /^\w*$/;
19720
19721 /**
19722  * Checks if `value` is a property name and not a property path.
19723  *
19724  * @private
19725  * @param {*} value The value to check.
19726  * @param {Object} [object] The object to query keys on.
19727  * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
19728  */
19729 function isKey(value, object) {
19730   if (isArray(value)) {
19731     return false;
19732   }
19733   var type = typeof value;
19734   if (type == 'number' || type == 'symbol' || type == 'boolean' ||
19735       value == null || isSymbol(value)) {
19736     return true;
19737   }
19738   return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
19739     (object != null && value in Object(object));
19740 }
19741
19742 /** Error message constants. */
19743 var FUNC_ERROR_TEXT = 'Expected a function';
19744
19745 /**
19746  * Creates a function that memoizes the result of `func`. If `resolver` is
19747  * provided, it determines the cache key for storing the result based on the
19748  * arguments provided to the memoized function. By default, the first argument
19749  * provided to the memoized function is used as the map cache key. The `func`
19750  * is invoked with the `this` binding of the memoized function.
19751  *
19752  * **Note:** The cache is exposed as the `cache` property on the memoized
19753  * function. Its creation may be customized by replacing the `_.memoize.Cache`
19754  * constructor with one whose instances implement the
19755  * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
19756  * method interface of `clear`, `delete`, `get`, `has`, and `set`.
19757  *
19758  * @static
19759  * @memberOf _
19760  * @since 0.1.0
19761  * @category Function
19762  * @param {Function} func The function to have its output memoized.
19763  * @param {Function} [resolver] The function to resolve the cache key.
19764  * @returns {Function} Returns the new memoized function.
19765  * @example
19766  *
19767  * var object = { 'a': 1, 'b': 2 };
19768  * var other = { 'c': 3, 'd': 4 };
19769  *
19770  * var values = _.memoize(_.values);
19771  * values(object);
19772  * // => [1, 2]
19773  *
19774  * values(other);
19775  * // => [3, 4]
19776  *
19777  * object.a = 2;
19778  * values(object);
19779  * // => [1, 2]
19780  *
19781  * // Modify the result cache.
19782  * values.cache.set(object, ['a', 'b']);
19783  * values(object);
19784  * // => ['a', 'b']
19785  *
19786  * // Replace `_.memoize.Cache`.
19787  * _.memoize.Cache = WeakMap;
19788  */
19789 function memoize(func, resolver) {
19790   if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
19791     throw new TypeError(FUNC_ERROR_TEXT);
19792   }
19793   var memoized = function() {
19794     var args = arguments,
19795         key = resolver ? resolver.apply(this, args) : args[0],
19796         cache = memoized.cache;
19797
19798     if (cache.has(key)) {
19799       return cache.get(key);
19800     }
19801     var result = func.apply(this, args);
19802     memoized.cache = cache.set(key, result) || cache;
19803     return result;
19804   };
19805   memoized.cache = new (memoize.Cache || MapCache);
19806   return memoized;
19807 }
19808
19809 // Expose `MapCache`.
19810 memoize.Cache = MapCache;
19811
19812 /** Used as the maximum memoize cache size. */
19813 var MAX_MEMOIZE_SIZE = 500;
19814
19815 /**
19816  * A specialized version of `_.memoize` which clears the memoized function's
19817  * cache when it exceeds `MAX_MEMOIZE_SIZE`.
19818  *
19819  * @private
19820  * @param {Function} func The function to have its output memoized.
19821  * @returns {Function} Returns the new memoized function.
19822  */
19823 function memoizeCapped(func) {
19824   var result = memoize(func, function(key) {
19825     if (cache.size === MAX_MEMOIZE_SIZE) {
19826       cache.clear();
19827     }
19828     return key;
19829   });
19830
19831   var cache = result.cache;
19832   return result;
19833 }
19834
19835 /** Used to match property names within property paths. */
19836 var reLeadingDot = /^\./;
19837 var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
19838
19839 /** Used to match backslashes in property paths. */
19840 var reEscapeChar = /\\(\\)?/g;
19841
19842 /**
19843  * Converts `string` to a property path array.
19844  *
19845  * @private
19846  * @param {string} string The string to convert.
19847  * @returns {Array} Returns the property path array.
19848  */
19849 var stringToPath = memoizeCapped(function(string) {
19850   var result = [];
19851   if (reLeadingDot.test(string)) {
19852     result.push('');
19853   }
19854   string.replace(rePropName, function(match, number, quote, string) {
19855     result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
19856   });
19857   return result;
19858 });
19859
19860 /**
19861  * A specialized version of `_.map` for arrays without support for iteratee
19862  * shorthands.
19863  *
19864  * @private
19865  * @param {Array} [array] The array to iterate over.
19866  * @param {Function} iteratee The function invoked per iteration.
19867  * @returns {Array} Returns the new mapped array.
19868  */
19869 function arrayMap(array, iteratee) {
19870   var index = -1,
19871       length = array == null ? 0 : array.length,
19872       result = Array(length);
19873
19874   while (++index < length) {
19875     result[index] = iteratee(array[index], index, array);
19876   }
19877   return result;
19878 }
19879
19880 /** Used as references for various `Number` constants. */
19881 var INFINITY = 1 / 0;
19882
19883 /** Used to convert symbols to primitives and strings. */
19884 var symbolProto$1 = Symbol ? Symbol.prototype : undefined;
19885 var symbolToString = symbolProto$1 ? symbolProto$1.toString : undefined;
19886
19887 /**
19888  * The base implementation of `_.toString` which doesn't convert nullish
19889  * values to empty strings.
19890  *
19891  * @private
19892  * @param {*} value The value to process.
19893  * @returns {string} Returns the string.
19894  */
19895 function baseToString(value) {
19896   // Exit early for strings to avoid a performance hit in some environments.
19897   if (typeof value == 'string') {
19898     return value;
19899   }
19900   if (isArray(value)) {
19901     // Recursively convert values (susceptible to call stack limits).
19902     return arrayMap(value, baseToString) + '';
19903   }
19904   if (isSymbol(value)) {
19905     return symbolToString ? symbolToString.call(value) : '';
19906   }
19907   var result = (value + '');
19908   return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
19909 }
19910
19911 /**
19912  * Converts `value` to a string. An empty string is returned for `null`
19913  * and `undefined` values. The sign of `-0` is preserved.
19914  *
19915  * @static
19916  * @memberOf _
19917  * @since 4.0.0
19918  * @category Lang
19919  * @param {*} value The value to convert.
19920  * @returns {string} Returns the converted string.
19921  * @example
19922  *
19923  * _.toString(null);
19924  * // => ''
19925  *
19926  * _.toString(-0);
19927  * // => '-0'
19928  *
19929  * _.toString([1, 2, 3]);
19930  * // => '1,2,3'
19931  */
19932 function toString(value) {
19933   return value == null ? '' : baseToString(value);
19934 }
19935
19936 /**
19937  * Casts `value` to a path array if it's not one.
19938  *
19939  * @private
19940  * @param {*} value The value to inspect.
19941  * @param {Object} [object] The object to query keys on.
19942  * @returns {Array} Returns the cast property path array.
19943  */
19944 function castPath(value, object) {
19945   if (isArray(value)) {
19946     return value;
19947   }
19948   return isKey(value, object) ? [value] : stringToPath(toString(value));
19949 }
19950
19951 /** Used as references for various `Number` constants. */
19952 var INFINITY$1 = 1 / 0;
19953
19954 /**
19955  * Converts `value` to a string key if it's not a string or symbol.
19956  *
19957  * @private
19958  * @param {*} value The value to inspect.
19959  * @returns {string|symbol} Returns the key.
19960  */
19961 function toKey(value) {
19962   if (typeof value == 'string' || isSymbol(value)) {
19963     return value;
19964   }
19965   var result = (value + '');
19966   return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
19967 }
19968
19969 /**
19970  * The base implementation of `_.get` without support for default values.
19971  *
19972  * @private
19973  * @param {Object} object The object to query.
19974  * @param {Array|string} path The path of the property to get.
19975  * @returns {*} Returns the resolved value.
19976  */
19977 function baseGet(object, path) {
19978   path = castPath(path, object);
19979
19980   var index = 0,
19981       length = path.length;
19982
19983   while (object != null && index < length) {
19984     object = object[toKey(path[index++])];
19985   }
19986   return (index && index == length) ? object : undefined;
19987 }
19988
19989 /**
19990  * Gets the value at `path` of `object`. If the resolved value is
19991  * `undefined`, the `defaultValue` is returned in its place.
19992  *
19993  * @static
19994  * @memberOf _
19995  * @since 3.7.0
19996  * @category Object
19997  * @param {Object} object The object to query.
19998  * @param {Array|string} path The path of the property to get.
19999  * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20000  * @returns {*} Returns the resolved value.
20001  * @example
20002  *
20003  * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20004  *
20005  * _.get(object, 'a[0].b.c');
20006  * // => 3
20007  *
20008  * _.get(object, ['a', '0', 'b', 'c']);
20009  * // => 3
20010  *
20011  * _.get(object, 'a.b.c', 'default');
20012  * // => 'default'
20013  */
20014 function get$2(object, path, defaultValue) {
20015   var result = object == null ? undefined : baseGet(object, path);
20016   return result === undefined ? defaultValue : result;
20017 }
20018
20019 /**
20020  * The base implementation of `_.hasIn` without support for deep paths.
20021  *
20022  * @private
20023  * @param {Object} [object] The object to query.
20024  * @param {Array|string} key The key to check.
20025  * @returns {boolean} Returns `true` if `key` exists, else `false`.
20026  */
20027 function baseHasIn(object, key) {
20028   return object != null && key in Object(object);
20029 }
20030
20031 /**
20032  * Checks if `path` exists on `object`.
20033  *
20034  * @private
20035  * @param {Object} object The object to query.
20036  * @param {Array|string} path The path to check.
20037  * @param {Function} hasFunc The function to check properties.
20038  * @returns {boolean} Returns `true` if `path` exists, else `false`.
20039  */
20040 function hasPath(object, path, hasFunc) {
20041   path = castPath(path, object);
20042
20043   var index = -1,
20044       length = path.length,
20045       result = false;
20046
20047   while (++index < length) {
20048     var key = toKey(path[index]);
20049     if (!(result = object != null && hasFunc(object, key))) {
20050       break;
20051     }
20052     object = object[key];
20053   }
20054   if (result || ++index != length) {
20055     return result;
20056   }
20057   length = object == null ? 0 : object.length;
20058   return !!length && isLength(length) && isIndex(key, length) &&
20059     (isArray(object) || isArguments(object));
20060 }
20061
20062 /**
20063  * Checks if `path` is a direct or inherited property of `object`.
20064  *
20065  * @static
20066  * @memberOf _
20067  * @since 4.0.0
20068  * @category Object
20069  * @param {Object} object The object to query.
20070  * @param {Array|string} path The path to check.
20071  * @returns {boolean} Returns `true` if `path` exists, else `false`.
20072  * @example
20073  *
20074  * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20075  *
20076  * _.hasIn(object, 'a');
20077  * // => true
20078  *
20079  * _.hasIn(object, 'a.b');
20080  * // => true
20081  *
20082  * _.hasIn(object, ['a', 'b']);
20083  * // => true
20084  *
20085  * _.hasIn(object, 'b');
20086  * // => false
20087  */
20088 function hasIn(object, path) {
20089   return object != null && hasPath(object, path, baseHasIn);
20090 }
20091
20092 /** Used to compose bitmasks for value comparisons. */
20093 var COMPARE_PARTIAL_FLAG$5 = 1;
20094 var COMPARE_UNORDERED_FLAG$3 = 2;
20095
20096 /**
20097  * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20098  *
20099  * @private
20100  * @param {string} path The path of the property to get.
20101  * @param {*} srcValue The value to match.
20102  * @returns {Function} Returns the new spec function.
20103  */
20104 function baseMatchesProperty(path, srcValue) {
20105   if (isKey(path) && isStrictComparable(srcValue)) {
20106     return matchesStrictComparable(toKey(path), srcValue);
20107   }
20108   return function(object) {
20109     var objValue = get$2(object, path);
20110     return (objValue === undefined && objValue === srcValue)
20111       ? hasIn(object, path)
20112       : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20113   };
20114 }
20115
20116 /**
20117  * The base implementation of `_.property` without support for deep paths.
20118  *
20119  * @private
20120  * @param {string} key The key of the property to get.
20121  * @returns {Function} Returns the new accessor function.
20122  */
20123 function baseProperty(key) {
20124   return function(object) {
20125     return object == null ? undefined : object[key];
20126   };
20127 }
20128
20129 /**
20130  * A specialized version of `baseProperty` which supports deep paths.
20131  *
20132  * @private
20133  * @param {Array|string} path The path of the property to get.
20134  * @returns {Function} Returns the new accessor function.
20135  */
20136 function basePropertyDeep(path) {
20137   return function(object) {
20138     return baseGet(object, path);
20139   };
20140 }
20141
20142 /**
20143  * Creates a function that returns the value at `path` of a given object.
20144  *
20145  * @static
20146  * @memberOf _
20147  * @since 2.4.0
20148  * @category Util
20149  * @param {Array|string} path The path of the property to get.
20150  * @returns {Function} Returns the new accessor function.
20151  * @example
20152  *
20153  * var objects = [
20154  *   { 'a': { 'b': 2 } },
20155  *   { 'a': { 'b': 1 } }
20156  * ];
20157  *
20158  * _.map(objects, _.property('a.b'));
20159  * // => [2, 1]
20160  *
20161  * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20162  * // => [1, 2]
20163  */
20164 function property(path) {
20165   return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20166 }
20167
20168 /**
20169  * The base implementation of `_.iteratee`.
20170  *
20171  * @private
20172  * @param {*} [value=_.identity] The value to convert to an iteratee.
20173  * @returns {Function} Returns the iteratee.
20174  */
20175 function baseIteratee(value) {
20176   // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20177   // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20178   if (typeof value == 'function') {
20179     return value;
20180   }
20181   if (value == null) {
20182     return identity$8;
20183   }
20184   if (typeof value == 'object') {
20185     return isArray(value)
20186       ? baseMatchesProperty(value[0], value[1])
20187       : baseMatches(value);
20188   }
20189   return property(value);
20190 }
20191
20192 /**
20193  * Iterates over elements of `collection`, returning an array of all elements
20194  * `predicate` returns truthy for. The predicate is invoked with three
20195  * arguments: (value, index|key, collection).
20196  *
20197  * **Note:** Unlike `_.remove`, this method returns a new array.
20198  *
20199  * @static
20200  * @memberOf _
20201  * @since 0.1.0
20202  * @category Collection
20203  * @param {Array|Object} collection The collection to iterate over.
20204  * @param {Function} [predicate=_.identity] The function invoked per iteration.
20205  * @returns {Array} Returns the new filtered array.
20206  * @see _.reject
20207  * @example
20208  *
20209  * var users = [
20210  *   { 'user': 'barney', 'age': 36, 'active': true },
20211  *   { 'user': 'fred',   'age': 40, 'active': false }
20212  * ];
20213  *
20214  * _.filter(users, function(o) { return !o.active; });
20215  * // => objects for ['fred']
20216  *
20217  * // The `_.matches` iteratee shorthand.
20218  * _.filter(users, { 'age': 36, 'active': true });
20219  * // => objects for ['barney']
20220  *
20221  * // The `_.matchesProperty` iteratee shorthand.
20222  * _.filter(users, ['active', false]);
20223  * // => objects for ['fred']
20224  *
20225  * // The `_.property` iteratee shorthand.
20226  * _.filter(users, 'active');
20227  * // => objects for ['barney']
20228  */
20229 function filter(collection, predicate) {
20230   var func = isArray(collection) ? arrayFilter : baseFilter;
20231   return func(collection, baseIteratee(predicate, 3));
20232 }
20233
20234 /**
20235  * Creates a `_.find` or `_.findLast` function.
20236  *
20237  * @private
20238  * @param {Function} findIndexFunc The function to find the collection index.
20239  * @returns {Function} Returns the new find function.
20240  */
20241 function createFind(findIndexFunc) {
20242   return function(collection, predicate, fromIndex) {
20243     var iterable = Object(collection);
20244     if (!isArrayLike(collection)) {
20245       var iteratee = baseIteratee(predicate, 3);
20246       collection = keys$1(collection);
20247       predicate = function(key) { return iteratee(iterable[key], key, iterable); };
20248     }
20249     var index = findIndexFunc(collection, predicate, fromIndex);
20250     return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
20251   };
20252 }
20253
20254 /**
20255  * The base implementation of `_.findIndex` and `_.findLastIndex` without
20256  * support for iteratee shorthands.
20257  *
20258  * @private
20259  * @param {Array} array The array to inspect.
20260  * @param {Function} predicate The function invoked per iteration.
20261  * @param {number} fromIndex The index to search from.
20262  * @param {boolean} [fromRight] Specify iterating from right to left.
20263  * @returns {number} Returns the index of the matched value, else `-1`.
20264  */
20265 function baseFindIndex(array, predicate, fromIndex, fromRight) {
20266   var length = array.length,
20267       index = fromIndex + (fromRight ? 1 : -1);
20268
20269   while ((fromRight ? index-- : ++index < length)) {
20270     if (predicate(array[index], index, array)) {
20271       return index;
20272     }
20273   }
20274   return -1;
20275 }
20276
20277 /** Used as references for various `Number` constants. */
20278 var NAN = 0 / 0;
20279
20280 /** Used to match leading and trailing whitespace. */
20281 var reTrim = /^\s+|\s+$/g;
20282
20283 /** Used to detect bad signed hexadecimal string values. */
20284 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
20285
20286 /** Used to detect binary string values. */
20287 var reIsBinary = /^0b[01]+$/i;
20288
20289 /** Used to detect octal string values. */
20290 var reIsOctal = /^0o[0-7]+$/i;
20291
20292 /** Built-in method references without a dependency on `root`. */
20293 var freeParseInt = parseInt;
20294
20295 /**
20296  * Converts `value` to a number.
20297  *
20298  * @static
20299  * @memberOf _
20300  * @since 4.0.0
20301  * @category Lang
20302  * @param {*} value The value to process.
20303  * @returns {number} Returns the number.
20304  * @example
20305  *
20306  * _.toNumber(3.2);
20307  * // => 3.2
20308  *
20309  * _.toNumber(Number.MIN_VALUE);
20310  * // => 5e-324
20311  *
20312  * _.toNumber(Infinity);
20313  * // => Infinity
20314  *
20315  * _.toNumber('3.2');
20316  * // => 3.2
20317  */
20318 function toNumber(value) {
20319   if (typeof value == 'number') {
20320     return value;
20321   }
20322   if (isSymbol(value)) {
20323     return NAN;
20324   }
20325   if (isObject(value)) {
20326     var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
20327     value = isObject(other) ? (other + '') : other;
20328   }
20329   if (typeof value != 'string') {
20330     return value === 0 ? value : +value;
20331   }
20332   value = value.replace(reTrim, '');
20333   var isBinary = reIsBinary.test(value);
20334   return (isBinary || reIsOctal.test(value))
20335     ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
20336     : (reIsBadHex.test(value) ? NAN : +value);
20337 }
20338
20339 /** Used as references for various `Number` constants. */
20340 var INFINITY$2 = 1 / 0;
20341 var MAX_INTEGER = 1.7976931348623157e+308;
20342
20343 /**
20344  * Converts `value` to a finite number.
20345  *
20346  * @static
20347  * @memberOf _
20348  * @since 4.12.0
20349  * @category Lang
20350  * @param {*} value The value to convert.
20351  * @returns {number} Returns the converted number.
20352  * @example
20353  *
20354  * _.toFinite(3.2);
20355  * // => 3.2
20356  *
20357  * _.toFinite(Number.MIN_VALUE);
20358  * // => 5e-324
20359  *
20360  * _.toFinite(Infinity);
20361  * // => 1.7976931348623157e+308
20362  *
20363  * _.toFinite('3.2');
20364  * // => 3.2
20365  */
20366 function toFinite(value) {
20367   if (!value) {
20368     return value === 0 ? value : 0;
20369   }
20370   value = toNumber(value);
20371   if (value === INFINITY$2 || value === -INFINITY$2) {
20372     var sign = (value < 0 ? -1 : 1);
20373     return sign * MAX_INTEGER;
20374   }
20375   return value === value ? value : 0;
20376 }
20377
20378 /**
20379  * Converts `value` to an integer.
20380  *
20381  * **Note:** This method is loosely based on
20382  * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
20383  *
20384  * @static
20385  * @memberOf _
20386  * @since 4.0.0
20387  * @category Lang
20388  * @param {*} value The value to convert.
20389  * @returns {number} Returns the converted integer.
20390  * @example
20391  *
20392  * _.toInteger(3.2);
20393  * // => 3
20394  *
20395  * _.toInteger(Number.MIN_VALUE);
20396  * // => 0
20397  *
20398  * _.toInteger(Infinity);
20399  * // => 1.7976931348623157e+308
20400  *
20401  * _.toInteger('3.2');
20402  * // => 3
20403  */
20404 function toInteger(value) {
20405   var result = toFinite(value),
20406       remainder = result % 1;
20407
20408   return result === result ? (remainder ? result - remainder : result) : 0;
20409 }
20410
20411 /* Built-in method references for those with the same name as other `lodash` methods. */
20412 var nativeMax$1 = Math.max;
20413
20414 /**
20415  * This method is like `_.find` except that it returns the index of the first
20416  * element `predicate` returns truthy for instead of the element itself.
20417  *
20418  * @static
20419  * @memberOf _
20420  * @since 1.1.0
20421  * @category Array
20422  * @param {Array} array The array to inspect.
20423  * @param {Function} [predicate=_.identity] The function invoked per iteration.
20424  * @param {number} [fromIndex=0] The index to search from.
20425  * @returns {number} Returns the index of the found element, else `-1`.
20426  * @example
20427  *
20428  * var users = [
20429  *   { 'user': 'barney',  'active': false },
20430  *   { 'user': 'fred',    'active': false },
20431  *   { 'user': 'pebbles', 'active': true }
20432  * ];
20433  *
20434  * _.findIndex(users, function(o) { return o.user == 'barney'; });
20435  * // => 0
20436  *
20437  * // The `_.matches` iteratee shorthand.
20438  * _.findIndex(users, { 'user': 'fred', 'active': false });
20439  * // => 1
20440  *
20441  * // The `_.matchesProperty` iteratee shorthand.
20442  * _.findIndex(users, ['active', false]);
20443  * // => 0
20444  *
20445  * // The `_.property` iteratee shorthand.
20446  * _.findIndex(users, 'active');
20447  * // => 2
20448  */
20449 function findIndex(array, predicate, fromIndex) {
20450   var length = array == null ? 0 : array.length;
20451   if (!length) {
20452     return -1;
20453   }
20454   var index = fromIndex == null ? 0 : toInteger(fromIndex);
20455   if (index < 0) {
20456     index = nativeMax$1(length + index, 0);
20457   }
20458   return baseFindIndex(array, baseIteratee(predicate, 3), index);
20459 }
20460
20461 /**
20462  * Iterates over elements of `collection`, returning the first element
20463  * `predicate` returns truthy for. The predicate is invoked with three
20464  * arguments: (value, index|key, collection).
20465  *
20466  * @static
20467  * @memberOf _
20468  * @since 0.1.0
20469  * @category Collection
20470  * @param {Array|Object} collection The collection to inspect.
20471  * @param {Function} [predicate=_.identity] The function invoked per iteration.
20472  * @param {number} [fromIndex=0] The index to search from.
20473  * @returns {*} Returns the matched element, else `undefined`.
20474  * @example
20475  *
20476  * var users = [
20477  *   { 'user': 'barney',  'age': 36, 'active': true },
20478  *   { 'user': 'fred',    'age': 40, 'active': false },
20479  *   { 'user': 'pebbles', 'age': 1,  'active': true }
20480  * ];
20481  *
20482  * _.find(users, function(o) { return o.age < 40; });
20483  * // => object for 'barney'
20484  *
20485  * // The `_.matches` iteratee shorthand.
20486  * _.find(users, { 'age': 1, 'active': true });
20487  * // => object for 'pebbles'
20488  *
20489  * // The `_.matchesProperty` iteratee shorthand.
20490  * _.find(users, ['active', false]);
20491  * // => object for 'fred'
20492  *
20493  * // The `_.property` iteratee shorthand.
20494  * _.find(users, 'active');
20495  * // => object for 'barney'
20496  */
20497 var find$1 = createFind(findIndex);
20498
20499 /**
20500  * The base implementation of `_.map` without support for iteratee shorthands.
20501  *
20502  * @private
20503  * @param {Array|Object} collection The collection to iterate over.
20504  * @param {Function} iteratee The function invoked per iteration.
20505  * @returns {Array} Returns the new mapped array.
20506  */
20507 function baseMap(collection, iteratee) {
20508   var index = -1,
20509       result = isArrayLike(collection) ? Array(collection.length) : [];
20510
20511   baseEach(collection, function(value, key, collection) {
20512     result[++index] = iteratee(value, key, collection);
20513   });
20514   return result;
20515 }
20516
20517 /**
20518  * Creates an array of values by running each element in `collection` thru
20519  * `iteratee`. The iteratee is invoked with three arguments:
20520  * (value, index|key, collection).
20521  *
20522  * Many lodash methods are guarded to work as iteratees for methods like
20523  * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
20524  *
20525  * The guarded methods are:
20526  * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
20527  * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
20528  * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
20529  * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
20530  *
20531  * @static
20532  * @memberOf _
20533  * @since 0.1.0
20534  * @category Collection
20535  * @param {Array|Object} collection The collection to iterate over.
20536  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
20537  * @returns {Array} Returns the new mapped array.
20538  * @example
20539  *
20540  * function square(n) {
20541  *   return n * n;
20542  * }
20543  *
20544  * _.map([4, 8], square);
20545  * // => [16, 64]
20546  *
20547  * _.map({ 'a': 4, 'b': 8 }, square);
20548  * // => [16, 64] (iteration order is not guaranteed)
20549  *
20550  * var users = [
20551  *   { 'user': 'barney' },
20552  *   { 'user': 'fred' }
20553  * ];
20554  *
20555  * // The `_.property` iteratee shorthand.
20556  * _.map(users, 'user');
20557  * // => ['barney', 'fred']
20558  */
20559 function map$4(collection, iteratee) {
20560   var func = isArray(collection) ? arrayMap : baseMap;
20561   return func(collection, baseIteratee(iteratee, 3));
20562 }
20563
20564 /**
20565  * The base implementation of `_.values` and `_.valuesIn` which creates an
20566  * array of `object` property values corresponding to the property names
20567  * of `props`.
20568  *
20569  * @private
20570  * @param {Object} object The object to query.
20571  * @param {Array} props The property names to get values for.
20572  * @returns {Object} Returns the array of property values.
20573  */
20574 function baseValues(object, props) {
20575   return arrayMap(props, function(key) {
20576     return object[key];
20577   });
20578 }
20579
20580 /**
20581  * Creates an array of the own enumerable string keyed property values of `object`.
20582  *
20583  * **Note:** Non-object values are coerced to objects.
20584  *
20585  * @static
20586  * @since 0.1.0
20587  * @memberOf _
20588  * @category Object
20589  * @param {Object} object The object to query.
20590  * @returns {Array} Returns the array of property values.
20591  * @example
20592  *
20593  * function Foo() {
20594  *   this.a = 1;
20595  *   this.b = 2;
20596  * }
20597  *
20598  * Foo.prototype.c = 3;
20599  *
20600  * _.values(new Foo);
20601  * // => [1, 2] (iteration order is not guaranteed)
20602  *
20603  * _.values('hi');
20604  * // => ['h', 'i']
20605  */
20606 function values$1(object) {
20607   return object == null ? [] : baseValues(object, keys$1(object));
20608 }
20609
20610 /**
20611  * A specialized version of `_.forEach` for arrays without support for
20612  * iteratee shorthands.
20613  *
20614  * @private
20615  * @param {Array} [array] The array to iterate over.
20616  * @param {Function} iteratee The function invoked per iteration.
20617  * @returns {Array} Returns `array`.
20618  */
20619 function arrayEach(array, iteratee) {
20620   var index = -1,
20621       length = array == null ? 0 : array.length;
20622
20623   while (++index < length) {
20624     if (iteratee(array[index], index, array) === false) {
20625       break;
20626     }
20627   }
20628   return array;
20629 }
20630
20631 /**
20632  * The base implementation of `_.assign` without support for multiple sources
20633  * or `customizer` functions.
20634  *
20635  * @private
20636  * @param {Object} object The destination object.
20637  * @param {Object} source The source object.
20638  * @returns {Object} Returns `object`.
20639  */
20640 function baseAssign(object, source) {
20641   return object && copyObject(source, keys$1(source), object);
20642 }
20643
20644 /**
20645  * The base implementation of `_.assignIn` without support for multiple sources
20646  * or `customizer` functions.
20647  *
20648  * @private
20649  * @param {Object} object The destination object.
20650  * @param {Object} source The source object.
20651  * @returns {Object} Returns `object`.
20652  */
20653 function baseAssignIn(object, source) {
20654   return object && copyObject(source, keysIn$1(source), object);
20655 }
20656
20657 /** Detect free variable `exports`. */
20658 var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
20659
20660 /** Detect free variable `module`. */
20661 var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
20662
20663 /** Detect the popular CommonJS extension `module.exports`. */
20664 var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
20665
20666 /** Built-in value references. */
20667 var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined;
20668 var allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
20669
20670 /**
20671  * Creates a clone of  `buffer`.
20672  *
20673  * @private
20674  * @param {Buffer} buffer The buffer to clone.
20675  * @param {boolean} [isDeep] Specify a deep clone.
20676  * @returns {Buffer} Returns the cloned buffer.
20677  */
20678 function cloneBuffer(buffer, isDeep) {
20679   if (isDeep) {
20680     return buffer.slice();
20681   }
20682   var length = buffer.length,
20683       result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
20684
20685   buffer.copy(result);
20686   return result;
20687 }
20688
20689 /**
20690  * Copies the values of `source` to `array`.
20691  *
20692  * @private
20693  * @param {Array} source The array to copy values from.
20694  * @param {Array} [array=[]] The array to copy values to.
20695  * @returns {Array} Returns `array`.
20696  */
20697 function copyArray(source, array) {
20698   var index = -1,
20699       length = source.length;
20700
20701   array || (array = Array(length));
20702   while (++index < length) {
20703     array[index] = source[index];
20704   }
20705   return array;
20706 }
20707
20708 /**
20709  * Copies own symbols of `source` to `object`.
20710  *
20711  * @private
20712  * @param {Object} source The object to copy symbols from.
20713  * @param {Object} [object={}] The object to copy symbols to.
20714  * @returns {Object} Returns `object`.
20715  */
20716 function copySymbols(source, object) {
20717   return copyObject(source, getSymbols(source), object);
20718 }
20719
20720 /** Built-in value references. */
20721 var getPrototype = overArg(Object.getPrototypeOf, Object);
20722
20723 /* Built-in method references for those with the same name as other `lodash` methods. */
20724 var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
20725
20726 /**
20727  * Creates an array of the own and inherited enumerable symbols of `object`.
20728  *
20729  * @private
20730  * @param {Object} object The object to query.
20731  * @returns {Array} Returns the array of symbols.
20732  */
20733 var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
20734   var result = [];
20735   while (object) {
20736     arrayPush(result, getSymbols(object));
20737     object = getPrototype(object);
20738   }
20739   return result;
20740 };
20741
20742 /**
20743  * Copies own and inherited symbols of `source` to `object`.
20744  *
20745  * @private
20746  * @param {Object} source The object to copy symbols from.
20747  * @param {Object} [object={}] The object to copy symbols to.
20748  * @returns {Object} Returns `object`.
20749  */
20750 function copySymbolsIn(source, object) {
20751   return copyObject(source, getSymbolsIn(source), object);
20752 }
20753
20754 /**
20755  * Creates an array of own and inherited enumerable property names and
20756  * symbols of `object`.
20757  *
20758  * @private
20759  * @param {Object} object The object to query.
20760  * @returns {Array} Returns the array of property names and symbols.
20761  */
20762 function getAllKeysIn(object) {
20763   return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
20764 }
20765
20766 /** Used for built-in method references. */
20767 var objectProto$14 = Object.prototype;
20768
20769 /** Used to check objects for own properties. */
20770 var hasOwnProperty$11 = objectProto$14.hasOwnProperty;
20771
20772 /**
20773  * Initializes an array clone.
20774  *
20775  * @private
20776  * @param {Array} array The array to clone.
20777  * @returns {Array} Returns the initialized clone.
20778  */
20779 function initCloneArray(array) {
20780   var length = array.length,
20781       result = array.constructor(length);
20782
20783   // Add properties assigned by `RegExp#exec`.
20784   if (length && typeof array[0] == 'string' && hasOwnProperty$11.call(array, 'index')) {
20785     result.index = array.index;
20786     result.input = array.input;
20787   }
20788   return result;
20789 }
20790
20791 /**
20792  * Creates a clone of `arrayBuffer`.
20793  *
20794  * @private
20795  * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
20796  * @returns {ArrayBuffer} Returns the cloned array buffer.
20797  */
20798 function cloneArrayBuffer(arrayBuffer) {
20799   var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
20800   new Uint8Array(result).set(new Uint8Array(arrayBuffer));
20801   return result;
20802 }
20803
20804 /**
20805  * Creates a clone of `dataView`.
20806  *
20807  * @private
20808  * @param {Object} dataView The data view to clone.
20809  * @param {boolean} [isDeep] Specify a deep clone.
20810  * @returns {Object} Returns the cloned data view.
20811  */
20812 function cloneDataView(dataView, isDeep) {
20813   var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
20814   return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
20815 }
20816
20817 /**
20818  * Adds the key-value `pair` to `map`.
20819  *
20820  * @private
20821  * @param {Object} map The map to modify.
20822  * @param {Array} pair The key-value pair to add.
20823  * @returns {Object} Returns `map`.
20824  */
20825 function addMapEntry(map, pair) {
20826   // Don't return `map.set` because it's not chainable in IE 11.
20827   map.set(pair[0], pair[1]);
20828   return map;
20829 }
20830
20831 /**
20832  * A specialized version of `_.reduce` for arrays without support for
20833  * iteratee shorthands.
20834  *
20835  * @private
20836  * @param {Array} [array] The array to iterate over.
20837  * @param {Function} iteratee The function invoked per iteration.
20838  * @param {*} [accumulator] The initial value.
20839  * @param {boolean} [initAccum] Specify using the first element of `array` as
20840  *  the initial value.
20841  * @returns {*} Returns the accumulated value.
20842  */
20843 function arrayReduce(array, iteratee, accumulator, initAccum) {
20844   var index = -1,
20845       length = array == null ? 0 : array.length;
20846
20847   if (initAccum && length) {
20848     accumulator = array[++index];
20849   }
20850   while (++index < length) {
20851     accumulator = iteratee(accumulator, array[index], index, array);
20852   }
20853   return accumulator;
20854 }
20855
20856 /** Used to compose bitmasks for cloning. */
20857 var CLONE_DEEP_FLAG$1 = 1;
20858
20859 /**
20860  * Creates a clone of `map`.
20861  *
20862  * @private
20863  * @param {Object} map The map to clone.
20864  * @param {Function} cloneFunc The function to clone values.
20865  * @param {boolean} [isDeep] Specify a deep clone.
20866  * @returns {Object} Returns the cloned map.
20867  */
20868 function cloneMap(map, isDeep, cloneFunc) {
20869   var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG$1) : mapToArray(map);
20870   return arrayReduce(array, addMapEntry, new map.constructor);
20871 }
20872
20873 /** Used to match `RegExp` flags from their coerced string values. */
20874 var reFlags = /\w*$/;
20875
20876 /**
20877  * Creates a clone of `regexp`.
20878  *
20879  * @private
20880  * @param {Object} regexp The regexp to clone.
20881  * @returns {Object} Returns the cloned regexp.
20882  */
20883 function cloneRegExp(regexp) {
20884   var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
20885   result.lastIndex = regexp.lastIndex;
20886   return result;
20887 }
20888
20889 /**
20890  * Adds `value` to `set`.
20891  *
20892  * @private
20893  * @param {Object} set The set to modify.
20894  * @param {*} value The value to add.
20895  * @returns {Object} Returns `set`.
20896  */
20897 function addSetEntry(set, value) {
20898   // Don't return `set.add` because it's not chainable in IE 11.
20899   set.add(value);
20900   return set;
20901 }
20902
20903 /** Used to compose bitmasks for cloning. */
20904 var CLONE_DEEP_FLAG$2 = 1;
20905
20906 /**
20907  * Creates a clone of `set`.
20908  *
20909  * @private
20910  * @param {Object} set The set to clone.
20911  * @param {Function} cloneFunc The function to clone values.
20912  * @param {boolean} [isDeep] Specify a deep clone.
20913  * @returns {Object} Returns the cloned set.
20914  */
20915 function cloneSet(set, isDeep, cloneFunc) {
20916   var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG$2) : setToArray(set);
20917   return arrayReduce(array, addSetEntry, new set.constructor);
20918 }
20919
20920 /** Used to convert symbols to primitives and strings. */
20921 var symbolProto$2 = Symbol ? Symbol.prototype : undefined;
20922 var symbolValueOf$1 = symbolProto$2 ? symbolProto$2.valueOf : undefined;
20923
20924 /**
20925  * Creates a clone of the `symbol` object.
20926  *
20927  * @private
20928  * @param {Object} symbol The symbol object to clone.
20929  * @returns {Object} Returns the cloned symbol object.
20930  */
20931 function cloneSymbol(symbol) {
20932   return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {};
20933 }
20934
20935 /**
20936  * Creates a clone of `typedArray`.
20937  *
20938  * @private
20939  * @param {Object} typedArray The typed array to clone.
20940  * @param {boolean} [isDeep] Specify a deep clone.
20941  * @returns {Object} Returns the cloned typed array.
20942  */
20943 function cloneTypedArray(typedArray, isDeep) {
20944   var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
20945   return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
20946 }
20947
20948 /** `Object#toString` result references. */
20949 var boolTag$3 = '[object Boolean]';
20950 var dateTag$3 = '[object Date]';
20951 var mapTag$4 = '[object Map]';
20952 var numberTag$3 = '[object Number]';
20953 var regexpTag$3 = '[object RegExp]';
20954 var setTag$4 = '[object Set]';
20955 var stringTag$3 = '[object String]';
20956 var symbolTag$3 = '[object Symbol]';
20957
20958 var arrayBufferTag$3 = '[object ArrayBuffer]';
20959 var dataViewTag$4 = '[object DataView]';
20960 var float32Tag$2 = '[object Float32Array]';
20961 var float64Tag$2 = '[object Float64Array]';
20962 var int8Tag$2 = '[object Int8Array]';
20963 var int16Tag$2 = '[object Int16Array]';
20964 var int32Tag$2 = '[object Int32Array]';
20965 var uint8Tag$2 = '[object Uint8Array]';
20966 var uint8ClampedTag$2 = '[object Uint8ClampedArray]';
20967 var uint16Tag$2 = '[object Uint16Array]';
20968 var uint32Tag$2 = '[object Uint32Array]';
20969
20970 /**
20971  * Initializes an object clone based on its `toStringTag`.
20972  *
20973  * **Note:** This function only supports cloning values with tags of
20974  * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
20975  *
20976  * @private
20977  * @param {Object} object The object to clone.
20978  * @param {string} tag The `toStringTag` of the object to clone.
20979  * @param {Function} cloneFunc The function to clone values.
20980  * @param {boolean} [isDeep] Specify a deep clone.
20981  * @returns {Object} Returns the initialized clone.
20982  */
20983 function initCloneByTag(object, tag, cloneFunc, isDeep) {
20984   var Ctor = object.constructor;
20985   switch (tag) {
20986     case arrayBufferTag$3:
20987       return cloneArrayBuffer(object);
20988
20989     case boolTag$3:
20990     case dateTag$3:
20991       return new Ctor(+object);
20992
20993     case dataViewTag$4:
20994       return cloneDataView(object, isDeep);
20995
20996     case float32Tag$2: case float64Tag$2:
20997     case int8Tag$2: case int16Tag$2: case int32Tag$2:
20998     case uint8Tag$2: case uint8ClampedTag$2: case uint16Tag$2: case uint32Tag$2:
20999       return cloneTypedArray(object, isDeep);
21000
21001     case mapTag$4:
21002       return cloneMap(object, isDeep, cloneFunc);
21003
21004     case numberTag$3:
21005     case stringTag$3:
21006       return new Ctor(object);
21007
21008     case regexpTag$3:
21009       return cloneRegExp(object);
21010
21011     case setTag$4:
21012       return cloneSet(object, isDeep, cloneFunc);
21013
21014     case symbolTag$3:
21015       return cloneSymbol(object);
21016   }
21017 }
21018
21019 /** Built-in value references. */
21020 var objectCreate = Object.create;
21021
21022 /**
21023  * The base implementation of `_.create` without support for assigning
21024  * properties to the created object.
21025  *
21026  * @private
21027  * @param {Object} proto The object to inherit from.
21028  * @returns {Object} Returns the new object.
21029  */
21030 var baseCreate = (function() {
21031   function object() {}
21032   return function(proto) {
21033     if (!isObject(proto)) {
21034       return {};
21035     }
21036     if (objectCreate) {
21037       return objectCreate(proto);
21038     }
21039     object.prototype = proto;
21040     var result = new object;
21041     object.prototype = undefined;
21042     return result;
21043   };
21044 }());
21045
21046 /**
21047  * Initializes an object clone.
21048  *
21049  * @private
21050  * @param {Object} object The object to clone.
21051  * @returns {Object} Returns the initialized clone.
21052  */
21053 function initCloneObject(object) {
21054   return (typeof object.constructor == 'function' && !isPrototype(object))
21055     ? baseCreate(getPrototype(object))
21056     : {};
21057 }
21058
21059 /** Used to compose bitmasks for cloning. */
21060 var CLONE_DEEP_FLAG = 1;
21061 var CLONE_FLAT_FLAG = 2;
21062 var CLONE_SYMBOLS_FLAG$1 = 4;
21063
21064 /** `Object#toString` result references. */
21065 var argsTag$3 = '[object Arguments]';
21066 var arrayTag$2 = '[object Array]';
21067 var boolTag$2 = '[object Boolean]';
21068 var dateTag$2 = '[object Date]';
21069 var errorTag$2 = '[object Error]';
21070 var funcTag$2 = '[object Function]';
21071 var genTag$1 = '[object GeneratorFunction]';
21072 var mapTag$3 = '[object Map]';
21073 var numberTag$2 = '[object Number]';
21074 var objectTag$3 = '[object Object]';
21075 var regexpTag$2 = '[object RegExp]';
21076 var setTag$3 = '[object Set]';
21077 var stringTag$2 = '[object String]';
21078 var symbolTag$2 = '[object Symbol]';
21079 var weakMapTag$2 = '[object WeakMap]';
21080
21081 var arrayBufferTag$2 = '[object ArrayBuffer]';
21082 var dataViewTag$3 = '[object DataView]';
21083 var float32Tag$1 = '[object Float32Array]';
21084 var float64Tag$1 = '[object Float64Array]';
21085 var int8Tag$1 = '[object Int8Array]';
21086 var int16Tag$1 = '[object Int16Array]';
21087 var int32Tag$1 = '[object Int32Array]';
21088 var uint8Tag$1 = '[object Uint8Array]';
21089 var uint8ClampedTag$1 = '[object Uint8ClampedArray]';
21090 var uint16Tag$1 = '[object Uint16Array]';
21091 var uint32Tag$1 = '[object Uint32Array]';
21092
21093 /** Used to identify `toStringTag` values supported by `_.clone`. */
21094 var cloneableTags = {};
21095 cloneableTags[argsTag$3] = cloneableTags[arrayTag$2] =
21096 cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
21097 cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
21098 cloneableTags[float32Tag$1] = cloneableTags[float64Tag$1] =
21099 cloneableTags[int8Tag$1] = cloneableTags[int16Tag$1] =
21100 cloneableTags[int32Tag$1] = cloneableTags[mapTag$3] =
21101 cloneableTags[numberTag$2] = cloneableTags[objectTag$3] =
21102 cloneableTags[regexpTag$2] = cloneableTags[setTag$3] =
21103 cloneableTags[stringTag$2] = cloneableTags[symbolTag$2] =
21104 cloneableTags[uint8Tag$1] = cloneableTags[uint8ClampedTag$1] =
21105 cloneableTags[uint16Tag$1] = cloneableTags[uint32Tag$1] = true;
21106 cloneableTags[errorTag$2] = cloneableTags[funcTag$2] =
21107 cloneableTags[weakMapTag$2] = false;
21108
21109 /**
21110  * The base implementation of `_.clone` and `_.cloneDeep` which tracks
21111  * traversed objects.
21112  *
21113  * @private
21114  * @param {*} value The value to clone.
21115  * @param {boolean} bitmask The bitmask flags.
21116  *  1 - Deep clone
21117  *  2 - Flatten inherited properties
21118  *  4 - Clone symbols
21119  * @param {Function} [customizer] The function to customize cloning.
21120  * @param {string} [key] The key of `value`.
21121  * @param {Object} [object] The parent object of `value`.
21122  * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
21123  * @returns {*} Returns the cloned value.
21124  */
21125 function baseClone(value, bitmask, customizer, key, object, stack) {
21126   var result,
21127       isDeep = bitmask & CLONE_DEEP_FLAG,
21128       isFlat = bitmask & CLONE_FLAT_FLAG,
21129       isFull = bitmask & CLONE_SYMBOLS_FLAG$1;
21130
21131   if (customizer) {
21132     result = object ? customizer(value, key, object, stack) : customizer(value);
21133   }
21134   if (result !== undefined) {
21135     return result;
21136   }
21137   if (!isObject(value)) {
21138     return value;
21139   }
21140   var isArr = isArray(value);
21141   if (isArr) {
21142     result = initCloneArray(value);
21143     if (!isDeep) {
21144       return copyArray(value, result);
21145     }
21146   } else {
21147     var tag = getTag$1(value),
21148         isFunc = tag == funcTag$2 || tag == genTag$1;
21149
21150     if (isBuffer(value)) {
21151       return cloneBuffer(value, isDeep);
21152     }
21153     if (tag == objectTag$3 || tag == argsTag$3 || (isFunc && !object)) {
21154       result = (isFlat || isFunc) ? {} : initCloneObject(value);
21155       if (!isDeep) {
21156         return isFlat
21157           ? copySymbolsIn(value, baseAssignIn(result, value))
21158           : copySymbols(value, baseAssign(result, value));
21159       }
21160     } else {
21161       if (!cloneableTags[tag]) {
21162         return object ? value : {};
21163       }
21164       result = initCloneByTag(value, tag, baseClone, isDeep);
21165     }
21166   }
21167   // Check for circular references and return its corresponding clone.
21168   stack || (stack = new Stack);
21169   var stacked = stack.get(value);
21170   if (stacked) {
21171     return stacked;
21172   }
21173   stack.set(value, result);
21174
21175   var keysFunc = isFull
21176     ? (isFlat ? getAllKeysIn : getAllKeys)
21177     : (isFlat ? keysIn : keys$1);
21178
21179   var props = isArr ? undefined : keysFunc(value);
21180   arrayEach(props || value, function(subValue, key) {
21181     if (props) {
21182       key = subValue;
21183       subValue = value[key];
21184     }
21185     // Recursively populate clone (susceptible to call stack limits).
21186     assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
21187   });
21188   return result;
21189 }
21190
21191 /** Used to compose bitmasks for cloning. */
21192 var CLONE_SYMBOLS_FLAG = 4;
21193
21194 /**
21195  * Creates a shallow clone of `value`.
21196  *
21197  * **Note:** This method is loosely based on the
21198  * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
21199  * and supports cloning arrays, array buffers, booleans, date objects, maps,
21200  * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
21201  * arrays. The own enumerable properties of `arguments` objects are cloned
21202  * as plain objects. An empty object is returned for uncloneable values such
21203  * as error objects, functions, DOM nodes, and WeakMaps.
21204  *
21205  * @static
21206  * @memberOf _
21207  * @since 0.1.0
21208  * @category Lang
21209  * @param {*} value The value to clone.
21210  * @returns {*} Returns the cloned value.
21211  * @see _.cloneDeep
21212  * @example
21213  *
21214  * var objects = [{ 'a': 1 }, { 'b': 2 }];
21215  *
21216  * var shallow = _.clone(objects);
21217  * console.log(shallow[0] === objects[0]);
21218  * // => true
21219  */
21220 function clone(value) {
21221   return baseClone(value, CLONE_SYMBOLS_FLAG);
21222 }
21223
21224 /**
21225  * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21226  * of key-value pairs for `object` corresponding to the property names of `props`.
21227  *
21228  * @private
21229  * @param {Object} object The object to query.
21230  * @param {Array} props The property names to get values for.
21231  * @returns {Object} Returns the key-value pairs.
21232  */
21233 function baseToPairs(object, props) {
21234   return arrayMap(props, function(key) {
21235     return [key, object[key]];
21236   });
21237 }
21238
21239 /**
21240  * Converts `set` to its value-value pairs.
21241  *
21242  * @private
21243  * @param {Object} set The set to convert.
21244  * @returns {Array} Returns the value-value pairs.
21245  */
21246 function setToPairs(set) {
21247   var index = -1,
21248       result = Array(set.size);
21249
21250   set.forEach(function(value) {
21251     result[++index] = [value, value];
21252   });
21253   return result;
21254 }
21255
21256 /** `Object#toString` result references. */
21257 var mapTag$5 = '[object Map]';
21258 var setTag$5 = '[object Set]';
21259
21260 /**
21261  * Creates a `_.toPairs` or `_.toPairsIn` function.
21262  *
21263  * @private
21264  * @param {Function} keysFunc The function to get the keys of a given object.
21265  * @returns {Function} Returns the new pairs function.
21266  */
21267 function createToPairs(keysFunc) {
21268   return function(object) {
21269     var tag = getTag$1(object);
21270     if (tag == mapTag$5) {
21271       return mapToArray(object);
21272     }
21273     if (tag == setTag$5) {
21274       return setToPairs(object);
21275     }
21276     return baseToPairs(object, keysFunc(object));
21277   };
21278 }
21279
21280 /**
21281  * Creates an array of own enumerable string keyed-value pairs for `object`
21282  * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21283  * entries are returned.
21284  *
21285  * @static
21286  * @memberOf _
21287  * @since 4.0.0
21288  * @alias entries
21289  * @category Object
21290  * @param {Object} object The object to query.
21291  * @returns {Array} Returns the key-value pairs.
21292  * @example
21293  *
21294  * function Foo() {
21295  *   this.a = 1;
21296  *   this.b = 2;
21297  * }
21298  *
21299  * Foo.prototype.c = 3;
21300  *
21301  * _.toPairs(new Foo);
21302  * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21303  */
21304 var toPairs = createToPairs(keys$1);
21305
21306 /** Built-in value references. */
21307 var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
21308
21309 /**
21310  * Checks if `value` is a flattenable `arguments` object or array.
21311  *
21312  * @private
21313  * @param {*} value The value to check.
21314  * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
21315  */
21316 function isFlattenable(value) {
21317   return isArray(value) || isArguments(value) ||
21318     !!(spreadableSymbol && value && value[spreadableSymbol]);
21319 }
21320
21321 /**
21322  * The base implementation of `_.flatten` with support for restricting flattening.
21323  *
21324  * @private
21325  * @param {Array} array The array to flatten.
21326  * @param {number} depth The maximum recursion depth.
21327  * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
21328  * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
21329  * @param {Array} [result=[]] The initial result value.
21330  * @returns {Array} Returns the new flattened array.
21331  */
21332 function baseFlatten(array, depth, predicate, isStrict, result) {
21333   var index = -1,
21334       length = array.length;
21335
21336   predicate || (predicate = isFlattenable);
21337   result || (result = []);
21338
21339   while (++index < length) {
21340     var value = array[index];
21341     if (depth > 0 && predicate(value)) {
21342       if (depth > 1) {
21343         // Recursively flatten arrays (susceptible to call stack limits).
21344         baseFlatten(value, depth - 1, predicate, isStrict, result);
21345       } else {
21346         arrayPush(result, value);
21347       }
21348     } else if (!isStrict) {
21349       result[result.length] = value;
21350     }
21351   }
21352   return result;
21353 }
21354
21355 /**
21356  * The base implementation of `_.isNaN` without support for number objects.
21357  *
21358  * @private
21359  * @param {*} value The value to check.
21360  * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21361  */
21362 function baseIsNaN(value) {
21363   return value !== value;
21364 }
21365
21366 /**
21367  * A specialized version of `_.indexOf` which performs strict equality
21368  * comparisons of values, i.e. `===`.
21369  *
21370  * @private
21371  * @param {Array} array The array to inspect.
21372  * @param {*} value The value to search for.
21373  * @param {number} fromIndex The index to search from.
21374  * @returns {number} Returns the index of the matched value, else `-1`.
21375  */
21376 function strictIndexOf(array, value, fromIndex) {
21377   var index = fromIndex - 1,
21378       length = array.length;
21379
21380   while (++index < length) {
21381     if (array[index] === value) {
21382       return index;
21383     }
21384   }
21385   return -1;
21386 }
21387
21388 /**
21389  * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21390  *
21391  * @private
21392  * @param {Array} array The array to inspect.
21393  * @param {*} value The value to search for.
21394  * @param {number} fromIndex The index to search from.
21395  * @returns {number} Returns the index of the matched value, else `-1`.
21396  */
21397 function baseIndexOf(array, value, fromIndex) {
21398   return value === value
21399     ? strictIndexOf(array, value, fromIndex)
21400     : baseFindIndex(array, baseIsNaN, fromIndex);
21401 }
21402
21403 /**
21404  * A specialized version of `_.includes` for arrays without support for
21405  * specifying an index to search from.
21406  *
21407  * @private
21408  * @param {Array} [array] The array to inspect.
21409  * @param {*} target The value to search for.
21410  * @returns {boolean} Returns `true` if `target` is found, else `false`.
21411  */
21412 function arrayIncludes(array, value) {
21413   var length = array == null ? 0 : array.length;
21414   return !!length && baseIndexOf(array, value, 0) > -1;
21415 }
21416
21417 /**
21418  * This function is like `arrayIncludes` except that it accepts a comparator.
21419  *
21420  * @private
21421  * @param {Array} [array] The array to inspect.
21422  * @param {*} target The value to search for.
21423  * @param {Function} comparator The comparator invoked per element.
21424  * @returns {boolean} Returns `true` if `target` is found, else `false`.
21425  */
21426 function arrayIncludesWith(array, value, comparator) {
21427   var index = -1,
21428       length = array == null ? 0 : array.length;
21429
21430   while (++index < length) {
21431     if (comparator(value, array[index])) {
21432       return true;
21433     }
21434   }
21435   return false;
21436 }
21437
21438 /**
21439  * This method returns `undefined`.
21440  *
21441  * @static
21442  * @memberOf _
21443  * @since 2.3.0
21444  * @category Util
21445  * @example
21446  *
21447  * _.times(2, _.noop);
21448  * // => [undefined, undefined]
21449  */
21450 function noop$3() {
21451   // No operation performed.
21452 }
21453
21454 /** Used as references for various `Number` constants. */
21455 var INFINITY$3 = 1 / 0;
21456
21457 /**
21458  * Creates a set object of `values`.
21459  *
21460  * @private
21461  * @param {Array} values The values to add to the set.
21462  * @returns {Object} Returns the new set.
21463  */
21464 var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21465   return new Set$1(values);
21466 };
21467
21468 /** Used as the size to enable large array optimizations. */
21469 var LARGE_ARRAY_SIZE$1 = 200;
21470
21471 /**
21472  * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21473  *
21474  * @private
21475  * @param {Array} array The array to inspect.
21476  * @param {Function} [iteratee] The iteratee invoked per element.
21477  * @param {Function} [comparator] The comparator invoked per element.
21478  * @returns {Array} Returns the new duplicate free array.
21479  */
21480 function baseUniq(array, iteratee, comparator) {
21481   var index = -1,
21482       includes = arrayIncludes,
21483       length = array.length,
21484       isCommon = true,
21485       result = [],
21486       seen = result;
21487
21488   if (comparator) {
21489     isCommon = false;
21490     includes = arrayIncludesWith;
21491   }
21492   else if (length >= LARGE_ARRAY_SIZE$1) {
21493     var set = iteratee ? null : createSet(array);
21494     if (set) {
21495       return setToArray(set);
21496     }
21497     isCommon = false;
21498     includes = cacheHas;
21499     seen = new SetCache;
21500   }
21501   else {
21502     seen = iteratee ? [] : result;
21503   }
21504   outer:
21505   while (++index < length) {
21506     var value = array[index],
21507         computed = iteratee ? iteratee(value) : value;
21508
21509     value = (comparator || value !== 0) ? value : 0;
21510     if (isCommon && computed === computed) {
21511       var seenIndex = seen.length;
21512       while (seenIndex--) {
21513         if (seen[seenIndex] === computed) {
21514           continue outer;
21515         }
21516       }
21517       if (iteratee) {
21518         seen.push(computed);
21519       }
21520       result.push(value);
21521     }
21522     else if (!includes(seen, computed, comparator)) {
21523       if (seen !== result) {
21524         seen.push(computed);
21525       }
21526       result.push(value);
21527     }
21528   }
21529   return result;
21530 }
21531
21532 /**
21533  * This method is like `_.isArrayLike` except that it also checks if `value`
21534  * is an object.
21535  *
21536  * @static
21537  * @memberOf _
21538  * @since 4.0.0
21539  * @category Lang
21540  * @param {*} value The value to check.
21541  * @returns {boolean} Returns `true` if `value` is an array-like object,
21542  *  else `false`.
21543  * @example
21544  *
21545  * _.isArrayLikeObject([1, 2, 3]);
21546  * // => true
21547  *
21548  * _.isArrayLikeObject(document.body.children);
21549  * // => true
21550  *
21551  * _.isArrayLikeObject('abc');
21552  * // => false
21553  *
21554  * _.isArrayLikeObject(_.noop);
21555  * // => false
21556  */
21557 function isArrayLikeObject(value) {
21558   return isObjectLike(value) && isArrayLike(value);
21559 }
21560
21561 /**
21562  * Creates an array of unique values, in order, from all given arrays using
21563  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21564  * for equality comparisons.
21565  *
21566  * @static
21567  * @memberOf _
21568  * @since 0.1.0
21569  * @category Array
21570  * @param {...Array} [arrays] The arrays to inspect.
21571  * @returns {Array} Returns the new array of combined values.
21572  * @example
21573  *
21574  * _.union([2], [1, 2]);
21575  * // => [2, 1]
21576  */
21577 var union = baseRest(function(arrays) {
21578   return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
21579 });
21580
21581 /** Used as the size to enable large array optimizations. */
21582 var LARGE_ARRAY_SIZE$2 = 200;
21583
21584 /**
21585  * The base implementation of methods like `_.difference` without support
21586  * for excluding multiple arrays or iteratee shorthands.
21587  *
21588  * @private
21589  * @param {Array} array The array to inspect.
21590  * @param {Array} values The values to exclude.
21591  * @param {Function} [iteratee] The iteratee invoked per element.
21592  * @param {Function} [comparator] The comparator invoked per element.
21593  * @returns {Array} Returns the new array of filtered values.
21594  */
21595 function baseDifference(array, values, iteratee, comparator) {
21596   var index = -1,
21597       includes = arrayIncludes,
21598       isCommon = true,
21599       length = array.length,
21600       result = [],
21601       valuesLength = values.length;
21602
21603   if (!length) {
21604     return result;
21605   }
21606   if (iteratee) {
21607     values = arrayMap(values, baseUnary(iteratee));
21608   }
21609   if (comparator) {
21610     includes = arrayIncludesWith;
21611     isCommon = false;
21612   }
21613   else if (values.length >= LARGE_ARRAY_SIZE$2) {
21614     includes = cacheHas;
21615     isCommon = false;
21616     values = new SetCache(values);
21617   }
21618   outer:
21619   while (++index < length) {
21620     var value = array[index],
21621         computed = iteratee == null ? value : iteratee(value);
21622
21623     value = (comparator || value !== 0) ? value : 0;
21624     if (isCommon && computed === computed) {
21625       var valuesIndex = valuesLength;
21626       while (valuesIndex--) {
21627         if (values[valuesIndex] === computed) {
21628           continue outer;
21629         }
21630       }
21631       result.push(value);
21632     }
21633     else if (!includes(values, computed, comparator)) {
21634       result.push(value);
21635     }
21636   }
21637   return result;
21638 }
21639
21640 /**
21641  * Creates an array excluding all given values using
21642  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21643  * for equality comparisons.
21644  *
21645  * **Note:** Unlike `_.pull`, this method returns a new array.
21646  *
21647  * @static
21648  * @memberOf _
21649  * @since 0.1.0
21650  * @category Array
21651  * @param {Array} array The array to inspect.
21652  * @param {...*} [values] The values to exclude.
21653  * @returns {Array} Returns the new array of filtered values.
21654  * @see _.difference, _.xor
21655  * @example
21656  *
21657  * _.without([2, 1, 2, 3], 1, 2);
21658  * // => [3]
21659  */
21660 var without = baseRest(function(array, values) {
21661   return isArrayLikeObject(array)
21662     ? baseDifference(array, values)
21663     : [];
21664 });
21665
21666 function osmIsInterestingTag(key) {
21667     return key !== 'attribution' &&
21668         key !== 'created_by' &&
21669         key !== 'source' &&
21670         key !== 'odbl' &&
21671         key.indexOf('tiger:') !== 0;
21672
21673 }
21674
21675
21676 var osmOneWayTags = {
21677     'aerialway': {
21678         'chair_lift': true,
21679         'mixed_lift': true,
21680         't-bar': true,
21681         'j-bar': true,
21682         'platter': true,
21683         'rope_tow': true,
21684         'magic_carpet': true,
21685         'yes': true
21686     },
21687     'highway': {
21688         'motorway': true,
21689         'motorway_link': true
21690     },
21691     'junction': {
21692         'roundabout': true
21693     },
21694     'man_made': {
21695         'piste:halfpipe': true
21696     },
21697     'piste:type': {
21698         'downhill': true,
21699         'sled': true,
21700         'yes': true
21701     },
21702     'waterway': {
21703         'canal': true,
21704         'ditch': true,
21705         'drain': true,
21706         'river': true,
21707         'stream': true
21708     }
21709 };
21710
21711
21712 var osmPavedTags = {
21713     'surface': {
21714         'paved': true,
21715         'asphalt': true,
21716         'concrete': true,
21717         'concrete:lanes': true,
21718         'concrete:plates': true
21719     },
21720     'tracktype': {
21721         'grade1': true
21722     }
21723 };
21724
21725 var dataWikipedia = [
21726     [
21727         "Abkhazian",
21728         "Аҧсшәа",
21729         "ab"
21730     ],
21731     [
21732         "Achinese",
21733         "Acèh",
21734         "ace"
21735     ],
21736     [
21737         "Adyghe",
21738         "адыгабзэ",
21739         "ady"
21740     ],
21741     [
21742         "Afrikaans",
21743         "Afrikaans",
21744         "af"
21745     ],
21746     [
21747         "Akan",
21748         "Akan",
21749         "ak"
21750     ],
21751     [
21752         "Alemannisch",
21753         "Alemannisch",
21754         "als"
21755     ],
21756     [
21757         "Amharic",
21758         "አማርኛ",
21759         "am"
21760     ],
21761     [
21762         "Aragonese",
21763         "aragonés",
21764         "an"
21765     ],
21766     [
21767         "Old English",
21768         "Ænglisc",
21769         "ang"
21770     ],
21771     [
21772         "Arabic",
21773         "العربية",
21774         "ar"
21775     ],
21776     [
21777         "Aramaic",
21778         "ܐܪܡܝܐ",
21779         "arc"
21780     ],
21781     [
21782         "Egyptian Arabic",
21783         "مصرى",
21784         "arz"
21785     ],
21786     [
21787         "Assamese",
21788         "অসমীয়া",
21789         "as"
21790     ],
21791     [
21792         "Asturian",
21793         "asturianu",
21794         "ast"
21795     ],
21796     [
21797         "Avaric",
21798         "авар",
21799         "av"
21800     ],
21801     [
21802         "Aymara",
21803         "Aymar aru",
21804         "ay"
21805     ],
21806     [
21807         "Azerbaijani",
21808         "azərbaycanca",
21809         "az"
21810     ],
21811     [
21812         "تۆرکجه",
21813         "تۆرکجه",
21814         "azb"
21815     ],
21816     [
21817         "Bashkir",
21818         "башҡортса",
21819         "ba"
21820     ],
21821     [
21822         "Bavarian",
21823         "Boarisch",
21824         "bar"
21825     ],
21826     [
21827         "Samogitian",
21828         "žemaitėška",
21829         "bat-smg"
21830     ],
21831     [
21832         "Bikol Central",
21833         "Bikol Central",
21834         "bcl"
21835     ],
21836     [
21837         "Belarusian",
21838         "беларуская",
21839         "be"
21840     ],
21841     [
21842         "беларуская (тарашкевіца)‎",
21843         "беларуская (тарашкевіца)‎",
21844         "be-x-old"
21845     ],
21846     [
21847         "Bulgarian",
21848         "български",
21849         "bg"
21850     ],
21851     [
21852         "भोजपुरी",
21853         "भोजपुरी",
21854         "bh"
21855     ],
21856     [
21857         "Bislama",
21858         "Bislama",
21859         "bi"
21860     ],
21861     [
21862         "Banjar",
21863         "Bahasa Banjar",
21864         "bjn"
21865     ],
21866     [
21867         "Bambara",
21868         "bamanankan",
21869         "bm"
21870     ],
21871     [
21872         "Bangla",
21873         "বাংলা",
21874         "bn"
21875     ],
21876     [
21877         "Tibetan",
21878         "བོད་ཡིག",
21879         "bo"
21880     ],
21881     [
21882         "Bishnupriya",
21883         "বিষ্ণুপ্রিয়া মণিপুরী",
21884         "bpy"
21885     ],
21886     [
21887         "Breton",
21888         "brezhoneg",
21889         "br"
21890     ],
21891     [
21892         "Bosnian",
21893         "bosanski",
21894         "bs"
21895     ],
21896     [
21897         "Buginese",
21898         "ᨅᨔ ᨕᨘᨁᨗ",
21899         "bug"
21900     ],
21901     [
21902         "буряад",
21903         "буряад",
21904         "bxr"
21905     ],
21906     [
21907         "Catalan",
21908         "català",
21909         "ca"
21910     ],
21911     [
21912         "Chavacano de Zamboanga",
21913         "Chavacano de Zamboanga",
21914         "cbk-zam"
21915     ],
21916     [
21917         "Min Dong Chinese",
21918         "Mìng-dĕ̤ng-ngṳ̄",
21919         "cdo"
21920     ],
21921     [
21922         "Chechen",
21923         "нохчийн",
21924         "ce"
21925     ],
21926     [
21927         "Cebuano",
21928         "Cebuano",
21929         "ceb"
21930     ],
21931     [
21932         "Chamorro",
21933         "Chamoru",
21934         "ch"
21935     ],
21936     [
21937         "Cherokee",
21938         "ᏣᎳᎩ",
21939         "chr"
21940     ],
21941     [
21942         "Cheyenne",
21943         "Tsetsêhestâhese",
21944         "chy"
21945     ],
21946     [
21947         "Central Kurdish",
21948         "کوردیی ناوەندی",
21949         "ckb"
21950     ],
21951     [
21952         "Corsican",
21953         "corsu",
21954         "co"
21955     ],
21956     [
21957         "Cree",
21958         "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
21959         "cr"
21960     ],
21961     [
21962         "Crimean Turkish",
21963         "qırımtatarca",
21964         "crh"
21965     ],
21966     [
21967         "Czech",
21968         "čeština",
21969         "cs"
21970     ],
21971     [
21972         "Kashubian",
21973         "kaszëbsczi",
21974         "csb"
21975     ],
21976     [
21977         "Church Slavic",
21978         "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
21979         "cu"
21980     ],
21981     [
21982         "Chuvash",
21983         "Чӑвашла",
21984         "cv"
21985     ],
21986     [
21987         "Welsh",
21988         "Cymraeg",
21989         "cy"
21990     ],
21991     [
21992         "Danish",
21993         "dansk",
21994         "da"
21995     ],
21996     [
21997         "German",
21998         "Deutsch",
21999         "de"
22000     ],
22001     [
22002         "Zazaki",
22003         "Zazaki",
22004         "diq"
22005     ],
22006     [
22007         "Lower Sorbian",
22008         "dolnoserbski",
22009         "dsb"
22010     ],
22011     [
22012         "Divehi",
22013         "ދިވެހިބަސް",
22014         "dv"
22015     ],
22016     [
22017         "Dzongkha",
22018         "ཇོང་ཁ",
22019         "dz"
22020     ],
22021     [
22022         "Ewe",
22023         "eʋegbe",
22024         "ee"
22025     ],
22026     [
22027         "Greek",
22028         "Ελληνικά",
22029         "el"
22030     ],
22031     [
22032         "Emiliano-Romagnolo",
22033         "emiliàn e rumagnòl",
22034         "eml"
22035     ],
22036     [
22037         "English",
22038         "English",
22039         "en"
22040     ],
22041     [
22042         "Esperanto",
22043         "Esperanto",
22044         "eo"
22045     ],
22046     [
22047         "Spanish",
22048         "español",
22049         "es"
22050     ],
22051     [
22052         "Estonian",
22053         "eesti",
22054         "et"
22055     ],
22056     [
22057         "Basque",
22058         "euskara",
22059         "eu"
22060     ],
22061     [
22062         "Extremaduran",
22063         "estremeñu",
22064         "ext"
22065     ],
22066     [
22067         "Persian",
22068         "فارسی",
22069         "fa"
22070     ],
22071     [
22072         "Fulah",
22073         "Fulfulde",
22074         "ff"
22075     ],
22076     [
22077         "Finnish",
22078         "suomi",
22079         "fi"
22080     ],
22081     [
22082         "Võro",
22083         "Võro",
22084         "fiu-vro"
22085     ],
22086     [
22087         "Fijian",
22088         "Na Vosa Vakaviti",
22089         "fj"
22090     ],
22091     [
22092         "Faroese",
22093         "føroyskt",
22094         "fo"
22095     ],
22096     [
22097         "French",
22098         "français",
22099         "fr"
22100     ],
22101     [
22102         "Arpitan",
22103         "arpetan",
22104         "frp"
22105     ],
22106     [
22107         "Northern Frisian",
22108         "Nordfriisk",
22109         "frr"
22110     ],
22111     [
22112         "Friulian",
22113         "furlan",
22114         "fur"
22115     ],
22116     [
22117         "Western Frisian",
22118         "Frysk",
22119         "fy"
22120     ],
22121     [
22122         "Irish",
22123         "Gaeilge",
22124         "ga"
22125     ],
22126     [
22127         "Gagauz",
22128         "Gagauz",
22129         "gag"
22130     ],
22131     [
22132         "Gan Chinese",
22133         "贛語",
22134         "gan"
22135     ],
22136     [
22137         "Scottish Gaelic",
22138         "Gàidhlig",
22139         "gd"
22140     ],
22141     [
22142         "Galician",
22143         "galego",
22144         "gl"
22145     ],
22146     [
22147         "Gilaki",
22148         "گیلکی",
22149         "glk"
22150     ],
22151     [
22152         "Guarani",
22153         "Avañe'ẽ",
22154         "gn"
22155     ],
22156     [
22157         "Goan Konkani",
22158         "गोंयची कोंकणी / Gõychi Konknni",
22159         "gom"
22160     ],
22161     [
22162         "Gothic",
22163         "𐌲𐌿𐍄𐌹𐍃𐌺",
22164         "got"
22165     ],
22166     [
22167         "Gujarati",
22168         "ગુજરાતી",
22169         "gu"
22170     ],
22171     [
22172         "Manx",
22173         "Gaelg",
22174         "gv"
22175     ],
22176     [
22177         "Hausa",
22178         "Hausa",
22179         "ha"
22180     ],
22181     [
22182         "Hakka Chinese",
22183         "客家語/Hak-kâ-ngî",
22184         "hak"
22185     ],
22186     [
22187         "Hawaiian",
22188         "Hawaiʻi",
22189         "haw"
22190     ],
22191     [
22192         "Hebrew",
22193         "עברית",
22194         "he"
22195     ],
22196     [
22197         "Hindi",
22198         "हिन्दी",
22199         "hi"
22200     ],
22201     [
22202         "Fiji Hindi",
22203         "Fiji Hindi",
22204         "hif"
22205     ],
22206     [
22207         "Croatian",
22208         "hrvatski",
22209         "hr"
22210     ],
22211     [
22212         "Upper Sorbian",
22213         "hornjoserbsce",
22214         "hsb"
22215     ],
22216     [
22217         "Haitian Creole",
22218         "Kreyòl ayisyen",
22219         "ht"
22220     ],
22221     [
22222         "Hungarian",
22223         "magyar",
22224         "hu"
22225     ],
22226     [
22227         "Armenian",
22228         "Հայերեն",
22229         "hy"
22230     ],
22231     [
22232         "Interlingua",
22233         "interlingua",
22234         "ia"
22235     ],
22236     [
22237         "Indonesian",
22238         "Bahasa Indonesia",
22239         "id"
22240     ],
22241     [
22242         "Interlingue",
22243         "Interlingue",
22244         "ie"
22245     ],
22246     [
22247         "Igbo",
22248         "Igbo",
22249         "ig"
22250     ],
22251     [
22252         "Inupiaq",
22253         "Iñupiak",
22254         "ik"
22255     ],
22256     [
22257         "Iloko",
22258         "Ilokano",
22259         "ilo"
22260     ],
22261     [
22262         "Ido",
22263         "Ido",
22264         "io"
22265     ],
22266     [
22267         "Icelandic",
22268         "íslenska",
22269         "is"
22270     ],
22271     [
22272         "Italian",
22273         "italiano",
22274         "it"
22275     ],
22276     [
22277         "Inuktitut",
22278         "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22279         "iu"
22280     ],
22281     [
22282         "Japanese",
22283         "日本語",
22284         "ja"
22285     ],
22286     [
22287         "Jamaican Creole English",
22288         "Patois",
22289         "jam"
22290     ],
22291     [
22292         "Lojban",
22293         "la .lojban.",
22294         "jbo"
22295     ],
22296     [
22297         "Javanese",
22298         "Basa Jawa",
22299         "jv"
22300     ],
22301     [
22302         "Georgian",
22303         "ქართული",
22304         "ka"
22305     ],
22306     [
22307         "Kara-Kalpak",
22308         "Qaraqalpaqsha",
22309         "kaa"
22310     ],
22311     [
22312         "Kabyle",
22313         "Taqbaylit",
22314         "kab"
22315     ],
22316     [
22317         "Kabardian",
22318         "Адыгэбзэ",
22319         "kbd"
22320     ],
22321     [
22322         "Kongo",
22323         "Kongo",
22324         "kg"
22325     ],
22326     [
22327         "Kikuyu",
22328         "Gĩkũyũ",
22329         "ki"
22330     ],
22331     [
22332         "Kazakh",
22333         "қазақша",
22334         "kk"
22335     ],
22336     [
22337         "Kalaallisut",
22338         "kalaallisut",
22339         "kl"
22340     ],
22341     [
22342         "Khmer",
22343         "ភាសាខ្មែរ",
22344         "km"
22345     ],
22346     [
22347         "Kannada",
22348         "ಕನ್ನಡ",
22349         "kn"
22350     ],
22351     [
22352         "Korean",
22353         "한국어",
22354         "ko"
22355     ],
22356     [
22357         "Komi-Permyak",
22358         "Перем Коми",
22359         "koi"
22360     ],
22361     [
22362         "Karachay-Balkar",
22363         "къарачай-малкъар",
22364         "krc"
22365     ],
22366     [
22367         "Kashmiri",
22368         "कॉशुर / کٲشُر",
22369         "ks"
22370     ],
22371     [
22372         "Colognian",
22373         "Ripoarisch",
22374         "ksh"
22375     ],
22376     [
22377         "Kurdish",
22378         "Kurdî",
22379         "ku"
22380     ],
22381     [
22382         "Komi",
22383         "коми",
22384         "kv"
22385     ],
22386     [
22387         "Cornish",
22388         "kernowek",
22389         "kw"
22390     ],
22391     [
22392         "Kyrgyz",
22393         "Кыргызча",
22394         "ky"
22395     ],
22396     [
22397         "Latin",
22398         "Latina",
22399         "la"
22400     ],
22401     [
22402         "Ladino",
22403         "Ladino",
22404         "lad"
22405     ],
22406     [
22407         "Luxembourgish",
22408         "Lëtzebuergesch",
22409         "lb"
22410     ],
22411     [
22412         "лакку",
22413         "лакку",
22414         "lbe"
22415     ],
22416     [
22417         "Lezghian",
22418         "лезги",
22419         "lez"
22420     ],
22421     [
22422         "Ganda",
22423         "Luganda",
22424         "lg"
22425     ],
22426     [
22427         "Limburgish",
22428         "Limburgs",
22429         "li"
22430     ],
22431     [
22432         "Ligurian",
22433         "Ligure",
22434         "lij"
22435     ],
22436     [
22437         "Lombard",
22438         "lumbaart",
22439         "lmo"
22440     ],
22441     [
22442         "Lingala",
22443         "lingála",
22444         "ln"
22445     ],
22446     [
22447         "Lao",
22448         "ລາວ",
22449         "lo"
22450     ],
22451     [
22452         "Northern Luri",
22453         "لۊری شومالی",
22454         "lrc"
22455     ],
22456     [
22457         "Lithuanian",
22458         "lietuvių",
22459         "lt"
22460     ],
22461     [
22462         "Latgalian",
22463         "latgaļu",
22464         "ltg"
22465     ],
22466     [
22467         "Latvian",
22468         "latviešu",
22469         "lv"
22470     ],
22471     [
22472         "Maithili",
22473         "मैथिली",
22474         "mai"
22475     ],
22476     [
22477         "Basa Banyumasan",
22478         "Basa Banyumasan",
22479         "map-bms"
22480     ],
22481     [
22482         "Moksha",
22483         "мокшень",
22484         "mdf"
22485     ],
22486     [
22487         "Malagasy",
22488         "Malagasy",
22489         "mg"
22490     ],
22491     [
22492         "Eastern Mari",
22493         "олык марий",
22494         "mhr"
22495     ],
22496     [
22497         "Maori",
22498         "Māori",
22499         "mi"
22500     ],
22501     [
22502         "Minangkabau",
22503         "Baso Minangkabau",
22504         "min"
22505     ],
22506     [
22507         "Macedonian",
22508         "македонски",
22509         "mk"
22510     ],
22511     [
22512         "Malayalam",
22513         "മലയാളം",
22514         "ml"
22515     ],
22516     [
22517         "Mongolian",
22518         "монгол",
22519         "mn"
22520     ],
22521     [
22522         "Marathi",
22523         "मराठी",
22524         "mr"
22525     ],
22526     [
22527         "Western Mari",
22528         "кырык мары",
22529         "mrj"
22530     ],
22531     [
22532         "Malay",
22533         "Bahasa Melayu",
22534         "ms"
22535     ],
22536     [
22537         "Maltese",
22538         "Malti",
22539         "mt"
22540     ],
22541     [
22542         "Mirandese",
22543         "Mirandés",
22544         "mwl"
22545     ],
22546     [
22547         "Burmese",
22548         "မြန်မာဘာသာ",
22549         "my"
22550     ],
22551     [
22552         "Erzya",
22553         "эрзянь",
22554         "myv"
22555     ],
22556     [
22557         "Mazanderani",
22558         "مازِرونی",
22559         "mzn"
22560     ],
22561     [
22562         "Nauru",
22563         "Dorerin Naoero",
22564         "na"
22565     ],
22566     [
22567         "Nāhuatl",
22568         "Nāhuatl",
22569         "nah"
22570     ],
22571     [
22572         "Neapolitan",
22573         "Napulitano",
22574         "nap"
22575     ],
22576     [
22577         "Low German",
22578         "Plattdüütsch",
22579         "nds"
22580     ],
22581     [
22582         "Low Saxon",
22583         "Nedersaksies",
22584         "nds-nl"
22585     ],
22586     [
22587         "Nepali",
22588         "नेपाली",
22589         "ne"
22590     ],
22591     [
22592         "Newari",
22593         "नेपाल भाषा",
22594         "new"
22595     ],
22596     [
22597         "Dutch",
22598         "Nederlands",
22599         "nl"
22600     ],
22601     [
22602         "Norwegian Nynorsk",
22603         "norsk nynorsk",
22604         "nn"
22605     ],
22606     [
22607         "Norwegian",
22608         "norsk bokmål",
22609         "no"
22610     ],
22611     [
22612         "Novial",
22613         "Novial",
22614         "nov"
22615     ],
22616     [
22617         "Nouormand",
22618         "Nouormand",
22619         "nrm"
22620     ],
22621     [
22622         "Northern Sotho",
22623         "Sesotho sa Leboa",
22624         "nso"
22625     ],
22626     [
22627         "Navajo",
22628         "Diné bizaad",
22629         "nv"
22630     ],
22631     [
22632         "Nyanja",
22633         "Chi-Chewa",
22634         "ny"
22635     ],
22636     [
22637         "Occitan",
22638         "occitan",
22639         "oc"
22640     ],
22641     [
22642         "Livvi-Karelian",
22643         "Livvinkarjala",
22644         "olo"
22645     ],
22646     [
22647         "Oromo",
22648         "Oromoo",
22649         "om"
22650     ],
22651     [
22652         "Odia",
22653         "ଓଡ଼ିଆ",
22654         "or"
22655     ],
22656     [
22657         "Ossetic",
22658         "Ирон",
22659         "os"
22660     ],
22661     [
22662         "Punjabi",
22663         "ਪੰਜਾਬੀ",
22664         "pa"
22665     ],
22666     [
22667         "Pangasinan",
22668         "Pangasinan",
22669         "pag"
22670     ],
22671     [
22672         "Pampanga",
22673         "Kapampangan",
22674         "pam"
22675     ],
22676     [
22677         "Papiamento",
22678         "Papiamentu",
22679         "pap"
22680     ],
22681     [
22682         "Picard",
22683         "Picard",
22684         "pcd"
22685     ],
22686     [
22687         "Pennsylvania German",
22688         "Deitsch",
22689         "pdc"
22690     ],
22691     [
22692         "Palatine German",
22693         "Pälzisch",
22694         "pfl"
22695     ],
22696     [
22697         "Pali",
22698         "पालि",
22699         "pi"
22700     ],
22701     [
22702         "Norfuk / Pitkern",
22703         "Norfuk / Pitkern",
22704         "pih"
22705     ],
22706     [
22707         "Polish",
22708         "polski",
22709         "pl"
22710     ],
22711     [
22712         "Piedmontese",
22713         "Piemontèis",
22714         "pms"
22715     ],
22716     [
22717         "Western Punjabi",
22718         "پنجابی",
22719         "pnb"
22720     ],
22721     [
22722         "Pontic",
22723         "Ποντιακά",
22724         "pnt"
22725     ],
22726     [
22727         "Pashto",
22728         "پښتو",
22729         "ps"
22730     ],
22731     [
22732         "Portuguese",
22733         "português",
22734         "pt"
22735     ],
22736     [
22737         "Quechua",
22738         "Runa Simi",
22739         "qu"
22740     ],
22741     [
22742         "Romansh",
22743         "rumantsch",
22744         "rm"
22745     ],
22746     [
22747         "Romani",
22748         "Romani",
22749         "rmy"
22750     ],
22751     [
22752         "Rundi",
22753         "Kirundi",
22754         "rn"
22755     ],
22756     [
22757         "Romanian",
22758         "română",
22759         "ro"
22760     ],
22761     [
22762         "Aromanian",
22763         "armãneashti",
22764         "roa-rup"
22765     ],
22766     [
22767         "tarandíne",
22768         "tarandíne",
22769         "roa-tara"
22770     ],
22771     [
22772         "Russian",
22773         "русский",
22774         "ru"
22775     ],
22776     [
22777         "Rusyn",
22778         "русиньскый",
22779         "rue"
22780     ],
22781     [
22782         "Kinyarwanda",
22783         "Kinyarwanda",
22784         "rw"
22785     ],
22786     [
22787         "Sanskrit",
22788         "संस्कृतम्",
22789         "sa"
22790     ],
22791     [
22792         "Sakha",
22793         "саха тыла",
22794         "sah"
22795     ],
22796     [
22797         "Sardinian",
22798         "sardu",
22799         "sc"
22800     ],
22801     [
22802         "Sicilian",
22803         "sicilianu",
22804         "scn"
22805     ],
22806     [
22807         "Scots",
22808         "Scots",
22809         "sco"
22810     ],
22811     [
22812         "Sindhi",
22813         "سنڌي",
22814         "sd"
22815     ],
22816     [
22817         "Northern Sami",
22818         "sámegiella",
22819         "se"
22820     ],
22821     [
22822         "Sango",
22823         "Sängö",
22824         "sg"
22825     ],
22826     [
22827         "Serbo-Croatian",
22828         "srpskohrvatski / српскохрватски",
22829         "sh"
22830     ],
22831     [
22832         "Sinhala",
22833         "සිංහල",
22834         "si"
22835     ],
22836     [
22837         "Simple English",
22838         "Simple English",
22839         "simple"
22840     ],
22841     [
22842         "Slovak",
22843         "slovenčina",
22844         "sk"
22845     ],
22846     [
22847         "Slovenian",
22848         "slovenščina",
22849         "sl"
22850     ],
22851     [
22852         "Samoan",
22853         "Gagana Samoa",
22854         "sm"
22855     ],
22856     [
22857         "Shona",
22858         "chiShona",
22859         "sn"
22860     ],
22861     [
22862         "Somali",
22863         "Soomaaliga",
22864         "so"
22865     ],
22866     [
22867         "Albanian",
22868         "shqip",
22869         "sq"
22870     ],
22871     [
22872         "Serbian",
22873         "српски / srpski",
22874         "sr"
22875     ],
22876     [
22877         "Sranan Tongo",
22878         "Sranantongo",
22879         "srn"
22880     ],
22881     [
22882         "Swati",
22883         "SiSwati",
22884         "ss"
22885     ],
22886     [
22887         "Southern Sotho",
22888         "Sesotho",
22889         "st"
22890     ],
22891     [
22892         "Saterland Frisian",
22893         "Seeltersk",
22894         "stq"
22895     ],
22896     [
22897         "Sundanese",
22898         "Basa Sunda",
22899         "su"
22900     ],
22901     [
22902         "Swedish",
22903         "svenska",
22904         "sv"
22905     ],
22906     [
22907         "Swahili",
22908         "Kiswahili",
22909         "sw"
22910     ],
22911     [
22912         "Silesian",
22913         "ślůnski",
22914         "szl"
22915     ],
22916     [
22917         "Tamil",
22918         "தமிழ்",
22919         "ta"
22920     ],
22921     [
22922         "Tulu",
22923         "ತುಳು",
22924         "tcy"
22925     ],
22926     [
22927         "Telugu",
22928         "తెలుగు",
22929         "te"
22930     ],
22931     [
22932         "Tetum",
22933         "tetun",
22934         "tet"
22935     ],
22936     [
22937         "Tajik",
22938         "тоҷикӣ",
22939         "tg"
22940     ],
22941     [
22942         "Thai",
22943         "ไทย",
22944         "th"
22945     ],
22946     [
22947         "Tigrinya",
22948         "ትግርኛ",
22949         "ti"
22950     ],
22951     [
22952         "Turkmen",
22953         "Türkmençe",
22954         "tk"
22955     ],
22956     [
22957         "Tagalog",
22958         "Tagalog",
22959         "tl"
22960     ],
22961     [
22962         "Tswana",
22963         "Setswana",
22964         "tn"
22965     ],
22966     [
22967         "Tongan",
22968         "lea faka-Tonga",
22969         "to"
22970     ],
22971     [
22972         "Tok Pisin",
22973         "Tok Pisin",
22974         "tpi"
22975     ],
22976     [
22977         "Turkish",
22978         "Türkçe",
22979         "tr"
22980     ],
22981     [
22982         "Tsonga",
22983         "Xitsonga",
22984         "ts"
22985     ],
22986     [
22987         "Tatar",
22988         "татарча/tatarça",
22989         "tt"
22990     ],
22991     [
22992         "Tumbuka",
22993         "chiTumbuka",
22994         "tum"
22995     ],
22996     [
22997         "Twi",
22998         "Twi",
22999         "tw"
23000     ],
23001     [
23002         "Tahitian",
23003         "reo tahiti",
23004         "ty"
23005     ],
23006     [
23007         "Tuvinian",
23008         "тыва дыл",
23009         "tyv"
23010     ],
23011     [
23012         "Udmurt",
23013         "удмурт",
23014         "udm"
23015     ],
23016     [
23017         "Uyghur",
23018         "ئۇيغۇرچە / Uyghurche",
23019         "ug"
23020     ],
23021     [
23022         "Ukrainian",
23023         "українська",
23024         "uk"
23025     ],
23026     [
23027         "Urdu",
23028         "اردو",
23029         "ur"
23030     ],
23031     [
23032         "Uzbek",
23033         "oʻzbekcha/ўзбекча",
23034         "uz"
23035     ],
23036     [
23037         "Venda",
23038         "Tshivenda",
23039         "ve"
23040     ],
23041     [
23042         "Venetian",
23043         "vèneto",
23044         "vec"
23045     ],
23046     [
23047         "Veps",
23048         "vepsän kel’",
23049         "vep"
23050     ],
23051     [
23052         "Vietnamese",
23053         "Tiếng Việt",
23054         "vi"
23055     ],
23056     [
23057         "West Flemish",
23058         "West-Vlams",
23059         "vls"
23060     ],
23061     [
23062         "Volapük",
23063         "Volapük",
23064         "vo"
23065     ],
23066     [
23067         "Walloon",
23068         "walon",
23069         "wa"
23070     ],
23071     [
23072         "Waray",
23073         "Winaray",
23074         "war"
23075     ],
23076     [
23077         "Wolof",
23078         "Wolof",
23079         "wo"
23080     ],
23081     [
23082         "Wu Chinese",
23083         "吴语",
23084         "wuu"
23085     ],
23086     [
23087         "Kalmyk",
23088         "хальмг",
23089         "xal"
23090     ],
23091     [
23092         "Xhosa",
23093         "isiXhosa",
23094         "xh"
23095     ],
23096     [
23097         "Mingrelian",
23098         "მარგალური",
23099         "xmf"
23100     ],
23101     [
23102         "Yiddish",
23103         "ייִדיש",
23104         "yi"
23105     ],
23106     [
23107         "Yoruba",
23108         "Yorùbá",
23109         "yo"
23110     ],
23111     [
23112         "Zhuang",
23113         "Vahcuengh",
23114         "za"
23115     ],
23116     [
23117         "Zeelandic",
23118         "Zeêuws",
23119         "zea"
23120     ],
23121     [
23122         "Chinese",
23123         "中文",
23124         "zh"
23125     ],
23126     [
23127         "Classical Chinese",
23128         "文言",
23129         "zh-classical"
23130     ],
23131     [
23132         "Chinese (Min Nan)",
23133         "Bân-lâm-gú",
23134         "zh-min-nan"
23135     ],
23136     [
23137         "Cantonese",
23138         "粵語",
23139         "zh-yue"
23140     ],
23141     [
23142         "Zulu",
23143         "isiZulu",
23144         "zu"
23145     ]
23146 ];
23147
23148 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 Shop":{"count":180},"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},"Consultorio Dental":{"count":187},"Dentista":{"count":109},"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},"Food Court":{"count":72},"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},"GNV":{"count":58},"Gas":{"count":66},"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},"Jardin Infantil":{"count":85},"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 Municipal":{"count":451},"Biblioteca Pública":{"count":66},"Biblioteca Pública Municipal":{"count":85},"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},"Farmácia":{"count":85},"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},"Belvedere":{"count":55},"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},"Food Court":{"count":52},"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},"Escola Estadual":{"count":73},"Escola Municipal":{"count":211},"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},"Anfiteatro":{"count":94},"Freilichtbühne":{"count":78},"Teatro Comunale":{"count":56},"Teatro Municipal":{"count":94}},"veterinary":{"Clinica Veterinaria":{"count":75},"Veterinaria":{"count":153}}};
23149 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},"Polideportivo":{"count":248},"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}}};
23150 var man_made = {"windmill":{"De Hoop":{"count":57}}};
23151 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},"Panaderia":{"count":615},"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},"Coffee Shop":{"count":71},"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":{"count":91},"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},"Kiosco":{"count":74},"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},"Minimarket":{"count":255},"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":{"Funeraria":{"count":51},"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":{"Barbershop":{"count":51},"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":{"count":57},"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},"Kiosco":{"count":203},"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},"Kitchen":{"count":202},"kitchen":{"count":101}},"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":{"count":122},"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},"Optica":{"count":159},"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},"Stadium":{"count":53},"Спортмастер":{"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},"Casino":{"count":337},"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":{"count":63},"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},"Minimarket":{"count":69},"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}},"tattoo":{"Tattoo":{"count":73}},"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},"Vulcanizing Shop":{"count":54},"Вулканизация":{"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}}};
23152 var tourism = {"alpine_hut":{"КОШ":{"count":105}},"apartment":{"Двухкомнатная квартира на сутки":{"count":52}},"attraction":{"Arch":{"count":51},"Kursächsische Postmeilensäule":{"count":54},"Lavoir":{"count":109},"Maibaum":{"count":52},"Moab trail":{"count":55},"Moai":{"count":702},"OWŚ":{"count":102},"Sommerrodelbahn":{"count":54},"path continues":{"count":71},"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},"Campsite":{"count":70}},"guest_house":{"Casa":{"count":61},"Guest House":{"count":64},"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":{"count":105},"Motel 6":{"count":214},"Quality Inn":{"count":113},"Rodeway Inn":{"count":102},"Super 8":{"count":173},"Travelodge":{"count":68}},"museum":{"Heimatmuseum":{"count":336},"Museum":{"count":51},"Stadtmuseum":{"count":86},"Tájház":{"count":93},"Краеведческий музей":{"count":247},"Музей":{"count":99}}};
23153 var dataSuggestions = {
23154         amenity: amenity,
23155         leisure: leisure,
23156         man_made: man_made,
23157         shop: shop,
23158         tourism: tourism
23159 };
23160
23161 var dataAddressFormats = [{"format":[["housenumber","street","unit"],["city","postcode"]]},{"countryCodes":["gb"],"format":[["housename"],["housenumber","street","unit"],["city","postcode"]]},{"countryCodes":["ie"],"format":[["housename"],["housenumber","street","unit"],["city"],["postcode"]]},{"countryCodes":["at","ch","de"],"format":[["street","housenumber"],["postcode","city"]]},{"countryCodes":["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","si","sk","sm","va"],"format":[["unit","street","housenumber"],["postcode","city"]]},{"countryCodes":["pl"],"format":[["street","housenumber"],["postcode"],["place","city"]]},{"countryCodes":["fr","lu","mo"],"format":[["unit","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","unit"],["postcode","district","city"]]},{"countryCodes":["ua"],"format":[["housenumber","postcode"],["street","unit"]]},{"countryCodes":["cn"],"format":[["postcode","province"],["city","district"],["street","housenumber"]]}];
23162
23163 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"}}];
23164
23165 var dataDiscarded = ["created_by","odbl","odbl:note","tiger:upload_uuid","tiger:tlid","tiger:source","tiger:separated","geobase:datasetName","geobase:uuid","sub_sea:type","KSJ2:ADS","KSJ2:ARE","KSJ2:AdminArea","KSJ2:COP_label","KSJ2:DFD","KSJ2:INT","KSJ2:INT_label","KSJ2:LOC","KSJ2:LPN","KSJ2:OPC","KSJ2:PubFacAdmin","KSJ2:RAC","KSJ2:RAC_label","KSJ2:RIC","KSJ2:RIN","KSJ2:WSC","KSJ2:coordinate","KSJ2:curve_id","KSJ2:curve_type","KSJ2:filename","KSJ2:lake_id","KSJ2:lat","KSJ2:long","KSJ2:river_id","yh:LINE_NAME","yh:LINE_NUM","yh:STRUCTURE","yh:TOTYUMONO","yh:TYPE","yh:WIDTH","yh:WIDTH_RANK","SK53_bulk:load"];
23166
23167 var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"bg":{"rtl":false},"bg-BG":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"cs":{"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}};
23168
23169 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"};
23170
23171 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"},{"shortcuts":[],"text":""},{"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"}]}]}];
23172
23173 var type$2 = "FeatureCollection";
23174 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]]]}}];
23175 var dataImperial = {
23176         type: type$2,
23177         features: features
23178 };
23179
23180 var type$3 = "FeatureCollection";
23181 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]]]}}];
23182 var dataDriveLeft = {
23183         type: type$3,
23184         features: features$1
23185 };
23186
23187 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."}},"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":{"help":{"select":"Click to select a road segment.","toggle":"Click to toggle turn restrictions.","toggle_on":"Click to add a \"{restriction}\" restriction.","toggle_off":"Click to remove the \"{restriction}\" restriction."},"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"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":"http://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":"closed","center":"Center","perimeter":"Perimeter","length":"Length","area":"Area","centroid":"Centroid","location":"Location","metric":"Metric","imperial":"Imperial"}},"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","percent_brightness":"{opacity}% brightness","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}/{z}, {x}, {y} for Z/X/Y tile scheme\n   - {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}","fix_misalignment":"Adjust imagery offset","imagery_source_faq":"Where does this imagery come from?","reset":"reset","offset":"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters.","minimap":{"description":"Minimap","tooltip":"Show a zoomed out map to help locate the area currently displayed.","key":"/"}},"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...","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. 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":"# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the world. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need to\n[log in](https://www.openstreetmap.org/login).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n","editing_saving":"# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click on it on\nthe map. This will highlight the selected feature and load a sidebar with\ndetails about it. If you right-click on it, it will show a menu of things\nyou can do with the feature.\n\nTo select multiple features, hold down the 'Shift' key. Then either click\non the features you want to select, or drag on the map to draw a contour\naround those features. All the points inside the lasso area will be selected.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Upload' to post the changes to\n[OpenStreetMap.org](http://www.openstreetmap.org/), where they will be visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n\n### Using the editor\n\nYou can view a list of keyboard shortcuts by pressing the `?` key.\n","roads":"# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a sidebar showing more information about the road. If you right-click\non it, you'll have a menu of actions you can apply on the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also right-click on it and select the 'Move' tool, or simply press\nthe `M` shortcut key, to move the entire road at one time, and then click\nagain to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then pressing the 'Delete'\nkey or right-clicking it and then clicking the trash can icon.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n","gps":"# GPS\n\nCollected GPS traces are one valuable source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognized, it will be added to the map as a bright purple\nline. Click on the 'Map Data' menu on the right side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add, and also to [upload it to OpenStreetMap](http://www.openstreetmap.org/trace/create)\nfor other users to use.\n","imagery":"# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\nairplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the right.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n","addresses":"# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n","inspector":"# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click the 'Add field' dropdown to add\nother details, like a Wikipedia link, wheelchair access, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n","buildings":"# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and load a sidebar showing more information about the building.\nIf you right-click on it, it will show a menu of actions you can execute\nin the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it and press the 'M' shortcut key,\nor right-click it and select the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the building could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then pressing the 'Delete'\nkey, or right-clicking it and then clicking the trash can icon.\n","relations":"# Relations\n\nA relation is a special type of feature in OpenStreetMap that groups together\nother features. For example, two common types of relations are *route relations*,\nwhich group together sections of road that belong to a specific freeway or\nhighway, and *multipolygons*, which group together several lines that define\na complex area (one with several pieces or holes in it like a donut).\n\nThe group of features in a relation are called *members*. In the bottom of the\nsidebar, you can see which relations a feature is a member of, and click on a\nrelation there will select it. When the relation is selected, you can see all of\nits members listed in the sidebar and highlighted on the map.\n\nFor the most part, iD will take care of maintaining relations automatically\nwhile you edit. The main thing you should be aware of is that if you delete a\nsection of road to redraw it more accurately, you should make sure that the\nnew section is a member of the same relations as the original.\n\n## Editing Relations\n\nIf you want to edit relations, here are the basics.\n\nTo add a feature to a relation, select the feature, click the \"+\" button in the\n\"All relations\" section of the sidebar, and select or type the name of the relation.\n\nTo create a new relation, select the first feature that should be a member,\nclick the \"+\" button in the \"All relations\" section, and select \"New relation...\".\n\nTo remove a feature from a relation, select the feature and click the trash\nbutton next to the relation you want to remove it from.\n\nYou can create multipolygons with holes using the \"Merge\" tool. Draw two areas (inner\nand outer), hold the Shift key and click on each of them to select them both, and then\npress the 'C' shortcut key. Other option is to select both, and then right-click one\nof the and click the \"Merge\" (+) button.\n"},"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 be 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"},"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"}}},"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"},"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..."},"cardinal_direction":{"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"}},"castle_type":{"label":"Type"},"clock_direction":{"label":"Direction","options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}},"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"},"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"},"milestone_position":{"label":"Milestone Position","placeholder":"Distance to one decimal (123.4)"},"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"}},"oneway":{"label":"One Way","options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}},"opening_hours":{"label":"Hours"},"operator":{"label":"Operator"},"outdoor_seating":{"label":"Outdoor Seating"},"par":{"label":"Par","placeholder":"3, 4, 5..."},"parallel_direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward"}},"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"},"rating":{"label":"Power Rating"},"recycling_accepts":{"label":"Accepts"},"recycling_type":{"label":"Recycling Type","options":{"container":"Container","centre":"Recycling Center"}},"ref_aeroway_gate":{"label":"Gate Number"},"ref_golf_hole":{"label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"label":"Junction Number"},"ref_platform":{"label":"Platform Number"},"ref_road_number":{"label":"Road Number"},"ref_route":{"label":"Route Number"},"ref_runway":{"label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"label":"Stop Number"},"ref_taxiway":{"label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"label":"Reference Code"},"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"},"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"},"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":""},"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/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/station":{"name":"Aerialway Station","terms":""},"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/coworking_space":{"name":"Coworking Space","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,dog,horse,kitten,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/bus_station":{"name":"Bus Station","terms":""},"amenity/cafe":{"name":"Cafe","terms":"bistro,coffee,tea"},"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/ferry_terminal":{"name":"Ferry Terminal","terms":""},"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/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":"garbhargriha,mandu,puja,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","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/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/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/cabin":{"name":"Cabin","terms":""},"building/cathedral":{"name":"Cathedral Building","terms":""},"building/chapel":{"name":"Chapel Building","terms":""},"building/church":{"name":"Church 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/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/public":{"name":"Public Building","terms":""},"building/residential":{"name":"Residential Building","terms":""},"building/retail":{"name":"Retail Building","terms":""},"building/roof":{"name":"Roof","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/shed":{"name":"Shed","terms":""},"building/stable":{"name":"Stable","terms":""},"building/static_caravan":{"name":"Static Mobile Home","terms":""},"building/terrace":{"name":"Row Houses","terms":"home,terrace,brownstone,family,residence,dwelling"},"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":""},"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/bridleway":{"name":"Bridle Path","terms":"bridleway,equestrian,horse"},"highway/bus_stop":{"name":"Bus Stop","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":"Garages","terms":""},"landuse/grass":{"name":"Grass","terms":""},"landuse/greenfield":{"name":"Greenfield","terms":""},"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/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/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/physician":{"name":"Physician","terms":""},"office/travel_agent":{"name":"Travel Agency","terms":""},"office/accountant":{"name":"Accountant Office","terms":""},"office/administrative":{"name":"Administrative 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":"Company 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":"clerk,signature,wills,deeds,estate"},"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":""},"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":""},"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/platform":{"name":"Platform","terms":""},"public_transport/stop_position":{"name":"Stop Position","terms":""},"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/halt":{"name":"Railway Halt","terms":"break,interrupt,rest,wait,interruption"},"railway/level_crossing":{"name":"Railway Crossing (Road)","terms":"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/milestone":{"name":"Railway Milestone","terms":"milestone,marker"},"railway/monorail":{"name":"Monorail","terms":""},"railway/narrow_gauge":{"name":"Narrow Gauge Rail","terms":"narrow gauge railway,narrow gauge railroad"},"railway/platform":{"name":"Railway Platform","terms":""},"railway/rail":{"name":"Rail","terms":""},"railway/signal":{"name":"Railway Signal","terms":"signal,lights"},"railway/station":{"name":"Railway Station","terms":"train station,station"},"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_stop":{"name":"Tram Stop","terms":"light rail,streetcar,tram,trolley"},"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":"Agriculture 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/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":"News 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/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/pipeline":{"name":"Pipeline Route","terms":""},"type/route/power":{"name":"Power Route","terms":""},"type/route/road":{"name":"Road 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"},"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":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{"attribution":{"text":"© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.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"}}};
23188
23189 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":"http://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":"AGRI-black_and_white-2.5m","name":"AGRI black-and-white 2.5m","type":"tms","template":"http://agri.openstreetmap.org/{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":"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]]]},{"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":[[[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":"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":"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":"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":"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":"South_Africa-CapeTown-Aerial-2013","name":"City of Cape Town 2013 Aerial","type":"tms","template":"http://{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":"http://{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":"CRAIG-Auvergne-2013","name":"CRAIG - Auvergne 2013 - 25 cm","type":"tms","template":"http://tiles.craig.fr/osm/tms/1.0.0/ortho_2013/webmercator/{zoom-1}/{x}/{-y}.jpeg","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":"http://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"Orthophotographie CRAIG/Sintegra/IGN 2013"},{"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":"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.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNXltOTBucm0yd3BtY3E5czl6NmYifQ.qJJsPgCjyzMCm3YG3YWQBQ","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,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"},{"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.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNW9qZjBudmgzMnA1a294OGRtNm8ifQ.06mo-nDisy4KmqjYxEVwQw","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":"maaamet.ee-orto","name":"Estonia Ortho (Maaamet)","type":"tms","template":"http://kaart.maakaart.ee/orto/{zoom}/{x}/{y}.jpeg","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":"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":"FR-BAN","name":"FR-BAN","type":"tms","template":"http://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"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"},{"id":"FR-Cadastre","name":"FR-Cadastre","type":"tms","template":"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png","scaleExtent":[12,22],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"http://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"},{"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":"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":"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":"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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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_R065_N47_20160929T102022","name":"imagico.de OSM images for mapping: Cental 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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-AST_L1T_00311162013112731_20150618142416_109190","name":"imagico.de OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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_R092_S02_20160613T075613","name":"imagico.de OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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 OSM images for mapping: 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-LC81490352013282LGN00","name":"imagico.de OSM images for mapping: 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 OSM images for mapping: 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":"http://nls.tileserver.com/nls70-nq8.png"},{"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":"http://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":"http://nls.tileserver.com/nls70-nq8.png"},{"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":"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":"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":"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":"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":"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_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":"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/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgODAuNDcgMjAuMDIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDgwLjQ3IDIwLjAyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe29wYWNpdHk6MC42O2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30uc3Qxe29wYWNpdHk6MC42O2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fTwvc3R5bGU+PGc+PHBhdGggY2xhc3M9InN0MCIgZD0iTTc5LjI5LDEzLjYxYzAsMC4xMS0wLjA5LDAuMi0wLjIsMC4yaC0xLjUzYy0wLjEyLDAtMC4yMy0wLjA2LTAuMjktMC4xNmwtMS4zNy0yLjI4bC0xLjM3LDIuMjhjLTAuMDYsMC4xLTAuMTcsMC4xNi0wLjI5LDAuMTZoLTEuNTNjLTAuMDQsMC0wLjA4LTAuMDEtMC4xMS0wLjAzYy0wLjA5LTAuMDYtMC4xMi0wLjE4LTAuMDYtMC4yN2MwLDAsMCwwLDAsMGwyLjMxLTMuNWwtMi4yOC0zLjQ3Yy0wLjAyLTAuMDMtMC4wMy0wLjA3LTAuMDMtMC4xMWMwLTAuMTEsMC4wOS0wLjIsMC4yLTAuMmgxLjUzYzAuMTIsMCwwLjIzLDAuMDYsMC4yOSwwLjE2bDEuMzQsMi4yNWwxLjMzLTIuMjRjMC4wNi0wLjEsMC4xNy0wLjE2LDAuMjktMC4xNmgxLjUzYzAuMDQsMCwwLjA4LDAuMDEsMC4xMSwwLjAzYzAuMDksMC4wNiwwLjEyLDAuMTgsMC4wNiwwLjI3YzAsMCwwLDAsMCwwTDc2Ljk2LDEwbDIuMzEsMy41Qzc5LjI4LDEzLjUzLDc5LjI5LDEzLjU3LDc5LjI5LDEzLjYxeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02My4wOSw5LjE2Yy0wLjM3LTEuNzktMS44Ny0zLjEyLTMuNjYtMy4xMmMtMC45OCwwLTEuOTMsMC40LTIuNiwxLjEyVjMuMzdjMC0wLjEyLTAuMS0wLjIyLTAuMjItMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjIsMC4xLTAuMjIsMC4yMnYxMC4yMWMwLDAuMTIsMC4xLDAuMjIsMC4yMiwwLjIyaDEuMzNjMC4xMiwwLDAuMjItMC4xLDAuMjItMC4yMnYtMC43YzAuNjgsMC43MSwxLjYyLDEuMTIsMi42LDEuMTJjMS43OSwwLDMuMjktMS4zNCwzLjY2LTMuMTNDNjMuMjEsMTAuMyw2My4yMSw5LjcyLDYzLjA5LDkuMTZMNjMuMDksOS4xNnogTTU5LjEyLDEyLjQxYy0xLjI2LDAtMi4yOC0xLjA2LTIuMy0yLjM2VjkuOTljMC4wMi0xLjMxLDEuMDQtMi4zNiwyLjMtMi4zNnMyLjMsMS4wNywyLjMsMi4zOVM2MC4zOSwxMi40MSw1OS4xMiwxMi40MXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNjguMjYsNi4wNGMtMS44OS0wLjAxLTMuNTQsMS4yOS0zLjk2LDMuMTNjLTAuMTIsMC41Ni0wLjEyLDEuMTMsMCwxLjY5YzAuNDIsMS44NSwyLjA3LDMuMTYsMy45NywzLjE0YzIuMjQsMCw0LjA2LTEuNzgsNC4wNi0zLjk5UzcwLjUxLDYuMDQsNjguMjYsNi4wNHogTTY4LjI0LDEyLjQyYy0xLjI3LDAtMi4zLTEuMDctMi4zLTIuMzlzMS4wMy0yLjQsMi4zLTIuNHMyLjMsMS4wNywyLjMsMi4zOVM2OS41MSwxMi40MSw2OC4yNCwxMi40Mkw2OC4yNCwxMi40MnoiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNTkuMTIsNy42M2MtMS4yNiwwLTIuMjgsMS4wNi0yLjMsMi4zNnYwLjA2YzAuMDIsMS4zMSwxLjA0LDIuMzYsMi4zLDIuMzZzMi4zLTEuMDcsMi4zLTIuMzlTNjAuMzksNy42Myw1OS4xMiw3LjYzeiBNNTkuMTIsMTEuMjNjLTAuNiwwLTEuMDktMC41My0xLjExLTEuMTlWMTBjMC4wMS0wLjY2LDAuNTEtMS4xOSwxLjExLTEuMTlzMS4xMSwwLjU0LDEuMTEsMS4yMVM1OS43NCwxMS4yMyw1OS4xMiwxMS4yM3oiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNjguMjQsNy42M2MtMS4yNywwLTIuMywxLjA3LTIuMywyLjM5czEuMDMsMi4zOSwyLjMsMi4zOXMyLjMtMS4wNywyLjMtMi4zOVM2OS41MSw3LjYzLDY4LjI0LDcuNjN6IE02OC4yNCwxMS4yM2MtMC42MSwwLTEuMTEtMC41NC0xLjExLTEuMjFzMC41LTEuMiwxLjExLTEuMnMxLjExLDAuNTQsMS4xMSwxLjIxUzY4Ljg1LDExLjIzLDY4LjI0LDExLjIzeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00My41Niw2LjI0aC0xLjMzYy0wLjEyLDAtMC4yMiwwLjEtMC4yMiwwLjIydjAuN2MtMC42OC0wLjcxLTEuNjItMS4xMi0yLjYtMS4xMmMtMi4wNywwLTMuNzUsMS43OC0zLjc1LDMuOTlzMS42OSwzLjk5LDMuNzUsMy45OWMwLjk5LDAsMS45My0wLjQxLDIuNi0xLjEzdjAuN2MwLDAuMTIsMC4xLDAuMjIsMC4yMiwwLjIyaDEuMzNjMC4xMiwwLDAuMjItMC4xLDAuMjItMC4yMlY2LjQ0YzAtMC4xMS0wLjA5LTAuMjEtMC4yMS0wLjIxQzQzLjU3LDYuMjQsNDMuNTcsNi4yNCw0My41Niw2LjI0eiBNNDIuMDIsMTAuMDVjLTAuMDEsMS4zMS0xLjA0LDIuMzYtMi4zLDIuMzZzLTIuMy0xLjA3LTIuMy0yLjM5czEuMDMtMi40LDIuMjktMi40YzEuMjcsMCwyLjI4LDEuMDYsMi4zLDIuMzZMNDIuMDIsMTAuMDV6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTM5LjcyLDcuNjNjLTEuMjcsMC0yLjMsMS4wNy0yLjMsMi4zOXMxLjAzLDIuMzksMi4zLDIuMzlzMi4yOC0xLjA2LDIuMy0yLjM2VjkuOTlDNDIsOC42OCw0MC45OCw3LjYzLDM5LjcyLDcuNjN6IE0zOC42MiwxMC4wMmMwLTAuNjcsMC41LTEuMjEsMS4xMS0xLjIxYzAuNjEsMCwxLjA5LDAuNTMsMS4xMSwxLjE5djAuMDRjLTAuMDEsMC42NS0wLjUsMS4xOC0xLjExLDEuMThTMzguNjIsMTAuNjgsMzguNjIsMTAuMDJ6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTQ5LjkxLDYuMDRjLTAuOTgsMC0xLjkzLDAuNC0yLjYsMS4xMlY2LjQ1YzAtMC4xMi0wLjEtMC4yMi0wLjIyLTAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLDAuMS0wLjIyLDAuMjJ2MTAuMjFjMCwwLjEyLDAuMSwwLjIyLDAuMjIsMC4yMmgxLjMzYzAuMTIsMCwwLjIyLTAuMSwwLjIyLTAuMjJ2LTMuNzhjMC42OCwwLjcxLDEuNjIsMS4xMiwyLjYxLDEuMTJjMi4wNywwLDMuNzUtMS43OCwzLjc1LTMuOTlTNTEuOTgsNi4wNCw0OS45MSw2LjA0eiBNNDkuNiwxMi40MmMtMS4yNiwwLTIuMjgtMS4wNi0yLjMtMi4zNlY5Ljk5YzAuMDItMS4zMSwxLjA0LTIuMzcsMi4yOS0yLjM3YzEuMjYsMCwyLjMsMS4wNywyLjMsMi4zOVM1MC44NiwxMi40MSw0OS42LDEyLjQyTDQ5LjYsMTIuNDJ6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTQ5LjYsNy42M2MtMS4yNiwwLTIuMjgsMS4wNi0yLjMsMi4zNnYwLjA2YzAuMDIsMS4zMSwxLjA0LDIuMzYsMi4zLDIuMzZzMi4zLTEuMDcsMi4zLTIuMzlTNTAuODYsNy42Myw0OS42LDcuNjN6IE00OS42LDExLjIzYy0wLjYsMC0xLjA5LTAuNTMtMS4xMS0xLjE5VjEwQzQ4LjUsOS4zNCw0OSw4LjgxLDQ5LjYsOC44MWMwLjYsMCwxLjExLDAuNTUsMS4xMSwxLjIxUzUwLjIxLDExLjIzLDQ5LjYsMTEuMjN6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTM0LjM2LDEzLjU5YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzRjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJWOS4yNGMwLTAuOTMtMC43LTEuNjMtMS41NC0xLjYzYy0wLjc2LDAtMS4zOSwwLjY3LTEuNTEsMS41NGwwLjAxLDQuNDRjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zNGMtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY5LjI0YzAtMC45My0wLjctMS42My0xLjU0LTEuNjNjLTAuODEsMC0xLjQ3LDAuNzUtMS41MiwxLjcxdjQuMjdjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY2LjQ0YzAuMDEtMC4xMiwwLjEtMC4yMSwwLjIyLTAuMjFoMS4zM2MwLjEyLDAsMC4yMSwwLjEsMC4yMiwwLjIxdjAuNjNjMC40OC0wLjY1LDEuMjQtMS4wNCwyLjA2LTEuMDVoMC4wM2MxLjA0LDAsMS45OSwwLjU3LDIuNDgsMS40OGMwLjQzLTAuOSwxLjMzLTEuNDgsMi4zMi0xLjQ5YzEuNTQsMCwyLjc5LDEuMTksMi43NiwyLjY1TDM0LjM2LDEzLjU5eiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik04MC4zMiwxMi45N2wtMC4wNy0wLjEyTDc4LjM4LDEwbDEuODUtMi44MWMwLjQyLTAuNjQsMC4yNS0xLjQ5LTAuMzktMS45MmMtMC4wMS0wLjAxLTAuMDItMC4wMS0wLjAzLTAuMDJjLTAuMjItMC4xNC0wLjQ4LTAuMjEtMC43NC0wLjIxaC0xLjUzYy0wLjUzLDAtMS4wMywwLjI4LTEuMywwLjc0bC0wLjMyLDAuNTNsLTAuMzItMC41M2MtMC4yOC0wLjQ2LTAuNzctMC43NC0xLjMxLTAuNzRoLTEuNTNjLTAuNTcsMC0xLjA4LDAuMzUtMS4yOSwwLjg4Yy0yLjA5LTEuNTgtNS4wMy0xLjQtNi45MSwwLjQzYy0wLjMzLDAuMzItMC42MiwwLjY5LTAuODUsMS4wOWMtMC44NS0xLjU1LTIuNDUtMi42LTQuMjgtMi42Yy0wLjQ4LDAtMC45NiwwLjA3LTEuNDEsMC4yMlYzLjM3YzAtMC43OC0wLjYzLTEuNDEtMS40LTEuNDFoLTEuMzNjLTAuNzcsMC0xLjQsMC42My0xLjQsMS40djMuNTdjLTAuOS0xLjMtMi4zOC0yLjA4LTMuOTctMi4wOWMtMC43LDAtMS4zOSwwLjE1LTIuMDIsMC40NWMtMC4yMy0wLjE2LTAuNTEtMC4yNS0wLjgtMC4yNWgtMS4zM2MtMC40MywwLTAuODMsMC4yLTEuMSwwLjUzYy0wLjAyLTAuMDMtMC4wNC0wLjA1LTAuMDctMC4wOGMtMC4yNy0wLjI5LTAuNjUtMC40NS0xLjA0LTAuNDVoLTEuMzJjLTAuMjksMC0wLjU3LDAuMDktMC44LDAuMjVDNDAuOCw1LDQwLjEyLDQuODUsMzkuNDIsNC44NWMtMS43NCwwLTMuMjcsMC45NS00LjE2LDIuMzhjLTAuMTktMC40NC0wLjQ2LTAuODUtMC43OS0xLjE5Yy0wLjc2LTAuNzctMS44LTEuMTktMi44OC0xLjE5aC0wLjAxYy0wLjg1LDAuMDEtMS42NywwLjMxLTIuMzQsMC44NGMtMC43LTAuNTQtMS41Ni0wLjg0LTIuNDUtMC44NGgtMC4wM2MtMC4yOCwwLTAuNTUsMC4wMy0wLjgyLDAuMWMtMC4yNywwLjA2LTAuNTMsMC4xNS0wLjc4LDAuMjdjLTAuMi0wLjExLTAuNDMtMC4xNy0wLjY3LTAuMTdoLTEuMzNjLTAuNzgsMC0xLjQsMC42My0xLjQsMS40djcuMTRjMCwwLjc4LDAuNjMsMS40LDEuNCwxLjRoMS4zM2MwLjc4LDAsMS40MS0wLjYzLDEuNDEtMS40MWMwLDAsMCwwLDAsMFY5LjM1YzAuMDMtMC4zNCwwLjIyLTAuNTYsMC4zNC0wLjU2YzAuMTcsMCwwLjM2LDAuMTcsMC4zNiwwLjQ1djQuMzVjMCwwLjc4LDAuNjMsMS40LDEuNCwxLjRoMS4zNGMwLjc4LDAsMS40LTAuNjMsMS40LTEuNGwtMC4wMS00LjM1YzAuMDYtMC4zLDAuMjQtMC40NSwwLjMzLTAuNDVjMC4xNywwLDAuMzYsMC4xNywwLjM2LDAuNDV2NC4zNWMwLDAuNzgsMC42MywxLjQsMS40LDEuNGgxLjM0YzAuNzgsMCwxLjQtMC42MywxLjQtMS40di0wLjM2YzAuOTEsMS4yMywyLjM0LDEuOTYsMy44NywxLjk2YzAuNywwLDEuMzktMC4xNSwyLjAyLTAuNDVjMC4yMywwLjE2LDAuNTEsMC4yNSwwLjgsMC4yNWgxLjMyYzAuMjksMCwwLjU3LTAuMDksMC44LTAuMjV2MS45MWMwLDAuNzgsMC42MywxLjQsMS40LDEuNGgxLjMzYzAuNzgsMCwxLjQtMC42MywxLjQtMS40di0xLjY5YzAuNDYsMC4xNCwwLjk0LDAuMjIsMS40MiwwLjIxYzEuNjIsMCwzLjA3LTAuODMsMy45Ny0yLjF2MC41YzAsMC43OCwwLjYzLDEuNCwxLjQsMS40aDEuMzNjMC4yOSwwLDAuNTctMC4wOSwwLjgtMC4yNWMwLjYzLDAuMywxLjMyLDAuNDUsMi4wMiwwLjQ1YzEuODMsMCwzLjQzLTEuMDUsNC4yOC0yLjZjMS40NywyLjUyLDQuNzEsMy4zNiw3LjIyLDEuODljMC4xNy0wLjEsMC4zNC0wLjIxLDAuNS0wLjM0YzAuMjEsMC41MiwwLjcyLDAuODcsMS4yOSwwLjg2aDEuNTNjMC41MywwLDEuMDMtMC4yOCwxLjMtMC43NGwwLjM1LTAuNThsMC4zNSwwLjU4YzAuMjgsMC40NiwwLjc3LDAuNzQsMS4zMSwwLjc0aDEuNTJjMC43NywwLDEuMzktMC42MywxLjM4LTEuMzlDODAuNDcsMTMuMzgsODAuNDIsMTMuMTcsODAuMzIsMTIuOTdMODAuMzIsMTIuOTd6IE0zNC4xNSwxMy44MWgtMS4zNGMtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY5LjI0YzAtMC45My0wLjctMS42My0xLjU0LTEuNjNjLTAuNzYsMC0xLjM5LDAuNjctMS41MSwxLjU0bDAuMDEsNC40NGMwLDAuMTItMC4xLDAuMjItMC4yMiwwLjIyaC0xLjM0Yy0wLjEyLDAtMC4yMi0wLjEtMC4yMi0wLjIyVjkuMjRjMC0wLjkzLTAuNy0xLjYzLTEuNTQtMS42M2MtMC44MSwwLTEuNDcsMC43NS0xLjUyLDEuNzF2NC4yN2MwLDAuMTItMC4xLDAuMjItMC4yMiwwLjIyaC0xLjMzYy0wLjEyLDAtMC4yMi0wLjEtMC4yMi0wLjIyVjYuNDRjMC4wMS0wLjEyLDAuMS0wLjIxLDAuMjItMC4yMWgxLjMzYzAuMTIsMCwwLjIxLDAuMSwwLjIyLDAuMjF2MC42M2MwLjQ4LTAuNjUsMS4yNC0xLjA0LDIuMDYtMS4wNWgwLjAzYzEuMDQsMCwxLjk5LDAuNTcsMi40OCwxLjQ4YzAuNDMtMC45LDEuMzMtMS40OCwyLjMyLTEuNDljMS41NCwwLDIuNzksMS4xOSwyLjc2LDIuNjVsMC4wMSw0LjkxQzM0LjM3LDEzLjcsMzQuMjcsMTMuOCwzNC4xNSwxMy44MUMzNC4xNSwxMy44MSwzNC4xNSwxMy44MSwzNC4xNSwxMy44MXogTTQzLjc4LDEzLjU5YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJ2LTAuNzFDNDEuMzQsMTMuNiw0MC40LDE0LDM5LjQyLDE0Yy0yLjA3LDAtMy43NS0xLjc4LTMuNzUtMy45OXMxLjY5LTMuOTksMy43NS0zLjk5YzAuOTgsMCwxLjkyLDAuNDEsMi42LDEuMTJ2LTAuN2MwLTAuMTIsMC4xLTAuMjIsMC4yMi0wLjIyaDEuMzNjMC4xMS0wLjAxLDAuMjEsMC4wOCwwLjIyLDAuMmMwLDAuMDEsMCwwLjAxLDAsMC4wMlYxMy41OXogTTQ5LjkxLDE0Yy0wLjk4LDAtMS45Mi0wLjQxLTIuNi0xLjEydjMuNzhjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY2LjQ1YzAtMC4xMiwwLjEtMC4yMSwwLjIyLTAuMjFoMS4zM2MwLjEyLDAsMC4yMiwwLjEsMC4yMiwwLjIydjAuN2MwLjY4LTAuNzIsMS42Mi0xLjEyLDIuNi0xLjEyYzIuMDcsMCwzLjc1LDEuNzcsMy43NSwzLjk4UzUxLjk4LDE0LDQ5LjkxLDE0eiBNNjMuMDksMTAuODdDNjIuNzIsMTIuNjUsNjEuMjIsMTQsNTkuNDMsMTRjLTAuOTgsMC0xLjkyLTAuNDEtMi42LTEuMTJ2MC43YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJWMy4zN2MwLTAuMTIsMC4xLTAuMjIsMC4yMi0wLjIyaDEuMzNjMC4xMiwwLDAuMjIsMC4xLDAuMjIsMC4yMnYzLjc4YzAuNjgtMC43MSwxLjYyLTEuMTIsMi42LTEuMTFjMS43OSwwLDMuMjksMS4zMywzLjY2LDMuMTJDNjMuMjEsOS43Myw2My4yMSwxMC4zMSw2My4wOSwxMC44N0w2My4wOSwxMC44N0w2My4wOSwxMC44N3ogTTY4LjI2LDE0LjAxYy0xLjksMC4wMS0zLjU1LTEuMjktMy45Ny0zLjE0Yy0wLjEyLTAuNTYtMC4xMi0xLjEzLDAtMS42OWMwLjQyLTEuODUsMi4wNy0zLjE1LDMuOTctMy4xNGMyLjI1LDAsNC4wNiwxLjc4LDQuMDYsMy45OVM3MC41LDE0LjAxLDY4LjI2LDE0LjAxTDY4LjI2LDE0LjAxeiBNNzkuMDksMTMuODFoLTEuNTNjLTAuMTIsMC0wLjIzLTAuMDYtMC4yOS0wLjE2bC0xLjM3LTIuMjhsLTEuMzcsMi4yOGMtMC4wNiwwLjEtMC4xNywwLjE2LTAuMjksMC4xNmgtMS41M2MtMC4wNCwwLTAuMDgtMC4wMS0wLjExLTAuMDNjLTAuMDktMC4wNi0wLjEyLTAuMTgtMC4wNi0wLjI3YzAsMCwwLDAsMCwwbDIuMzEtMy41bC0yLjI4LTMuNDdjLTAuMDItMC4wMy0wLjAzLTAuMDctMC4wMy0wLjExYzAtMC4xMSwwLjA5LTAuMiwwLjItMC4yaDEuNTNjMC4xMiwwLDAuMjMsMC4wNiwwLjI5LDAuMTZsMS4zNCwyLjI1bDEuMzQtMi4yNWMwLjA2LTAuMSwwLjE3LTAuMTYsMC4yOS0wLjE2aDEuNTNjMC4wNCwwLDAuMDgsMC4wMSwwLjExLDAuMDNjMC4wOSwwLjA2LDAuMTIsMC4xOCwwLjA2LDAuMjdjMCwwLDAsMCwwLDBMNzYuOTYsMTBsMi4zMSwzLjVjMC4wMiwwLjAzLDAuMDMsMC4wNywwLjAzLDAuMTFDNzkuMjksMTMuNzIsNzkuMiwxMy44MSw3OS4wOSwxMy44MUM3OS4wOSwxMy44MSw3OS4wOSwxMy44MSw3OS4wOSwxMy44MUw3OS4wOSwxMy44MXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTAsMS4yMWMtNC44NywwLTguODEsMy45NS04LjgxLDguODFzMy45NSw4LjgxLDguODEsOC44MXM4LjgxLTMuOTUsOC44MS04LjgxQzE4LjgxLDUuMTUsMTQuODcsMS4yMSwxMCwxLjIxeiBNMTQuMTgsMTIuMTljLTEuODQsMS44NC00LjU1LDIuMi02LjM4LDIuMmMtMC42NywwLTEuMzQtMC4wNS0yLTAuMTVjMCwwLTAuOTctNS4zNywyLjA0LTguMzljMC43OS0wLjc5LDEuODYtMS4yMiwyLjk4LTEuMjJjMS4yMSwwLDIuMzcsMC40OSwzLjIzLDEuMzVDMTUuOCw3LjczLDE1Ljg1LDEwLjUsMTQuMTgsMTIuMTl6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTEwLDAuMDJjLTUuNTIsMC0xMCw0LjQ4LTEwLDEwczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMEMxOS45OSw0LjUsMTUuNTIsMC4wMiwxMCwwLjAyeiBNMTAsMTguODNjLTQuODcsMC04LjgxLTMuOTUtOC44MS04LjgxUzUuMTMsMS4yLDEwLDEuMnM4LjgxLDMuOTUsOC44MSw4LjgxQzE4LjgxLDE0Ljg5LDE0Ljg3LDE4LjgzLDEwLDE4LjgzeiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xNC4wNCw1Ljk4Yy0xLjc1LTEuNzUtNC41My0xLjgxLTYuMi0wLjE0QzQuODMsOC44Niw1LjgsMTQuMjMsNS44LDE0LjIzczUuMzcsMC45Nyw4LjM5LTIuMDRDMTUuODUsMTAuNSwxNS44LDcuNzMsMTQuMDQsNS45OHogTTExLjg4LDkuODdsLTAuODcsMS43OGwtMC44Ni0xLjc4TDguMzgsOS4wMWwxLjc3LTAuODZsMC44Ni0xLjc4bDAuODcsMS43OGwxLjc3LDAuODZMMTEuODgsOS44N3oiLz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjEzLjY1LDkuMDEgMTEuODgsOS44NyAxMS4wMSwxMS42NSAxMC4xNSw5Ljg3IDguMzgsOS4wMSAxMC4xNSw4LjE1IDExLjAxLDYuMzcgMTEuODgsOC4xNSAiLz48L2c+PC9zdmc+"},{"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_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":"geodata.state.nj.us-Infrared2015","name":"NJ 2015 Aerial Imagery (Infrared)","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Infrared2015/http://geodata.state.nj.us/imagerywms/Infrared2015","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":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Natural2015/http://geodata.state.nj.us/imagerywms/Natural2015","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":"NLS-Bartholomew-hfinch-hist","name":"NLS - Bartholomew Half Inch, 1897-1907","type":"tms","template":"http://geo.nls.uk/mapdata2/bartholomew/great_britain/{zoom}/{x}/{-y}.png","scaleExtent":[0,15],"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]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-7th_Series","name":"NLS - OS 1-inch 7th Series 1955-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/seventh/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"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]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-1st_Series","name":"NLS - OS 1:25k 1st Series 1937-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25000/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-4.7157244,54.6796556],[-4.6850662,54.6800268],[-4.6835779,54.6623245],[-4.7148782,54.6615818],[-4.7157244,54.6796556]],[[-3.7085748,58.3371151],[-3.5405937,58.3380684],[-3.5315137,58.1608002],[-3.3608086,58.1622372],[-3.3653486,58.252173],[-3.1610473,58.2536063],[-3.1610473,58.3261509],[-3.0275704,58.3271045],[-3.0366505,58.6139001],[-3.0021463,58.614373],[-3.0030543,58.7036341],[-3.4180129,58.7003322],[-3.4171049,58.6290293],[-3.7240109,58.6266658],[-3.7231029,58.606806],[-4.2361262,58.5992374],[-4.2334022,58.5092347],[-3.88836,58.5144516],[-3.8829119,58.4261327],[-3.7158389,58.4270836],[-3.7085748,58.3371151]],[[-6.46676,49.9943621],[-6.1889102,50.004868],[-6.1789222,49.8967815],[-6.3169391,49.8915171],[-6.312399,49.8200979],[-6.4504159,49.8159968],[-6.46676,49.9943621]],[[-5.6453263,50.2029809],[-5.7801329,50.2014076],[-5.7637888,50.0197267],[-5.3479221,50.0290604],[-5.3388421,49.9414854],[-5.024672,49.9473287],[-5.0355681,50.0383923],[-5.0010639,50.0453901],[-4.9974319,50.1304478],[-4.855783,50.13394],[-4.861231,50.206057],[-4.6546085,50.2140172],[-4.6558926,50.3018616],[-4.5184924,50.3026818],[-4.51464,50.325642],[-4.2488284,50.3264618],[-4.2488284,50.3100631],[-4.10886,50.3141633],[-4.1062917,50.2411267],[-3.9648088,50.2432047],[-3.9640778,50.2254158],[-3.8522287,50.2273626],[-3.8503757,50.1552563],[-3.6921809,50.1572487],[-3.5414602,50.1602198],[-3.5465781,50.3226814],[-3.4068012,50.3241013],[-3.4165761,50.5892711],[-3.2746691,50.5962721],[-3.2749172,50.6106323],[-2.9971742,50.613972],[-2.9896008,50.688537],[-2.7120266,50.690565],[-2.710908,50.6195964],[-2.5695473,50.6157538],[-2.5651019,50.5134083],[-2.4014463,50.513379],[-2.3940583,50.6160348],[-2.2894123,50.6147436],[-2.2876184,50.6008549],[-2.1477855,50.6048506],[-2.1451013,50.5325437],[-1.9335117,50.5347477],[-1.9362139,50.6170445],[-1.8573025,50.6228094],[-1.8554865,50.709139],[-1.6066929,50.709139],[-1.6085089,50.6239615],[-1.4450678,50.6228094],[-1.4432518,50.5317039],[-1.1545059,50.5293951],[-1.1472419,50.6170485],[-1.011041,50.6205051],[-1.011041,50.7056889],[-0.704135,50.7045388],[-0.700503,50.7769401],[-0.5860943,50.7723465],[-0.5879103,50.7907181],[-0.0149586,50.7798108],[-0.0185906,50.7625836],[0.0967261,50.7620093],[0.0921861,50.6913106],[0.3046595,50.6890096],[0.3101075,50.7757917],[0.5511831,50.7726336],[0.5529991,50.8432096],[0.695556,50.8403428],[0.696464,50.8592608],[0.9852099,50.8523824],[0.9906579,50.9417226],[1.0160821,50.9411504],[1.0215301,51.0303204],[1.2812198,51.0240383],[1.2848518,51.0948044],[1.4277848,51.0948044],[1.4386809,51.2882859],[1.4713691,51.2871502],[1.4804492,51.3994534],[1.1590151,51.4073836],[1.1590151,51.3869889],[1.0191822,51.3903886],[1.0228142,51.4798247],[0.8793493,51.4843484],[0.8829813,51.5566675],[1.0264462,51.5544092],[1.0373423,51.7493319],[1.2607117,51.7482076],[1.2661598,51.8279642],[1.3351682,51.8335756],[1.3478803,51.9199021],[1.4840812,51.9199021],[1.4986093,52.0038271],[1.6438902,52.0027092],[1.6656823,52.270221],[1.7310588,52.270221],[1.7528509,52.4465637],[1.8254914,52.4476705],[1.8345714,52.624408],[1.7690346,52.6291402],[1.7741711,52.717904],[1.6996925,52.721793],[1.706113,52.8103687],[1.559724,52.8165777],[1.5648605,52.9034116],[1.4184715,52.9103818],[1.4223238,52.9281894],[1.3439928,52.9289635],[1.3491293,53.0001194],[0.4515789,53.022589],[0.4497629,52.9351139],[0.3789384,52.9351139],[0.3716744,52.846365],[0.2227614,52.8496552],[0.2336575,52.9329248],[0.3062979,52.9351139],[0.308114,53.022589],[0.3807544,53.0236813],[0.3993708,53.2933729],[0.3248922,53.2987454],[0.3274604,53.3853782],[0.2504136,53.38691],[0.2581183,53.4748924],[0.1862079,53.4779494],[0.1913443,53.6548777],[0.1502527,53.6594436],[0.1528209,53.7666003],[0.0012954,53.7734308],[0.0025796,53.8424326],[-0.0282392,53.841675],[-0.0226575,53.9311501],[-0.1406983,53.9322193],[-0.1416063,54.0219323],[-0.1706625,54.0235326],[-0.1679384,54.0949482],[-0.0126694,54.0912206],[-0.0099454,54.1811226],[-0.1615824,54.1837795],[-0.1606744,54.2029038],[-0.2405789,54.2034349],[-0.2378549,54.2936234],[-0.3894919,54.2941533],[-0.3857497,54.3837321],[-0.461638,54.3856364],[-0.4571122,54.4939066],[-0.6105651,54.4965434],[-0.6096571,54.5676704],[-0.7667421,54.569776],[-0.7640181,54.5887213],[-0.9192871,54.5908258],[-0.9148116,54.6608348],[-1.1485204,54.6634343],[-1.1472363,54.7528316],[-1.2268514,54.7532021],[-1.2265398,54.8429879],[-1.2991803,54.8435107],[-1.2991803,54.9333391],[-1.3454886,54.9354258],[-1.3436726,55.0234878],[-1.3772688,55.0255698],[-1.3754528,55.1310877],[-1.4997441,55.1315727],[-1.4969272,55.2928323],[-1.5296721,55.2942946],[-1.5258198,55.6523803],[-1.7659492,55.6545537],[-1.7620968,55.7435626],[-1.9688392,55.7435626],[-1.9698023,55.8334505],[-2.0019051,55.8336308],[-2.0015841,55.9235526],[-2.1604851,55.9240613],[-2.1613931,55.9413549],[-2.3202942,55.9408463],[-2.3212022,56.0145126],[-2.5627317,56.0124824],[-2.5645477,56.1022207],[-2.9658863,56.0991822],[-2.9667943,56.1710304],[-2.4828272,56.1755797],[-2.4882752,56.2856078],[-2.5645477,56.2835918],[-2.5681798,56.3742075],[-2.7261728,56.3732019],[-2.7316208,56.4425301],[-2.6190281,56.4425301],[-2.6153961,56.5317671],[-2.453771,56.5347715],[-2.4534686,56.6420248],[-2.4062523,56.6440218],[-2.3953562,56.7297964],[-2.2936596,56.7337811],[-2.2972916,56.807423],[-2.1629067,56.8113995],[-2.1592747,56.9958425],[-1.9922016,57.0017771],[-2.0067297,57.2737477],[-1.9195612,57.2757112],[-1.9304572,57.3482876],[-1.8106005,57.3443682],[-1.7997044,57.4402728],[-1.6616875,57.4285429],[-1.6689516,57.5398256],[-1.7452241,57.5398256],[-1.7524881,57.6313302],[-1.8287606,57.6332746],[-1.8287606,57.7187255],[-3.1768526,57.7171219],[-3.1794208,57.734264],[-3.5134082,57.7292105],[-3.5129542,57.7112683],[-3.7635638,57.7076303],[-3.7598539,57.635713],[-3.8420372,57.6343382],[-3.8458895,57.6178365],[-3.9794374,57.6157733],[-3.9794374,57.686544],[-3.8150708,57.689976],[-3.817639,57.7968899],[-3.6853753,57.7989429],[-3.6892276,57.8891567],[-3.9383458,57.8877915],[-3.9421981,57.9750592],[-3.6943641,57.9784638],[-3.6969323,58.0695865],[-4.0372226,58.0641528],[-4.0346543,57.9730163],[-4.2003051,57.9702923],[-4.1832772,57.7012869],[-4.518752,57.6951111],[-4.5122925,57.6050682],[-4.6789116,57.6016628],[-4.666022,57.4218334],[-3.6677696,57.4394729],[-3.671282,57.5295384],[-3.3384979,57.5331943],[-3.3330498,57.4438859],[-2.8336466,57.4485275],[-2.8236396,56.9992706],[-2.3305398,57.0006693],[-2.3298977,56.9113932],[-2.6579889,56.9092901],[-2.6559637,56.8198406],[-2.8216747,56.8188467],[-2.8184967,56.7295397],[-3.1449248,56.7265508],[-3.1435628,56.6362749],[-3.4679089,56.6350265],[-3.474265,56.7238108],[-3.8011471,56.7188284],[-3.785711,56.4493026],[-3.946428,56.4457896],[-3.9428873,56.2659777],[-4.423146,56.2588459],[-4.4141572,56.0815506],[-4.8944159,56.0708008],[-4.8791072,55.8896994],[-5.1994158,55.8821374],[-5.1852906,55.7023791],[-5.0273445,55.7067203],[-5.0222081,55.6879046],[-4.897649,55.6907999],[-4.8880181,55.6002822],[-4.7339244,55.6046348],[-4.7275038,55.5342082],[-4.773732,55.5334815],[-4.7685955,55.4447227],[-4.8494947,55.4418092],[-4.8405059,55.3506535],[-4.8700405,55.3513836],[-4.8649041,55.2629462],[-4.9920314,55.2592875],[-4.9907473,55.1691779],[-5.0600894,55.1655105],[-5.0575212,55.0751884],[-5.2141831,55.0722477],[-5.1991766,54.8020337],[-5.0466316,54.8062205],[-5.0502636,54.7244996],[-4.9703591,54.7203043],[-4.9776232,54.6215905],[-4.796022,54.6342056],[-4.796022,54.7307917],[-4.8977186,54.7265971],[-4.9086147,54.8145928],[-4.8069181,54.8166856],[-4.8105501,54.7915648],[-4.6943253,54.7978465],[-4.6761652,54.7244996],[-4.5744686,54.7244996],[-4.5599405,54.6426135],[-4.3093309,54.6384098],[-4.3333262,54.8229889],[-4.2626999,54.8274274],[-4.2549952,54.7348587],[-3.8338058,54.7400481],[-3.836374,54.8141105],[-3.7118149,54.8133706],[-3.7143831,54.8318654],[-3.5346072,54.8355633],[-3.5271039,54.9066228],[-3.4808758,54.9084684],[-3.4776655,54.7457328],[-3.5874573,54.744621],[-3.5836049,54.6546166],[-3.7107322,54.6531308],[-3.6991752,54.4550407],[-3.5746161,54.4572801],[-3.5759002,54.3863042],[-3.539945,54.3855564],[-3.5386609,54.297224],[-3.46033,54.2957252],[-3.4590458,54.2079507],[-3.3807149,54.2102037],[-3.381999,54.1169788],[-3.302878,54.1160656],[-3.300154,54.0276224],[-3.1013007,54.0292224],[-3.093596,53.6062158],[-3.2065981,53.6016441],[-3.2091663,53.4917753],[-3.2451215,53.4887193],[-3.2348486,53.4045934],[-3.5276266,53.3999999],[-3.5343966,53.328481],[-3.6488053,53.3252272],[-3.6527308,53.3057716],[-3.7271873,53.3046865],[-3.7315003,53.3945257],[-3.9108315,53.3912769],[-3.9071995,53.3023804],[-3.9521457,53.3015665],[-3.9566724,53.3912183],[-4.1081979,53.3889209],[-4.1081979,53.4072967],[-4.2622916,53.4065312],[-4.2635757,53.4753707],[-4.638537,53.4677274],[-4.6346847,53.3812621],[-4.7091633,53.3774321],[-4.7001745,53.1954965],[-4.5499332,53.1962658],[-4.5435126,53.1092488],[-4.3919871,53.1100196],[-4.3855666,53.0236002],[-4.6115707,53.0205105],[-4.603866,52.9284932],[-4.7566756,52.9261709],[-4.7476868,52.8370555],[-4.8208813,52.8331768],[-4.8208813,52.7446476],[-4.3701572,52.7539749],[-4.3765778,52.8401583],[-4.2314728,52.8455875],[-4.2237682,52.7586379],[-4.1056297,52.7570836],[-4.1015192,52.6714874],[-4.1487355,52.6703862],[-4.1305754,52.4008596],[-4.1995838,52.3986435],[-4.2050319,52.3110195],[-4.3466808,52.303247],[-4.3484968,52.2365693],[-4.4901457,52.2332328],[-4.4883297,52.2098702],[-4.6572188,52.2098702],[-4.6590348,52.1385939],[-4.7788916,52.13525],[-4.7807076,52.1162967],[-4.9259885,52.1140663],[-4.9187245,52.0392855],[-5.2365265,52.0314653],[-5.2347105,51.9442339],[-5.3473032,51.9408755],[-5.3473032,51.9195995],[-5.4925842,51.9162392],[-5.4853201,51.8265386],[-5.1983903,51.8321501],[-5.1893102,51.7625177],[-5.335825,51.7589528],[-5.3281204,51.6686495],[-5.1836575,51.6730296],[-5.1836575,51.6539134],[-5.0674452,51.6578966],[-5.0603825,51.5677905],[-4.5974594,51.5809588],[-4.60388,51.6726314],[-4.345773,51.6726314],[-4.3355001,51.4962964],[-3.9528341,51.5106841],[-3.9425611,51.5905333],[-3.8809237,51.5953198],[-3.8706508,51.5074872],[-3.7679216,51.4978952],[-3.7550805,51.4242895],[-3.5855774,51.41468],[-3.5778727,51.3329177],[-3.0796364,51.3329177],[-3.0770682,51.2494018],[-3.7216935,51.2381477],[-3.7216935,51.2558315],[-3.8706508,51.2558315],[-3.8680825,51.2365398],[-4.2944084,51.2252825],[-4.289272,51.0496352],[-4.5692089,51.0431767],[-4.5624122,50.9497388],[-4.5905604,50.9520269],[-4.5896524,50.8627065],[-4.6296046,50.8592677],[-4.6226411,50.7691513],[-4.6952816,50.7680028],[-4.6934655,50.6967379],[-4.8342064,50.6938621],[-4.8296664,50.6046231],[-4.9676833,50.6000126],[-4.9685913,50.5821427],[-5.1084242,50.5786832],[-5.1029762,50.4892254],[-5.1311244,50.48807],[-5.1274923,50.4163798],[-5.2664172,50.4117509],[-5.2609692,50.3034214],[-5.5124868,50.2976214],[-5.5061308,50.2256428],[-5.6468717,50.2209953],[-5.6453263,50.2029809]],[[-5.1336607,55.2630226],[-5.1021999,55.2639372],[-5.0999527,55.2458239],[-5.1322161,55.2446343],[-5.1336607,55.2630226]],[[-5.6431878,55.5095745],[-5.4861028,55.5126594],[-5.4715747,55.3348829],[-5.6277517,55.3302345],[-5.6431878,55.5095745]],[[-4.7213517,51.2180246],[-4.5804201,51.2212417],[-4.5746416,51.1306736],[-4.7174993,51.1280545],[-4.7213517,51.2180246]],[[-5.1608796,55.4153626],[-5.0045387,55.4190069],[-5.0184798,55.6153521],[-5.1755648,55.6138137],[-5.1608796,55.4153626]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-25inch-hist","name":"NLS - OS 25-inch (Scotland), 1892-1905","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25_inch/scotland_1/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-6inch-Scotland-hist","name":"NLS - OS 6-inch Scotland 1842-82","type":"tms","template":"http://geo.nls.uk/maps/os/six_inch/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"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":"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,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","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","best":true,"icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"OS-historic-25k-OSM_Limited","name":"OS 1:25k historic (OSM)","type":"tms","template":"http://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":"http://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":"http://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":"http://ooc.openstreetmap.org/npescotland/tiles/{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":"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":"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":"http://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":"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":"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":"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","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-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":"http://gravitystorm.dev.openstreetmap.org/surrey/{zoom}/{x}/{y}.png","endDate":"2009-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","scaleExtent":[8,19],"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":"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":"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":"Toulouse-Orthophotoplan-2007","name":"Toulouse - Orthophotoplan 2007","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2007/{zoom}/{x}/{y}","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":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2011/{zoom}/{x}/{y}","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":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_2013/{zoom}/{x}/{y}","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":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_2015/{zoom}/{x}/{y}","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":"http://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.427093505859375,47.26199018174824],[0.427093505859375,47.50096732311069],[0.814361572265625,47.50096732311069],[0.814361572265625,47.26199018174824],[0.427093505859375,47.26199018174824]]],"terms_url":"http://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":"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":"http://wiki.openstreetmap.org/wiki/Vejmidte","terms_text":"Danish municipalities"},{"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"}];
23190
23191 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"},"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":["parallel_direction","lit"],"geometry":["point","vertex","line"],"tags":{"advertising":"billboard"},"name":"Billboard"},"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/station":{"icon":"aerialway","geometry":["point","vertex","area"],"fields":["aerialway/access","aerialway/summer/access","elevation","building_area"],"tags":{"aerialway":"station"},"name":"Aerialway Station"},"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/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/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","dog","horse","kitten","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"],"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"],"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"],"geometry":["point","area"],"tags":{"amenity":"biergarten"},"terms":["beer","bier","booze"],"name":"Beer Garden"},"amenity/boat_rental":{"fields":["name","operator"],"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/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"},"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_rental":{"icon":"car","fields":["name","operator"],"geometry":["point","area"],"tags":{"amenity":"car_rental"},"name":"Car Rental"},"amenity/car_sharing":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","area"],"tags":{"amenity":"car_sharing"},"name":"Car Sharing"},"amenity/car_wash":{"icon":"car","fields":["address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"car_wash"},"name":"Car Wash"},"amenity/casino":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","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"],"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"],"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/ferry_terminal":{"icon":"ferry","fields":["name","network","operator","address","building_area"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"ferry_terminal"},"name":"Ferry Terminal"},"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","opening_hours","fuel_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"],"geometry":["point","area"],"terms":["book"],"tags":{"amenity":"library"},"name":"Library"},"amenity/marketplace":{"icon":"shop","fields":["name","operator","address","building_area","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","address"],"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","opening_hours","drive_through"],"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":["garbhargriha","mandu","puja","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"],"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"],"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":"waste-basket","fields":["name","operator","address","opening_hours","recycling_accepts"],"geometry":["point","area"],"terms":["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling","recycling_type":"centre"},"name":"Recycling Center"},"amenity/recycling":{"icon":"recycling","fields":["recycling_type","recycling_accepts","collection_times"],"geometry":["point","area"],"terms":["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling"},"name":"Recycling"},"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"],"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":"water","fields":["operator","opening_hours","fee","supervised","building_area"],"geometry":["point","vertex","area"],"terms":["rain closet"],"tags":{"amenity":"shower"},"name":"Shower"},"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","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/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/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/college":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["university"],"tags":{"building":"college"},"matchScore":0.5,"name":"College Building"},"building/commercial":{"icon":"commercial","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/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/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/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/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/static_caravan":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"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/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"},"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"},"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/bridleway":{"fields":["name","surface","width","structure","access"],"icon":"highway-bridleway","geometry":["line"],"tags":{"highway":"bridleway"},"terms":["bridleway","equestrian","horse"],"name":"Bridle Path"},"highway/bus_stop":{"icon":"bus","fields":["name","network","operator","bench","shelter"],"geometry":["point","vertex"],"tags":{"highway":"bus_stop"},"terms":[],"name":"Bus Stop"},"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":["parallel_direction"],"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":["clock_direction"],"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_yes","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":["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","parallel_direction"],"geometry":["vertex"],"tags":{"highway":"stop"},"terms":["stop","halt","sign"],"name":"Stop Sign"},"highway/street_lamp":{"icon":"poi-street-lamp","geometry":["point","vertex"],"tags":{"highway":"street_lamp"},"fields":["lamp_type","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"],"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"],"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","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":[],"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":"commercial","fields":["name"],"geometry":["area"],"tags":{"landuse":"commercial"},"terms":[],"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":"Garages"},"landuse/grass":{"geometry":["area"],"tags":{"landuse":"grass"},"terms":[],"name":"Grass"},"landuse/greenfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"greenfield"},"terms":[],"name":"Greenfield"},"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":{"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"],"tags":{"landuse":"religious"},"terms":[],"name":"Religious Area"},"landuse/residential":{"icon":"building","geometry":["area"],"tags":{"landuse":"residential"},"terms":[],"name":"Residential Area"},"landuse/retail":{"icon":"shop","geometry":["area"],"fields":["name"],"tags":{"landuse":"retail"},"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/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","address","building_area","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"],"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/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"],"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"],"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":"commercial","fields":["name","office","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"*"},"terms":[],"name":"Office"},"office/physician":{"icon":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"accountant"},"terms":[],"name":"Accountant Office"},"office/administrative":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"administrative"},"terms":[],"name":"Administrative Office"},"office/adoption_agency":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"adoption_agency"},"terms":[],"name":"Adoption Agency"},"office/advertising_agency":{"icon":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"architect"},"terms":[],"name":"Architect Office"},"office/association":{"icon":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"charity"},"terms":["charitable organization"],"name":"Charity Office"},"office/company":{"icon":"commercial","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"company"},"terms":[],"name":"Company Office"},"office/coworking":{"icon":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"educational_institution"},"terms":[],"name":"Educational Institution"},"office/employment_agency":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"employment_agency"},"terms":["job"],"name":"Employment Agency"},"office/energy_supplier":{"icon":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"estate_agent"},"terms":[],"name":"Real Estate Office"},"office/financial":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"financial"},"terms":[],"name":"Financial Office"},"office/forestry":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"forestry"},"terms":["forest","ranger"],"name":"Forestry Office"},"office/foundation":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"foundation"},"terms":[],"name":"Foundation Office"},"office/government":{"icon":"commercial","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":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"insurance"},"terms":[],"name":"Insurance Office"},"office/it":{"icon":"commercial","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":"commercial","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"},"terms":["clerk","signature","wills","deeds","estate"],"name":"Notary Office"},"office/moving_company":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"moving_company"},"terms":["relocation"],"name":"Moving Company Office"},"office/newspaper":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"newspaper"},"terms":[],"name":"Newspaper Office"},"office/ngo":{"icon":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"notary"},"terms":[],"name":"Notary Office"},"office/political_party":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"political_party"},"terms":[],"name":"Political Party"},"office/private_investigator":{"icon":"commercial","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":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"research"},"terms":[],"name":"Research Office"},"office/surveyor":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"surveyor"},"terms":[],"name":"Surveyor Office"},"office/tax_advisor":{"icon":"commercial","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":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"telecommunication"},"terms":[],"name":"Telecom Office"},"office/therapist":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"therapist"},"terms":["therapy"],"name":"Therapist Office"},"office/water_utility":{"icon":"commercial","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/platform":{"icon":"bus","fields":["name","ref_platform","network","operator","shelter"],"geometry":["point","vertex","line","area"],"tags":{"public_transport":"platform"},"name":"Platform"},"public_transport/stop_position":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position"},"name":"Stop Position"},"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/halt":{"icon":"rail","geometry":["point","vertex"],"tags":{"railway":"halt"},"name":"Railway Halt","terms":["break","interrupt","rest","wait","interruption"]},"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/milestone":{"icon":"poi-milestone","geometry":["point","vertex"],"fields":["milestone_position"],"tags":{"railway":"milestone"},"terms":["milestone","marker"],"name":"Railway Milestone"},"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/platform":{"icon":"highway-footway","fields":["name","ref_platform","surface","lit","shelter"],"geometry":["line","area"],"tags":{"railway":"platform"},"name":"Railway Platform"},"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"],"tags":{"railway":"signal"},"terms":["signal","lights"],"name":"Railway Signal"},"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":"Railway Station"},"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_stop":{"icon":"rail-light","fields":["name","network","operator"],"geometry":["vertex"],"tags":{"railway":"tram_stop"},"terms":["light rail","streetcar","tram","trolley"],"name":"Tram Stop"},"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"],"geometry":["point","area"],"tags":{"shop":"*"},"terms":[],"name":"Shop"},"shop/fishmonger":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"geometry":["point","area"],"terms":["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],"tags":{"shop":"agrarian"},"name":"Agriculture Shop"},"shop/alcohol":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","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"],"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"],"geometry":["point","area"],"tags":{"shop":"antiques"},"name":"Antiques Shop"},"shop/appliance":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"geometry":["point","area"],"tags":{"shop":"baby_goods"},"name":"Baby Goods Store"},"shop/bag":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"tags":{"shop":"bakery"},"name":"Bakery"},"shop/bathroom_furnishing":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bathroom_furnishing"},"name":"Bathroom Furnishing Store"},"shop/beauty":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","beauty"],"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"],"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"],"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"],"geometry":["point","area"],"tags":{"shop":"bed"},"name":"Bedding/Mattress Store"},"shop/beverages":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"beverages"},"name":"Beverage Store"},"shop/bicycle":{"icon":"bicycle","fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"geometry":["point","area"],"terms":["bike","repair"],"tags":{"shop":"bicycle"},"name":"Bicycle Shop"},"shop/bookmaker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["betting"],"tags":{"shop":"bookmaker"},"name":"Bookmaker"},"shop/books":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","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"],"geometry":["point","area"],"tags":{"shop":"boutique"},"name":"Boutique"},"shop/butcher":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["meat"],"tags":{"shop":"butcher"},"name":"Butcher"},"shop/candles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"candles"},"name":"Candle Shop"},"shop/car_parts":{"icon":"car","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car_parts"},"name":"Car Parts Store"},"shop/car_repair":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"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","opening_hours","second_hand","service/vehicle"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car"},"name":"Car Dealership"},"shop/carpet":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["rug"],"tags":{"shop":"carpet"},"name":"Carpet Store"},"shop/charity":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","second_hand"],"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"],"geometry":["point","area"],"tags":{"shop":"cheese"},"name":"Cheese Store"},"shop/chemist":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"chemist"},"terms":["med*","drug*","gift"],"name":"Drugstore"},"shop/chocolate":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"chocolate"},"name":"Chocolate Store"},"shop/clothes":{"icon":"clothing-store","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"clothes"},"name":"Clothing Store"},"shop/coffee":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"coffee"},"name":"Coffee Store"},"shop/computer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"computer"},"name":"Computer Store"},"shop/confectionery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet"],"tags":{"shop":"confectionery"},"name":"Candy Store"},"shop/convenience":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"convenience"},"name":"Convenience Store"},"shop/copyshop":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"copyshop"},"name":"Copy Store"},"shop/cosmetics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"cosmetics"},"name":"Cosmetics Store"},"shop/craft":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"terms":["drape*","window"],"tags":{"shop":"curtain"},"name":"Curtain Store"},"shop/dairy":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"geometry":["point","area"],"tags":{"shop":"department_store"},"name":"Department Store"},"shop/doityourself":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"doityourself"},"name":"DIY Store"},"shop/dry_cleaning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"dry_cleaning"},"name":"Dry Cleaner"},"shop/e-cigarette":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"geometry":["point","area"],"terms":["sex","porn"],"tags":{"shop":"erotic"},"name":"Erotic Store"},"shop/fabric":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sew"],"tags":{"shop":"fabric"},"name":"Fabric Store"},"shop/farm":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"tags":{"shop":"fashion"},"name":"Fashion Store"},"shop/florist":{"icon":"florist","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["flower"],"tags":{"shop":"florist"},"name":"Florist"},"shop/frame":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"geometry":["point","area"],"terms":["souvenir"],"tags":{"shop":"gift"},"name":"Gift Shop"},"shop/greengrocer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fruit","vegetable"],"tags":{"shop":"greengrocer"},"name":"Greengrocer"},"shop/hairdresser":{"icon":"hairdresser","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["barber"],"tags":{"shop":"hairdresser"},"name":"Hairdresser"},"shop/hardware":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"hardware"},"name":"Hardware Store"},"shop/hearing_aids":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"hearing_aids"},"name":"Hearing Aids Store"},"shop/herbalist":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"herbalist"},"name":"Herbalist"},"shop/hifi":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["stereo","video"],"tags":{"shop":"hifi"},"name":"Hifi Store"},"shop/houseware":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"tags":{"shop":"interior_decoration"},"name":"Interior Decoration Store"},"shop/jewelry":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["diamond","gem","ring"],"tags":{"shop":"jewelry"},"name":"Jeweler"},"shop/kiosk":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"kiosk"},"name":"News Kiosk"},"shop/kitchen":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"kitchen"},"name":"Kitchen Design Store"},"shop/laundry":{"icon":"laundry","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"laundry"},"name":"Laundry"},"shop/leather":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"leather"},"name":"Leather Store"},"shop/locksmith":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["key","lockpick"],"tags":{"shop":"locksmith"},"name":"Locksmith"},"shop/lottery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"tags":{"shop":"massage"},"name":"Massage Shop"},"shop/medical_supply":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"geometry":["point","area"],"terms":["bike"],"tags":{"shop":"motorcycle"},"name":"Motorcycle Dealership"},"shop/music":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"geometry":["point","area"],"tags":{"shop":"newsagent"},"name":"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"nutrition_supplements"},"name":"Nutrition Supplements Store"},"shop/optician":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses"],"tags":{"shop":"optician"},"name":"Optician"},"shop/organic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"supermarket","organic":"only"},"name":"Organic Goods Store"},"shop/outdoor":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"tags":{"shop":"paint"},"name":"Paint Store"},"shop/pastry":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"tags":{"shop":"pawnbroker"},"name":"Pawn Shop"},"shop/perfumery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"perfumery"},"name":"Perfume Store"},"shop/pet":{"icon":"dog-park","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"terms":["camera","film"],"tags":{"shop":"photo"},"name":"Photography Store"},"shop/pyrotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pyrotechnics"},"name":"Fireworks Store"},"shop/radiotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"radiotechnics"},"name":"Radio/Electronic Component Store"},"shop/religion":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","religion","denomination"],"geometry":["point","area"],"tags":{"shop":"religion"},"name":"Religious Store"},"shop/scuba_diving":{"icon":"swimming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"scuba_diving"},"name":"Scuba Diving Shop"},"shop/seafood":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fishmonger"],"tags":{"shop":"seafood"},"name":"Seafood Shop"},"shop/second_hand":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","second_hand"],"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"],"geometry":["point","area"],"tags":{"shop":"shoes"},"name":"Shoe Store"},"shop/sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"sports"},"name":"Sporting Goods Store"},"shop/stationery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["card","paper"],"tags":{"shop":"stationery"},"name":"Stationery Store"},"shop/storage_rental":{"icon":"shop","fields":["name","operator","address","building","opening_hours"],"geometry":["point","area"],"tags":{"shop":"storage_rental"},"name":"Storage Rental"},"shop/supermarket":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours"],"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"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"shop":"tailor"},"name":"Tailor"},"shop/tattoo":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tattoo"},"name":"Tattoo Parlor"},"shop/tea":{"icon":"teahouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tea"},"name":"Tea Store"},"shop/ticket":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"ticket"},"name":"Ticket Seller"},"shop/tiles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tiles"},"name":"Tile Shop"},"shop/tobacco":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tobacco"},"name":"Tobacco Shop"},"shop/toys":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"toys"},"name":"Toy Store"},"shop/trade":{"icon":"shop","fields":["name","trade","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"trade"},"name":"Trade Shop"},"shop/travel_agency":{"icon":"suitcase","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"travel_agency"},"name":"Travel Agency"},"shop/tyres":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tyres"},"name":"Tire Store"},"shop/vacuum_cleaner":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"vacuum_cleaner"},"name":"Vacuum Cleaner Store"},"shop/variety_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"variety_store"},"name":"Variety Store"},"shop/video_games":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"video_games"},"name":"Video Game Store"},"shop/video":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["DVD"],"tags":{"shop":"video"},"name":"Video Store"},"shop/watches":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"watches"},"name":"Watches Shop"},"shop/water_sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"water_sports"},"name":"Watersport/Swim Shop"},"shop/weapons":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ammo","gun","knife","knives"],"tags":{"shop":"weapons"},"name":"Weapon Shop"},"shop/window_blind":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"window_blind"},"name":"Window Blind Store"},"shop/wine":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"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":"monument","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"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"board"},"reference":{"key":"information","value":"board"},"name":"Information Board"},"tourism/information/guidepost":{"icon":"information","fields":["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"],"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"],"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","parallel_direction"],"geometry":["vertex","line"],"tags":{"traffic_calming":"*"},"terms":["bump","hump","slow","speed"],"name":"Traffic Calming"},"traffic_calming/bump":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["hump","speed","slow"],"tags":{"traffic_calming":"bump"},"name":"Speed Bump"},"traffic_calming/chicane":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["driveway link","speed","slow"],"tags":{"traffic_calming":"chicane"},"name":"Traffic Chicane"},"traffic_calming/choker":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"choker"},"name":"Traffic Choker"},"traffic_calming/cushion":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["bump","hump","speed","slow"],"tags":{"traffic_calming":"cushion"},"name":"Speed Cushion"},"traffic_calming/dip":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"dip"},"name":"Dip"},"traffic_calming/hump":{"icon":"poi-warning","fields":["surface","parallel_direction"],"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":["parallel_direction"],"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/pipeline":{"icon":"route-pipeline","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"pipeline"},"name":"Pipeline 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/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"],"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"],"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"],"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"],"suggestion":true},"amenity/bicycle_rental/Bicing":{"tags":{"name":"Bicing","amenity":"bicycle_rental"},"name":"Bicing","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"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"],"suggestion":true},"amenity/bicycle_rental/Grid":{"tags":{"name":"Grid","amenity":"bicycle_rental"},"name":"Grid","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Mibici":{"tags":{"name":"Mibici","amenity":"bicycle_rental"},"name":"Mibici","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/metropolradruhr":{"tags":{"name":"metropolradruhr","amenity":"bicycle_rental"},"name":"metropolradruhr","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"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 Shop":{"tags":{"name":"Coffee Shop","amenity":"cafe"},"name":"Coffee Shop","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"],"suggestion":true},"amenity/car_rental/Avis":{"tags":{"name":"Avis","amenity":"car_rental"},"name":"Avis","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Budget":{"tags":{"name":"Budget","amenity":"car_rental"},"name":"Budget","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Enterprise":{"tags":{"name":"Enterprise","amenity":"car_rental"},"name":"Enterprise","icon":"car","geometry":["point","area"],"fields":["name","operator"],"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"],"suggestion":true},"amenity/car_rental/Europcar":{"tags":{"name":"Europcar","amenity":"car_rental"},"name":"Europcar","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Hertz":{"tags":{"name":"Hertz","amenity":"car_rental"},"name":"Hertz","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Localiza":{"tags":{"name":"Localiza","amenity":"car_rental"},"name":"Localiza","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Sixt":{"tags":{"name":"Sixt","amenity":"car_rental"},"name":"Sixt","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Thrifty":{"tags":{"name":"Thrifty","amenity":"car_rental"},"name":"Thrifty","icon":"car","geometry":["point","area"],"fields":["name","operator"],"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"],"suggestion":true},"amenity/car_rental/オリックスレンタカー":{"tags":{"name":"オリックスレンタカー","amenity":"car_rental"},"name":"オリックスレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/トヨタレンタカー":{"tags":{"name":"トヨタレンタカー","amenity":"car_rental"},"name":"トヨタレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/トヨタレンタリース":{"tags":{"name":"トヨタレンタリース","amenity":"car_rental"},"name":"トヨタレンタリース","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/ニッポンレンタカー":{"tags":{"name":"ニッポンレンタカー","amenity":"car_rental"},"name":"ニッポンレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/car_wash/Автомийка":{"tags":{"name":"Автомийка","amenity":"car_wash"},"name":"Автомийка","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"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"],"suggestion":true},"amenity/cinema/Cinemark":{"tags":{"name":"Cinemark","amenity":"cinema"},"name":"Cinemark","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinemex":{"tags":{"name":"Cinemex","amenity":"cinema"},"name":"Cinemex","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinepolis":{"tags":{"name":"Cinepolis","amenity":"cinema"},"name":"Cinepolis","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cineworld":{"tags":{"name":"Cineworld","amenity":"cinema"},"name":"Cineworld","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Odeon":{"tags":{"name":"Odeon","amenity":"cinema"},"name":"Odeon","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"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/Consultorio Dental":{"tags":{"name":"Consultorio Dental","healthcare":"dentist","amenity":"dentist"},"name":"Consultorio Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Dentista":{"tags":{"name":"Dentista","healthcare":"dentist","amenity":"dentist"},"name":"Dentista","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"],"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/Food Court":{"tags":{"name":"Food Court","amenity":"fast_food"},"name":"Food Court","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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ADNOC":{"tags":{"name":"ADNOC","amenity":"fuel"},"name":"ADNOC","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ANP":{"tags":{"name":"ANP","amenity":"fuel"},"name":"ANP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ARAL":{"tags":{"name":"ARAL","amenity":"fuel"},"name":"ARAL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Aegean":{"tags":{"name":"Aegean","amenity":"fuel"},"name":"Aegean","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Afriquia":{"tags":{"name":"Afriquia","amenity":"fuel"},"name":"Afriquia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Agip":{"tags":{"name":"Agip","amenity":"fuel"},"name":"Agip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Agrola":{"tags":{"name":"Agrola","amenity":"fuel"},"name":"Agrola","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Alon":{"tags":{"name":"Alon","amenity":"fuel"},"name":"Alon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Alpet":{"tags":{"name":"Alpet","amenity":"fuel"},"name":"Alpet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Api":{"tags":{"name":"Api","amenity":"fuel"},"name":"Api","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Aral":{"tags":{"name":"Aral","amenity":"fuel"},"name":"Aral","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Arco":{"tags":{"name":"Arco","amenity":"fuel"},"name":"Arco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Avanti":{"tags":{"name":"Avanti","amenity":"fuel"},"name":"Avanti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Avia":{"tags":{"name":"Avia","amenity":"fuel"},"name":"Avia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BEBECO":{"tags":{"name":"BEBECO","amenity":"fuel"},"name":"BEBECO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BFT":{"tags":{"name":"BFT","amenity":"fuel"},"name":"BFT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BHPetrol":{"tags":{"name":"BHPetrol","amenity":"fuel"},"name":"BHPetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BP":{"tags":{"name":"BP","amenity":"fuel"},"name":"BP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BR":{"tags":{"name":"BR","amenity":"fuel"},"name":"BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bangchak":{"tags":{"name":"Bangchak","amenity":"fuel"},"name":"Bangchak","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Benzina":{"tags":{"name":"Benzina","amenity":"fuel"},"name":"Benzina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bliska":{"tags":{"name":"Bliska","amenity":"fuel"},"name":"Bliska","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CAMPSA":{"tags":{"name":"CAMPSA","amenity":"fuel"},"name":"CAMPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CARREFOUR":{"tags":{"name":"CARREFOUR","amenity":"fuel"},"name":"CARREFOUR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CEPSA":{"tags":{"name":"CEPSA","amenity":"fuel"},"name":"CEPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CNG":{"tags":{"name":"CNG","amenity":"fuel"},"name":"CNG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Caltex":{"tags":{"name":"Caltex","amenity":"fuel"},"name":"Caltex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Campsa":{"tags":{"name":"Campsa","amenity":"fuel"},"name":"Campsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cenex":{"tags":{"name":"Cenex","amenity":"fuel"},"name":"Cenex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cepsa":{"tags":{"name":"Cepsa","amenity":"fuel"},"name":"Cepsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ceypetco":{"tags":{"name":"Ceypetco","amenity":"fuel"},"name":"Ceypetco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Chevron":{"tags":{"name":"Chevron","amenity":"fuel"},"name":"Chevron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Citgo":{"tags":{"name":"Citgo","amenity":"fuel"},"name":"Citgo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Clark":{"tags":{"name":"Clark","amenity":"fuel"},"name":"Clark","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Conoco":{"tags":{"name":"Conoco","amenity":"fuel"},"name":"Conoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Copec":{"tags":{"name":"Copec","amenity":"fuel"},"name":"Copec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Copetrol":{"tags":{"name":"Copetrol","amenity":"fuel"},"name":"Copetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cosmo":{"tags":{"name":"Cosmo","amenity":"fuel"},"name":"Cosmo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Crodux":{"tags":{"name":"Crodux","amenity":"fuel"},"name":"Crodux","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Delta":{"tags":{"name":"Delta","amenity":"fuel"},"name":"Delta","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/EKO":{"tags":{"name":"EKO","amenity":"fuel"},"name":"EKO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ENEOS":{"tags":{"name":"ENEOS","amenity":"fuel"},"name":"ENEOS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ENI":{"tags":{"name":"ENI","amenity":"fuel"},"name":"ENI","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ERG":{"tags":{"name":"ERG","amenity":"fuel"},"name":"ERG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Elan":{"tags":{"name":"Elan","amenity":"fuel"},"name":"Elan","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Eneos":{"tags":{"name":"Eneos","amenity":"fuel"},"name":"Eneos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Engen":{"tags":{"name":"Engen","amenity":"fuel"},"name":"Engen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Eni":{"tags":{"name":"Eni","amenity":"fuel"},"name":"Eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Erg":{"tags":{"name":"Erg","amenity":"fuel"},"name":"Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Esso":{"tags":{"name":"Esso","amenity":"fuel"},"name":"Esso","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/EuroOil":{"tags":{"name":"EuroOil","amenity":"fuel"},"name":"EuroOil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Exxon":{"tags":{"name":"Exxon","amenity":"fuel"},"name":"Exxon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/F24":{"tags":{"name":"F24","amenity":"fuel"},"name":"F24","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Firezone":{"tags":{"name":"Firezone","amenity":"fuel"},"name":"Firezone","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GALP":{"tags":{"name":"GALP","amenity":"fuel"},"name":"GALP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GNV":{"tags":{"name":"GNV","amenity":"fuel"},"name":"GNV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gas":{"tags":{"name":"Gas","amenity":"fuel"},"name":"Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gazprom":{"tags":{"name":"Gazprom","amenity":"fuel"},"name":"Gazprom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GetGo":{"tags":{"name":"GetGo","amenity":"fuel"},"name":"GetGo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Goil":{"tags":{"name":"Goil","amenity":"fuel"},"name":"Goil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gulf":{"tags":{"name":"Gulf","amenity":"fuel"},"name":"Gulf","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HEM":{"tags":{"name":"HEM","amenity":"fuel"},"name":"HEM","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HP":{"tags":{"name":"HP","amenity":"fuel"},"name":"HP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Helios":{"tags":{"name":"Helios","amenity":"fuel"},"name":"Helios","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Hess":{"tags":{"name":"Hess","amenity":"fuel"},"name":"Hess","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Holiday":{"tags":{"name":"Holiday","amenity":"fuel"},"name":"Holiday","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Husky":{"tags":{"name":"Husky","amenity":"fuel"},"name":"Husky","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/IES":{"tags":{"name":"IES","amenity":"fuel"},"name":"IES","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/IP":{"tags":{"name":"IP","amenity":"fuel"},"name":"IP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Indipend.":{"tags":{"name":"Indipend.","amenity":"fuel"},"name":"Indipend.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ingo":{"tags":{"name":"Ingo","amenity":"fuel"},"name":"Ingo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ipiranga":{"tags":{"name":"Ipiranga","amenity":"fuel"},"name":"Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Irving":{"tags":{"name":"Irving","amenity":"fuel"},"name":"Irving","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/JOMO":{"tags":{"name":"JOMO","amenity":"fuel"},"name":"JOMO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Jet":{"tags":{"name":"Jet","amenity":"fuel"},"name":"Jet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Jetti":{"tags":{"name":"Jetti","amenity":"fuel"},"name":"Jetti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kangaroo":{"tags":{"name":"Kangaroo","amenity":"fuel"},"name":"Kangaroo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kobil":{"tags":{"name":"Kobil","amenity":"fuel"},"name":"Kobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LPG":{"tags":{"name":"LPG","amenity":"fuel"},"name":"LPG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LUKOIL":{"tags":{"name":"LUKOIL","amenity":"fuel"},"name":"LUKOIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Liberty":{"tags":{"name":"Liberty","amenity":"fuel"},"name":"Liberty","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lotos":{"tags":{"name":"Lotos","amenity":"fuel"},"name":"Lotos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lukoil":{"tags":{"name":"Lukoil","amenity":"fuel"},"name":"Lukoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MEROIL":{"tags":{"name":"MEROIL","amenity":"fuel"},"name":"MEROIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MOL":{"tags":{"name":"MOL","amenity":"fuel"},"name":"MOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MRS":{"tags":{"name":"MRS","amenity":"fuel"},"name":"MRS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Marathon":{"tags":{"name":"Marathon","amenity":"fuel"},"name":"Marathon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Maverik":{"tags":{"name":"Maverik","amenity":"fuel"},"name":"Maverik","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Maxol":{"tags":{"name":"Maxol","amenity":"fuel"},"name":"Maxol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Metano":{"tags":{"name":"Metano","amenity":"fuel"},"name":"Metano","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Migrol":{"tags":{"name":"Migrol","amenity":"fuel"},"name":"Migrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Minipump":{"tags":{"name":"Minipump","amenity":"fuel"},"name":"Minipump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mobil":{"tags":{"name":"Mobil","amenity":"fuel"},"name":"Mobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mobile":{"tags":{"name":"Mobile","amenity":"fuel"},"name":"Mobile","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mol":{"tags":{"name":"Mol","amenity":"fuel"},"name":"Mol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Moya":{"tags":{"name":"Moya","amenity":"fuel"},"name":"Moya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Neste":{"tags":{"name":"Neste","amenity":"fuel"},"name":"Neste","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OIL!":{"tags":{"name":"OIL!","amenity":"fuel"},"name":"OIL!","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OK":{"tags":{"name":"OK","amenity":"fuel"},"name":"OK","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OKQ8":{"tags":{"name":"OKQ8","amenity":"fuel"},"name":"OKQ8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OMV":{"tags":{"name":"OMV","amenity":"fuel"},"name":"OMV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Oilibya":{"tags":{"name":"Oilibya","amenity":"fuel"},"name":"Oilibya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Opet":{"tags":{"name":"Opet","amenity":"fuel"},"name":"Opet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Orlen":{"tags":{"name":"Orlen","amenity":"fuel"},"name":"Orlen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PETRONOR":{"tags":{"name":"PETRONOR","amenity":"fuel"},"name":"PETRONOR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PSO":{"tags":{"name":"PSO","amenity":"fuel"},"name":"PSO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PT":{"tags":{"name":"PT","amenity":"fuel"},"name":"PT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PTT":{"tags":{"name":"PTT","amenity":"fuel"},"name":"PTT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pecsa":{"tags":{"name":"Pecsa","amenity":"fuel"},"name":"Pecsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pemex":{"tags":{"name":"Pemex","amenity":"fuel"},"name":"Pemex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pertamina":{"tags":{"name":"Pertamina","amenity":"fuel"},"name":"Pertamina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petro":{"tags":{"name":"Petro","amenity":"fuel"},"name":"Petro","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrobras":{"tags":{"name":"Petrobras","amenity":"fuel"},"name":"Petrobras","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrochina":{"tags":{"name":"Petrochina","amenity":"fuel"},"name":"Petrochina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petroecuador":{"tags":{"name":"Petroecuador","amenity":"fuel"},"name":"Petroecuador","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrolimex":{"tags":{"name":"Petrolimex","amenity":"fuel"},"name":"Petrolimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrom":{"tags":{"name":"Petrom","amenity":"fuel"},"name":"Petrom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petron":{"tags":{"name":"Petron","amenity":"fuel"},"name":"Petron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petronas":{"tags":{"name":"Petronas","amenity":"fuel"},"name":"Petronas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petroperu":{"tags":{"name":"Petroperu","amenity":"fuel"},"name":"Petroperu","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Phoenix":{"tags":{"name":"Phoenix","amenity":"fuel"},"name":"Phoenix","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pilot":{"tags":{"name":"Pilot","amenity":"fuel"},"name":"Pilot","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pioneer":{"tags":{"name":"Pioneer","amenity":"fuel"},"name":"Pioneer","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto":{"tags":{"name":"Posto","amenity":"fuel"},"name":"Posto","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Primax":{"tags":{"name":"Primax","amenity":"fuel"},"name":"Primax","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Prio":{"tags":{"name":"Prio","amenity":"fuel"},"name":"Prio","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Puma":{"tags":{"name":"Puma","amenity":"fuel"},"name":"Puma","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q1":{"tags":{"name":"Q1","amenity":"fuel"},"name":"Q1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q8":{"tags":{"name":"Q8","amenity":"fuel"},"name":"Q8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/QuikTrip":{"tags":{"name":"QuikTrip","amenity":"fuel"},"name":"QuikTrip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/REPSOL":{"tags":{"name":"REPSOL","amenity":"fuel"},"name":"REPSOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/RaceTrac":{"tags":{"name":"RaceTrac","amenity":"fuel"},"name":"RaceTrac","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Repsol":{"tags":{"name":"Repsol","amenity":"fuel"},"name":"Repsol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Rompetrol":{"tags":{"name":"Rompetrol","amenity":"fuel"},"name":"Rompetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Rubis":{"tags":{"name":"Rubis","amenity":"fuel"},"name":"Rubis","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/SPBU":{"tags":{"name":"SPBU","amenity":"fuel"},"name":"SPBU","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sasol":{"tags":{"name":"Sasol","amenity":"fuel"},"name":"Sasol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sheetz":{"tags":{"name":"Sheetz","amenity":"fuel"},"name":"Sheetz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Shell":{"tags":{"name":"Shell","amenity":"fuel"},"name":"Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinclair":{"tags":{"name":"Sinclair","amenity":"fuel"},"name":"Sinclair","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinopec":{"tags":{"name":"Sinopec","amenity":"fuel"},"name":"Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Slovnaft":{"tags":{"name":"Slovnaft","amenity":"fuel"},"name":"Slovnaft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Socar":{"tags":{"name":"Socar","amenity":"fuel"},"name":"Socar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sokimex":{"tags":{"name":"Sokimex","amenity":"fuel"},"name":"Sokimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Speedway":{"tags":{"name":"Speedway","amenity":"fuel"},"name":"Speedway","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/St1":{"tags":{"name":"St1","amenity":"fuel"},"name":"St1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Star":{"tags":{"name":"Star","amenity":"fuel"},"name":"Star","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Statoil":{"tags":{"name":"Statoil","amenity":"fuel"},"name":"Statoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sunoco":{"tags":{"name":"Sunoco","amenity":"fuel"},"name":"Sunoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tamoil":{"tags":{"name":"Tamoil","amenity":"fuel"},"name":"Tamoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tango":{"tags":{"name":"Tango","amenity":"fuel"},"name":"Tango","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Teboil":{"tags":{"name":"Teboil","amenity":"fuel"},"name":"Teboil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tela":{"tags":{"name":"Tela","amenity":"fuel"},"name":"Tela","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Terpel":{"tags":{"name":"Terpel","amenity":"fuel"},"name":"Terpel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Texaco":{"tags":{"name":"Texaco","amenity":"fuel"},"name":"Texaco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tinq":{"tags":{"name":"Tinq","amenity":"fuel"},"name":"Tinq","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Topaz":{"tags":{"name":"Topaz","amenity":"fuel"},"name":"Topaz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total":{"tags":{"name":"Total","amenity":"fuel"},"name":"Total","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/TotalErg":{"tags":{"name":"TotalErg","amenity":"fuel"},"name":"TotalErg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ultramar":{"tags":{"name":"Ultramar","amenity":"fuel"},"name":"Ultramar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/United":{"tags":{"name":"United","amenity":"fuel"},"name":"United","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Uno":{"tags":{"name":"Uno","amenity":"fuel"},"name":"Uno","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Valero":{"tags":{"name":"Valero","amenity":"fuel"},"name":"Valero","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Vito":{"tags":{"name":"Vito","amenity":"fuel"},"name":"Vito","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/WOG":{"tags":{"name":"WOG","amenity":"fuel"},"name":"WOG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Westfalen":{"tags":{"name":"Westfalen","amenity":"fuel"},"name":"Westfalen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Z":{"tags":{"name":"Z","amenity":"fuel"},"name":"Z","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/bft":{"tags":{"name":"bft","amenity":"fuel"},"name":"bft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/eni":{"tags":{"name":"eni","amenity":"fuel"},"name":"eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石化 Sinopec":{"tags":{"name":"中国石化 Sinopec","amenity":"fuel"},"name":"中国石化 Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/出光":{"tags":{"name":"出光","name:en":"IDEMITSU","amenity":"fuel"},"name":"出光","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_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/Jardin Infantil":{"tags":{"name":"Jardin Infantil","amenity":"kindergarten"},"name":"Jardin Infantil","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"],"suggestion":true},"amenity/library/Biblioteca Municipal":{"tags":{"name":"Biblioteca Municipal","amenity":"library"},"name":"Biblioteca Municipal","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Pública":{"tags":{"name":"Biblioteca Pública","amenity":"library"},"name":"Biblioteca Pública","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Pública Municipal":{"tags":{"name":"Biblioteca Pública Municipal","amenity":"library"},"name":"Biblioteca Pública Municipal","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmácia":{"tags":{"name":"Farmácia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmácia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"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","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Айболит":{"tags":{"name":"Айболит","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Айболит","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"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","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека низких цен":{"tags":{"name":"Аптека низких цен","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низких цен","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека низьких цін":{"tags":{"name":"Аптека низьких цін","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низьких цін","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека от склада":{"tags":{"name":"Аптека от склада","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека от склада","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"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","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптечный пункт":{"tags":{"name":"Аптечный пункт","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптечный пункт","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Арніка":{"tags":{"name":"Арніка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Арніка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Бережная аптека":{"tags":{"name":"Бережная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Бережная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Будь здоров":{"tags":{"name":"Будь здоров","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Будь здоров","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Вита":{"tags":{"name":"Вита","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Вита","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Горздрав":{"tags":{"name":"Горздрав","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Горздрав","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Живика":{"tags":{"name":"Живика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Живика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Здоровье":{"tags":{"name":"Здоровье","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Здоровье","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Имплозия":{"tags":{"name":"Имплозия","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Имплозия","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Классика":{"tags":{"name":"Классика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Классика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ладушка":{"tags":{"name":"Ладушка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ладушка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Мед-сервіс":{"tags":{"name":"Мед-сервіс","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мед-сервіс","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Мелодия здоровья":{"tags":{"name":"Мелодия здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мелодия здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Невис":{"tags":{"name":"Невис","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Невис","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Норма":{"tags":{"name":"Норма","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Норма","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Озерки":{"tags":{"name":"Озерки","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Озерки","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Панацея":{"tags":{"name":"Панацея","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Панацея","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Первая помощь":{"tags":{"name":"Первая помощь","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Первая помощь","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Планета здоровья":{"tags":{"name":"Планета здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Планета здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ригла":{"tags":{"name":"Ригла","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ригла","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Семейная":{"tags":{"name":"Семейная","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Семейная","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Социальная аптека":{"tags":{"name":"Социальная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Социальная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Столички":{"tags":{"name":"Столички","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Столички","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармакопейка":{"tags":{"name":"Фармакопейка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакопейка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармакор":{"tags":{"name":"Фармакор","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакор","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармация":{"tags":{"name":"Фармация","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармация","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармленд":{"tags":{"name":"Фармленд","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармленд","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Центральная аптека":{"tags":{"name":"Центральная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Центральная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/סופר-פארם":{"tags":{"name":"סופר-פארם","healthcare":"pharmacy","amenity":"pharmacy"},"name":"סופר-פארם","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/داروخانه":{"tags":{"name":"داروخانه","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/داروخانه شبانه روزی":{"tags":{"name":"داروخانه شبانه روزی","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه شبانه روزی","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/صيدلية":{"tags":{"name":"صيدلية","healthcare":"pharmacy","amenity":"pharmacy"},"name":"صيدلية","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/くすりの福太郎":{"tags":{"name":"くすりの福太郎","healthcare":"pharmacy","amenity":"pharmacy"},"name":"くすりの福太郎","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/さくら薬局":{"tags":{"name":"さくら薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"さくら薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ウエルシア":{"tags":{"name":"ウエルシア","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ウエルシア","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/カワチ薬品":{"tags":{"name":"カワチ薬品","healthcare":"pharmacy","amenity":"pharmacy"},"name":"カワチ薬品","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/クリエイト":{"tags":{"name":"クリエイト","healthcare":"pharmacy","amenity":"pharmacy"},"name":"クリエイト","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/サンドラッグ":{"tags":{"name":"サンドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"サンドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/スギ薬局":{"tags":{"name":"スギ薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"スギ薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/セイジョー":{"tags":{"name":"セイジョー","healthcare":"pharmacy","amenity":"pharmacy"},"name":"セイジョー","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ツルハドラッグ":{"tags":{"name":"ツルハドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ツルハドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"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","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/マツモトキヨシ":{"tags":{"name":"マツモトキヨシ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"マツモトキヨシ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/丁丁藥局":{"tags":{"name":"丁丁藥局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"丁丁藥局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/pub/魚民":{"tags":{"name":"魚民","amenity":"pub"},"name":"魚民","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/鳥貴族":{"tags":{"name":"鳥貴族","amenity":"pub"},"name":"鳥貴族","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"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/Belvedere":{"tags":{"name":"Belvedere","amenity":"restaurant"},"name":"Belvedere","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"],"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"],"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"],"suggestion":true},"amenity/school/Amado Nervo":{"tags":{"name":"Amado Nervo","amenity":"school"},"name":"Amado Nervo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Benito Juarez":{"tags":{"name":"Benito Juarez","amenity":"school"},"name":"Benito Juarez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Brown School":{"tags":{"name":"Brown School","amenity":"school"},"name":"Brown School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/CEM":{"tags":{"name":"CEM","amenity":"school"},"name":"CEM","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Center School":{"tags":{"name":"Center School","amenity":"school"},"name":"Center School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"suggestion":true},"amenity/school/Central School":{"tags":{"name":"Central School","amenity":"school"},"name":"Central School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Cuauhtemoc":{"tags":{"name":"Cuauhtemoc","amenity":"school"},"name":"Cuauhtemoc","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Curso Comunitario":{"tags":{"name":"Curso Comunitario","amenity":"school"},"name":"Curso Comunitario","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Cursos Comunitarios":{"tags":{"name":"Cursos Comunitarios","amenity":"school"},"name":"Cursos Comunitarios","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/EPP":{"tags":{"name":"EPP","amenity":"school"},"name":"EPP","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Emiliano Zapata":{"tags":{"name":"Emiliano Zapata","amenity":"school"},"name":"Emiliano Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Escola Estadual":{"tags":{"name":"Escola Estadual","amenity":"school"},"name":"Escola Estadual","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Escola Municipal":{"tags":{"name":"Escola Municipal","amenity":"school"},"name":"Escola Municipal","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Fairview School":{"tags":{"name":"Fairview School","amenity":"school"},"name":"Fairview School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"suggestion":true},"amenity/school/Francisco Villa":{"tags":{"name":"Francisco Villa","amenity":"school"},"name":"Francisco Villa","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Franklin School":{"tags":{"name":"Franklin School","amenity":"school"},"name":"Franklin School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Garfield School":{"tags":{"name":"Garfield School","amenity":"school"},"name":"Garfield School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Government School":{"tags":{"name":"Government School","amenity":"school"},"name":"Government School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Groupe Scolaire":{"tags":{"name":"Groupe Scolaire","amenity":"school"},"name":"Groupe Scolaire","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Guadalupe Victoria":{"tags":{"name":"Guadalupe Victoria","amenity":"school"},"name":"Guadalupe Victoria","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Highland School":{"tags":{"name":"Highland School","amenity":"school"},"name":"Highland School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Ignacio Allende":{"tags":{"name":"Ignacio Allende","amenity":"school"},"name":"Ignacio Allende","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ignacio Zaragoza":{"tags":{"name":"Ignacio Zaragoza","amenity":"school"},"name":"Ignacio Zaragoza","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"suggestion":true},"amenity/school/Jackson School":{"tags":{"name":"Jackson School","amenity":"school"},"name":"Jackson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Jefferson School":{"tags":{"name":"Jefferson School","amenity":"school"},"name":"Jefferson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"suggestion":true},"amenity/school/Jose Vasconcelos":{"tags":{"name":"Jose Vasconcelos","amenity":"school"},"name":"Jose Vasconcelos","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Juan Escutia":{"tags":{"name":"Juan Escutia","amenity":"school"},"name":"Juan Escutia","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Justo Sierra":{"tags":{"name":"Justo Sierra","amenity":"school"},"name":"Justo Sierra","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Kumon":{"tags":{"name":"Kumon","amenity":"school"},"name":"Kumon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lazaro Cardenas":{"tags":{"name":"Lazaro Cardenas","amenity":"school"},"name":"Lazaro Cardenas","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Leona Vicario":{"tags":{"name":"Leona Vicario","amenity":"school"},"name":"Leona Vicario","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Liberty School":{"tags":{"name":"Liberty School","amenity":"school"},"name":"Liberty School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Lincoln School":{"tags":{"name":"Lincoln School","amenity":"school"},"name":"Lincoln School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Longfellow School":{"tags":{"name":"Longfellow School","amenity":"school"},"name":"Longfellow School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/school/McKinley School":{"tags":{"name":"McKinley School","amenity":"school"},"name":"McKinley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miguel Hidalgo":{"tags":{"name":"Miguel Hidalgo","amenity":"school"},"name":"Miguel Hidalgo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Miller School":{"tags":{"name":"Miller School","amenity":"school"},"name":"Miller School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Nicolas Bravo":{"tags":{"name":"Nicolas Bravo","amenity":"school"},"name":"Nicolas Bravo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Pedro Moreno":{"tags":{"name":"Pedro Moreno","amenity":"school"},"name":"Pedro Moreno","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pestalozzischule":{"tags":{"name":"Pestalozzischule","amenity":"school"},"name":"Pestalozzischule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Primaria Comunitaria":{"tags":{"name":"Primaria Comunitaria","amenity":"school"},"name":"Primaria Comunitaria","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ramon Corona":{"tags":{"name":"Ramon Corona","amenity":"school"},"name":"Ramon Corona","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Riverside School":{"tags":{"name":"Riverside School","amenity":"school"},"name":"Riverside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Roosevelt School":{"tags":{"name":"Roosevelt School","amenity":"school"},"name":"Roosevelt School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/SD":{"tags":{"name":"SD","amenity":"school"},"name":"SD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/SDN":{"tags":{"name":"SDN","amenity":"school"},"name":"SDN","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Schillerschule":{"tags":{"name":"Schillerschule","amenity":"school"},"name":"Schillerschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Smith School":{"tags":{"name":"Smith School","amenity":"school"},"name":"Smith School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Sunnyside School":{"tags":{"name":"Sunnyside School","amenity":"school"},"name":"Sunnyside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Trinity School":{"tags":{"name":"Trinity School","amenity":"school"},"name":"Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/UNIDAD EDUCATIVA":{"tags":{"name":"UNIDAD EDUCATIVA","amenity":"school"},"name":"UNIDAD EDUCATIVA","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Union School":{"tags":{"name":"Union School","amenity":"school"},"name":"Union School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Venustiano Carranza":{"tags":{"name":"Venustiano Carranza","amenity":"school"},"name":"Venustiano Carranza","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Vicente Guerrero":{"tags":{"name":"Vicente Guerrero","amenity":"school"},"name":"Vicente Guerrero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Volkshochschule":{"tags":{"name":"Volkshochschule","amenity":"school"},"name":"Volkshochschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Volksschule":{"tags":{"name":"Volksschule","amenity":"school"},"name":"Volksschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Washington School":{"tags":{"name":"Washington School","amenity":"school"},"name":"Washington School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/White School":{"tags":{"name":"White School","amenity":"school"},"name":"White School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"suggestion":true},"amenity/school/Wilson School":{"tags":{"name":"Wilson School","amenity":"school"},"name":"Wilson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"amenity/school/Școala Generală":{"tags":{"name":"Școala Generală","amenity":"school"},"name":"Școala Generală","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Școală":{"tags":{"name":"Școală","amenity":"school"},"name":"Școală","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Вечерняя школа":{"tags":{"name":"Вечерняя школа","amenity":"school"},"name":"Вечерняя школа","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Гимназия №1":{"tags":{"name":"Гимназия №1","amenity":"school"},"name":"Гимназия №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №1":{"tags":{"name":"Средняя школа №1","amenity":"school"},"name":"Средняя школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №2":{"tags":{"name":"Средняя школа №2","amenity":"school"},"name":"Средняя школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №3":{"tags":{"name":"Средняя школа №3","amenity":"school"},"name":"Средняя школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 1":{"tags":{"name":"Школа № 1","amenity":"school"},"name":"Школа № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 2":{"tags":{"name":"Школа № 2","amenity":"school"},"name":"Школа № 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 3":{"tags":{"name":"Школа № 3","amenity":"school"},"name":"Школа № 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 4":{"tags":{"name":"Школа № 4","amenity":"school"},"name":"Школа № 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 5":{"tags":{"name":"Школа № 5","amenity":"school"},"name":"Школа № 5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №1":{"tags":{"name":"Школа №1","amenity":"school"},"name":"Школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №10":{"tags":{"name":"Школа №10","amenity":"school"},"name":"Школа №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №11":{"tags":{"name":"Школа №11","amenity":"school"},"name":"Школа №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №12":{"tags":{"name":"Школа №12","amenity":"school"},"name":"Школа №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №13":{"tags":{"name":"Школа №13","amenity":"school"},"name":"Школа №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №14":{"tags":{"name":"Школа №14","amenity":"school"},"name":"Школа №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №15":{"tags":{"name":"Школа №15","amenity":"school"},"name":"Школа №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №16":{"tags":{"name":"Школа №16","amenity":"school"},"name":"Школа №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №17":{"tags":{"name":"Школа №17","amenity":"school"},"name":"Школа №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №18":{"tags":{"name":"Школа №18","amenity":"school"},"name":"Школа №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №19":{"tags":{"name":"Школа №19","amenity":"school"},"name":"Школа №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №2":{"tags":{"name":"Школа №2","amenity":"school"},"name":"Школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №20":{"tags":{"name":"Школа №20","amenity":"school"},"name":"Школа №20","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №21":{"tags":{"name":"Школа №21","amenity":"school"},"name":"Школа №21","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №22":{"tags":{"name":"Школа №22","amenity":"school"},"name":"Школа №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №23":{"tags":{"name":"Школа №23","amenity":"school"},"name":"Школа №23","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №24":{"tags":{"name":"Школа №24","amenity":"school"},"name":"Школа №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №25":{"tags":{"name":"Школа №25","amenity":"school"},"name":"Школа №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №26":{"tags":{"name":"Школа №26","amenity":"school"},"name":"Школа №26","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №27":{"tags":{"name":"Школа №27","amenity":"school"},"name":"Школа №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №28":{"tags":{"name":"Школа №28","amenity":"school"},"name":"Школа №28","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №3":{"tags":{"name":"Школа №3","amenity":"school"},"name":"Школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №31":{"tags":{"name":"Школа №31","amenity":"school"},"name":"Школа №31","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №35":{"tags":{"name":"Школа №35","amenity":"school"},"name":"Школа №35","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №4":{"tags":{"name":"Школа №4","amenity":"school"},"name":"Школа №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №5":{"tags":{"name":"Школа №5","amenity":"school"},"name":"Школа №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №6":{"tags":{"name":"Школа №6","amenity":"school"},"name":"Школа №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №7":{"tags":{"name":"Школа №7","amenity":"school"},"name":"Школа №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №8":{"tags":{"name":"Школа №8","amenity":"school"},"name":"Школа №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №9":{"tags":{"name":"Школа №9","amenity":"school"},"name":"Школа №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/مدرسة":{"tags":{"name":"مدرسة","amenity":"school"},"name":"مدرسة","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/مدرسه":{"tags":{"name":"مدرسه","amenity":"school"},"name":"مدرسه","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立南中学校":{"tags":{"name":"市立南中学校","amenity":"school"},"name":"市立南中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立南小学校":{"tags":{"name":"市立南小学校","amenity":"school"},"name":"市立南小学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立東中学校":{"tags":{"name":"市立東中学校","amenity":"school"},"name":"市立東中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"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/Anfiteatro":{"tags":{"name":"Anfiteatro","amenity":"theatre"},"name":"Anfiteatro","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},"amenity/theatre/Teatro Municipal":{"tags":{"name":"Teatro Municipal","amenity":"theatre"},"name":"Teatro Municipal","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/veterinary/Clinica Veterinaria":{"tags":{"name":"Clinica Veterinaria","amenity":"veterinary"},"name":"Clinica Veterinaria","icon":"veterinary","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"amenity/veterinary/Veterinaria":{"tags":{"name":"Veterinaria","amenity":"veterinary"},"name":"Veterinaria","icon":"veterinary","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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","address","building_area","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","address","building_area","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","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Curves":{"tags":{"name":"Curves","leisure":"sports_centre"},"name":"Curves","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","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","address","building_area","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","address","building_area","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","address","building_area","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","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/McFit":{"tags":{"name":"McFit","leisure":"sports_centre"},"name":"McFit","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","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","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Orlik":{"tags":{"name":"Orlik","leisure":"sports_centre"},"name":"Orlik","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","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","address","building_area","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","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Polideportivo":{"tags":{"name":"Polideportivo","leisure":"sports_centre"},"name":"Polideportivo","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","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","address","building_area","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","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/YMCA":{"tags":{"name":"YMCA","leisure":"sports_centre"},"name":"YMCA","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/ДЮСШ":{"tags":{"name":"ДЮСШ","leisure":"sports_centre"},"name":"ДЮСШ","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Ледовый дворец":{"tags":{"name":"Ледовый дворец","leisure":"sports_centre"},"name":"Ледовый дворец","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/体育館":{"tags":{"name":"体育館","leisure":"sports_centre"},"name":"体育館","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/bakery/Panaderia":{"tags":{"name":"Panaderia","shop":"bakery"},"name":"Panaderia","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/bakery/Булочная":{"tags":{"name":"Булочная","shop":"bakery"},"name":"Булочная","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Горячий хлеб":{"tags":{"name":"Горячий хлеб","shop":"bakery"},"name":"Горячий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Каравай":{"tags":{"name":"Каравай","shop":"bakery"},"name":"Каравай","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Кулиничи":{"tags":{"name":"Кулиничи","shop":"bakery"},"name":"Кулиничи","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Кулиничі":{"tags":{"name":"Кулиничі","shop":"bakery"},"name":"Кулиничі","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Свежий хлеб":{"tags":{"name":"Свежий хлеб","shop":"bakery"},"name":"Свежий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Хлеб":{"tags":{"name":"Хлеб","shop":"bakery"},"name":"Хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/مخبز":{"tags":{"name":"مخبز","shop":"bakery"},"name":"مخبز","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/مخبزة":{"tags":{"name":"مخبزة","shop":"bakery"},"name":"مخبزة","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نان لواش":{"tags":{"name":"نان لواش","shop":"bakery"},"name":"نان لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی":{"tags":{"name":"نانوایی","shop":"bakery"},"name":"نانوایی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی بربری":{"tags":{"name":"نانوایی بربری","shop":"bakery"},"name":"نانوایی بربری","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی سنگک":{"tags":{"name":"نانوایی سنگک","shop":"bakery"},"name":"نانوایی سنگک","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی سنگکی":{"tags":{"name":"نانوایی سنگکی","shop":"bakery"},"name":"نانوایی سنگکی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی لواش":{"tags":{"name":"نانوایی لواش","shop":"bakery"},"name":"نانوایی لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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","beauty"],"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","beauty"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/beverages/茶湯會":{"tags":{"name":"茶湯會","shop":"beverages"},"name":"茶湯會","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bicycle/Halfords":{"tags":{"name":"Halfords","shop":"bicycle"},"name":"Halfords","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bicycle/Веломарка":{"tags":{"name":"Веломарка","shop":"bicycle"},"name":"Веломарка","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bicycle/サイクルベースあさひ":{"tags":{"name":"サイクルベースあさひ","shop":"bicycle"},"name":"サイクルベースあさひ","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/bookmaker/ΟΠΑΠ":{"tags":{"name":"ΟΠΑΠ","shop":"bookmaker"},"name":"ΟΠΑΠ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/butcher/Ариант":{"tags":{"name":"Ариант","shop":"butcher"},"name":"Ариант","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Великолукский мясокомбинат":{"tags":{"name":"Великолукский мясокомбинат","shop":"butcher"},"name":"Великолукский мясокомбинат","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясная лавка":{"tags":{"name":"Мясная лавка","shop":"butcher"},"name":"Мясная лавка","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясницкий ряд":{"tags":{"name":"Мясницкий ряд","shop":"butcher"},"name":"Мясницкий ряд","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясной":{"tags":{"name":"Мясной","shop":"butcher"},"name":"Мясной","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясо":{"tags":{"name":"Мясо","shop":"butcher"},"name":"Мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Наша Ряба":{"tags":{"name":"Наша Ряба","shop":"butcher"},"name":"Наша Ряба","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Свежее мясо":{"tags":{"name":"Свежее мясо","shop":"butcher"},"name":"Свежее мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car/Audi":{"tags":{"name":"Audi","shop":"car"},"name":"Audi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/BMW":{"tags":{"name":"BMW","shop":"car"},"name":"BMW","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Chevrolet":{"tags":{"name":"Chevrolet","shop":"car"},"name":"Chevrolet","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"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","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Dacia":{"tags":{"name":"Dacia","shop":"car"},"name":"Dacia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Fiat":{"tags":{"name":"Fiat","shop":"car"},"name":"Fiat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Ford":{"tags":{"name":"Ford","shop":"car"},"name":"Ford","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Honda":{"tags":{"name":"Honda","shop":"car"},"name":"Honda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Hyundai":{"tags":{"name":"Hyundai","shop":"car"},"name":"Hyundai","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Isuzu":{"tags":{"name":"Isuzu","shop":"car"},"name":"Isuzu","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Kia":{"tags":{"name":"Kia","shop":"car"},"name":"Kia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"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","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Lexus":{"tags":{"name":"Lexus","shop":"car"},"name":"Lexus","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mazda":{"tags":{"name":"Mazda","shop":"car"},"name":"Mazda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"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","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mitsubishi":{"tags":{"name":"Mitsubishi","shop":"car"},"name":"Mitsubishi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"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","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/NISSAN":{"tags":{"name":"NISSAN","shop":"car"},"name":"NISSAN","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Nissan":{"tags":{"name":"Nissan","shop":"car"},"name":"Nissan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Opel":{"tags":{"name":"Opel","shop":"car"},"name":"Opel","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Peugeot":{"tags":{"name":"Peugeot","shop":"car"},"name":"Peugeot","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Porsche":{"tags":{"name":"Porsche","shop":"car"},"name":"Porsche","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Renault":{"tags":{"name":"Renault","shop":"car"},"name":"Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Seat":{"tags":{"name":"Seat","shop":"car"},"name":"Seat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Skoda":{"tags":{"name":"Skoda","shop":"car"},"name":"Skoda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Subaru":{"tags":{"name":"Subaru","shop":"car"},"name":"Subaru","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Suzuki":{"tags":{"name":"Suzuki","shop":"car"},"name":"Suzuki","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Toyota":{"tags":{"name":"Toyota","shop":"car"},"name":"Toyota","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Volkswagen":{"tags":{"name":"Volkswagen","shop":"car"},"name":"Volkswagen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Volvo":{"tags":{"name":"Volvo","shop":"car"},"name":"Volvo","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/car_parts/Автозапчастини":{"tags":{"name":"Автозапчастини","shop":"car_parts"},"name":"Автозапчастини","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Автомир":{"tags":{"name":"Автомир","shop":"car_parts"},"name":"Автомир","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/イエローハット":{"tags":{"name":"イエローハット","shop":"car_parts"},"name":"イエローハット","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/オートバックス":{"tags":{"name":"オートバックス","shop":"car_parts"},"name":"オートバックス","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/タイヤ館":{"tags":{"name":"タイヤ館","shop":"car_parts"},"name":"タイヤ館","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"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","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автомастерская":{"tags":{"name":"Автомастерская","shop":"car_repair"},"name":"Автомастерская","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Авторемонт":{"tags":{"name":"Авторемонт","shop":"car_repair"},"name":"Авторемонт","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автосервис":{"tags":{"name":"Автосервис","shop":"car_repair"},"name":"Автосервис","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автосервис+шиномонтаж":{"tags":{"name":"Автосервис+шиномонтаж","shop":"car_repair"},"name":"Автосервис+шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Замена масла":{"tags":{"name":"Замена масла","shop":"car_repair"},"name":"Замена масла","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/СТО":{"tags":{"name":"СТО","shop":"car_repair"},"name":"СТО","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Шиномонтаж":{"tags":{"name":"Шиномонтаж","shop":"car_repair"},"name":"Шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/шиномонтаж":{"tags":{"name":"шиномонтаж","shop":"car_repair"},"name":"шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"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"],"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"],"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","opening_hours","second_hand"],"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","opening_hours","second_hand"],"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","opening_hours","second_hand"],"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","opening_hours","second_hand"],"suggestion":true},"shop/charity/Oxfam":{"tags":{"name":"Oxfam","shop":"charity"},"name":"Oxfam","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"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","opening_hours","second_hand"],"suggestion":true},"shop/charity/Scope":{"tags":{"name":"Scope","shop":"charity"},"name":"Scope","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"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","opening_hours","second_hand"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/chemist/Бытовая химия":{"tags":{"name":"Бытовая химия","shop":"chemist"},"name":"Бытовая химия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Магнит Косметик":{"tags":{"name":"Магнит Косметик","shop":"chemist"},"name":"Магнит Косметик","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Мила":{"tags":{"name":"Мила","shop":"chemist"},"name":"Мила","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Остров чистоты":{"tags":{"name":"Остров чистоты","shop":"chemist"},"name":"Остров чистоты","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Рубль Бум":{"tags":{"name":"Рубль Бум","shop":"chemist"},"name":"Рубль Бум","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Улыбка радуги":{"tags":{"name":"Улыбка радуги","shop":"chemist"},"name":"Улыбка радуги","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/屈臣氏":{"tags":{"name":"屈臣氏","shop":"chemist"},"name":"屈臣氏","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/康是美":{"tags":{"name":"康是美","shop":"chemist"},"name":"康是美","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/clothes/Детская одежда":{"tags":{"name":"Детская одежда","shop":"clothes"},"name":"Детская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Женская одежда":{"tags":{"name":"Женская одежда","shop":"clothes"},"name":"Женская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Липненски":{"tags":{"name":"Липненски","shop":"clothes"},"name":"Липненски","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Московская ярмарка":{"tags":{"name":"Московская ярмарка","shop":"clothes"},"name":"Московская ярмарка","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Одежда":{"tags":{"name":"Одежда","shop":"clothes"},"name":"Одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Смешные цены":{"tags":{"name":"Смешные цены","shop":"clothes"},"name":"Смешные цены","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Спецодежда":{"tags":{"name":"Спецодежда","shop":"clothes"},"name":"Спецодежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/しまむら":{"tags":{"name":"しまむら","shop":"clothes"},"name":"しまむら","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/ユニクロ":{"tags":{"name":"ユニクロ","shop":"clothes"},"name":"ユニクロ","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/ワークマン":{"tags":{"name":"ワークマン","shop":"clothes"},"name":"ワークマン","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/洋服の青山":{"tags":{"name":"洋服の青山","shop":"clothes"},"name":"洋服の青山","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/西松屋":{"tags":{"name":"西松屋","shop":"clothes"},"name":"西松屋","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/computer/ДНС":{"tags":{"name":"ДНС","shop":"computer"},"name":"ДНС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/convenience/Minimarket":{"tags":{"name":"Minimarket","shop":"convenience"},"name":"Minimarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/convenience/Августина":{"tags":{"name":"Августина","shop":"convenience"},"name":"Августина","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Авоська":{"tags":{"name":"Авоська","shop":"convenience"},"name":"Авоська","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Агрокомплекс":{"tags":{"name":"Агрокомплекс","shop":"convenience"},"name":"Агрокомплекс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Альянс":{"tags":{"name":"Альянс","shop":"convenience"},"name":"Альянс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Апельсин":{"tags":{"name":"Апельсин","shop":"convenience"},"name":"Апельсин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ассорти":{"tags":{"name":"Ассорти","shop":"convenience"},"name":"Ассорти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Белорусские продукты":{"tags":{"name":"Белорусские продукты","shop":"convenience"},"name":"Белорусские продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Берёзка":{"tags":{"name":"Берёзка","shop":"convenience"},"name":"Берёзка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Везунчик":{"tags":{"name":"Везунчик","shop":"convenience"},"name":"Везунчик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Весна":{"tags":{"name":"Весна","shop":"convenience"},"name":"Весна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ветеран":{"tags":{"name":"Ветеран","shop":"convenience"},"name":"Ветеран","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Визит":{"tags":{"name":"Визит","shop":"convenience"},"name":"Визит","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Виктория":{"tags":{"name":"Виктория","shop":"convenience"},"name":"Виктория","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ВкусВилл":{"tags":{"name":"ВкусВилл","shop":"convenience"},"name":"ВкусВилл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гастроном":{"tags":{"name":"Гастроном","shop":"convenience"},"name":"Гастроном","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гермес":{"tags":{"name":"Гермес","shop":"convenience"},"name":"Гермес","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гурман":{"tags":{"name":"Гурман","shop":"convenience"},"name":"Гурман","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Домашний":{"tags":{"name":"Домашний","shop":"convenience"},"name":"Домашний","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Елена":{"tags":{"name":"Елена","shop":"convenience"},"name":"Елена","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ермолино":{"tags":{"name":"Ермолино","shop":"convenience"},"name":"Ермолино","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Калинка":{"tags":{"name":"Калинка","shop":"convenience"},"name":"Калинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кировский":{"tags":{"name":"Кировский","shop":"convenience"},"name":"Кировский","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Колобок":{"tags":{"name":"Колобок","shop":"convenience"},"name":"Колобок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Колосок":{"tags":{"name":"Колосок","shop":"convenience"},"name":"Колосок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Копеечка":{"tags":{"name":"Копеечка","shop":"convenience"},"name":"Копеечка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Копейка":{"tags":{"name":"Копейка","shop":"convenience"},"name":"Копейка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Корзинка":{"tags":{"name":"Корзинка","shop":"convenience"},"name":"Корзинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Крамниця":{"tags":{"name":"Крамниця","shop":"convenience"},"name":"Крамниця","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кристалл":{"tags":{"name":"Кристалл","shop":"convenience"},"name":"Кристалл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кулинария":{"tags":{"name":"Кулинария","shop":"convenience"},"name":"Кулинария","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Купец":{"tags":{"name":"Купец","shop":"convenience"},"name":"Купец","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ласточка":{"tags":{"name":"Ласточка","shop":"convenience"},"name":"Ласточка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Лидер":{"tags":{"name":"Лидер","shop":"convenience"},"name":"Лидер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Любимый":{"tags":{"name":"Любимый","shop":"convenience"},"name":"Любимый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Люкс":{"tags":{"name":"Люкс","shop":"convenience"},"name":"Люкс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Магазин при АЗС":{"tags":{"name":"Магазин при АЗС","shop":"convenience"},"name":"Магазин при АЗС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мария-Ра":{"tags":{"name":"Мария-Ра","shop":"convenience"},"name":"Мария-Ра","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Маяк":{"tags":{"name":"Маяк","shop":"convenience"},"name":"Маяк","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Меркурий":{"tags":{"name":"Меркурий","shop":"convenience"},"name":"Меркурий","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мечта":{"tags":{"name":"Мечта","shop":"convenience"},"name":"Мечта","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Минимаркет":{"tags":{"name":"Минимаркет","shop":"convenience"},"name":"Минимаркет","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мираж":{"tags":{"name":"Мираж","shop":"convenience"},"name":"Мираж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Надежда":{"tags":{"name":"Надежда","shop":"convenience"},"name":"Надежда","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ника":{"tags":{"name":"Ника","shop":"convenience"},"name":"Ника","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Оазис":{"tags":{"name":"Оазис","shop":"convenience"},"name":"Оазис","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Олимп":{"tags":{"name":"Олимп","shop":"convenience"},"name":"Олимп","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Подсолнух":{"tags":{"name":"Подсолнух","shop":"convenience"},"name":"Подсолнух","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Престиж":{"tags":{"name":"Престиж","shop":"convenience"},"name":"Престиж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукти":{"tags":{"name":"Продукти","shop":"convenience"},"name":"Продукти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продуктовый":{"tags":{"name":"Продуктовый","shop":"convenience"},"name":"Продуктовый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продуктовый магазин":{"tags":{"name":"Продуктовый магазин","shop":"convenience"},"name":"Продуктовый магазин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукты":{"tags":{"name":"Продукты","shop":"convenience"},"name":"Продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/convenience/Радуга":{"tags":{"name":"Радуга","shop":"convenience"},"name":"Радуга","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Родны кут":{"tags":{"name":"Родны кут","shop":"convenience"},"name":"Родны кут","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ромашка":{"tags":{"name":"Ромашка","shop":"convenience"},"name":"Ромашка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Русь":{"tags":{"name":"Русь","shop":"convenience"},"name":"Русь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Светлана":{"tags":{"name":"Светлана","shop":"convenience"},"name":"Светлана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Смак":{"tags":{"name":"Смак","shop":"convenience"},"name":"Смак","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Солнечный":{"tags":{"name":"Солнечный","shop":"convenience"},"name":"Солнечный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Татьяна":{"tags":{"name":"Татьяна","shop":"convenience"},"name":"Татьяна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Тройка":{"tags":{"name":"Тройка","shop":"convenience"},"name":"Тройка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/У Палыча":{"tags":{"name":"У Палыча","shop":"convenience"},"name":"У Палыча","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Универсам":{"tags":{"name":"Универсам","shop":"convenience"},"name":"Универсам","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Фортуна":{"tags":{"name":"Фортуна","shop":"convenience"},"name":"Фортуна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Хороший":{"tags":{"name":"Хороший","shop":"convenience"},"name":"Хороший","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Центральный":{"tags":{"name":"Центральный","shop":"convenience"},"name":"Центральный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Чайка":{"tags":{"name":"Чайка","shop":"convenience"},"name":"Чайка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Шанс":{"tags":{"name":"Шанс","shop":"convenience"},"name":"Шанс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Эконом":{"tags":{"name":"Эконом","shop":"convenience"},"name":"Эконом","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Юбилейный":{"tags":{"name":"Юбилейный","shop":"convenience"},"name":"Юбилейный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Юлия":{"tags":{"name":"Юлия","shop":"convenience"},"name":"Юлия","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/продукты":{"tags":{"name":"продукты","shop":"convenience"},"name":"продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/მარკეტი":{"tags":{"name":"მარკეტი","shop":"convenience"},"name":"მარკეტი","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"suggestion":true},"shop/convenience/スリーエフ":{"tags":{"name":"スリーエフ","shop":"convenience"},"name":"スリーエフ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セイコーマート":{"tags":{"name":"セイコーマート","shop":"convenience"},"name":"セイコーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"suggestion":true},"shop/convenience/セーブオン":{"tags":{"name":"セーブオン","shop":"convenience"},"name":"セーブオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/デイリーヤマザキ":{"tags":{"name":"デイリーヤマザキ","shop":"convenience"},"name":"デイリーヤマザキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/convenience/ポプラ":{"tags":{"name":"ポプラ","shop":"convenience"},"name":"ポプラ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/convenience/ヤマザキショップ":{"tags":{"name":"ヤマザキショップ","shop":"convenience"},"name":"ヤマザキショップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"suggestion":true},"shop/convenience/全家":{"tags":{"name":"全家","shop":"convenience"},"name":"全家","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/全家便利商店":{"tags":{"name":"全家便利商店","shop":"convenience"},"name":"全家便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/萊爾富":{"tags":{"name":"萊爾富","shop":"convenience"},"name":"萊爾富","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/세븐일레븐":{"tags":{"name":"세븐일레븐","shop":"convenience"},"name":"세븐일레븐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/cosmetics/Л'Этуаль":{"tags":{"name":"Л'Этуаль","shop":"cosmetics"},"name":"Л'Этуаль","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Магнит косметик":{"tags":{"name":"Магнит косметик","shop":"cosmetics"},"name":"Магнит косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Магнит-Косметик":{"tags":{"name":"Магнит-Косметик","shop":"cosmetics"},"name":"Магнит-Косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Подружка":{"tags":{"name":"Подружка","shop":"cosmetics"},"name":"Подружка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/department_store/Универмаг":{"tags":{"name":"Универмаг","shop":"department_store"},"name":"Универмаг","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/doityourself/Леруа Мерлен":{"tags":{"name":"Леруа Мерлен","shop":"doityourself"},"name":"Леруа Мерлен","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Мастер":{"tags":{"name":"Мастер","shop":"doityourself"},"name":"Мастер","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Строитель":{"tags":{"name":"Строитель","shop":"doityourself"},"name":"Строитель","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Стройматериалы":{"tags":{"name":"Стройматериалы","shop":"doityourself"},"name":"Стройматериалы","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/カインズホーム":{"tags":{"name":"カインズホーム","shop":"doityourself"},"name":"カインズホーム","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/コメリ":{"tags":{"name":"コメリ","shop":"doityourself"},"name":"コメリ","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/コーナン":{"tags":{"name":"コーナン","shop":"doityourself"},"name":"コーナン","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"suggestion":true},"shop/dry_cleaning/Диана":{"tags":{"name":"Диана","shop":"dry_cleaning"},"name":"Диана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Химчистка":{"tags":{"name":"Химчистка","shop":"dry_cleaning"},"name":"Химчистка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/ホワイト急便":{"tags":{"name":"ホワイト急便","shop":"dry_cleaning"},"name":"ホワイト急便","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/electronics/М.Видео":{"tags":{"name":"М.Видео","shop":"electronics"},"name":"М.Видео","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Фокстрот":{"tags":{"name":"Фокстрот","shop":"electronics"},"name":"Фокстрот","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Эксперт":{"tags":{"name":"Эксперт","shop":"electronics"},"name":"Эксперт","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Эльдорадо":{"tags":{"name":"Эльдорадо","shop":"electronics"},"name":"Эльдорадо","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/エディオン":{"tags":{"name":"エディオン","shop":"electronics"},"name":"エディオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/ケーズデンキ":{"tags":{"name":"ケーズデンキ","shop":"electronics"},"name":"ケーズデンキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/コジマ":{"tags":{"name":"コジマ","shop":"electronics"},"name":"コジマ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/ヤマダ電機":{"tags":{"name":"ヤマダ電機","shop":"electronics"},"name":"ヤマダ電機","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/全國電子":{"tags":{"name":"全國電子","shop":"electronics"},"name":"全國電子","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"suggestion":true},"shop/fabric/Ткани":{"tags":{"name":"Ткани","shop":"fabric"},"name":"Ткани","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/florist/Квіти":{"tags":{"name":"Квіти","shop":"florist"},"name":"Квіти","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Цветочный магазин":{"tags":{"name":"Цветочный магазин","shop":"florist"},"name":"Цветочный магазин","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Цветы":{"tags":{"name":"Цветы","shop":"florist"},"name":"Цветы","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/funeral_directors/Funeraria":{"tags":{"name":"Funeraria","shop":"funeral_directors"},"name":"Funeraria","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/furniture/Меблі":{"tags":{"name":"Меблі","shop":"furniture"},"name":"Меблі","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/ニトリ":{"tags":{"name":"ニトリ","shop":"furniture"},"name":"ニトリ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/gift/Подарки":{"tags":{"name":"Подарки","shop":"gift"},"name":"Подарки","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/greengrocer/Овощи и фрукты":{"tags":{"name":"Овощи и фрукты","shop":"greengrocer"},"name":"Овощи и фрукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Barbershop":{"tags":{"name":"Barbershop","shop":"hairdresser"},"name":"Barbershop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/hairdresser/Salon":{"tags":{"name":"Salon","shop":"hairdresser"},"name":"Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/hairdresser/Локон":{"tags":{"name":"Локон","shop":"hairdresser"},"name":"Локон","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Парикмахерская":{"tags":{"name":"Парикмахерская","shop":"hairdresser"},"name":"Парикмахерская","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Перукарня":{"tags":{"name":"Перукарня","shop":"hairdresser"},"name":"Перукарня","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Салон красоты":{"tags":{"name":"Салон красоты","shop":"hairdresser"},"name":"Салон красоты","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Стиль":{"tags":{"name":"Стиль","shop":"hairdresser"},"name":"Стиль","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Шарм":{"tags":{"name":"Шарм","shop":"hairdresser"},"name":"Шарм","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/حلاق":{"tags":{"name":"حلاق","shop":"hairdresser"},"name":"حلاق","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/hardware/Промтовары":{"tags":{"name":"Промтовары","shop":"hardware"},"name":"Промтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Сантехника":{"tags":{"name":"Сантехника","shop":"hardware"},"name":"Сантехника","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Товары для дома":{"tags":{"name":"Товары для дома","shop":"hardware"},"name":"Товары для дома","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Хозтовары":{"tags":{"name":"Хозтовары","shop":"hardware"},"name":"Хозтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/jewelry/Адамас":{"tags":{"name":"Адамас","shop":"jewelry"},"name":"Адамас","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Золото":{"tags":{"name":"Золото","shop":"jewelry"},"name":"Золото","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/kiosk/Kiosco":{"tags":{"name":"Kiosco","shop":"kiosk"},"name":"Kiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/kiosk/Белсоюзпечать":{"tags":{"name":"Белсоюзпечать","shop":"kiosk"},"name":"Белсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Киоск":{"tags":{"name":"Киоск","shop":"kiosk"},"name":"Киоск","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Мороженое":{"tags":{"name":"Мороженое","shop":"kiosk"},"name":"Мороженое","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"suggestion":true},"shop/kitchen/Kitchen":{"tags":{"name":"Kitchen","shop":"kitchen"},"name":"Kitchen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/kitchen":{"tags":{"name":"kitchen","shop":"kitchen"},"name":"kitchen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"suggestion":true},"shop/laundry/コインランドリー":{"tags":{"name":"コインランドリー","shop":"laundry"},"name":"コインランドリー","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/mobile_phone/Cricket":{"tags":{"name":"Cricket","shop":"mobile_phone"},"name":"Cricket","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/newsagent/Витебскоблсоюзпечать":{"tags":{"name":"Витебскоблсоюзпечать","shop":"newsagent"},"name":"Витебскоблсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Первая полоса":{"tags":{"name":"Первая полоса","shop":"newsagent"},"name":"Первая полоса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Печать":{"tags":{"name":"Печать","shop":"newsagent"},"name":"Печать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Роспечать":{"tags":{"name":"Роспечать","shop":"newsagent"},"name":"Роспечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Союзпечать":{"tags":{"name":"Союзпечать","shop":"newsagent"},"name":"Союзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/optician/Optica":{"tags":{"name":"Optica","shop":"optician"},"name":"Optica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/optician/แว่นท็อปเจริญ":{"tags":{"name":"แว่นท็อปเจริญ","shop":"optician"},"name":"แว่นท็อปเจริญ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/メガネスーパー":{"tags":{"name":"メガネスーパー","shop":"optician"},"name":"メガネスーパー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/眼鏡市場":{"tags":{"name":"眼鏡市場","shop":"optician"},"name":"眼鏡市場","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"suggestion":true},"shop/outdoor/Рыболов":{"tags":{"name":"Рыболов","shop":"outdoor"},"name":"Рыболов","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/pet/Бетховен":{"tags":{"name":"Бетховен","shop":"pet"},"name":"Бетховен","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Зоотовары":{"tags":{"name":"Зоотовары","shop":"pet"},"name":"Зоотовары","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Четыре лапы":{"tags":{"name":"Четыре лапы","shop":"pet"},"name":"Четыре лапы","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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","opening_hours","second_hand"],"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","opening_hours","second_hand"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/shoes/Ремонт обуви":{"tags":{"name":"Ремонт обуви","shop":"shoes"},"name":"Ремонт обуви","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/ЦентрОбувь":{"tags":{"name":"ЦентрОбувь","shop":"shoes"},"name":"ЦентрОбувь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Юничел":{"tags":{"name":"Юничел","shop":"shoes"},"name":"Юничел","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/東京靴流通センター":{"tags":{"name":"東京靴流通センター","shop":"shoes"},"name":"東京靴流通センター","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/sports/Stadium":{"tags":{"name":"Stadium","shop":"sports"},"name":"Stadium","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Спортмастер":{"tags":{"name":"Спортмастер","shop":"sports"},"name":"Спортмастер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Спорттовары":{"tags":{"name":"Спорттовары","shop":"sports"},"name":"Спорттовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/stationery/Канцтовары":{"tags":{"name":"Канцтовары","shop":"stationery"},"name":"Канцтовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/supermarket/Casino":{"tags":{"name":"Casino","shop":"supermarket"},"name":"Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/supermarket/Mercado":{"tags":{"name":"Mercado","shop":"supermarket"},"name":"Mercado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/supermarket/ΑΒ Βασιλόπουλος":{"tags":{"name":"ΑΒ Βασιλόπουλος","shop":"supermarket"},"name":"ΑΒ Βασιλόπουλος","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Γαλαξίας":{"tags":{"name":"Γαλαξίας","shop":"supermarket"},"name":"Γαλαξίας","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Μασούτης":{"tags":{"name":"Μασούτης","shop":"supermarket"},"name":"Μασούτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Σκλαβενίτης":{"tags":{"name":"Σκλαβενίτης","shop":"supermarket"},"name":"Σκλαβενίτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/АТБ":{"tags":{"name":"АТБ","shop":"supermarket"},"name":"АТБ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Абсолют":{"tags":{"name":"Абсолют","shop":"supermarket"},"name":"Абсолют","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Азбука Вкуса":{"tags":{"name":"Азбука Вкуса","shop":"supermarket"},"name":"Азбука Вкуса","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Атак":{"tags":{"name":"Атак","shop":"supermarket"},"name":"Атак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ашан":{"tags":{"name":"Ашан","shop":"supermarket"},"name":"Ашан","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Верный":{"tags":{"name":"Верный","shop":"supermarket"},"name":"Верный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Вопак":{"tags":{"name":"Вопак","shop":"supermarket"},"name":"Вопак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Гроздь":{"tags":{"name":"Гроздь","shop":"supermarket"},"name":"Гроздь","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Десяточка":{"tags":{"name":"Десяточка","shop":"supermarket"},"name":"Десяточка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Дикси":{"tags":{"name":"Дикси","shop":"supermarket"},"name":"Дикси","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Евроопт":{"tags":{"name":"Евроопт","shop":"supermarket"},"name":"Евроопт","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Карусель":{"tags":{"name":"Карусель","shop":"supermarket"},"name":"Карусель","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Квартал":{"tags":{"name":"Квартал","shop":"supermarket"},"name":"Квартал","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Командор":{"tags":{"name":"Командор","shop":"supermarket"},"name":"Командор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Красный Яр":{"tags":{"name":"Красный Яр","shop":"supermarket"},"name":"Красный Яр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Лента":{"tags":{"name":"Лента","shop":"supermarket"},"name":"Лента","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Магнит":{"tags":{"name":"Магнит","shop":"supermarket"},"name":"Магнит","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Магнолия":{"tags":{"name":"Магнолия","shop":"supermarket"},"name":"Магнолия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Монетка":{"tags":{"name":"Монетка","shop":"supermarket"},"name":"Монетка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/supermarket/Перекресток":{"tags":{"name":"Перекресток","shop":"supermarket"},"name":"Перекресток","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Покупочка":{"tags":{"name":"Покупочка","shop":"supermarket"},"name":"Покупочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Полушка":{"tags":{"name":"Полушка","shop":"supermarket"},"name":"Полушка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Пятёрочка":{"tags":{"name":"Пятёрочка","shop":"supermarket"},"name":"Пятёрочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Радеж":{"tags":{"name":"Радеж","shop":"supermarket"},"name":"Радеж","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Рукавичка":{"tags":{"name":"Рукавичка","shop":"supermarket"},"name":"Рукавичка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Светофор":{"tags":{"name":"Светофор","shop":"supermarket"},"name":"Светофор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Седьмой континент":{"tags":{"name":"Седьмой континент","shop":"supermarket"},"name":"Седьмой континент","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Семейный":{"tags":{"name":"Семейный","shop":"supermarket"},"name":"Семейный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Семья":{"tags":{"name":"Семья","shop":"supermarket"},"name":"Семья","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Супермаркет":{"tags":{"name":"Супермаркет","shop":"supermarket"},"name":"Супермаркет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Сільпо":{"tags":{"name":"Сільпо","shop":"supermarket"},"name":"Сільпо","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Таврія‑В":{"tags":{"name":"Таврія‑В","shop":"supermarket"},"name":"Таврія‑В","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Фора":{"tags":{"name":"Фора","shop":"supermarket"},"name":"Фора","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Фуршет":{"tags":{"name":"Фуршет","shop":"supermarket"},"name":"Фуршет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Хүнсний дэлгүүр":{"tags":{"name":"Хүнсний дэлгүүр","shop":"supermarket"},"name":"Хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Эдельвейс":{"tags":{"name":"Эдельвейс","shop":"supermarket"},"name":"Эдельвейс","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/хүнсний дэлгүүр":{"tags":{"name":"хүнсний дэлгүүр","shop":"supermarket"},"name":"хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/بقالة":{"tags":{"name":"بقالة","shop":"supermarket"},"name":"بقالة","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/سوپر مارکت":{"tags":{"name":"سوپر مارکت","shop":"supermarket"},"name":"سوپر مارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/سوپرمارکت":{"tags":{"name":"سوپرمارکت","shop":"supermarket"},"name":"سوپرمارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/いなげや":{"tags":{"name":"いなげや","shop":"supermarket"},"name":"いなげや","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/まいばすけっと":{"tags":{"name":"まいばすけっと","shop":"supermarket"},"name":"まいばすけっと","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/イオン":{"tags":{"name":"イオン","shop":"supermarket"},"name":"イオン","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/イトーヨーカドー":{"tags":{"name":"イトーヨーカドー","shop":"supermarket"},"name":"イトーヨーカドー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/カスミ":{"tags":{"name":"カスミ","shop":"supermarket"},"name":"カスミ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/マックスバリュ":{"tags":{"name":"マックスバリュ","shop":"supermarket"},"name":"マックスバリュ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/マルエツ":{"tags":{"name":"マルエツ","shop":"supermarket"},"name":"マルエツ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ライフ":{"tags":{"name":"ライフ","shop":"supermarket"},"name":"ライフ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/全聯":{"tags":{"name":"全聯","shop":"supermarket"},"name":"全聯","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/全聯福利中心":{"tags":{"name":"全聯福利中心","shop":"supermarket"},"name":"全聯福利中心","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/supermarket/業務スーパー":{"tags":{"name":"業務スーパー","shop":"supermarket"},"name":"業務スーパー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/美廉社":{"tags":{"name":"美廉社","shop":"supermarket"},"name":"美廉社","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/西友":{"tags":{"name":"西友","shop":"supermarket"},"name":"西友","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"suggestion":true},"shop/tattoo/Tattoo":{"tags":{"name":"Tattoo","shop":"tattoo"},"name":"Tattoo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"suggestion":true},"shop/ticket/Касса":{"tags":{"name":"Касса","shop":"ticket"},"name":"Касса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Проездные билеты":{"tags":{"name":"Проездные билеты","shop":"ticket"},"name":"Проездные билеты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/tobacco/Табакерка":{"tags":{"name":"Табакерка","shop":"tobacco"},"name":"Табакерка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/toys/Детский мир":{"tags":{"name":"Детский мир","shop":"toys"},"name":"Детский мир","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Игрушки":{"tags":{"name":"Игрушки","shop":"toys"},"name":"Игрушки","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/tyres/Vulcanizing Shop":{"tags":{"name":"Vulcanizing Shop","shop":"tyres"},"name":"Vulcanizing Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Вулканизация":{"tags":{"name":"Вулканизация","shop":"tyres"},"name":"Вулканизация","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/variety_store/ダイソー":{"tags":{"name":"ダイソー","shop":"variety_store"},"name":"ダイソー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"suggestion":true},"shop/video/ゲオ":{"tags":{"name":"ゲオ","shop":"video"},"name":"ゲオ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"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"],"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"],"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"],"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"],"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":"monument","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":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Lavoir":{"tags":{"name":"Lavoir","tourism":"attraction"},"name":"Lavoir","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Maibaum":{"tags":{"name":"Maibaum","tourism":"attraction"},"name":"Maibaum","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moab trail":{"tags":{"name":"Moab trail","tourism":"attraction"},"name":"Moab trail","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moai":{"tags":{"name":"Moai","tourism":"attraction"},"name":"Moai","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/OWŚ":{"tags":{"name":"OWŚ","tourism":"attraction"},"name":"OWŚ","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Sommerrodelbahn":{"tags":{"name":"Sommerrodelbahn","tourism":"attraction"},"name":"Sommerrodelbahn","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path continues":{"tags":{"name":"path continues","tourism":"attraction"},"name":"path continues","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path contiunes":{"tags":{"name":"path contiunes","tourism":"attraction"},"name":"path contiunes","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/white blaze":{"tags":{"name":"white blaze","tourism":"attraction"},"name":"white blaze","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Кладбище еврейское":{"tags":{"name":"Кладбище еврейское","tourism":"attraction"},"name":"Кладбище еврейское","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Колесо обозрения":{"tags":{"name":"Колесо обозрения","tourism":"attraction"},"name":"Колесо обозрения","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Приусадебный парк":{"tags":{"name":"Приусадебный парк","tourism":"attraction"},"name":"Приусадебный парк","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Усадьба":{"tags":{"name":"Усадьба","tourism":"attraction"},"name":"Усадьба","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Хозяйственный двор":{"tags":{"name":"Хозяйственный двор","tourism":"attraction"},"name":"Хозяйственный двор","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Часовня":{"tags":{"name":"Часовня","tourism":"attraction"},"name":"Часовня","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/дольмен":{"tags":{"name":"дольмен","tourism":"attraction"},"name":"дольмен","icon":"monument","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/camp_site/Campsite":{"tags":{"name":"Campsite","tourism":"camp_site"},"name":"Campsite","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/Guest House":{"tags":{"name":"Guest House","tourism":"guest_house"},"name":"Guest House","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/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":{"tags":{"name":"Motel","tourism":"motel"},"name":"Motel","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/Museum":{"tags":{"name":"Museum","tourism":"museum"},"name":"Museum","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}};
23192
23193 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","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
23194
23195 var categories = {"category-barrier":{"icon":"roadblock","geometry":"line","name":"Barrier Features","members":["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier"]},"category-building":{"icon":"building","geometry":"area","name":"Building Features","members":["building","building/house","building/apartments","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/bus","type/route/train","type/route/tram","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"]}};
23196
23197 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"},"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..."},"cardinal_direction":{"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"}}},"castle_type":{"key":"castle_type","type":"combo","label":"Type"},"clock_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}}},"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"]},"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"},"milestone_position":{"key":"railway:position","type":"text","placeholder":"Distance to one decimal (123.4)","label":"Milestone Position"},"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"}}},"oneway":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}}},"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..."},"parallel_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward"}}},"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"},"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"},"rating":{"key":"rating","type":"combo","label":"Power Rating","snake_case":false},"recycling_accepts":{"key":"recycling:","type":"multiCombo","label":"Accepts"},"recycling_type":{"key":"recycling_type","default":"container","type":"combo","label":"Recycling Type","strings":{"options":{"container":"Container","centre":"Recycling Center"}}},"ref_aeroway_gate":{"key":"ref","type":"text","label":"Gate Number"},"ref_golf_hole":{"key":"ref","type":"text","label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"key":"ref","type":"text","label":"Junction Number"},"ref_platform":{"key":"ref","type":"text","label":"Platform Number"},"ref_road_number":{"key":"ref","type":"text","label":"Road Number"},"ref_route":{"key":"ref","type":"text","label":"Route Number"},"ref_runway":{"key":"ref","type":"text","label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"key":"ref","type":"text","label":"Stop Number"},"ref_taxiway":{"key":"ref","type":"text","label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"key":"ref","type":"text","label":"Reference Code"},"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,"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"},"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"},"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"}}}};
23198
23199 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"];
23200 var all$1 = {
23201         all: all
23202 };
23203
23204 var all$2 = Object.freeze({
23205         all: all,
23206         default: all$1
23207 });
23208
23209 var Airport = ["airfield","airport","heliport","rocket"];
23210 var Dining = ["bakery","bar","beer","cafe","fast-food","ice-cream","restaurant"];
23211 var Education = ["college","school"];
23212 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"];
23213 var Health = ["dentist","doctor","hospital","pharmacy"];
23214 var Outdoors = ["campsite","cemetery","dog-park","garden","golf","park","picnic-site","playground","zoo"];
23215 var Transit = ["bus","ferry"];
23216 var streets = {
23217         Airport: Airport,
23218         Dining: Dining,
23219         Education: Education,
23220         General: General,
23221         Health: Health,
23222         Outdoors: Outdoors,
23223         Transit: Transit,
23224         "Mountain peak": ["mountain","volcano"],
23225         "Rail station": ["entrance","rail","rail-light","rail-metro"]
23226 };
23227
23228 var streets$1 = Object.freeze({
23229         Airport: Airport,
23230         Dining: Dining,
23231         Education: Education,
23232         General: General,
23233         Health: Health,
23234         Outdoors: Outdoors,
23235         Transit: Transit,
23236         default: streets
23237 });
23238
23239 var require$$0 = ( all$2 && all$1 ) || all$2;
23240
23241 var require$$1 = ( streets$1 && streets ) || streets$1;
23242
23243 var maki = {
23244   layouts: {
23245     all: require$$0,
23246     streets: require$$1
23247   }
23248 };
23249
23250 var dataFeatureIcons = maki.layouts.all.all;
23251
23252 var data = {
23253     imagery: dataImagery,
23254     presets: {
23255         presets: presets,
23256         defaults: defaults,
23257         categories: categories,
23258         fields: fields
23259     }
23260 };
23261
23262 function osmEntity$$1(attrs) {
23263     // For prototypal inheritance.
23264     if (this instanceof osmEntity$$1) return;
23265
23266     // Create the appropriate subtype.
23267     if (attrs && attrs.type) {
23268         return osmEntity$$1[attrs.type].apply(this, arguments);
23269     } else if (attrs && attrs.id) {
23270         return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
23271     }
23272
23273     // Initialize a generic Entity (used only in tests).
23274     return (new osmEntity$$1()).initialize(arguments);
23275 }
23276
23277
23278 osmEntity$$1.id = function(type) {
23279     return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
23280 };
23281
23282
23283 osmEntity$$1.id.next = {
23284     changeset: -1, node: -1, way: -1, relation: -1
23285 };
23286
23287
23288 osmEntity$$1.id.fromOSM = function(type, id) {
23289     return type[0] + id;
23290 };
23291
23292
23293 osmEntity$$1.id.toOSM = function(id) {
23294     return id.slice(1);
23295 };
23296
23297
23298 osmEntity$$1.id.type = function(id) {
23299     return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
23300 };
23301
23302
23303 // A function suitable for use as the second argument to d3.selection#data().
23304 osmEntity$$1.key = function(entity) {
23305     return entity.id + 'v' + (entity.v || 0);
23306 };
23307
23308
23309 osmEntity$$1.prototype = {
23310
23311     tags: {},
23312
23313
23314     initialize: function(sources) {
23315         for (var i = 0; i < sources.length; ++i) {
23316             var source = sources[i];
23317             for (var prop in source) {
23318                 if (Object.prototype.hasOwnProperty.call(source, prop)) {
23319                     if (source[prop] === undefined) {
23320                         delete this[prop];
23321                     } else {
23322                         this[prop] = source[prop];
23323                     }
23324                 }
23325             }
23326         }
23327
23328         if (!this.id && this.type) {
23329             this.id = osmEntity$$1.id(this.type);
23330         }
23331         if (!this.hasOwnProperty('visible')) {
23332             this.visible = true;
23333         }
23334
23335         if (debug) {
23336             Object.freeze(this);
23337             Object.freeze(this.tags);
23338
23339             if (this.loc) Object.freeze(this.loc);
23340             if (this.nodes) Object.freeze(this.nodes);
23341             if (this.members) Object.freeze(this.members);
23342         }
23343
23344         return this;
23345     },
23346
23347
23348     copy: function(resolver, copies) {
23349         if (copies[this.id])
23350             return copies[this.id];
23351
23352         var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
23353         copies[this.id] = copy;
23354
23355         return copy;
23356     },
23357
23358
23359     osmId: function() {
23360         return osmEntity$$1.id.toOSM(this.id);
23361     },
23362
23363
23364     isNew: function() {
23365         return this.osmId() < 0;
23366     },
23367
23368
23369     update: function(attrs) {
23370         return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
23371     },
23372
23373
23374     mergeTags: function(tags) {
23375         var merged = clone(this.tags), changed = false;
23376         for (var k in tags) {
23377             var t1 = merged[k],
23378                 t2 = tags[k];
23379             if (!t1) {
23380                 changed = true;
23381                 merged[k] = t2;
23382             } else if (t1 !== t2) {
23383                 changed = true;
23384                 merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
23385             }
23386         }
23387         return changed ? this.update({tags: merged}) : this;
23388     },
23389
23390
23391     intersects: function(extent, resolver) {
23392         return this.extent(resolver).intersects(extent);
23393     },
23394
23395
23396     isUsed: function(resolver) {
23397         return without(Object.keys(this.tags), 'area').length > 0 ||
23398             resolver.parentRelations(this).length > 0;
23399     },
23400
23401
23402     hasInterestingTags: function() {
23403         return keys$1(this.tags).some(osmIsInterestingTag);
23404     },
23405
23406
23407     isHighwayIntersection: function() {
23408         return false;
23409     },
23410
23411     isDegenerate: function() {
23412         return true;
23413     },
23414
23415     deprecatedTags: function() {
23416         var tags = toPairs(this.tags);
23417         var deprecated = {};
23418
23419         dataDeprecated.forEach(function(d) {
23420             var match = toPairs(d.old)[0];
23421             tags.forEach(function(t) {
23422                 if (t[0] === match[0] &&
23423                     (t[1] === match[1] || match[1] === '*')) {
23424                     deprecated[t[0]] = t[1];
23425                 }
23426             });
23427         });
23428
23429         return deprecated;
23430     }
23431 };
23432
23433 /**
23434  * A specialized version of `_.every` for arrays without support for
23435  * iteratee shorthands.
23436  *
23437  * @private
23438  * @param {Array} [array] The array to iterate over.
23439  * @param {Function} predicate The function invoked per iteration.
23440  * @returns {boolean} Returns `true` if all elements pass the predicate check,
23441  *  else `false`.
23442  */
23443 function arrayEvery(array, predicate) {
23444   var index = -1,
23445       length = array == null ? 0 : array.length;
23446
23447   while (++index < length) {
23448     if (!predicate(array[index], index, array)) {
23449       return false;
23450     }
23451   }
23452   return true;
23453 }
23454
23455 /**
23456  * The base implementation of `_.every` without support for iteratee shorthands.
23457  *
23458  * @private
23459  * @param {Array|Object} collection The collection to iterate over.
23460  * @param {Function} predicate The function invoked per iteration.
23461  * @returns {boolean} Returns `true` if all elements pass the predicate check,
23462  *  else `false`
23463  */
23464 function baseEvery(collection, predicate) {
23465   var result = true;
23466   baseEach(collection, function(value, index, collection) {
23467     result = !!predicate(value, index, collection);
23468     return result;
23469   });
23470   return result;
23471 }
23472
23473 /**
23474  * Checks if `predicate` returns truthy for **all** elements of `collection`.
23475  * Iteration is stopped once `predicate` returns falsey. The predicate is
23476  * invoked with three arguments: (value, index|key, collection).
23477  *
23478  * **Note:** This method returns `true` for
23479  * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
23480  * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
23481  * elements of empty collections.
23482  *
23483  * @static
23484  * @memberOf _
23485  * @since 0.1.0
23486  * @category Collection
23487  * @param {Array|Object} collection The collection to iterate over.
23488  * @param {Function} [predicate=_.identity] The function invoked per iteration.
23489  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23490  * @returns {boolean} Returns `true` if all elements pass the predicate check,
23491  *  else `false`.
23492  * @example
23493  *
23494  * _.every([true, 1, null, 'yes'], Boolean);
23495  * // => false
23496  *
23497  * var users = [
23498  *   { 'user': 'barney', 'age': 36, 'active': false },
23499  *   { 'user': 'fred',   'age': 40, 'active': false }
23500  * ];
23501  *
23502  * // The `_.matches` iteratee shorthand.
23503  * _.every(users, { 'user': 'barney', 'active': false });
23504  * // => false
23505  *
23506  * // The `_.matchesProperty` iteratee shorthand.
23507  * _.every(users, ['active', false]);
23508  * // => true
23509  *
23510  * // The `_.property` iteratee shorthand.
23511  * _.every(users, 'active');
23512  * // => false
23513  */
23514 function every(collection, predicate, guard) {
23515   var func = isArray(collection) ? arrayEvery : baseEvery;
23516   if (guard && isIterateeCall(collection, predicate, guard)) {
23517     predicate = undefined;
23518   }
23519   return func(collection, baseIteratee(predicate, 3));
23520 }
23521
23522 /**
23523  * The base implementation of `_.some` without support for iteratee shorthands.
23524  *
23525  * @private
23526  * @param {Array|Object} collection The collection to iterate over.
23527  * @param {Function} predicate The function invoked per iteration.
23528  * @returns {boolean} Returns `true` if any element passes the predicate check,
23529  *  else `false`.
23530  */
23531 function baseSome(collection, predicate) {
23532   var result;
23533
23534   baseEach(collection, function(value, index, collection) {
23535     result = predicate(value, index, collection);
23536     return !result;
23537   });
23538   return !!result;
23539 }
23540
23541 /**
23542  * Checks if `predicate` returns truthy for **any** element of `collection`.
23543  * Iteration is stopped once `predicate` returns truthy. The predicate is
23544  * invoked with three arguments: (value, index|key, collection).
23545  *
23546  * @static
23547  * @memberOf _
23548  * @since 0.1.0
23549  * @category Collection
23550  * @param {Array|Object} collection The collection to iterate over.
23551  * @param {Function} [predicate=_.identity] The function invoked per iteration.
23552  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23553  * @returns {boolean} Returns `true` if any element passes the predicate check,
23554  *  else `false`.
23555  * @example
23556  *
23557  * _.some([null, 0, 'yes', false], Boolean);
23558  * // => true
23559  *
23560  * var users = [
23561  *   { 'user': 'barney', 'active': true },
23562  *   { 'user': 'fred',   'active': false }
23563  * ];
23564  *
23565  * // The `_.matches` iteratee shorthand.
23566  * _.some(users, { 'user': 'barney', 'active': false });
23567  * // => false
23568  *
23569  * // The `_.matchesProperty` iteratee shorthand.
23570  * _.some(users, ['active', false]);
23571  * // => true
23572  *
23573  * // The `_.property` iteratee shorthand.
23574  * _.some(users, 'active');
23575  * // => true
23576  */
23577 function some(collection, predicate, guard) {
23578   var func = isArray(collection) ? arraySome : baseSome;
23579   if (guard && isIterateeCall(collection, predicate, guard)) {
23580     predicate = undefined;
23581   }
23582   return func(collection, baseIteratee(predicate, 3));
23583 }
23584
23585 function geoRoundCoords(c) {
23586     return [Math.floor(c[0]), Math.floor(c[1])];
23587 }
23588
23589
23590 function geoInterp(p1, p2, t) {
23591     return [p1[0] + (p2[0] - p1[0]) * t,
23592             p1[1] + (p2[1] - p1[1]) * t];
23593 }
23594
23595
23596 // 2D cross product of OA and OB vectors, i.e. z-component of their 3D cross product.
23597 // Returns a positive value, if OAB makes a counter-clockwise turn,
23598 // negative for clockwise turn, and zero if the points are collinear.
23599 function geoCross(o, a, b) {
23600     return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
23601 }
23602
23603
23604 // http://jsperf.com/id-dist-optimization
23605 function geoEuclideanDistance(a, b) {
23606     var x = a[0] - b[0], y = a[1] - b[1];
23607     return Math.sqrt((x * x) + (y * y));
23608 }
23609
23610
23611 // using WGS84 polar radius (6356752.314245179 m)
23612 // const = 2 * PI * r / 360
23613 function geoLatToMeters(dLat) {
23614     return dLat * 110946.257617;
23615 }
23616
23617
23618 // using WGS84 equatorial radius (6378137.0 m)
23619 // const = 2 * PI * r / 360
23620 function geoLonToMeters(dLon, atLat) {
23621     return Math.abs(atLat) >= 90 ? 0 :
23622         dLon * 111319.490793 * Math.abs(Math.cos(atLat * (Math.PI/180)));
23623 }
23624
23625
23626 // using WGS84 polar radius (6356752.314245179 m)
23627 // const = 2 * PI * r / 360
23628 function geoMetersToLat(m) {
23629     return m / 110946.257617;
23630 }
23631
23632
23633 // using WGS84 equatorial radius (6378137.0 m)
23634 // const = 2 * PI * r / 360
23635 function geoMetersToLon(m, atLat) {
23636     return Math.abs(atLat) >= 90 ? 0 :
23637         m / 111319.490793 / Math.abs(Math.cos(atLat * (Math.PI/180)));
23638 }
23639
23640
23641 function geoOffsetToMeters(offset) {
23642     var equatRadius = 6356752.314245179,
23643         polarRadius = 6378137.0,
23644         tileSize = 256;
23645
23646     return [
23647         offset[0] * 2 * Math.PI * equatRadius / tileSize,
23648         -offset[1] * 2 * Math.PI * polarRadius / tileSize
23649     ];
23650 }
23651
23652
23653 function geoMetersToOffset(meters) {
23654     var equatRadius = 6356752.314245179,
23655         polarRadius = 6378137.0,
23656         tileSize = 256;
23657
23658     return [
23659         meters[0] * tileSize / (2 * Math.PI * equatRadius),
23660         -meters[1] * tileSize / (2 * Math.PI * polarRadius)
23661     ];
23662 }
23663
23664
23665 // Equirectangular approximation of spherical distances on Earth
23666 function geoSphericalDistance(a, b) {
23667     var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2),
23668         y = geoLatToMeters(a[1] - b[1]);
23669     return Math.sqrt((x * x) + (y * y));
23670 }
23671
23672
23673 function geoEdgeEqual(a, b) {
23674     return (a[0] === b[0] && a[1] === b[1]) ||
23675         (a[0] === b[1] && a[1] === b[0]);
23676 }
23677
23678
23679 // Return the counterclockwise angle in the range (-pi, pi)
23680 // between the positive X axis and the line intersecting a and b.
23681 function geoAngle(a, b, projection) {
23682     a = projection(a.loc);
23683     b = projection(b.loc);
23684     return Math.atan2(b[1] - a[1], b[0] - a[0]);
23685 }
23686
23687
23688 // Rotate all points counterclockwise around a pivot point by given angle
23689 function geoRotate(points, angle, around) {
23690     return points.map(function(point) {
23691         var radial = [point[0] - around[0], point[1] - around[1]];
23692         return [
23693             radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
23694             radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
23695         ];
23696     });
23697 }
23698
23699
23700 // Choose the edge with the minimal distance from `point` to its orthogonal
23701 // projection onto that edge, if such a projection exists, or the distance to
23702 // the closest vertex on that edge. Returns an object with the `index` of the
23703 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
23704 function geoChooseEdge(nodes, point, projection) {
23705     var dist = geoEuclideanDistance,
23706         points = nodes.map(function(n) { return projection(n.loc); }),
23707         min = Infinity,
23708         idx, loc;
23709
23710     function dot(p, q) {
23711         return p[0] * q[0] + p[1] * q[1];
23712     }
23713
23714     for (var i = 0; i < points.length - 1; i++) {
23715         var o = points[i],
23716             s = [points[i + 1][0] - o[0],
23717                  points[i + 1][1] - o[1]],
23718             v = [point[0] - o[0],
23719                  point[1] - o[1]],
23720             proj = dot(v, s) / dot(s, s),
23721             p;
23722
23723         if (proj < 0) {
23724             p = o;
23725         } else if (proj > 1) {
23726             p = points[i + 1];
23727         } else {
23728             p = [o[0] + proj * s[0], o[1] + proj * s[1]];
23729         }
23730
23731         var d = dist(p, point);
23732         if (d < min) {
23733             min = d;
23734             idx = i + 1;
23735             loc = projection.invert(p);
23736         }
23737     }
23738
23739     return {
23740         index: idx,
23741         distance: min,
23742         loc: loc
23743     };
23744 }
23745
23746
23747 // Return the intersection point of 2 line segments.
23748 // From https://github.com/pgkelley4/line-segments-intersect
23749 // This uses the vector cross product approach described below:
23750 //  http://stackoverflow.com/a/565282/786339
23751 function geoLineIntersection(a, b) {
23752     function subtractPoints(point1, point2) {
23753         return [point1[0] - point2[0], point1[1] - point2[1]];
23754     }
23755     function crossProduct(point1, point2) {
23756         return point1[0] * point2[1] - point1[1] * point2[0];
23757     }
23758
23759     var p = [a[0][0], a[0][1]],
23760         p2 = [a[1][0], a[1][1]],
23761         q = [b[0][0], b[0][1]],
23762         q2 = [b[1][0], b[1][1]],
23763         r = subtractPoints(p2, p),
23764         s = subtractPoints(q2, q),
23765         uNumerator = crossProduct(subtractPoints(q, p), r),
23766         denominator = crossProduct(r, s);
23767
23768     if (uNumerator && denominator) {
23769         var u = uNumerator / denominator,
23770             t = crossProduct(subtractPoints(q, p), s) / denominator;
23771
23772         if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
23773             return geoInterp(p, p2, t);
23774         }
23775     }
23776
23777     return null;
23778 }
23779
23780
23781 function geoPathIntersections(path1, path2) {
23782     var intersections = [];
23783     for (var i = 0; i < path1.length - 1; i++) {
23784         for (var j = 0; j < path2.length - 1; j++) {
23785             var a = [ path1[i], path1[i+1] ],
23786                 b = [ path2[j], path2[j+1] ],
23787                 hit = geoLineIntersection(a, b);
23788             if (hit) intersections.push(hit);
23789         }
23790     }
23791     return intersections;
23792 }
23793
23794
23795 // Return whether point is contained in polygon.
23796 //
23797 // `point` should be a 2-item array of coordinates.
23798 // `polygon` should be an array of 2-item arrays of coordinates.
23799 //
23800 // From https://github.com/substack/point-in-polygon.
23801 // ray-casting algorithm based on
23802 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
23803 //
23804 function geoPointInPolygon(point, polygon) {
23805     var x = point[0],
23806         y = point[1],
23807         inside = false;
23808
23809     for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
23810         var xi = polygon[i][0], yi = polygon[i][1];
23811         var xj = polygon[j][0], yj = polygon[j][1];
23812
23813         var intersect = ((yi > y) !== (yj > y)) &&
23814             (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
23815         if (intersect) inside = !inside;
23816     }
23817
23818     return inside;
23819 }
23820
23821
23822 function geoPolygonContainsPolygon(outer, inner) {
23823     return every(inner, function(point) {
23824         return geoPointInPolygon(point, outer);
23825     });
23826 }
23827
23828
23829 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
23830     function testSegments(outer, inner) {
23831         for (var i = 0; i < outer.length - 1; i++) {
23832             for (var j = 0; j < inner.length - 1; j++) {
23833                 var a = [ outer[i], outer[i+1] ],
23834                     b = [ inner[j], inner[j+1] ];
23835                 if (geoLineIntersection(a, b)) return true;
23836             }
23837         }
23838         return false;
23839     }
23840
23841     function testPoints(outer, inner) {
23842         return some(inner, function(point) {
23843             return geoPointInPolygon(point, outer);
23844         });
23845     }
23846
23847    return testPoints(outer, inner) || (!!checkSegments && testSegments(outer, inner));
23848 }
23849
23850
23851 function geoPathLength(path) {
23852     var length = 0;
23853     for (var i = 0; i < path.length - 1; i++) {
23854         length += geoEuclideanDistance(path[i], path[i + 1]);
23855     }
23856     return length;
23857 }
23858
23859 function geoExtent$$1(min, max) {
23860     if (!(this instanceof geoExtent$$1)) return new geoExtent$$1(min, max);
23861     if (min instanceof geoExtent$$1) {
23862         return min;
23863     } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23864         this[0] = min[0];
23865         this[1] = min[1];
23866     } else {
23867         this[0] = min        || [ Infinity,  Infinity];
23868         this[1] = max || min || [-Infinity, -Infinity];
23869     }
23870 }
23871
23872 geoExtent$$1.prototype = new Array(2);
23873
23874 assignIn$1(geoExtent$$1.prototype, {
23875
23876     equals: function (obj) {
23877         return this[0][0] === obj[0][0] &&
23878             this[0][1] === obj[0][1] &&
23879             this[1][0] === obj[1][0] &&
23880             this[1][1] === obj[1][1];
23881     },
23882
23883
23884     extend: function(obj) {
23885         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23886         return geoExtent$$1(
23887             [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23888             [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23889         );
23890     },
23891
23892
23893     _extend: function(extent) {
23894         this[0][0] = Math.min(extent[0][0], this[0][0]);
23895         this[0][1] = Math.min(extent[0][1], this[0][1]);
23896         this[1][0] = Math.max(extent[1][0], this[1][0]);
23897         this[1][1] = Math.max(extent[1][1], this[1][1]);
23898     },
23899
23900
23901     area: function() {
23902         return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23903     },
23904
23905
23906     center: function() {
23907         return [(this[0][0] + this[1][0]) / 2,
23908                 (this[0][1] + this[1][1]) / 2];
23909     },
23910
23911
23912     rectangle: function() {
23913         return [this[0][0], this[0][1], this[1][0], this[1][1]];
23914     },
23915
23916
23917     bbox: function() {
23918         return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23919     },
23920
23921
23922     polygon: function() {
23923         return [
23924             [this[0][0], this[0][1]],
23925             [this[0][0], this[1][1]],
23926             [this[1][0], this[1][1]],
23927             [this[1][0], this[0][1]],
23928             [this[0][0], this[0][1]]
23929         ];
23930     },
23931
23932
23933     contains: function(obj) {
23934         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23935         return obj[0][0] >= this[0][0] &&
23936                obj[0][1] >= this[0][1] &&
23937                obj[1][0] <= this[1][0] &&
23938                obj[1][1] <= this[1][1];
23939     },
23940
23941
23942     intersects: function(obj) {
23943         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23944         return obj[0][0] <= this[1][0] &&
23945                obj[0][1] <= this[1][1] &&
23946                obj[1][0] >= this[0][0] &&
23947                obj[1][1] >= this[0][1];
23948     },
23949
23950
23951     intersection: function(obj) {
23952         if (!this.intersects(obj)) return new geoExtent$$1();
23953         return new geoExtent$$1(
23954             [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23955             [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23956         );
23957     },
23958
23959
23960     percentContainedIn: function(obj) {
23961         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23962         var a1 = this.intersection(obj).area(),
23963             a2 = this.area();
23964
23965         if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23966             return 0;
23967         } else {
23968             return a1 / a2;
23969         }
23970     },
23971
23972
23973     padByMeters: function(meters) {
23974         var dLat = geoMetersToLat(meters),
23975             dLon = geoMetersToLon(meters, this.center()[1]);
23976         return geoExtent$$1(
23977             [this[0][0] - dLon, this[0][1] - dLat],
23978             [this[1][0] + dLon, this[1][1] + dLat]
23979         );
23980     },
23981
23982
23983     toParam: function() {
23984         return this.rectangle().join(',');
23985     }
23986
23987 });
23988
23989 /*
23990     Bypasses features of D3's default projection stream pipeline that are unnecessary:
23991     * Antimeridian clipping
23992     * Spherical rotation
23993     * Resampling
23994 */
23995 function geoRawMercator() {
23996     var project = mercatorRaw,
23997         k = 512 / Math.PI, // scale
23998         x = 0, y = 0, // translate
23999         clipExtent = [[0, 0], [0, 0]];
24000
24001
24002     function projection$$1(point) {
24003         point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24004         return [point[0] * k + x, y - point[1] * k];
24005     }
24006
24007
24008     projection$$1.invert = function(point) {
24009         point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24010         return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24011     };
24012
24013
24014     projection$$1.scale = function(_) {
24015         if (!arguments.length) return k;
24016         k = +_;
24017         return projection$$1;
24018     };
24019
24020
24021     projection$$1.translate = function(_) {
24022         if (!arguments.length) return [x, y];
24023         x = +_[0];
24024         y = +_[1];
24025         return projection$$1;
24026     };
24027
24028
24029     projection$$1.clipExtent = function(_) {
24030         if (!arguments.length) return clipExtent;
24031         clipExtent = _;
24032         return projection$$1;
24033     };
24034
24035
24036     projection$$1.transform = function(_) {
24037         if (!arguments.length) return identity$7.translate(x, y).scale(k);
24038         x = +_.x;
24039         y = +_.y;
24040         k = +_.k;
24041         return projection$$1;
24042     };
24043
24044
24045     projection$$1.stream = d3_geoTransform({
24046         point: function(x, y) {
24047             x = projection$$1([x, y]);
24048             this.stream.point(x[0], x[1]);
24049         }
24050     }).stream;
24051
24052
24053     return projection$$1;
24054 }
24055
24056 function osmChangeset() {
24057     if (!(this instanceof osmChangeset)) {
24058         return (new osmChangeset()).initialize(arguments);
24059     } else if (arguments.length) {
24060         this.initialize(arguments);
24061     }
24062 }
24063
24064
24065 osmEntity$$1.changeset = osmChangeset;
24066
24067 osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
24068
24069 assignIn$1(osmChangeset.prototype, {
24070
24071     type: 'changeset',
24072
24073
24074     extent: function() {
24075         return new geoExtent$$1();
24076     },
24077
24078
24079     geometry: function() {
24080         return 'changeset';
24081     },
24082
24083
24084     asJXON: function() {
24085         return {
24086             osm: {
24087                 changeset: {
24088                     tag: map$4(this.tags, function(value, key) {
24089                         return { '@k': key, '@v': value };
24090                     }),
24091                     '@version': 0.6,
24092                     '@generator': 'iD'
24093                 }
24094             }
24095         };
24096     },
24097
24098
24099     // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
24100     // XML. Returns a string.
24101     osmChangeJXON: function(changes) {
24102         var changeset_id = this.id;
24103
24104         function nest(x, order) {
24105             var groups = {};
24106             for (var i = 0; i < x.length; i++) {
24107                 var tagName = Object.keys(x[i])[0];
24108                 if (!groups[tagName]) groups[tagName] = [];
24109                 groups[tagName].push(x[i][tagName]);
24110             }
24111             var ordered = {};
24112             order.forEach(function(o) {
24113                 if (groups[o]) ordered[o] = groups[o];
24114             });
24115             return ordered;
24116         }
24117
24118
24119         // sort relations in a changeset by dependencies
24120         function sort(changes) {
24121
24122             // find a referenced relation in the current changeset
24123             function resolve(item) {
24124                 return find$1(relations, function(relation) {
24125                     return item.keyAttributes.type === 'relation'
24126                         && item.keyAttributes.ref === relation['@id'];
24127                 });
24128             }
24129
24130             // a new item is an item that has not been already processed
24131             function isNew(item) {
24132                 return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
24133                     return proc['@id'] === item['@id'];
24134                 });
24135             }
24136
24137             var processing = [],
24138                 sorted = {},
24139                 relations = changes.relation;
24140
24141             if (!relations) return changes;
24142
24143             for (var i = 0; i < relations.length; i++) {
24144                 var relation = relations[i];
24145
24146                 // skip relation if already sorted
24147                 if (!sorted[relation['@id']]) {
24148                     processing.push(relation);
24149                 }
24150
24151                 while (processing.length > 0) {
24152                     var next = processing[0],
24153                     deps = filter(compact(next.member.map(resolve)), isNew);
24154                     if (deps.length === 0) {
24155                         sorted[next['@id']] = next;
24156                         processing.shift();
24157                     } else {
24158                         processing = deps.concat(processing);
24159                     }
24160                 }
24161             }
24162
24163             changes.relation = values$1(sorted);
24164             return changes;
24165         }
24166
24167         function rep(entity) {
24168             return entity.asJXON(changeset_id);
24169         }
24170
24171         return {
24172             osmChange: {
24173                 '@version': 0.6,
24174                 '@generator': 'iD',
24175                 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
24176                 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
24177                 'delete': assignIn$1(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
24178             }
24179         };
24180     },
24181
24182
24183     asGeoJSON: function() {
24184         return {};
24185     }
24186
24187 });
24188
24189 function osmNode() {
24190     if (!(this instanceof osmNode)) {
24191         return (new osmNode()).initialize(arguments);
24192     } else if (arguments.length) {
24193         this.initialize(arguments);
24194     }
24195 }
24196
24197 osmEntity$$1.node = osmNode;
24198
24199 osmNode.prototype = Object.create(osmEntity$$1.prototype);
24200
24201 assignIn$1(osmNode.prototype, {
24202
24203     type: 'node',
24204
24205
24206     extent: function() {
24207         return new geoExtent$$1(this.loc);
24208     },
24209
24210
24211     geometry: function(graph) {
24212         return graph.transient(this, 'geometry', function() {
24213             return graph.isPoi(this) ? 'point' : 'vertex';
24214         });
24215     },
24216
24217
24218     move: function(loc) {
24219         return this.update({loc: loc});
24220     },
24221
24222
24223     isDegenerate: function() {
24224         return !(
24225             Array.isArray(this.loc) && this.loc.length === 2 &&
24226             this.loc[0] >= -180 && this.loc[0] <= 180 &&
24227             this.loc[1] >= -90 && this.loc[1] <= 90
24228         );
24229     },
24230
24231
24232     isEndpoint: function(resolver) {
24233         return resolver.transient(this, 'isEndpoint', function() {
24234             var id = this.id;
24235             return resolver.parentWays(this).filter(function(parent) {
24236                 return !parent.isClosed() && !!parent.affix(id);
24237             }).length > 0;
24238         });
24239     },
24240
24241
24242     isConnected: function(resolver) {
24243         return resolver.transient(this, 'isConnected', function() {
24244             var parents = resolver.parentWays(this);
24245
24246             function isLine(entity) {
24247                 return entity.geometry(resolver) === 'line' &&
24248                     entity.hasInterestingTags();
24249             }
24250
24251             // vertex is connected to multiple parent lines
24252             if (parents.length > 1 && some(parents, isLine)) {
24253                 return true;
24254
24255             } else if (parents.length === 1) {
24256                 var way = parents[0],
24257                     nodes = way.nodes.slice();
24258                 if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
24259
24260                 // return true if vertex appears multiple times (way is self intersecting)
24261                 return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
24262             }
24263
24264             return false;
24265         });
24266     },
24267
24268
24269     isIntersection: function(resolver) {
24270         return resolver.transient(this, 'isIntersection', function() {
24271             return resolver.parentWays(this).filter(function(parent) {
24272                 return (parent.tags.highway ||
24273                     parent.tags.waterway ||
24274                     parent.tags.railway ||
24275                     parent.tags.aeroway) &&
24276                     parent.geometry(resolver) === 'line';
24277             }).length > 1;
24278         });
24279     },
24280
24281
24282     isHighwayIntersection: function(resolver) {
24283         return resolver.transient(this, 'isHighwayIntersection', function() {
24284             return resolver.parentWays(this).filter(function(parent) {
24285                 return parent.tags.highway && parent.geometry(resolver) === 'line';
24286             }).length > 1;
24287         });
24288     },
24289
24290
24291     isOnAddressLine: function(resolver) {
24292         return resolver.transient(this, 'isOnAddressLine', function() {
24293             return resolver.parentWays(this).filter(function(parent) {
24294                 return parent.tags.hasOwnProperty('addr:interpolation') &&
24295                     parent.geometry(resolver) === 'line';
24296             }).length > 0;
24297         });
24298     },
24299
24300
24301     asJXON: function(changeset_id) {
24302         var r = {
24303             node: {
24304                 '@id': this.osmId(),
24305                 '@lon': this.loc[0],
24306                 '@lat': this.loc[1],
24307                 '@version': (this.version || 0),
24308                 tag: map$4(this.tags, function(v, k) {
24309                     return { keyAttributes: { k: k, v: v } };
24310                 })
24311             }
24312         };
24313         if (changeset_id) r.node['@changeset'] = changeset_id;
24314         return r;
24315     },
24316
24317
24318     asGeoJSON: function() {
24319         return {
24320             type: 'Point',
24321             coordinates: this.loc
24322         };
24323     }
24324 });
24325
24326 /** Error message constants. */
24327 var FUNC_ERROR_TEXT$1 = 'Expected a function';
24328
24329 /**
24330  * Creates a function that negates the result of the predicate `func`. The
24331  * `func` predicate is invoked with the `this` binding and arguments of the
24332  * created function.
24333  *
24334  * @static
24335  * @memberOf _
24336  * @since 3.0.0
24337  * @category Function
24338  * @param {Function} predicate The predicate to negate.
24339  * @returns {Function} Returns the new negated function.
24340  * @example
24341  *
24342  * function isEven(n) {
24343  *   return n % 2 == 0;
24344  * }
24345  *
24346  * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
24347  * // => [1, 3, 5]
24348  */
24349 function negate(predicate) {
24350   if (typeof predicate != 'function') {
24351     throw new TypeError(FUNC_ERROR_TEXT$1);
24352   }
24353   return function() {
24354     var args = arguments;
24355     switch (args.length) {
24356       case 0: return !predicate.call(this);
24357       case 1: return !predicate.call(this, args[0]);
24358       case 2: return !predicate.call(this, args[0], args[1]);
24359       case 3: return !predicate.call(this, args[0], args[1], args[2]);
24360     }
24361     return !predicate.apply(this, args);
24362   };
24363 }
24364
24365 /**
24366  * The opposite of `_.filter`; this method returns the elements of `collection`
24367  * that `predicate` does **not** return truthy for.
24368  *
24369  * @static
24370  * @memberOf _
24371  * @since 0.1.0
24372  * @category Collection
24373  * @param {Array|Object} collection The collection to iterate over.
24374  * @param {Function} [predicate=_.identity] The function invoked per iteration.
24375  * @returns {Array} Returns the new filtered array.
24376  * @see _.filter
24377  * @example
24378  *
24379  * var users = [
24380  *   { 'user': 'barney', 'age': 36, 'active': false },
24381  *   { 'user': 'fred',   'age': 40, 'active': true }
24382  * ];
24383  *
24384  * _.reject(users, function(o) { return !o.active; });
24385  * // => objects for ['fred']
24386  *
24387  * // The `_.matches` iteratee shorthand.
24388  * _.reject(users, { 'age': 40, 'active': true });
24389  * // => objects for ['barney']
24390  *
24391  * // The `_.matchesProperty` iteratee shorthand.
24392  * _.reject(users, ['active', false]);
24393  * // => objects for ['fred']
24394  *
24395  * // The `_.property` iteratee shorthand.
24396  * _.reject(users, 'active');
24397  * // => objects for ['barney']
24398  */
24399 function reject(collection, predicate) {
24400   var func = isArray(collection) ? arrayFilter : baseFilter;
24401   return func(collection, negate(baseIteratee(predicate, 3)));
24402 }
24403
24404 /**
24405  * An alternative to `_.reduce`; this method transforms `object` to a new
24406  * `accumulator` object which is the result of running each of its own
24407  * enumerable string keyed properties thru `iteratee`, with each invocation
24408  * potentially mutating the `accumulator` object. If `accumulator` is not
24409  * provided, a new object with the same `[[Prototype]]` will be used. The
24410  * iteratee is invoked with four arguments: (accumulator, value, key, object).
24411  * Iteratee functions may exit iteration early by explicitly returning `false`.
24412  *
24413  * @static
24414  * @memberOf _
24415  * @since 1.3.0
24416  * @category Object
24417  * @param {Object} object The object to iterate over.
24418  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
24419  * @param {*} [accumulator] The custom accumulator value.
24420  * @returns {*} Returns the accumulated value.
24421  * @example
24422  *
24423  * _.transform([2, 3, 4], function(result, n) {
24424  *   result.push(n *= n);
24425  *   return n % 2 == 0;
24426  * }, []);
24427  * // => [4, 9]
24428  *
24429  * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
24430  *   (result[value] || (result[value] = [])).push(key);
24431  * }, {});
24432  * // => { '1': ['a', 'c'], '2': ['b'] }
24433  */
24434 function transform$1(object, iteratee, accumulator) {
24435   var isArr = isArray(object),
24436       isArrLike = isArr || isBuffer(object) || isTypedArray(object);
24437
24438   iteratee = baseIteratee(iteratee, 4);
24439   if (accumulator == null) {
24440     var Ctor = object && object.constructor;
24441     if (isArrLike) {
24442       accumulator = isArr ? new Ctor : [];
24443     }
24444     else if (isObject(object)) {
24445       accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
24446     }
24447     else {
24448       accumulator = {};
24449     }
24450   }
24451   (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
24452     return iteratee(accumulator, value, index, object);
24453   });
24454   return accumulator;
24455 }
24456
24457 /*
24458   Order the nodes of a way in reverse order and reverse any direction dependent tags
24459   other than `oneway`. (We assume that correcting a backwards oneway is the primary
24460   reason for reversing a way.)
24461
24462   The following transforms are performed:
24463
24464     Keys:
24465           *:right=* ⟺ *:left=*
24466         *:forward=* ⟺ *:backward=*
24467        direction=up ⟺ direction=down
24468          incline=up ⟺ incline=down
24469             *=right ⟺ *=left
24470
24471     Relation members:
24472        role=forward ⟺ role=backward
24473          role=north ⟺ role=south
24474           role=east ⟺ role=west
24475
24476    In addition, numeric-valued `incline` tags are negated.
24477
24478    The JOSM implementation was used as a guide, but transformations that were of unclear benefit
24479    or adjusted tags that don't seem to be used in practice were omitted.
24480
24481    Also, each node on the way is examined for its own tags and the following transformations are performed
24482    in order to ensure associated nodes (eg a Stop Sign) is also reversed
24483
24484     Node Keys:
24485         direction=forward ⟺ direction=backward
24486         direction=left ⟺ direction=right
24487         *:forward=* ⟺ *:backward=*
24488         *:left=* ⟺ *:right=*
24489
24490    References:
24491       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
24492       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
24493       http://wiki.openstreetmap.org/wiki/Key:incline
24494       http://wiki.openstreetmap.org/wiki/Route#Members
24495       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
24496       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
24497       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
24498  */
24499 function actionReverse(wayId, options) {
24500     var replacements = [
24501             [/:right$/, ':left'], [/:left$/, ':right'],
24502             [/:forward$/, ':backward'], [/:backward$/, ':forward']
24503         ],
24504         numeric = /^([+\-]?)(?=[\d.])/,
24505         roleReversals = {
24506             forward: 'backward',
24507             backward: 'forward',
24508             north: 'south',
24509             south: 'north',
24510             east: 'west',
24511             west: 'east'
24512         };
24513
24514
24515     function reverseKey(key) {
24516         for (var i = 0; i < replacements.length; ++i) {
24517             var replacement = replacements[i];
24518             if (replacement[0].test(key)) {
24519                 return key.replace(replacement[0], replacement[1]);
24520             }
24521         }
24522         return key;
24523     }
24524
24525
24526     function reverseValue(key, value) {
24527         if (key === 'incline' && numeric.test(value)) {
24528             return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
24529         } else if (key === 'incline' || key === 'direction') {
24530             return {up: 'down', down: 'up'}[value] || value;
24531         } else if (options && options.reverseOneway && key === 'oneway') {
24532             return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
24533         } else {
24534             return {left: 'right', right: 'left'}[value] || value;
24535         }
24536     }
24537
24538
24539     function reverseDirectionTags(node) {
24540         // Update the direction based tags as appropriate then return an updated node
24541         return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
24542             // See if this is a direction tag and reverse (or use existing value if not recognised)
24543             if (tagKey === 'direction') {
24544                 acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
24545             } else {
24546                 // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
24547                 // This will pass through other tags unchanged
24548                 acc[reverseKey(tagKey)] = tagValue;
24549             }
24550             return acc;
24551         }, {})});
24552     }
24553
24554
24555     function reverseTagsOnNodes(graph, nodeIds) {
24556         // Reverse the direction of appropriate tags attached to the nodes (#3076)
24557         return nodeIds
24558             // Get each node from the graph
24559             .map(function(nodeId) { return graph.entity(nodeId);})
24560             // Check tags on the node, if there aren't any, we can skip
24561             .filter(function(existingNode) { return existingNode.tags !== undefined;})
24562             // Get a new version of each node with the appropriate tags reversed
24563             .map(function(existingNode) { return reverseDirectionTags(existingNode);})
24564             // Chain together consecutive updates to the graph for each updated node and return
24565             .reduce(function (accGraph, value) { return accGraph.replace(value); }, graph);
24566     }
24567
24568
24569     return function(graph) {
24570         var way = graph.entity(wayId),
24571             nodes = way.nodes.slice().reverse(),
24572             tags = {}, key, role;
24573
24574         for (key in way.tags) {
24575             tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
24576         }
24577
24578         graph.parentRelations(way).forEach(function(relation) {
24579             relation.members.forEach(function(member, index) {
24580                 if (member.id === way.id && (role = roleReversals[member.role])) {
24581                     relation = relation.updateMember({role: role}, index);
24582                     graph = graph.replace(relation);
24583                 }
24584             });
24585         });
24586
24587         // Reverse any associated directions on nodes on the way and then replace
24588         // the way itself with the reversed node ids and updated way tags
24589         return reverseTagsOnNodes(graph, nodes).replace(way.update({nodes: nodes, tags: tags}));
24590     };
24591 }
24592
24593 // For fixing up rendering of multipolygons with tags on the outer member.
24594 // https://github.com/openstreetmap/iD/issues/613
24595 function osmIsSimpleMultipolygonOuterMember(entity, graph) {
24596     if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
24597         return false;
24598
24599     var parents = graph.parentRelations(entity);
24600     if (parents.length !== 1)
24601         return false;
24602
24603     var parent = parents[0];
24604     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
24605         return false;
24606
24607     var members = parent.members, member;
24608     for (var i = 0; i < members.length; i++) {
24609         member = members[i];
24610         if (member.id === entity.id && member.role && member.role !== 'outer')
24611             return false; // Not outer member
24612         if (member.id !== entity.id && (!member.role || member.role === 'outer'))
24613             return false; // Not a simple multipolygon
24614     }
24615
24616     return parent;
24617 }
24618
24619
24620 function osmSimpleMultipolygonOuterMember(entity, graph) {
24621     if (entity.type !== 'way')
24622         return false;
24623
24624     var parents = graph.parentRelations(entity);
24625     if (parents.length !== 1)
24626         return false;
24627
24628     var parent = parents[0];
24629     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
24630         return false;
24631
24632     var members = parent.members, member, outerMember;
24633     for (var i = 0; i < members.length; i++) {
24634         member = members[i];
24635         if (!member.role || member.role === 'outer') {
24636             if (outerMember)
24637                 return false; // Not a simple multipolygon
24638             outerMember = member;
24639         }
24640     }
24641
24642     if (!outerMember)
24643         return false;
24644
24645     var outerEntity = graph.hasEntity(outerMember.id);
24646     if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
24647         return false;
24648
24649     return outerEntity;
24650 }
24651
24652
24653 // Join `array` into sequences of connecting ways.
24654 //
24655 // Segments which share identical start/end nodes will, as much as possible,
24656 // be connected with each other.
24657 //
24658 // The return value is a nested array. Each constituent array contains elements
24659 // of `array` which have been determined to connect. Each consitituent array
24660 // also has a `nodes` property whose value is an ordered array of member nodes,
24661 // with appropriate order reversal and start/end coordinate de-duplication.
24662 //
24663 // Members of `array` must have, at minimum, `type` and `id` properties.
24664 // Thus either an array of `osmWay`s or a relation member array may be
24665 // used.
24666 //
24667 // If an member has a `tags` property, its tags will be reversed via
24668 // `actionReverse` in the output.
24669 //
24670 // Incomplete members (those for which `graph.hasEntity(element.id)` returns
24671 // false) and non-way members are ignored.
24672 //
24673 function osmJoinWays(array, graph) {
24674     var joined = [], member, current, nodes, first, last, i, how, what;
24675
24676     array = array.filter(function(member) {
24677         return member.type === 'way' && graph.hasEntity(member.id);
24678     });
24679
24680     function resolve(member) {
24681         return graph.childNodes(graph.entity(member.id));
24682     }
24683
24684     function reverse(member) {
24685         return member.tags ? actionReverse(member.id, { reverseOneway: true })(graph).entity(member.id) : member;
24686     }
24687
24688     while (array.length) {
24689         member = array.shift();
24690         current = [member];
24691         current.nodes = nodes = resolve(member).slice();
24692         joined.push(current);
24693
24694         while (array.length && nodes[0] !== nodes[nodes.length - 1]) {
24695             first = nodes[0];
24696             last  = nodes[nodes.length - 1];
24697
24698             for (i = 0; i < array.length; i++) {
24699                 member = array[i];
24700                 what = resolve(member);
24701
24702                 if (last === what[0]) {
24703                     how  = nodes.push;
24704                     what = what.slice(1);
24705                     break;
24706                 } else if (last === what[what.length - 1]) {
24707                     how  = nodes.push;
24708                     what = what.slice(0, -1).reverse();
24709                     member = reverse(member);
24710                     break;
24711                 } else if (first === what[what.length - 1]) {
24712                     how  = nodes.unshift;
24713                     what = what.slice(0, -1);
24714                     break;
24715                 } else if (first === what[0]) {
24716                     how  = nodes.unshift;
24717                     what = what.slice(1).reverse();
24718                     member = reverse(member);
24719                     break;
24720                 } else {
24721                     what = how = null;
24722                 }
24723             }
24724
24725             if (!what)
24726                 break; // No more joinable ways.
24727
24728             how.apply(current, [member]);
24729             how.apply(nodes, what);
24730
24731             array.splice(i, 1);
24732         }
24733     }
24734
24735     return joined;
24736 }
24737
24738 function osmRelation() {
24739     if (!(this instanceof osmRelation)) {
24740         return (new osmRelation()).initialize(arguments);
24741     } else if (arguments.length) {
24742         this.initialize(arguments);
24743     }
24744 }
24745
24746
24747 osmEntity$$1.relation = osmRelation;
24748
24749 osmRelation.prototype = Object.create(osmEntity$$1.prototype);
24750
24751
24752 osmRelation.creationOrder = function(a, b) {
24753     var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
24754     var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
24755
24756     if (aId < 0 || bId < 0) return aId - bId;
24757     return bId - aId;
24758 };
24759
24760
24761 assignIn$1(osmRelation.prototype, {
24762     type: 'relation',
24763     members: [],
24764
24765
24766     copy: function(resolver, copies) {
24767         if (copies[this.id])
24768             return copies[this.id];
24769
24770         var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
24771
24772         var members = this.members.map(function(member) {
24773             return assignIn$1({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
24774         });
24775
24776         copy = copy.update({members: members});
24777         copies[this.id] = copy;
24778
24779         return copy;
24780     },
24781
24782
24783     extent: function(resolver, memo) {
24784         return resolver.transient(this, 'extent', function() {
24785             if (memo && memo[this.id]) return geoExtent$$1();
24786             memo = memo || {};
24787             memo[this.id] = true;
24788
24789             var extent = geoExtent$$1();
24790             for (var i = 0; i < this.members.length; i++) {
24791                 var member = resolver.hasEntity(this.members[i].id);
24792                 if (member) {
24793                     extent._extend(member.extent(resolver, memo));
24794                 }
24795             }
24796             return extent;
24797         });
24798     },
24799
24800
24801     geometry: function(graph) {
24802         return graph.transient(this, 'geometry', function() {
24803             return this.isMultipolygon() ? 'area' : 'relation';
24804         });
24805     },
24806
24807
24808     isDegenerate: function() {
24809         return this.members.length === 0;
24810     },
24811
24812
24813     // Return an array of members, each extended with an 'index' property whose value
24814     // is the member index.
24815     indexedMembers: function() {
24816         var result = new Array(this.members.length);
24817         for (var i = 0; i < this.members.length; i++) {
24818             result[i] = assignIn$1({}, this.members[i], {index: i});
24819         }
24820         return result;
24821     },
24822
24823
24824     // Return the first member with the given role. A copy of the member object
24825     // is returned, extended with an 'index' property whose value is the member index.
24826     memberByRole: function(role) {
24827         for (var i = 0; i < this.members.length; i++) {
24828             if (this.members[i].role === role) {
24829                 return assignIn$1({}, this.members[i], {index: i});
24830             }
24831         }
24832     },
24833
24834
24835     // Return the first member with the given id. A copy of the member object
24836     // is returned, extended with an 'index' property whose value is the member index.
24837     memberById: function(id) {
24838         for (var i = 0; i < this.members.length; i++) {
24839             if (this.members[i].id === id) {
24840                 return assignIn$1({}, this.members[i], {index: i});
24841             }
24842         }
24843     },
24844
24845
24846     // Return the first member with the given id and role. A copy of the member object
24847     // is returned, extended with an 'index' property whose value is the member index.
24848     memberByIdAndRole: function(id, role) {
24849         for (var i = 0; i < this.members.length; i++) {
24850             if (this.members[i].id === id && this.members[i].role === role) {
24851                 return assignIn$1({}, this.members[i], {index: i});
24852             }
24853         }
24854     },
24855
24856
24857     addMember: function(member, index) {
24858         var members = this.members.slice();
24859         members.splice(index === undefined ? members.length : index, 0, member);
24860         return this.update({members: members});
24861     },
24862
24863
24864     updateMember: function(member, index) {
24865         var members = this.members.slice();
24866         members.splice(index, 1, assignIn$1({}, members[index], member));
24867         return this.update({members: members});
24868     },
24869
24870
24871     removeMember: function(index) {
24872         var members = this.members.slice();
24873         members.splice(index, 1);
24874         return this.update({members: members});
24875     },
24876
24877
24878     removeMembersWithID: function(id) {
24879         var members = reject(this.members, function(m) { return m.id === id; });
24880         return this.update({members: members});
24881     },
24882
24883
24884     // Wherever a member appears with id `needle.id`, replace it with a member
24885     // with id `replacement.id`, type `replacement.type`, and the original role,
24886     // unless a member already exists with that id and role. Return an updated
24887     // relation.
24888     replaceMember: function(needle, replacement) {
24889         if (!this.memberById(needle.id))
24890             return this;
24891
24892         var members = [];
24893
24894         for (var i = 0; i < this.members.length; i++) {
24895             var member = this.members[i];
24896             if (member.id !== needle.id) {
24897                 members.push(member);
24898             } else if (!this.memberByIdAndRole(replacement.id, member.role)) {
24899                 members.push({id: replacement.id, type: replacement.type, role: member.role});
24900             }
24901         }
24902
24903         return this.update({members: members});
24904     },
24905
24906
24907     asJXON: function(changeset_id) {
24908         var r = {
24909             relation: {
24910                 '@id': this.osmId(),
24911                 '@version': this.version || 0,
24912                 member: map$4(this.members, function(member) {
24913                     return {
24914                         keyAttributes: {
24915                             type: member.type,
24916                             role: member.role,
24917                             ref: osmEntity$$1.id.toOSM(member.id)
24918                         }
24919                     };
24920                 }),
24921                 tag: map$4(this.tags, function(v, k) {
24922                     return { keyAttributes: { k: k, v: v } };
24923                 })
24924             }
24925         };
24926         if (changeset_id) r.relation['@changeset'] = changeset_id;
24927         return r;
24928     },
24929
24930
24931     asGeoJSON: function(resolver) {
24932         return resolver.transient(this, 'GeoJSON', function () {
24933             if (this.isMultipolygon()) {
24934                 return {
24935                     type: 'MultiPolygon',
24936                     coordinates: this.multipolygon(resolver)
24937                 };
24938             } else {
24939                 return {
24940                     type: 'FeatureCollection',
24941                     properties: this.tags,
24942                     features: this.members.map(function (member) {
24943                         return assignIn$1({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
24944                     })
24945                 };
24946             }
24947         });
24948     },
24949
24950
24951     area: function(resolver) {
24952         return resolver.transient(this, 'area', function() {
24953             return d3_geoArea(this.asGeoJSON(resolver));
24954         });
24955     },
24956
24957
24958     isMultipolygon: function() {
24959         return this.tags.type === 'multipolygon';
24960     },
24961
24962
24963     isComplete: function(resolver) {
24964         for (var i = 0; i < this.members.length; i++) {
24965             if (!resolver.hasEntity(this.members[i].id)) {
24966                 return false;
24967             }
24968         }
24969         return true;
24970     },
24971
24972
24973     isRestriction: function() {
24974         return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
24975     },
24976
24977
24978     // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
24979     // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
24980     //
24981     // This corresponds to the structure needed for rendering a multipolygon path using a
24982     // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
24983     //
24984     // In the case of invalid geometries, this function will still return a result which
24985     // includes the nodes of all way members, but some Nds may be unclosed and some inner
24986     // rings not matched with the intended outer ring.
24987     //
24988     multipolygon: function(resolver) {
24989         var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }),
24990             inners = this.members.filter(function(m) { return 'inner' === m.role; });
24991
24992         outers = osmJoinWays(outers, resolver);
24993         inners = osmJoinWays(inners, resolver);
24994
24995         outers = outers.map(function(outer) { return map$4(outer.nodes, 'loc'); });
24996         inners = inners.map(function(inner) { return map$4(inner.nodes, 'loc'); });
24997
24998         var result = outers.map(function(o) {
24999             // Heuristic for detecting counterclockwise winding order. Assumes
25000             // that OpenStreetMap polygons are not hemisphere-spanning.
25001             return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
25002         });
25003
25004         function findOuter(inner) {
25005             var o, outer;
25006
25007             for (o = 0; o < outers.length; o++) {
25008                 outer = outers[o];
25009                 if (geoPolygonContainsPolygon(outer, inner))
25010                     return o;
25011             }
25012
25013             for (o = 0; o < outers.length; o++) {
25014                 outer = outers[o];
25015                 if (geoPolygonIntersectsPolygon(outer, inner, false))
25016                     return o;
25017             }
25018         }
25019
25020         for (var i = 0; i < inners.length; i++) {
25021             var inner = inners[i];
25022
25023             if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
25024                 inner = inner.reverse();
25025             }
25026
25027             var o = findOuter(inners[i]);
25028             if (o !== undefined)
25029                 result[o].push(inners[i]);
25030             else
25031                 result.push([inners[i]]); // Invalid geometry
25032         }
25033
25034         return result;
25035     }
25036 });
25037
25038 /**
25039  * Creates a duplicate-free version of an array, using
25040  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25041  * for equality comparisons, in which only the first occurrence of each element
25042  * is kept. The order of result values is determined by the order they occur
25043  * in the array.
25044  *
25045  * @static
25046  * @memberOf _
25047  * @since 0.1.0
25048  * @category Array
25049  * @param {Array} array The array to inspect.
25050  * @returns {Array} Returns the new duplicate free array.
25051  * @example
25052  *
25053  * _.uniq([2, 1, 2]);
25054  * // => [2, 1]
25055  */
25056 function uniq(array) {
25057   return (array && array.length) ? baseUniq(array) : [];
25058 }
25059
25060 /** `Object#toString` result references. */
25061 var numberTag$4 = '[object Number]';
25062
25063 /**
25064  * Checks if `value` is classified as a `Number` primitive or object.
25065  *
25066  * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
25067  * classified as numbers, use the `_.isFinite` method.
25068  *
25069  * @static
25070  * @memberOf _
25071  * @since 0.1.0
25072  * @category Lang
25073  * @param {*} value The value to check.
25074  * @returns {boolean} Returns `true` if `value` is a number, else `false`.
25075  * @example
25076  *
25077  * _.isNumber(3);
25078  * // => true
25079  *
25080  * _.isNumber(Number.MIN_VALUE);
25081  * // => true
25082  *
25083  * _.isNumber(Infinity);
25084  * // => true
25085  *
25086  * _.isNumber('3');
25087  * // => false
25088  */
25089 function isNumber(value) {
25090   return typeof value == 'number' ||
25091     (isObjectLike(value) && baseGetTag(value) == numberTag$4);
25092 }
25093
25094 /** `Object#toString` result references. */
25095 var stringTag$4 = '[object String]';
25096
25097 /**
25098  * Checks if `value` is classified as a `String` primitive or object.
25099  *
25100  * @static
25101  * @since 0.1.0
25102  * @memberOf _
25103  * @category Lang
25104  * @param {*} value The value to check.
25105  * @returns {boolean} Returns `true` if `value` is a string, else `false`.
25106  * @example
25107  *
25108  * _.isString('abc');
25109  * // => true
25110  *
25111  * _.isString(1);
25112  * // => false
25113  */
25114 function isString(value) {
25115   return typeof value == 'string' ||
25116     (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
25117 }
25118
25119 /**
25120  * Checks if `value` is `NaN`.
25121  *
25122  * **Note:** This method is based on
25123  * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
25124  * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
25125  * `undefined` and other non-number values.
25126  *
25127  * @static
25128  * @memberOf _
25129  * @since 0.1.0
25130  * @category Lang
25131  * @param {*} value The value to check.
25132  * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
25133  * @example
25134  *
25135  * _.isNaN(NaN);
25136  * // => true
25137  *
25138  * _.isNaN(new Number(NaN));
25139  * // => true
25140  *
25141  * isNaN(undefined);
25142  * // => true
25143  *
25144  * _.isNaN(undefined);
25145  * // => false
25146  */
25147 function isNaN$1(value) {
25148   // An `NaN` primitive is the only value that is not equal to itself.
25149   // Perform the `toStringTag` check first to avoid errors with some
25150   // ActiveX objects in IE.
25151   return isNumber(value) && value != +value;
25152 }
25153
25154 function osmLanes(entity) {
25155     if (entity.type !== 'way') return null;
25156     if (!entity.tags.highway) return null;
25157
25158     var tags = entity.tags;
25159     var isOneWay = entity.isOneWay();
25160     var laneCount = getLaneCount(tags, isOneWay);
25161     var maxspeed = parseMaxspeed(tags);
25162
25163     var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
25164     var forward = laneDirections.forward;
25165     var backward = laneDirections.backward;
25166     var bothways = laneDirections.bothways;
25167
25168     // parse the piped string 'x|y|z' format
25169     var turnLanes = {};
25170     turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
25171     turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
25172     turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
25173
25174     var maxspeedLanes = {};
25175     maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
25176     maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
25177     maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
25178
25179     var psvLanes = {};
25180     psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
25181     psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
25182     psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
25183
25184     var busLanes = {};
25185     busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
25186     busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
25187     busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
25188
25189     var taxiLanes = {};
25190     taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
25191     taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
25192     taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
25193
25194     var hovLanes = {};
25195     hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
25196     hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
25197     hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
25198
25199     var hgvLanes = {};
25200     hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
25201     hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
25202     hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
25203
25204     var bicyclewayLanes = {};
25205     bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
25206     bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
25207     bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
25208
25209     var lanesObj = {
25210         forward: [],
25211         backward: [],
25212         unspecified: []
25213     };
25214
25215     // map forward/backward/unspecified of each lane type to lanesObj
25216     mapToLanesObj(lanesObj, turnLanes, 'turnLane');
25217     mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
25218     mapToLanesObj(lanesObj, psvLanes, 'psv');
25219     mapToLanesObj(lanesObj, busLanes, 'bus');
25220     mapToLanesObj(lanesObj, taxiLanes, 'taxi');
25221     mapToLanesObj(lanesObj, hovLanes, 'hov');
25222     mapToLanesObj(lanesObj, hgvLanes, 'hgv');
25223     mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
25224
25225     return {
25226         metadata: {
25227             count: laneCount,
25228             oneway: isOneWay,
25229             forward: forward,
25230             backward: backward,
25231             bothways: bothways,
25232             turnLanes: turnLanes,
25233             maxspeed: maxspeed,
25234             maxspeedLanes: maxspeedLanes,
25235             psvLanes: psvLanes,
25236             busLanes: busLanes,
25237             taxiLanes: taxiLanes,
25238             hovLanes: hovLanes,
25239             hgvLanes: hgvLanes,
25240             bicyclewayLanes: bicyclewayLanes
25241         },
25242         lanes: lanesObj
25243     };
25244 }
25245
25246
25247 function getLaneCount(tags, isOneWay) {
25248     var count;
25249     if (tags.lanes) {
25250         count = parseInt(tags.lanes, 10);
25251         if (count > 0) {
25252             return count;
25253         }
25254     }
25255
25256
25257     switch (tags.highway) {
25258         case 'trunk':
25259         case 'motorway':
25260             count = isOneWay ? 2 : 4;
25261             break;
25262         default:
25263             count = isOneWay ? 1 : 2;
25264             break;
25265     }
25266
25267     return count;
25268 }
25269
25270
25271 function parseMaxspeed(tags) {
25272     var maxspeed = tags.maxspeed;
25273     if (isNumber(maxspeed)) return maxspeed;
25274     if (isString(maxspeed)) {
25275         maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
25276         if (!maxspeed) return;
25277         return parseInt(maxspeed, 10);
25278     }
25279 }
25280
25281
25282 function parseLaneDirections(tags, isOneWay, laneCount) {
25283     var forward = parseInt(tags['lanes:forward'], 10);
25284     var backward = parseInt(tags['lanes:backward'], 10);
25285     var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
25286
25287     if (parseInt(tags.oneway, 10) === -1) {
25288         forward = 0;
25289         bothways = 0;
25290         backward = laneCount;
25291     }
25292     else if (isOneWay) {
25293         forward = laneCount;
25294         bothways = 0;
25295         backward = 0;
25296     }
25297     else if (isNaN$1(forward) && isNaN$1(backward)) {
25298         backward = Math.floor((laneCount - bothways) / 2);
25299         forward = laneCount - bothways - backward;
25300     }
25301     else if (isNaN$1(forward)) {
25302         if (backward > laneCount - bothways) {
25303             backward = laneCount - bothways;
25304         }
25305         forward = laneCount - bothways - backward;
25306     }
25307     else if (isNaN$1(backward)) {
25308         if (forward > laneCount - bothways) {
25309             forward = laneCount - bothways;
25310         }
25311         backward = laneCount - bothways - forward;
25312     }
25313     return {
25314         forward: forward,
25315         backward: backward,
25316         bothways: bothways
25317     };
25318 }
25319
25320
25321 function parseTurnLanes(tag){
25322     if (!tag) return;
25323
25324     var validValues = [
25325         'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
25326         'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
25327     ];
25328
25329     return tag.split('|')
25330         .map(function (s) {
25331             if (s === '') s = 'none';
25332             return s.split(';')
25333                 .map(function (d) {
25334                     return validValues.indexOf(d) === -1 ? 'unknown': d;
25335                 });
25336         });
25337 }
25338
25339
25340 function parseMaxspeedLanes(tag, maxspeed) {
25341     if (!tag) return;
25342
25343     return tag.split('|')
25344         .map(function (s) {
25345             if (s === 'none') return s;
25346             var m = parseInt(s, 10);
25347             if (s === '' || m === maxspeed) return null;
25348             return isNaN$1(m) ? 'unknown': m;
25349         });
25350 }
25351
25352
25353 function parseMiscLanes(tag) {
25354     if (!tag) return;
25355
25356     var validValues = [
25357         'yes', 'no', 'designated'
25358     ];
25359
25360     return tag.split('|')
25361         .map(function (s) {
25362             if (s === '') s = 'no';
25363             return validValues.indexOf(s) === -1 ? 'unknown': s;
25364         });
25365 }
25366
25367
25368 function parseBicycleWay(tag) {
25369     if (!tag) return;
25370
25371     var validValues = [
25372         'yes', 'no', 'designated', 'lane'
25373     ];
25374
25375     return tag.split('|')
25376         .map(function (s) {
25377             if (s === '') s = 'no';
25378             return validValues.indexOf(s) === -1 ? 'unknown': s;
25379         });
25380 }
25381
25382
25383 function mapToLanesObj(lanesObj, data, key) {
25384     if (data.forward) data.forward.forEach(function(l, i) {
25385         if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
25386         lanesObj.forward[i][key] = l;
25387     });
25388     if (data.backward) data.backward.forEach(function(l, i) {
25389         if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
25390         lanesObj.backward[i][key] = l;
25391     });
25392     if (data.unspecified) data.unspecified.forEach(function(l, i) {
25393         if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
25394         lanesObj.unspecified[i][key] = l;
25395     });
25396 }
25397
25398 /** Used to compose bitmasks for cloning. */
25399 var CLONE_DEEP_FLAG$3 = 1;
25400 var CLONE_SYMBOLS_FLAG$2 = 4;
25401
25402 /**
25403  * This method is like `_.clone` except that it recursively clones `value`.
25404  *
25405  * @static
25406  * @memberOf _
25407  * @since 1.0.0
25408  * @category Lang
25409  * @param {*} value The value to recursively clone.
25410  * @returns {*} Returns the deep cloned value.
25411  * @see _.clone
25412  * @example
25413  *
25414  * var objects = [{ 'a': 1 }, { 'b': 2 }];
25415  *
25416  * var deep = _.cloneDeep(objects);
25417  * console.log(deep[0] === objects[0]);
25418  * // => false
25419  */
25420 function cloneDeep(value) {
25421   return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$2);
25422 }
25423
25424 /**
25425  * Gets the timestamp of the number of milliseconds that have elapsed since
25426  * the Unix epoch (1 January 1970 00:00:00 UTC).
25427  *
25428  * @static
25429  * @memberOf _
25430  * @since 2.4.0
25431  * @category Date
25432  * @returns {number} Returns the timestamp.
25433  * @example
25434  *
25435  * _.defer(function(stamp) {
25436  *   console.log(_.now() - stamp);
25437  * }, _.now());
25438  * // => Logs the number of milliseconds it took for the deferred invocation.
25439  */
25440 var now$1 = function() {
25441   return root$2.Date.now();
25442 };
25443
25444 /** Error message constants. */
25445 var FUNC_ERROR_TEXT$2 = 'Expected a function';
25446
25447 /* Built-in method references for those with the same name as other `lodash` methods. */
25448 var nativeMax$2 = Math.max;
25449 var nativeMin = Math.min;
25450
25451 /**
25452  * Creates a debounced function that delays invoking `func` until after `wait`
25453  * milliseconds have elapsed since the last time the debounced function was
25454  * invoked. The debounced function comes with a `cancel` method to cancel
25455  * delayed `func` invocations and a `flush` method to immediately invoke them.
25456  * Provide `options` to indicate whether `func` should be invoked on the
25457  * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
25458  * with the last arguments provided to the debounced function. Subsequent
25459  * calls to the debounced function return the result of the last `func`
25460  * invocation.
25461  *
25462  * **Note:** If `leading` and `trailing` options are `true`, `func` is
25463  * invoked on the trailing edge of the timeout only if the debounced function
25464  * is invoked more than once during the `wait` timeout.
25465  *
25466  * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
25467  * until to the next tick, similar to `setTimeout` with a timeout of `0`.
25468  *
25469  * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
25470  * for details over the differences between `_.debounce` and `_.throttle`.
25471  *
25472  * @static
25473  * @memberOf _
25474  * @since 0.1.0
25475  * @category Function
25476  * @param {Function} func The function to debounce.
25477  * @param {number} [wait=0] The number of milliseconds to delay.
25478  * @param {Object} [options={}] The options object.
25479  * @param {boolean} [options.leading=false]
25480  *  Specify invoking on the leading edge of the timeout.
25481  * @param {number} [options.maxWait]
25482  *  The maximum time `func` is allowed to be delayed before it's invoked.
25483  * @param {boolean} [options.trailing=true]
25484  *  Specify invoking on the trailing edge of the timeout.
25485  * @returns {Function} Returns the new debounced function.
25486  * @example
25487  *
25488  * // Avoid costly calculations while the window size is in flux.
25489  * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
25490  *
25491  * // Invoke `sendMail` when clicked, debouncing subsequent calls.
25492  * jQuery(element).on('click', _.debounce(sendMail, 300, {
25493  *   'leading': true,
25494  *   'trailing': false
25495  * }));
25496  *
25497  * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
25498  * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
25499  * var source = new EventSource('/stream');
25500  * jQuery(source).on('message', debounced);
25501  *
25502  * // Cancel the trailing debounced invocation.
25503  * jQuery(window).on('popstate', debounced.cancel);
25504  */
25505 function debounce$1(func, wait, options) {
25506   var lastArgs,
25507       lastThis,
25508       maxWait,
25509       result,
25510       timerId,
25511       lastCallTime,
25512       lastInvokeTime = 0,
25513       leading = false,
25514       maxing = false,
25515       trailing = true;
25516
25517   if (typeof func != 'function') {
25518     throw new TypeError(FUNC_ERROR_TEXT$2);
25519   }
25520   wait = toNumber(wait) || 0;
25521   if (isObject(options)) {
25522     leading = !!options.leading;
25523     maxing = 'maxWait' in options;
25524     maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
25525     trailing = 'trailing' in options ? !!options.trailing : trailing;
25526   }
25527
25528   function invokeFunc(time) {
25529     var args = lastArgs,
25530         thisArg = lastThis;
25531
25532     lastArgs = lastThis = undefined;
25533     lastInvokeTime = time;
25534     result = func.apply(thisArg, args);
25535     return result;
25536   }
25537
25538   function leadingEdge(time) {
25539     // Reset any `maxWait` timer.
25540     lastInvokeTime = time;
25541     // Start the timer for the trailing edge.
25542     timerId = setTimeout(timerExpired, wait);
25543     // Invoke the leading edge.
25544     return leading ? invokeFunc(time) : result;
25545   }
25546
25547   function remainingWait(time) {
25548     var timeSinceLastCall = time - lastCallTime,
25549         timeSinceLastInvoke = time - lastInvokeTime,
25550         result = wait - timeSinceLastCall;
25551
25552     return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
25553   }
25554
25555   function shouldInvoke(time) {
25556     var timeSinceLastCall = time - lastCallTime,
25557         timeSinceLastInvoke = time - lastInvokeTime;
25558
25559     // Either this is the first call, activity has stopped and we're at the
25560     // trailing edge, the system time has gone backwards and we're treating
25561     // it as the trailing edge, or we've hit the `maxWait` limit.
25562     return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
25563       (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
25564   }
25565
25566   function timerExpired() {
25567     var time = now$1();
25568     if (shouldInvoke(time)) {
25569       return trailingEdge(time);
25570     }
25571     // Restart the timer.
25572     timerId = setTimeout(timerExpired, remainingWait(time));
25573   }
25574
25575   function trailingEdge(time) {
25576     timerId = undefined;
25577
25578     // Only invoke if we have `lastArgs` which means `func` has been
25579     // debounced at least once.
25580     if (trailing && lastArgs) {
25581       return invokeFunc(time);
25582     }
25583     lastArgs = lastThis = undefined;
25584     return result;
25585   }
25586
25587   function cancel() {
25588     if (timerId !== undefined) {
25589       clearTimeout(timerId);
25590     }
25591     lastInvokeTime = 0;
25592     lastArgs = lastCallTime = lastThis = timerId = undefined;
25593   }
25594
25595   function flush() {
25596     return timerId === undefined ? result : trailingEdge(now$1());
25597   }
25598
25599   function debounced() {
25600     var time = now$1(),
25601         isInvoking = shouldInvoke(time);
25602
25603     lastArgs = arguments;
25604     lastThis = this;
25605     lastCallTime = time;
25606
25607     if (isInvoking) {
25608       if (timerId === undefined) {
25609         return leadingEdge(lastCallTime);
25610       }
25611       if (maxing) {
25612         // Handle invocations in a tight loop.
25613         timerId = setTimeout(timerExpired, wait);
25614         return invokeFunc(lastCallTime);
25615       }
25616     }
25617     if (timerId === undefined) {
25618       timerId = setTimeout(timerExpired, wait);
25619     }
25620     return result;
25621   }
25622   debounced.cancel = cancel;
25623   debounced.flush = flush;
25624   return debounced;
25625 }
25626
25627 /**
25628  * Casts `value` to `identity` if it's not a function.
25629  *
25630  * @private
25631  * @param {*} value The value to inspect.
25632  * @returns {Function} Returns cast function.
25633  */
25634 function castFunction(value) {
25635   return typeof value == 'function' ? value : identity$8;
25636 }
25637
25638 /**
25639  * Iterates over elements of `collection` and invokes `iteratee` for each element.
25640  * The iteratee is invoked with three arguments: (value, index|key, collection).
25641  * Iteratee functions may exit iteration early by explicitly returning `false`.
25642  *
25643  * **Note:** As with other "Collections" methods, objects with a "length"
25644  * property are iterated like arrays. To avoid this behavior use `_.forIn`
25645  * or `_.forOwn` for object iteration.
25646  *
25647  * @static
25648  * @memberOf _
25649  * @since 0.1.0
25650  * @alias each
25651  * @category Collection
25652  * @param {Array|Object} collection The collection to iterate over.
25653  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25654  * @returns {Array|Object} Returns `collection`.
25655  * @see _.forEachRight
25656  * @example
25657  *
25658  * _.forEach([1, 2], function(value) {
25659  *   console.log(value);
25660  * });
25661  * // => Logs `1` then `2`.
25662  *
25663  * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
25664  *   console.log(key);
25665  * });
25666  * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25667  */
25668 function forEach(collection, iteratee) {
25669   var func = isArray(collection) ? arrayEach : baseEach;
25670   return func(collection, castFunction(iteratee));
25671 }
25672
25673 /**
25674  * Iterates over own enumerable string keyed properties of an object and
25675  * invokes `iteratee` for each property. The iteratee is invoked with three
25676  * arguments: (value, key, object). Iteratee functions may exit iteration
25677  * early by explicitly returning `false`.
25678  *
25679  * @static
25680  * @memberOf _
25681  * @since 0.3.0
25682  * @category Object
25683  * @param {Object} object The object to iterate over.
25684  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25685  * @returns {Object} Returns `object`.
25686  * @see _.forOwnRight
25687  * @example
25688  *
25689  * function Foo() {
25690  *   this.a = 1;
25691  *   this.b = 2;
25692  * }
25693  *
25694  * Foo.prototype.c = 3;
25695  *
25696  * _.forOwn(new Foo, function(value, key) {
25697  *   console.log(key);
25698  * });
25699  * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25700  */
25701 function forOwn(object, iteratee) {
25702   return object && baseForOwn(object, castFunction(iteratee));
25703 }
25704
25705 var translations = Object.create(null);
25706
25707 var currentLocale = 'en';
25708 var textDirection = 'ltr';
25709
25710 function setLocale(_) {
25711     if (translations[_] !== undefined) {
25712         currentLocale = _;
25713     } else if (translations[_.split('-')[0]]) {
25714         currentLocale = _.split('-')[0];
25715     }
25716 }
25717
25718 function addTranslation(id, value) {
25719     translations[id] = value;
25720 }
25721
25722 /**
25723  * Given a string identifier, try to find that string in the current
25724  * language, and return it.
25725  *
25726  * @param {string} s string identifier
25727  * @returns {string?} locale string
25728  */
25729 function t(s, o, loc) {
25730     loc = loc || currentLocale;
25731
25732     var path = s
25733         .split('.')
25734         .map(function(s) { return s.replace('<TX_DOT>', '.'); })
25735         .reverse();
25736
25737     var rep = translations[loc];
25738
25739     while (rep !== undefined && path.length) rep = rep[path.pop()];
25740
25741     if (rep !== undefined) {
25742         if (o) for (var k in o) rep = rep.replace('{' + k + '}', o[k]);
25743         return rep;
25744     }
25745
25746     if (loc !== 'en') {
25747         return t(s, o, 'en');
25748     }
25749
25750     if (o && 'default' in o) {
25751         return o.default;
25752     }
25753
25754     var missing = 'Missing ' + loc + ' translation: ' + s;
25755     if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
25756
25757     return missing;
25758 }
25759
25760 /**
25761  * Given string 'ltr' or 'rtl', save that setting
25762  *
25763  * @param {string} s ltr or rtl
25764  */
25765
25766 function setTextDirection(dir) {
25767     textDirection = dir;
25768 }
25769
25770 /** Used to compose bitmasks for cloning. */
25771 var CLONE_DEEP_FLAG$4 = 1;
25772 var CLONE_SYMBOLS_FLAG$3 = 4;
25773
25774 /**
25775  * This method is like `_.cloneWith` except that it recursively clones `value`.
25776  *
25777  * @static
25778  * @memberOf _
25779  * @since 4.0.0
25780  * @category Lang
25781  * @param {*} value The value to recursively clone.
25782  * @param {Function} [customizer] The function to customize cloning.
25783  * @returns {*} Returns the deep cloned value.
25784  * @see _.cloneWith
25785  * @example
25786  *
25787  * function customizer(value) {
25788  *   if (_.isElement(value)) {
25789  *     return value.cloneNode(true);
25790  *   }
25791  * }
25792  *
25793  * var el = _.cloneDeepWith(document.body, customizer);
25794  *
25795  * console.log(el === document.body);
25796  * // => false
25797  * console.log(el.nodeName);
25798  * // => 'BODY'
25799  * console.log(el.childNodes.length);
25800  * // => 20
25801  */
25802 function cloneDeepWith(value, customizer) {
25803   customizer = typeof customizer == 'function' ? customizer : undefined;
25804   return baseClone(value, CLONE_DEEP_FLAG$4 | CLONE_SYMBOLS_FLAG$3, customizer);
25805 }
25806
25807 /**
25808  * Creates an array of `array` values not included in the other given arrays
25809  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25810  * for equality comparisons. The order and references of result values are
25811  * determined by the first array.
25812  *
25813  * **Note:** Unlike `_.pullAll`, this method returns a new array.
25814  *
25815  * @static
25816  * @memberOf _
25817  * @since 0.1.0
25818  * @category Array
25819  * @param {Array} array The array to inspect.
25820  * @param {...Array} [values] The values to exclude.
25821  * @returns {Array} Returns the new array of filtered values.
25822  * @see _.without, _.xor
25823  * @example
25824  *
25825  * _.difference([2, 1], [2, 3]);
25826  * // => [1]
25827  */
25828 var difference = baseRest(function(array, values) {
25829   return isArrayLikeObject(array)
25830     ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
25831     : [];
25832 });
25833
25834 /**
25835  * Flattens `array` a single level deep.
25836  *
25837  * @static
25838  * @memberOf _
25839  * @since 0.1.0
25840  * @category Array
25841  * @param {Array} array The array to flatten.
25842  * @returns {Array} Returns the new flattened array.
25843  * @example
25844  *
25845  * _.flatten([1, [2, [3, [4]], 5]]);
25846  * // => [1, 2, [3, [4]], 5]
25847  */
25848 function flatten(array) {
25849   var length = array == null ? 0 : array.length;
25850   return length ? baseFlatten(array, 1) : [];
25851 }
25852
25853 /**
25854  * A specialized version of `baseAggregator` for arrays.
25855  *
25856  * @private
25857  * @param {Array} [array] The array to iterate over.
25858  * @param {Function} setter The function to set `accumulator` values.
25859  * @param {Function} iteratee The iteratee to transform keys.
25860  * @param {Object} accumulator The initial aggregated object.
25861  * @returns {Function} Returns `accumulator`.
25862  */
25863 function arrayAggregator(array, setter, iteratee, accumulator) {
25864   var index = -1,
25865       length = array == null ? 0 : array.length;
25866
25867   while (++index < length) {
25868     var value = array[index];
25869     setter(accumulator, value, iteratee(value), array);
25870   }
25871   return accumulator;
25872 }
25873
25874 /**
25875  * Aggregates elements of `collection` on `accumulator` with keys transformed
25876  * by `iteratee` and values set by `setter`.
25877  *
25878  * @private
25879  * @param {Array|Object} collection The collection to iterate over.
25880  * @param {Function} setter The function to set `accumulator` values.
25881  * @param {Function} iteratee The iteratee to transform keys.
25882  * @param {Object} accumulator The initial aggregated object.
25883  * @returns {Function} Returns `accumulator`.
25884  */
25885 function baseAggregator(collection, setter, iteratee, accumulator) {
25886   baseEach(collection, function(value, key, collection) {
25887     setter(accumulator, value, iteratee(value), collection);
25888   });
25889   return accumulator;
25890 }
25891
25892 /**
25893  * Creates a function like `_.groupBy`.
25894  *
25895  * @private
25896  * @param {Function} setter The function to set accumulator values.
25897  * @param {Function} [initializer] The accumulator object initializer.
25898  * @returns {Function} Returns the new aggregator function.
25899  */
25900 function createAggregator(setter, initializer) {
25901   return function(collection, iteratee) {
25902     var func = isArray(collection) ? arrayAggregator : baseAggregator,
25903         accumulator = initializer ? initializer() : {};
25904
25905     return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
25906   };
25907 }
25908
25909 /** Used for built-in method references. */
25910 var objectProto$15 = Object.prototype;
25911
25912 /** Used to check objects for own properties. */
25913 var hasOwnProperty$12 = objectProto$15.hasOwnProperty;
25914
25915 /**
25916  * Creates an object composed of keys generated from the results of running
25917  * each element of `collection` thru `iteratee`. The order of grouped values
25918  * is determined by the order they occur in `collection`. The corresponding
25919  * value of each key is an array of elements responsible for generating the
25920  * key. The iteratee is invoked with one argument: (value).
25921  *
25922  * @static
25923  * @memberOf _
25924  * @since 0.1.0
25925  * @category Collection
25926  * @param {Array|Object} collection The collection to iterate over.
25927  * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
25928  * @returns {Object} Returns the composed aggregate object.
25929  * @example
25930  *
25931  * _.groupBy([6.1, 4.2, 6.3], Math.floor);
25932  * // => { '4': [4.2], '6': [6.1, 6.3] }
25933  *
25934  * // The `_.property` iteratee shorthand.
25935  * _.groupBy(['one', 'two', 'three'], 'length');
25936  * // => { '3': ['one', 'two'], '5': ['three'] }
25937  */
25938 var groupBy = createAggregator(function(result, value, key) {
25939   if (hasOwnProperty$12.call(result, key)) {
25940     result[key].push(value);
25941   } else {
25942     baseAssignValue(result, key, [value]);
25943   }
25944 });
25945
25946 /** `Object#toString` result references. */
25947 var mapTag$6 = '[object Map]';
25948 var setTag$6 = '[object Set]';
25949
25950 /** Used for built-in method references. */
25951 var objectProto$16 = Object.prototype;
25952
25953 /** Used to check objects for own properties. */
25954 var hasOwnProperty$13 = objectProto$16.hasOwnProperty;
25955
25956 /**
25957  * Checks if `value` is an empty object, collection, map, or set.
25958  *
25959  * Objects are considered empty if they have no own enumerable string keyed
25960  * properties.
25961  *
25962  * Array-like values such as `arguments` objects, arrays, buffers, strings, or
25963  * jQuery-like collections are considered empty if they have a `length` of `0`.
25964  * Similarly, maps and sets are considered empty if they have a `size` of `0`.
25965  *
25966  * @static
25967  * @memberOf _
25968  * @since 0.1.0
25969  * @category Lang
25970  * @param {*} value The value to check.
25971  * @returns {boolean} Returns `true` if `value` is empty, else `false`.
25972  * @example
25973  *
25974  * _.isEmpty(null);
25975  * // => true
25976  *
25977  * _.isEmpty(true);
25978  * // => true
25979  *
25980  * _.isEmpty(1);
25981  * // => true
25982  *
25983  * _.isEmpty([1, 2, 3]);
25984  * // => false
25985  *
25986  * _.isEmpty({ 'a': 1 });
25987  * // => false
25988  */
25989 function isEmpty(value) {
25990   if (value == null) {
25991     return true;
25992   }
25993   if (isArrayLike(value) &&
25994       (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
25995         isBuffer(value) || isTypedArray(value) || isArguments(value))) {
25996     return !value.length;
25997   }
25998   var tag = getTag$1(value);
25999   if (tag == mapTag$6 || tag == setTag$6) {
26000     return !value.size;
26001   }
26002   if (isPrototype(value)) {
26003     return !baseKeys(value).length;
26004   }
26005   for (var key in value) {
26006     if (hasOwnProperty$13.call(value, key)) {
26007       return false;
26008     }
26009   }
26010   return true;
26011 }
26012
26013 /**
26014  * Gets the last element of `array`.
26015  *
26016  * @static
26017  * @memberOf _
26018  * @since 0.1.0
26019  * @category Array
26020  * @param {Array} array The array to query.
26021  * @returns {*} Returns the last element of `array`.
26022  * @example
26023  *
26024  * _.last([1, 2, 3]);
26025  * // => 3
26026  */
26027 function last(array) {
26028   var length = array == null ? 0 : array.length;
26029   return length ? array[length - 1] : undefined;
26030 }
26031
26032 /**
26033  * The base implementation of `_.slice` without an iteratee call guard.
26034  *
26035  * @private
26036  * @param {Array} array The array to slice.
26037  * @param {number} [start=0] The start position.
26038  * @param {number} [end=array.length] The end position.
26039  * @returns {Array} Returns the slice of `array`.
26040  */
26041 function baseSlice(array, start, end) {
26042   var index = -1,
26043       length = array.length;
26044
26045   if (start < 0) {
26046     start = -start > length ? 0 : (length + start);
26047   }
26048   end = end > length ? length : end;
26049   if (end < 0) {
26050     end += length;
26051   }
26052   length = start > end ? 0 : ((end - start) >>> 0);
26053   start >>>= 0;
26054
26055   var result = Array(length);
26056   while (++index < length) {
26057     result[index] = array[index + start];
26058   }
26059   return result;
26060 }
26061
26062 /**
26063  * Gets the parent value at `path` of `object`.
26064  *
26065  * @private
26066  * @param {Object} object The object to query.
26067  * @param {Array} path The path to get the parent value of.
26068  * @returns {*} Returns the parent value.
26069  */
26070 function parent(object, path) {
26071   return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
26072 }
26073
26074 /**
26075  * The base implementation of `_.unset`.
26076  *
26077  * @private
26078  * @param {Object} object The object to modify.
26079  * @param {Array|string} path The property path to unset.
26080  * @returns {boolean} Returns `true` if the property is deleted, else `false`.
26081  */
26082 function baseUnset(object, path) {
26083   path = castPath(path, object);
26084   object = parent(object, path);
26085   return object == null || delete object[toKey(last(path))];
26086 }
26087
26088 /** `Object#toString` result references. */
26089 var objectTag$4 = '[object Object]';
26090
26091 /** Used for built-in method references. */
26092 var funcProto$2 = Function.prototype;
26093 var objectProto$17 = Object.prototype;
26094
26095 /** Used to resolve the decompiled source of functions. */
26096 var funcToString$2 = funcProto$2.toString;
26097
26098 /** Used to check objects for own properties. */
26099 var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
26100
26101 /** Used to infer the `Object` constructor. */
26102 var objectCtorString = funcToString$2.call(Object);
26103
26104 /**
26105  * Checks if `value` is a plain object, that is, an object created by the
26106  * `Object` constructor or one with a `[[Prototype]]` of `null`.
26107  *
26108  * @static
26109  * @memberOf _
26110  * @since 0.8.0
26111  * @category Lang
26112  * @param {*} value The value to check.
26113  * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
26114  * @example
26115  *
26116  * function Foo() {
26117  *   this.a = 1;
26118  * }
26119  *
26120  * _.isPlainObject(new Foo);
26121  * // => false
26122  *
26123  * _.isPlainObject([1, 2, 3]);
26124  * // => false
26125  *
26126  * _.isPlainObject({ 'x': 0, 'y': 0 });
26127  * // => true
26128  *
26129  * _.isPlainObject(Object.create(null));
26130  * // => true
26131  */
26132 function isPlainObject(value) {
26133   if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
26134     return false;
26135   }
26136   var proto = getPrototype(value);
26137   if (proto === null) {
26138     return true;
26139   }
26140   var Ctor = hasOwnProperty$14.call(proto, 'constructor') && proto.constructor;
26141   return typeof Ctor == 'function' && Ctor instanceof Ctor &&
26142     funcToString$2.call(Ctor) == objectCtorString;
26143 }
26144
26145 /**
26146  * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
26147  * objects.
26148  *
26149  * @private
26150  * @param {*} value The value to inspect.
26151  * @param {string} key The key of the property to inspect.
26152  * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
26153  */
26154 function customOmitClone(value) {
26155   return isPlainObject(value) ? undefined : value;
26156 }
26157
26158 /**
26159  * A specialized version of `baseRest` which flattens the rest array.
26160  *
26161  * @private
26162  * @param {Function} func The function to apply a rest parameter to.
26163  * @returns {Function} Returns the new function.
26164  */
26165 function flatRest(func) {
26166   return setToString(overRest(func, undefined, flatten), func + '');
26167 }
26168
26169 /** Used to compose bitmasks for cloning. */
26170 var CLONE_DEEP_FLAG$5 = 1;
26171 var CLONE_FLAT_FLAG$1 = 2;
26172 var CLONE_SYMBOLS_FLAG$4 = 4;
26173
26174 /**
26175  * The opposite of `_.pick`; this method creates an object composed of the
26176  * own and inherited enumerable property paths of `object` that are not omitted.
26177  *
26178  * **Note:** This method is considerably slower than `_.pick`.
26179  *
26180  * @static
26181  * @since 0.1.0
26182  * @memberOf _
26183  * @category Object
26184  * @param {Object} object The source object.
26185  * @param {...(string|string[])} [paths] The property paths to omit.
26186  * @returns {Object} Returns the new object.
26187  * @example
26188  *
26189  * var object = { 'a': 1, 'b': '2', 'c': 3 };
26190  *
26191  * _.omit(object, ['a', 'c']);
26192  * // => { 'b': '2' }
26193  */
26194 var omit = flatRest(function(object, paths) {
26195   var result = {};
26196   if (object == null) {
26197     return result;
26198   }
26199   var isDeep = false;
26200   paths = arrayMap(paths, function(path) {
26201     path = castPath(path, object);
26202     isDeep || (isDeep = path.length > 1);
26203     return path;
26204   });
26205   copyObject(object, getAllKeysIn(object), result);
26206   if (isDeep) {
26207     result = baseClone(result, CLONE_DEEP_FLAG$5 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$4, customOmitClone);
26208   }
26209   var length = paths.length;
26210   while (length--) {
26211     baseUnset(result, paths[length]);
26212   }
26213   return result;
26214 });
26215
26216 var detected;
26217
26218 function utilDetect(force) {
26219     if (detected && !force) return detected;
26220     detected = {};
26221
26222     var ua = navigator.userAgent,
26223         m = null;
26224
26225     m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
26226     if (m !== null) {
26227         detected.browser = m[1];
26228         detected.version = m[2];
26229     }
26230     if (!detected.browser) {
26231         m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
26232         if (m !== null) {
26233             detected.browser = 'msie';
26234             detected.version = m[1];
26235         }
26236     }
26237     if (!detected.browser) {
26238         m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
26239         if (m !== null) {
26240             detected.browser = 'Opera';
26241             detected.version = m[2];
26242         }
26243     }
26244     if (!detected.browser) {
26245         m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
26246         if (m !== null) {
26247             detected.browser = m[1];
26248             detected.version = m[2];
26249             m = ua.match(/version\/([\.\d]+)/i);
26250             if (m !== null) detected.version = m[1];
26251         }
26252     }
26253     if (!detected.browser) {
26254         detected.browser = navigator.appName;
26255         detected.version = navigator.appVersion;
26256     }
26257
26258     // keep major.minor version only..
26259     detected.version = detected.version.split(/\W/).slice(0,2).join('.');
26260
26261     if (detected.browser.toLowerCase() === 'msie') {
26262         detected.ie = true;
26263         detected.browser = 'Internet Explorer';
26264         detected.support = parseFloat(detected.version) >= 11;
26265     } else {
26266         detected.ie = false;
26267         detected.support = true;
26268     }
26269
26270     // Added due to incomplete svg style support. See #715
26271     detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
26272
26273     detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
26274     detected.language = detected.locale.split('-')[0];
26275
26276     // Search `navigator.languages` for a better locale.. Prefer the first language,
26277     // unless the second language is a culture-specific version of the first one, see #3842
26278     if (navigator.languages && navigator.languages.length > 0) {
26279         var code0 = navigator.languages[0],
26280             parts0 = code0.split('-');
26281
26282         detected.locale = code0;
26283         detected.language = parts0[0];
26284
26285         if (navigator.languages.length > 1 && parts0.length === 1) {
26286             var code1 = navigator.languages[1],
26287                 parts1 = code1.split('-');
26288
26289             if (parts1[0] === parts0[0]) {
26290                 detected.locale = code1;
26291             }
26292         }
26293     }
26294
26295     // Loaded locale is stored in currentLocale
26296     // return that instead (except in the situation where 'en' might override 'en-US')
26297     var loadedLocale = currentLocale || 'en';
26298     if (loadedLocale !== 'en') {
26299         detected.locale = loadedLocale;
26300         detected.language = detected.locale.split('-')[0];
26301     }
26302
26303     // detect text direction
26304     var q = utilStringQs(window.location.hash.substring(1));
26305     var lang = dataLocales[detected.locale];
26306     if ((lang && lang.rtl) || (q.rtl === 'true')) {
26307         detected.textDirection = 'rtl';
26308     } else {
26309         detected.textDirection = 'ltr';
26310     }
26311     setTextDirection(detected.textDirection);
26312
26313     // detect host
26314     var loc = window.top.location;
26315     var origin = loc.origin;
26316     if (!origin) {  // for unpatched IE11
26317         origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
26318     }
26319
26320     detected.host = origin + loc.pathname;
26321
26322     detected.filedrop = (window.FileReader && 'ondrop' in window);
26323
26324     detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26325
26326     function nav(x) {
26327         return navigator.userAgent.indexOf(x) !== -1;
26328     }
26329
26330     if (nav('Win')) {
26331         detected.os = 'win';
26332         detected.platform = 'Windows';
26333     }
26334     else if (nav('Mac')) {
26335         detected.os = 'mac';
26336         detected.platform = 'Macintosh';
26337     }
26338     else if (nav('X11') || nav('Linux')) {
26339         detected.os = 'linux';
26340         detected.platform = 'Linux';
26341     }
26342     else {
26343         detected.os = 'win';
26344         detected.platform = 'Unknown';
26345     }
26346
26347     return detected;
26348 }
26349
26350 var remove$1 = removeDiacritics;
26351
26352 var replacementList = [
26353   {
26354     base: ' ',
26355     chars: "\u00A0",
26356   }, {
26357     base: '0',
26358     chars: "\u07C0",
26359   }, {
26360     base: 'A',
26361     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",
26362   }, {
26363     base: 'AA',
26364     chars: "\uA732",
26365   }, {
26366     base: 'AE',
26367     chars: "\u00C6\u01FC\u01E2",
26368   }, {
26369     base: 'AO',
26370     chars: "\uA734",
26371   }, {
26372     base: 'AU',
26373     chars: "\uA736",
26374   }, {
26375     base: 'AV',
26376     chars: "\uA738\uA73A",
26377   }, {
26378     base: 'AY',
26379     chars: "\uA73C",
26380   }, {
26381     base: 'B',
26382     chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
26383   }, {
26384     base: 'C',
26385     chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
26386   }, {
26387     base: 'D',
26388     chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
26389   }, {
26390     base: 'Dh',
26391     chars: "\u00D0",
26392   }, {
26393     base: 'DZ',
26394     chars: "\u01F1\u01C4",
26395   }, {
26396     base: 'Dz',
26397     chars: "\u01F2\u01C5",
26398   }, {
26399     base: 'E',
26400     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",
26401   }, {
26402     base: 'F',
26403     chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
26404   }, {
26405     base: 'G',
26406     chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
26407   }, {
26408     base: 'H',
26409     chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
26410   }, {
26411     base: 'I',
26412     chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
26413   }, {
26414     base: 'J',
26415     chars: "\u24BF\uFF2A\u0134\u0248\u0237",
26416   }, {
26417     base: 'K',
26418     chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
26419   }, {
26420     base: 'L',
26421     chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
26422   }, {
26423     base: 'LJ',
26424     chars: "\u01C7",
26425   }, {
26426     base: 'Lj',
26427     chars: "\u01C8",
26428   }, {
26429     base: 'M',
26430     chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
26431   }, {
26432     base: 'N',
26433     chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
26434   }, {
26435     base: 'NJ',
26436     chars: "\u01CA",
26437   }, {
26438     base: 'Nj',
26439     chars: "\u01CB",
26440   }, {
26441     base: 'O',
26442     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",
26443   }, {
26444     base: 'OE',
26445     chars: "\u0152",
26446   }, {
26447     base: 'OI',
26448     chars: "\u01A2",
26449   }, {
26450     base: 'OO',
26451     chars: "\uA74E",
26452   }, {
26453     base: 'OU',
26454     chars: "\u0222",
26455   }, {
26456     base: 'P',
26457     chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
26458   }, {
26459     base: 'Q',
26460     chars: "\u24C6\uFF31\uA756\uA758\u024A",
26461   }, {
26462     base: 'R',
26463     chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
26464   }, {
26465     base: 'S',
26466     chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
26467   }, {
26468     base: 'T',
26469     chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
26470   }, {
26471     base: 'Th',
26472     chars: "\u00DE",
26473   }, {
26474     base: 'TZ',
26475     chars: "\uA728",
26476   }, {
26477     base: 'U',
26478     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",
26479   }, {
26480     base: 'V',
26481     chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
26482   }, {
26483     base: 'VY',
26484     chars: "\uA760",
26485   }, {
26486     base: 'W',
26487     chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
26488   }, {
26489     base: 'X',
26490     chars: "\u24CD\uFF38\u1E8A\u1E8C",
26491   }, {
26492     base: 'Y',
26493     chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
26494   }, {
26495     base: 'Z',
26496     chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
26497   }, {
26498     base: 'a',
26499     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",
26500   }, {
26501     base: 'aa',
26502     chars: "\uA733",
26503   }, {
26504     base: 'ae',
26505     chars: "\u00E6\u01FD\u01E3",
26506   }, {
26507     base: 'ao',
26508     chars: "\uA735",
26509   }, {
26510     base: 'au',
26511     chars: "\uA737",
26512   }, {
26513     base: 'av',
26514     chars: "\uA739\uA73B",
26515   }, {
26516     base: 'ay',
26517     chars: "\uA73D",
26518   }, {
26519     base: 'b',
26520     chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
26521   }, {
26522     base: 'c',
26523     chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
26524   }, {
26525     base: 'd',
26526     chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
26527   }, {
26528     base: 'dh',
26529     chars: "\u00F0",
26530   }, {
26531     base: 'dz',
26532     chars: "\u01F3\u01C6",
26533   }, {
26534     base: 'e',
26535     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",
26536   }, {
26537     base: 'f',
26538     chars: "\u24D5\uFF46\u1E1F\u0192",
26539   }, {
26540     base: 'ff',
26541     chars: "\uFB00",
26542   }, {
26543     base: 'fi',
26544     chars: "\uFB01",
26545   }, {
26546     base: 'fl',
26547     chars: "\uFB02",
26548   }, {
26549     base: 'ffi',
26550     chars: "\uFB03",
26551   }, {
26552     base: 'ffl',
26553     chars: "\uFB04",
26554   }, {
26555     base: 'g',
26556     chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
26557   }, {
26558     base: 'h',
26559     chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
26560   }, {
26561     base: 'hv',
26562     chars: "\u0195",
26563   }, {
26564     base: 'i',
26565     chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
26566   }, {
26567     base: 'j',
26568     chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
26569   }, {
26570     base: 'k',
26571     chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
26572   }, {
26573     base: 'l',
26574     chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
26575   }, {
26576     base: 'lj',
26577     chars: "\u01C9",
26578   }, {
26579     base: 'm',
26580     chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
26581   }, {
26582     base: 'n',
26583     chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
26584   }, {
26585     base: 'nj',
26586     chars: "\u01CC",
26587   }, {
26588     base: 'o',
26589     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",
26590   }, {
26591     base: 'oe',
26592     chars: "\u0153",
26593   }, {
26594     base: 'oi',
26595     chars: "\u01A3",
26596   }, {
26597     base: 'oo',
26598     chars: "\uA74F",
26599   }, {
26600     base: 'ou',
26601     chars: "\u0223",
26602   }, {
26603     base: 'p',
26604     chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
26605   }, {
26606     base: 'q',
26607     chars: "\u24E0\uFF51\u024B\uA757\uA759",
26608   }, {
26609     base: 'r',
26610     chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
26611   }, {
26612     base: 's',
26613     chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
26614   }, {
26615     base: 'ss',
26616     chars: "\xDF",
26617   }, {
26618     base: 't',
26619     chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26620   }, {
26621     base: 'th',
26622     chars: "\u00FE",
26623   }, {
26624     base: 'tz',
26625     chars: "\uA729",
26626   }, {
26627     base: 'u',
26628     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",
26629   }, {
26630     base: 'v',
26631     chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26632   }, {
26633     base: 'vy',
26634     chars: "\uA761",
26635   }, {
26636     base: 'w',
26637     chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26638   }, {
26639     base: 'x',
26640     chars: "\u24E7\uFF58\u1E8B\u1E8D",
26641   }, {
26642     base: 'y',
26643     chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26644   }, {
26645     base: 'z',
26646     chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26647   }
26648 ];
26649
26650 var diacriticsMap = {};
26651 for (var i = 0; i < replacementList.length; i += 1) {
26652   var chars = replacementList[i].chars;
26653   for (var j = 0; j < chars.length; j += 1) {
26654     diacriticsMap[chars[j]] = replacementList[i].base;
26655   }
26656 }
26657
26658 function removeDiacritics(str) {
26659   return str.replace(/[^\u0000-\u007e]/g, function(c) {
26660     return diacriticsMap[c] || c;
26661   });
26662 }
26663
26664 // see https://github.com/openstreetmap/iD/pull/3707
26665 // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
26666
26667 var chars$1 = {
26668     // madda above alef
26669     1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
26670
26671     // hamza above and below alef
26672     1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
26673     // 1572 is ؤ
26674     1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
26675     // 1574 is ئ
26676     1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
26677     1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
26678
26679     // 1577 ة
26680     1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
26681
26682     1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
26683     1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
26684     1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
26685     1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
26686     1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
26687     1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
26688     1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
26689     1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
26690     1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
26691     1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
26692     1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
26693     1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
26694     1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
26695     1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
26696     1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
26697     1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
26698     1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
26699     1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
26700
26701     // 1595 ػ - may be very rare
26702
26703     1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
26704     1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
26705     1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
26706     1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
26707     1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
26708     1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
26709     1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
26710
26711     // 1609 ى
26712     1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
26713     // 1610 ي
26714     1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
26715
26716     // short vowel sounds / tashkil markings
26717
26718     1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
26719
26720     1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
26721     1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
26722     1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
26723     1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
26724     1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
26725     5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
26726 };
26727
26728 var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
26729
26730 function fixRTLTextForSvg(inputText) {
26731     var context = true;
26732     var ret = '';
26733     var rtlBuffer = [];
26734     var arabicRegex = /[\u0600-\u06FF]/g;
26735     var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
26736     var thaanaVowel = /[\u07A6-\u07B0]/;
26737     var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
26738
26739     if (!arabicRegex.test(inputText)) {
26740         // Hebrew or Thaana RTL script
26741         for (var n = 0; n < inputText.length; n++) {
26742             var c = inputText[n];
26743             if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
26744                 rtlBuffer[rtlBuffer.length - 1] += c;
26745             } else if (rtlRegex.test(c)) {
26746                 rtlBuffer.push(c);
26747             } else if (c === ' ' && rtlBuffer.length) {
26748                 // whitespace within RTL text
26749                 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26750             } else {
26751                 // non-RTL character
26752                 ret += rtlBuffer.reverse().join('') + c;
26753                 rtlBuffer = [];
26754             }
26755         }
26756     } else {
26757         for (var i = 0, l = inputText.length; i < l; i++) {
26758             var code = inputText[i].charCodeAt(0);
26759             var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
26760
26761             if (!chars$1[code]) {
26762                 if (code === 32 && rtlBuffer.length) {
26763                     // whitespace
26764                     rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26765                 } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
26766                     // tashkil mark
26767                     rtlBuffer[rtlBuffer.length - 1] += inputText[i];
26768                 } else {
26769                     // non-RTL character
26770                     ret += rtlBuffer.reverse().join('') + inputText[i];
26771                     rtlBuffer = [];
26772                 }
26773                 continue;
26774             }
26775             if (context) {
26776                 if (i === l - 1 || nextCode === 32) {
26777                     rtlBuffer.push(chars$1[code].isolated);
26778                 } else {
26779                     // special case for لا
26780                     if (code === 1604 && nextCode === 1575) {
26781                         rtlBuffer.push(chars$1[5000].initial);
26782                         i++;
26783                         context = true;
26784                         continue;
26785                     }
26786                     rtlBuffer.push(chars$1[code].initial);
26787                 }
26788             } else {
26789                 if (i === l - 1 || nextCode === 32){
26790                     rtlBuffer.push(chars$1[code].final);
26791                 } else {
26792                     // special case for ﻼ
26793                     if (code === 1604 && nextCode === 1575){
26794                         rtlBuffer.push(chars$1[5000].final);
26795                         i++;
26796                         context = true;
26797                         continue;
26798                     }
26799                     if (chars$1[code].medial === ''){
26800                         rtlBuffer.push(chars$1[code].final);
26801                     } else {
26802                         rtlBuffer.push(chars$1[code].medial);
26803                     }
26804                 }
26805             }
26806             context = (chars$1[code].medial === '') || nextCode === 32;
26807         }
26808     }
26809     ret += rtlBuffer.reverse().join('');
26810     return ret;
26811 }
26812
26813 function utilTagText(entity) {
26814     return map$4(entity.tags, function(v, k) {
26815         return k + '=' + v;
26816     }).join(', ');
26817 }
26818
26819
26820 function utilEntitySelector(ids) {
26821     return ids.length ? '.' + ids.join(',.') : 'nothing';
26822 }
26823
26824
26825 function utilEntityOrMemberSelector(ids, graph) {
26826     var s = utilEntitySelector(ids);
26827
26828     ids.forEach(function(id) {
26829         var entity = graph.hasEntity(id);
26830         if (entity && entity.type === 'relation') {
26831             entity.members.forEach(function(member) {
26832                 s += ',.' + member.id;
26833             });
26834         }
26835     });
26836
26837     return s;
26838 }
26839
26840
26841 function utilGetAllNodes(ids, graph) {
26842     var seen = {};
26843     var nodes = [];
26844     ids.forEach(getNodes);
26845     return nodes;
26846
26847     function getNodes(id) {
26848         if (seen[id]) return;
26849         seen[id] = true;
26850
26851         var entity = graph.hasEntity(id);
26852         if (!entity) return;
26853
26854         if (entity.type === 'node') {
26855             nodes.push(entity);
26856         } else if (entity.type === 'way') {
26857             entity.nodes.forEach(getNodes);
26858         } else {
26859             entity.members.map(function(member) { return member.id; }).forEach(getNodes);
26860         }
26861     }
26862 }
26863
26864
26865 function utilDisplayName(entity) {
26866     var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
26867         name = entity.tags[localizedNameKey] || entity.tags.name || '',
26868         network = entity.tags.cycle_network || entity.tags.network;
26869
26870     if (!name && entity.tags.ref) {
26871         name = entity.tags.ref;
26872         if (network) {
26873             name = network + ' ' + name;
26874         }
26875     }
26876
26877     return name;
26878 }
26879
26880
26881 function utilDisplayNameForPath(entity) {
26882     var name = utilDisplayName(entity);
26883     var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
26884
26885     if (!isFirefox && name && rtlRegex.test(name)) {
26886         name = fixRTLTextForSvg(name);
26887     }
26888
26889     return name;
26890 }
26891
26892
26893 function utilDisplayType(id) {
26894     return {
26895         n: t('inspector.node'),
26896         w: t('inspector.way'),
26897         r: t('inspector.relation')
26898     }[id.charAt(0)];
26899 }
26900
26901
26902 function utilStringQs(str) {
26903     return str.split('&').reduce(function(obj, pair){
26904         var parts = pair.split('=');
26905         if (parts.length === 2) {
26906             obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
26907         }
26908         return obj;
26909     }, {});
26910 }
26911
26912
26913 function utilQsString(obj, noencode) {
26914     function softEncode(s) {
26915       // encode everything except special characters used in certain hash parameters:
26916       // "/" in map states, ":", ",", {" and "}" in background
26917       return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
26918     }
26919     return Object.keys(obj).sort().map(function(key) {
26920         return encodeURIComponent(key) + '=' + (
26921             noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
26922     }).join('&');
26923 }
26924
26925
26926 function utilPrefixDOMProperty(property) {
26927     var prefixes = ['webkit', 'ms', 'moz', 'o'],
26928         i = -1,
26929         n = prefixes.length,
26930         s = document.body;
26931
26932     if (property in s)
26933         return property;
26934
26935     property = property.substr(0, 1).toUpperCase() + property.substr(1);
26936
26937     while (++i < n)
26938         if (prefixes[i] + property in s)
26939             return prefixes[i] + property;
26940
26941     return false;
26942 }
26943
26944
26945 function utilPrefixCSSProperty(property) {
26946     var prefixes = ['webkit', 'ms', 'Moz', 'O'],
26947         i = -1,
26948         n = prefixes.length,
26949         s = document.body.style;
26950
26951     if (property.toLowerCase() in s)
26952         return property.toLowerCase();
26953
26954     while (++i < n)
26955         if (prefixes[i] + property in s)
26956             return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
26957
26958     return false;
26959 }
26960
26961
26962 var transformProperty;
26963 function utilSetTransform(el, x, y, scale) {
26964     var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
26965         translate = utilDetect().opera ?
26966             'translate('   + x + 'px,' + y + 'px)' :
26967             'translate3d(' + x + 'px,' + y + 'px,0)';
26968     return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
26969 }
26970
26971
26972 // Calculates Levenshtein distance between two strings
26973 // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
26974 // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
26975 function utilEditDistance(a, b) {
26976     a = remove$1(a.toLowerCase());
26977     b = remove$1(b.toLowerCase());
26978     if (a.length === 0) return b.length;
26979     if (b.length === 0) return a.length;
26980     var matrix = [];
26981     for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
26982     for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
26983     for (i = 1; i <= b.length; i++) {
26984         for (j = 1; j <= a.length; j++) {
26985             if (b.charAt(i-1) === a.charAt(j-1)) {
26986                 matrix[i][j] = matrix[i-1][j-1];
26987             } else {
26988                 matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
26989                     Math.min(matrix[i][j-1] + 1, // insertion
26990                     matrix[i-1][j] + 1)); // deletion
26991             }
26992         }
26993     }
26994     return matrix[b.length][a.length];
26995 }
26996
26997
26998 // a d3.mouse-alike which
26999 // 1. Only works on HTML elements, not SVG
27000 // 2. Does not cause style recalculation
27001 function utilFastMouse(container) {
27002     var rect = container.getBoundingClientRect(),
27003         rectLeft = rect.left,
27004         rectTop = rect.top,
27005         clientLeft = +container.clientLeft,
27006         clientTop = +container.clientTop;
27007     if (textDirection === 'rtl') {
27008         rectLeft = 0;
27009     }
27010     return function(e) {
27011         return [
27012             e.clientX - rectLeft - clientLeft,
27013             e.clientY - rectTop - clientTop];
27014     };
27015 }
27016
27017
27018 /* eslint-disable no-proto */
27019 var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27020 /* eslint-enable no-proto */
27021
27022
27023 function utilAsyncMap(inputs, func, callback) {
27024     var remaining = inputs.length,
27025         results = [],
27026         errors = [];
27027
27028     inputs.forEach(function(d, i) {
27029         func(d, function done(err, data) {
27030             errors[i] = err;
27031             results[i] = data;
27032             remaining--;
27033             if (!remaining) callback(errors, results);
27034         });
27035     });
27036 }
27037
27038
27039 // wraps an index to an interval [0..length-1]
27040 function utilWrap(index, length) {
27041     if (index < 0)
27042         index += Math.ceil(-index/length)*length;
27043     return index % length;
27044 }
27045
27046
27047 /**
27048  * a replacement for functor
27049  *
27050  * @param {*} value any value
27051  * @returns {Function} a function that returns that value or the value if it's a function
27052  */
27053 function utilFunctor(value) {
27054     if (typeof value === 'function') return value;
27055     return function() {
27056         return value;
27057     };
27058 }
27059
27060
27061 function utilNoAuto(selection) {
27062     var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27063
27064     return selection
27065         .attr('autocomplete', 'off')
27066         .attr('autocorrect', 'off')
27067         .attr('autocapitalize', 'off')
27068         .attr('spellcheck', isText ? 'true' : 'false');
27069 }
27070
27071 // note the function should be of low priority
27072 // and should not be returning a value.
27073 function utilCallWhenIdle(func, timeout) {
27074     return function() {
27075         var args = arguments;
27076         var that = this;
27077         window.requestIdleCallback(function() {
27078             func.apply(that, args);
27079         }, {timeout: timeout});
27080     };
27081 }
27082
27083 // Like selection.property('value', ...), but avoids no-op value sets,
27084 // which can result in layout/repaint thrashing in some situations.
27085 function utilGetSetValue(selection, value) {
27086     function d3_selection_value(value) {
27087         function valueNull() {
27088             delete this.value;
27089         }
27090
27091         function valueConstant() {
27092             if (this.value !== value) {
27093                 this.value = value;
27094             }
27095         }
27096
27097         function valueFunction() {
27098             var x = value.apply(this, arguments);
27099             if (x == null) {
27100                 delete this.value;
27101             } else if (this.value !== x) {
27102                 this.value = x;
27103             }
27104         }
27105
27106         return value == null
27107             ? valueNull : (typeof value === 'function'
27108             ? valueFunction : valueConstant);
27109     }
27110
27111     if (arguments.length === 1) {
27112         return selection.property('value');
27113     }
27114
27115     return selection.each(d3_selection_value(value));
27116 }
27117
27118 function utilIdleWorker(tasks, processor, callback) {
27119     var processed = [];
27120     var currentPos = 0;
27121     var totalTasks = tasks.length;
27122
27123     function worker(deadline) {
27124         while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27125             var result = processor(tasks[currentPos]);
27126
27127             // if falsy dont add to the processed list
27128             if (result) processed.push(result);
27129             currentPos++;
27130         }
27131
27132         // more tasks are left, we might need more idleCallbacks
27133         if (currentPos < totalTasks) {
27134             return window.requestIdleCallback(function(deadline) {worker(deadline);});
27135         }
27136
27137         // tasks are completed
27138         return callback(processed);
27139     }
27140
27141     window.requestIdleCallback(function(deadline) {worker(deadline);});
27142 }
27143
27144 // shim
27145 window.requestIdleCallback =
27146     window.requestIdleCallback ||
27147     function(cb) {
27148         var start = Date.now();
27149         return setTimeout(function() {
27150             cb({
27151                 didTimeout: false,
27152                 timeRemaining: function() {
27153                     return Math.max(0, 50 - (Date.now() - start));
27154                 }
27155             });
27156         }, 1);
27157     };
27158
27159 window.cancelIdleCallback =
27160     window.cancelIdleCallback ||
27161     function(id) {
27162         clearTimeout(id);
27163     };
27164
27165 // Copies a variable number of methods from source to target.
27166 function utilRebind(target, source) {
27167     var i = 1, n = arguments.length, method;
27168     while (++i < n) {
27169         target[method = arguments[i]] = d3_rebind(target, source, source[method]);
27170     }
27171     return target;
27172 }
27173
27174 // Method is assumed to be a standard D3 getter-setter:
27175 // If passed with no arguments, gets the value.
27176 // If passed with arguments, sets the value and returns the target.
27177 function d3_rebind(target, source, method) {
27178     return function() {
27179         var value = method.apply(source, arguments);
27180         return value === source ? target : value;
27181     };
27182 }
27183
27184 // A per-domain session mutex backed by a cookie and dead man's
27185 // switch. If the session crashes, the mutex will auto-release
27186 // after 5 seconds.
27187
27188 function utilSessionMutex(name) {
27189     var mutex = {},
27190         intervalID;
27191
27192     function renew() {
27193         var expires = new Date();
27194         expires.setSeconds(expires.getSeconds() + 5);
27195         document.cookie = name + '=1; expires=' + expires.toUTCString();
27196     }
27197
27198     mutex.lock = function() {
27199         if (intervalID) return true;
27200         var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
27201         if (cookie) return false;
27202         renew();
27203         intervalID = window.setInterval(renew, 4000);
27204         return true;
27205     };
27206
27207     mutex.unlock = function() {
27208         if (!intervalID) return;
27209         document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
27210         clearInterval(intervalID);
27211         intervalID = null;
27212     };
27213
27214     mutex.locked = function() {
27215         return !!intervalID;
27216     };
27217
27218     return mutex;
27219 }
27220
27221 function utilSuggestNames(preset, suggestions) {
27222     preset = preset.id.split('/', 2);
27223     var k = preset[0],
27224         v = preset[1];
27225
27226     return function(value, callback) {
27227         var result = [];
27228         if (value && value.length > 2) {
27229             if (suggestions[k] && suggestions[k][v]) {
27230                 for (var sugg in suggestions[k][v]) {
27231                     var dist = utilEditDistance(value, sugg.substring(0, value.length));
27232                     if (dist < 3) {
27233                         result.push({
27234                             title: sugg,
27235                             value: sugg,
27236                             dist: dist
27237                         });
27238                     }
27239                 }
27240             }
27241             result.sort(function(a, b) {
27242                 return a.dist - b.dist;
27243             });
27244         }
27245         result = result.slice(0,3);
27246         callback(result);
27247     };
27248 }
27249
27250 function utilTriggerEvent(target, type) {
27251     target.each(function() {
27252         var evt = document.createEvent('HTMLEvents');
27253         evt.initEvent(type, true, true);
27254         this.dispatchEvent(evt);
27255     });
27256 }
27257
27258 function validationDeprecatedTag() {
27259
27260     var validation = function(changes) {
27261         var warnings = [];
27262         for (var i = 0; i < changes.created.length; i++) {
27263             var change = changes.created[i],
27264                 deprecatedTags = change.deprecatedTags();
27265
27266             if (!isEmpty(deprecatedTags)) {
27267                 var tags = utilTagText({ tags: deprecatedTags });
27268                 warnings.push({
27269                     id: 'deprecated_tags',
27270                     message: t('validations.deprecated_tags', { tags: tags }),
27271                     entity: change
27272                 });
27273             }
27274         }
27275
27276         return warnings;
27277     };
27278
27279
27280     return validation;
27281 }
27282
27283 function validationDisconnectedHighway() {
27284
27285     function isDisconnectedHighway(entity, graph) {
27286         if (!entity.tags.highway) return false;
27287         if (entity.geometry(graph) !== 'line') return false;
27288
27289         return graph.childNodes(entity)
27290             .every(function(vertex) {
27291                 var parents = graph.parentWays(vertex);
27292                 if (parents.length === 1) {  // standalone vertex
27293                     return true;
27294                 } else {                     // shared vertex
27295                     return !vertex.tags.entrance &&
27296                         parents.filter(function(parent) {
27297                             return parent.tags.highway && parent !== entity;
27298                         }).length === 0;
27299                 }
27300             });
27301     }
27302
27303
27304     var validation = function(changes, graph) {
27305         var warnings = [];
27306         for (var i = 0; i < changes.created.length; i++) {
27307             var entity = changes.created[i];
27308
27309             if (isDisconnectedHighway(entity, graph)) {
27310                 warnings.push({
27311                     id: 'disconnected_highway',
27312                     message: t('validations.disconnected_highway'),
27313                     tooltip: t('validations.disconnected_highway_tooltip'),
27314                     entity: entity
27315                 });
27316             }
27317         }
27318
27319         return warnings;
27320     };
27321
27322
27323     return validation;
27324 }
27325
27326 function validationManyDeletions() {
27327     var threshold = 100;
27328
27329     var validation = function(changes) {
27330         var warnings = [];
27331         if (changes.deleted.length > threshold) {
27332             warnings.push({
27333                 id: 'many_deletions',
27334                 message: t('validations.many_deletions', { n: changes.deleted.length })
27335             });
27336         }
27337
27338         return warnings;
27339     };
27340
27341
27342     return validation;
27343 }
27344
27345 function validationMissingTag() {
27346
27347     // Slightly stricter check than Entity#isUsed (#3091)
27348     function hasTags(entity, graph) {
27349         return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
27350             graph.parentRelations(entity).length > 0;
27351     }
27352
27353     var validation = function(changes, graph) {
27354         var types = ['point', 'line', 'area', 'relation'],
27355             warnings = [];
27356
27357         for (var i = 0; i < changes.created.length; i++) {
27358             var change = changes.created[i],
27359                 geometry = change.geometry(graph);
27360
27361             if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
27362                 warnings.push({
27363                     id: 'missing_tag',
27364                     message: t('validations.untagged_' + geometry),
27365                     tooltip: t('validations.untagged_' + geometry + '_tooltip'),
27366                     entity: change
27367                 });
27368             }
27369         }
27370
27371         return warnings;
27372     };
27373
27374
27375     return validation;
27376 }
27377
27378 function validationOldMultipolygon() {
27379
27380     return function validation(changes, graph) {
27381         var warnings = [];
27382         for (var i = 0; i < changes.created.length; i++) {
27383             var entity = changes.created[i];
27384             var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
27385             if (parent) {
27386                 warnings.push({
27387                     id: 'old_multipolygon',
27388                     message: t('validations.old_multipolygon'),
27389                     tooltip: t('validations.old_multipolygon_tooltip'),
27390                     entity: parent
27391                 });
27392             }
27393         }
27394         return warnings;
27395     };
27396 }
27397
27398 // https://github.com/openstreetmap/josm/blob/mirror/src/org/
27399 // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
27400 function validationTagSuggestsArea() {
27401
27402     function tagSuggestsArea(tags) {
27403         if (isEmpty(tags)) return false;
27404
27405         var presence = ['landuse', 'amenities', 'tourism', 'shop'];
27406         for (var i = 0; i < presence.length; i++) {
27407             if (tags[presence[i]] !== undefined) {
27408                 return presence[i] + '=' + tags[presence[i]];
27409             }
27410         }
27411
27412         if (tags.building && tags.building === 'yes') return 'building=yes';
27413     }
27414
27415
27416     var validation = function(changes, graph) {
27417         var warnings = [];
27418         for (var i = 0; i < changes.created.length; i++) {
27419             var change = changes.created[i],
27420                 geometry = change.geometry(graph),
27421                 suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
27422
27423             if (suggestion) {
27424                 warnings.push({
27425                     id: 'tag_suggests_area',
27426                     message: t('validations.tag_suggests_area', { tag: suggestion }),
27427                     entity: change
27428                 });
27429             }
27430         }
27431
27432         return warnings;
27433     };
27434
27435
27436     return validation;
27437 }
27438
27439
27440
27441 var Validations = Object.freeze({
27442         validationDeprecatedTag: validationDeprecatedTag,
27443         validationDisconnectedHighway: validationDisconnectedHighway,
27444         validationManyDeletions: validationManyDeletions,
27445         validationMissingTag: validationMissingTag,
27446         validationOldMultipolygon: validationOldMultipolygon,
27447         validationTagSuggestsArea: validationTagSuggestsArea
27448 });
27449
27450 /**
27451  * Performs a deep comparison between two values to determine if they are
27452  * equivalent.
27453  *
27454  * **Note:** This method supports comparing arrays, array buffers, booleans,
27455  * date objects, error objects, maps, numbers, `Object` objects, regexes,
27456  * sets, strings, symbols, and typed arrays. `Object` objects are compared
27457  * by their own, not inherited, enumerable properties. Functions and DOM
27458  * nodes are compared by strict equality, i.e. `===`.
27459  *
27460  * @static
27461  * @memberOf _
27462  * @since 0.1.0
27463  * @category Lang
27464  * @param {*} value The value to compare.
27465  * @param {*} other The other value to compare.
27466  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
27467  * @example
27468  *
27469  * var object = { 'a': 1 };
27470  * var other = { 'a': 1 };
27471  *
27472  * _.isEqual(object, other);
27473  * // => true
27474  *
27475  * object === other;
27476  * // => false
27477  */
27478 function isEqual(value, other) {
27479   return baseIsEqual(value, other);
27480 }
27481
27482 /*
27483     iD.Difference represents the difference between two graphs.
27484     It knows how to calculate the set of entities that were
27485     created, modified, or deleted, and also contains the logic
27486     for recursively extending a difference to the complete set
27487     of entities that will require a redraw, taking into account
27488     child and parent relationships.
27489  */
27490 function coreDifference(base, head) {
27491     var changes = {},
27492         difference$$1 = {},
27493         length = 0;
27494
27495
27496     function changed(h, b) {
27497         return h !== b && !isEqual(omit(h, 'v'), omit(b, 'v'));
27498     }
27499
27500
27501     forEach(head.entities, function(h, id) {
27502         var b = base.entities[id];
27503         if (changed(h, b)) {
27504             changes[id] = {base: b, head: h};
27505             length++;
27506         }
27507     });
27508
27509
27510     forEach(base.entities, function(b, id) {
27511         var h = head.entities[id];
27512         if (!changes[id] && changed(h, b)) {
27513             changes[id] = {base: b, head: h};
27514             length++;
27515         }
27516     });
27517
27518
27519     function addParents(parents, result) {
27520         for (var i = 0; i < parents.length; i++) {
27521             var parent = parents[i];
27522
27523             if (parent.id in result)
27524                 continue;
27525
27526             result[parent.id] = parent;
27527             addParents(head.parentRelations(parent), result);
27528         }
27529     }
27530
27531
27532     difference$$1.length = function() {
27533         return length;
27534     };
27535
27536
27537     difference$$1.changes = function() {
27538         return changes;
27539     };
27540
27541
27542     difference$$1.extantIDs = function() {
27543         var result = [];
27544         forEach(changes, function(change, id) {
27545             if (change.head) result.push(id);
27546         });
27547         return result;
27548     };
27549
27550
27551     difference$$1.modified = function() {
27552         var result = [];
27553         forEach(changes, function(change) {
27554             if (change.base && change.head) result.push(change.head);
27555         });
27556         return result;
27557     };
27558
27559
27560     difference$$1.created = function() {
27561         var result = [];
27562         forEach(changes, function(change) {
27563             if (!change.base && change.head) result.push(change.head);
27564         });
27565         return result;
27566     };
27567
27568
27569     difference$$1.deleted = function() {
27570         var result = [];
27571         forEach(changes, function(change) {
27572             if (change.base && !change.head) result.push(change.base);
27573         });
27574         return result;
27575     };
27576
27577
27578     difference$$1.summary = function() {
27579         var relevant = {};
27580
27581         function addEntity(entity, graph, changeType) {
27582             relevant[entity.id] = {
27583                 entity: entity,
27584                 graph: graph,
27585                 changeType: changeType
27586             };
27587         }
27588
27589         function addParents(entity) {
27590             var parents = head.parentWays(entity);
27591             for (var j = parents.length - 1; j >= 0; j--) {
27592                 var parent = parents[j];
27593                 if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
27594             }
27595         }
27596
27597         forEach(changes, function(change) {
27598             if (change.head && change.head.geometry(head) !== 'vertex') {
27599                 addEntity(change.head, head, change.base ? 'modified' : 'created');
27600
27601             } else if (change.base && change.base.geometry(base) !== 'vertex') {
27602                 addEntity(change.base, base, 'deleted');
27603
27604             } else if (change.base && change.head) { // modified vertex
27605                 var moved    = !isEqual(change.base.loc,  change.head.loc),
27606                     retagged = !isEqual(change.base.tags, change.head.tags);
27607
27608                 if (moved) {
27609                     addParents(change.head);
27610                 }
27611
27612                 if (retagged || (moved && change.head.hasInterestingTags())) {
27613                     addEntity(change.head, head, 'modified');
27614                 }
27615
27616             } else if (change.head && change.head.hasInterestingTags()) { // created vertex
27617                 addEntity(change.head, head, 'created');
27618
27619             } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
27620                 addEntity(change.base, base, 'deleted');
27621             }
27622         });
27623
27624         return values$1(relevant);
27625     };
27626
27627
27628     difference$$1.complete = function(extent) {
27629         var result = {}, id, change;
27630
27631         for (id in changes) {
27632             change = changes[id];
27633
27634             var h = change.head,
27635                 b = change.base,
27636                 entity = h || b;
27637
27638             if (extent &&
27639                 (!h || !h.intersects(extent, head)) &&
27640                 (!b || !b.intersects(extent, base)))
27641                 continue;
27642
27643             result[id] = h;
27644
27645             if (entity.type === 'way') {
27646                 var nh = h ? h.nodes : [],
27647                     nb = b ? b.nodes : [],
27648                     diff, i;
27649
27650                 diff = difference(nh, nb);
27651                 for (i = 0; i < diff.length; i++) {
27652                     result[diff[i]] = head.hasEntity(diff[i]);
27653                 }
27654
27655                 diff = difference(nb, nh);
27656                 for (i = 0; i < diff.length; i++) {
27657                     result[diff[i]] = head.hasEntity(diff[i]);
27658                 }
27659             }
27660
27661             addParents(head.parentWays(entity), result);
27662             addParents(head.parentRelations(entity), result);
27663         }
27664
27665         return result;
27666     };
27667
27668
27669     return difference$$1;
27670 }
27671
27672 /** Used for built-in method references. */
27673 var objectProto$18 = Object.prototype;
27674
27675 /** Used to check objects for own properties. */
27676 var hasOwnProperty$15 = objectProto$18.hasOwnProperty;
27677
27678 /**
27679  * Assigns own enumerable string keyed properties of source objects to the
27680  * destination object. Source objects are applied from left to right.
27681  * Subsequent sources overwrite property assignments of previous sources.
27682  *
27683  * **Note:** This method mutates `object` and is loosely based on
27684  * [`Object.assign`](https://mdn.io/Object/assign).
27685  *
27686  * @static
27687  * @memberOf _
27688  * @since 0.10.0
27689  * @category Object
27690  * @param {Object} object The destination object.
27691  * @param {...Object} [sources] The source objects.
27692  * @returns {Object} Returns `object`.
27693  * @see _.assignIn
27694  * @example
27695  *
27696  * function Foo() {
27697  *   this.a = 1;
27698  * }
27699  *
27700  * function Bar() {
27701  *   this.c = 3;
27702  * }
27703  *
27704  * Foo.prototype.b = 2;
27705  * Bar.prototype.d = 4;
27706  *
27707  * _.assign({ 'a': 0 }, new Foo, new Bar);
27708  * // => { 'a': 1, 'c': 3 }
27709  */
27710 var assign = createAssigner(function(object, source) {
27711   if (isPrototype(source) || isArrayLike(source)) {
27712     copyObject(source, keys$1(source), object);
27713     return;
27714   }
27715   for (var key in source) {
27716     if (hasOwnProperty$15.call(source, key)) {
27717       assignValue(object, key, source[key]);
27718     }
27719   }
27720 });
27721
27722 /* Built-in method references for those with the same name as other `lodash` methods. */
27723 var nativeMax$3 = Math.max;
27724
27725 /**
27726  * Checks if `value` is in `collection`. If `collection` is a string, it's
27727  * checked for a substring of `value`, otherwise
27728  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27729  * is used for equality comparisons. If `fromIndex` is negative, it's used as
27730  * the offset from the end of `collection`.
27731  *
27732  * @static
27733  * @memberOf _
27734  * @since 0.1.0
27735  * @category Collection
27736  * @param {Array|Object|string} collection The collection to inspect.
27737  * @param {*} value The value to search for.
27738  * @param {number} [fromIndex=0] The index to search from.
27739  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
27740  * @returns {boolean} Returns `true` if `value` is found, else `false`.
27741  * @example
27742  *
27743  * _.includes([1, 2, 3], 1);
27744  * // => true
27745  *
27746  * _.includes([1, 2, 3], 1, 2);
27747  * // => false
27748  *
27749  * _.includes({ 'a': 1, 'b': 2 }, 1);
27750  * // => true
27751  *
27752  * _.includes('abcd', 'bc');
27753  * // => true
27754  */
27755 function includes(collection, value, fromIndex, guard) {
27756   collection = isArrayLike(collection) ? collection : values$1(collection);
27757   fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
27758
27759   var length = collection.length;
27760   if (fromIndex < 0) {
27761     fromIndex = nativeMax$3(length + fromIndex, 0);
27762   }
27763   return isString(collection)
27764     ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
27765     : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
27766 }
27767
27768 function coreGraph$$1(other, mutable) {
27769     if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
27770
27771     if (other instanceof coreGraph$$1) {
27772         var base = other.base();
27773         this.entities = assign(Object.create(base.entities), other.entities);
27774         this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
27775         this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
27776
27777     } else {
27778         this.entities = Object.create({});
27779         this._parentWays = Object.create({});
27780         this._parentRels = Object.create({});
27781         this.rebase(other || [], [this]);
27782     }
27783
27784     this.transients = {};
27785     this._childNodes = {};
27786     this.frozen = !mutable;
27787 }
27788
27789
27790 coreGraph$$1.prototype = {
27791
27792     hasEntity: function(id) {
27793         return this.entities[id];
27794     },
27795
27796
27797     entity: function(id) {
27798         var entity = this.entities[id];
27799
27800         //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
27801         if (!entity) {
27802             entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
27803         }
27804
27805         if (!entity) {
27806             throw new Error('entity ' + id + ' not found');
27807         }
27808         return entity;
27809     },
27810
27811
27812     transient: function(entity, key, fn) {
27813         var id = entity.id,
27814             transients = this.transients[id] ||
27815             (this.transients[id] = {});
27816
27817         if (transients[key] !== undefined) {
27818             return transients[key];
27819         }
27820
27821         transients[key] = fn.call(entity);
27822
27823         return transients[key];
27824     },
27825
27826
27827     parentWays: function(entity) {
27828         var parents = this._parentWays[entity.id],
27829             result = [];
27830
27831         if (parents) {
27832             for (var i = 0; i < parents.length; i++) {
27833                 result.push(this.entity(parents[i]));
27834             }
27835         }
27836         return result;
27837     },
27838
27839
27840     isPoi: function(entity) {
27841         var parentWays = this._parentWays[entity.id];
27842         return !parentWays || parentWays.length === 0;
27843     },
27844
27845
27846     isShared: function(entity) {
27847         var parentWays = this._parentWays[entity.id];
27848         return parentWays && parentWays.length > 1;
27849     },
27850
27851
27852     parentRelations: function(entity) {
27853         var parents = this._parentRels[entity.id],
27854             result = [];
27855
27856         if (parents) {
27857             for (var i = 0; i < parents.length; i++) {
27858                 result.push(this.entity(parents[i]));
27859             }
27860         }
27861         return result;
27862     },
27863
27864
27865     childNodes: function(entity) {
27866         if (this._childNodes[entity.id]) return this._childNodes[entity.id];
27867         if (!entity.nodes) return [];
27868
27869         var nodes = [];
27870         for (var i = 0; i < entity.nodes.length; i++) {
27871             nodes[i] = this.entity(entity.nodes[i]);
27872         }
27873
27874         if (debug) Object.freeze(nodes);
27875
27876         this._childNodes[entity.id] = nodes;
27877         return this._childNodes[entity.id];
27878     },
27879
27880
27881     base: function() {
27882         return {
27883             'entities': utilGetPrototypeOf(this.entities),
27884             'parentWays': utilGetPrototypeOf(this._parentWays),
27885             'parentRels': utilGetPrototypeOf(this._parentRels)
27886         };
27887     },
27888
27889
27890     // Unlike other graph methods, rebase mutates in place. This is because it
27891     // is used only during the history operation that merges newly downloaded
27892     // data into each state. To external consumers, it should appear as if the
27893     // graph always contained the newly downloaded data.
27894     rebase: function(entities, stack, force) {
27895         var base = this.base(),
27896             i, j, k, id;
27897
27898         for (i = 0; i < entities.length; i++) {
27899             var entity = entities[i];
27900
27901             if (!entity.visible || (!force && base.entities[entity.id]))
27902                 continue;
27903
27904             // Merging data into the base graph
27905             base.entities[entity.id] = entity;
27906             this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
27907
27908             // Restore provisionally-deleted nodes that are discovered to have an extant parent
27909             if (entity.type === 'way') {
27910                 for (j = 0; j < entity.nodes.length; j++) {
27911                     id = entity.nodes[j];
27912                     for (k = 1; k < stack.length; k++) {
27913                         var ents = stack[k].entities;
27914                         if (ents.hasOwnProperty(id) && ents[id] === undefined) {
27915                             delete ents[id];
27916                         }
27917                     }
27918                 }
27919             }
27920         }
27921
27922         for (i = 0; i < stack.length; i++) {
27923             stack[i]._updateRebased();
27924         }
27925     },
27926
27927
27928     _updateRebased: function() {
27929         var base = this.base(),
27930             i, k, child, id, keys;
27931
27932         keys = Object.keys(this._parentWays);
27933         for (i = 0; i < keys.length; i++) {
27934             child = keys[i];
27935             if (base.parentWays[child]) {
27936                 for (k = 0; k < base.parentWays[child].length; k++) {
27937                     id = base.parentWays[child][k];
27938                     if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
27939                         this._parentWays[child].push(id);
27940                     }
27941                 }
27942             }
27943         }
27944
27945         keys = Object.keys(this._parentRels);
27946         for (i = 0; i < keys.length; i++) {
27947             child = keys[i];
27948             if (base.parentRels[child]) {
27949                 for (k = 0; k < base.parentRels[child].length; k++) {
27950                     id = base.parentRels[child][k];
27951                     if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
27952                         this._parentRels[child].push(id);
27953                     }
27954                 }
27955             }
27956         }
27957
27958         this.transients = {};
27959
27960         // this._childNodes is not updated, under the assumption that
27961         // ways are always downloaded with their child nodes.
27962     },
27963
27964
27965     // Updates calculated properties (parentWays, parentRels) for the specified change
27966     _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
27967
27968         parentWays = parentWays || this._parentWays;
27969         parentRels = parentRels || this._parentRels;
27970
27971         var type = entity && entity.type || oldentity && oldentity.type,
27972             removed, added, ways, rels, i;
27973
27974
27975         if (type === 'way') {
27976
27977             // Update parentWays
27978             if (oldentity && entity) {
27979                 removed = difference(oldentity.nodes, entity.nodes);
27980                 added = difference(entity.nodes, oldentity.nodes);
27981             } else if (oldentity) {
27982                 removed = oldentity.nodes;
27983                 added = [];
27984             } else if (entity) {
27985                 removed = [];
27986                 added = entity.nodes;
27987             }
27988             for (i = 0; i < removed.length; i++) {
27989                 parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
27990             }
27991             for (i = 0; i < added.length; i++) {
27992                 ways = without(parentWays[added[i]], entity.id);
27993                 ways.push(entity.id);
27994                 parentWays[added[i]] = ways;
27995             }
27996
27997         } else if (type === 'relation') {
27998
27999             // Update parentRels
28000             if (oldentity && entity) {
28001                 removed = difference(oldentity.members, entity.members);
28002                 added = difference(entity.members, oldentity);
28003             } else if (oldentity) {
28004                 removed = oldentity.members;
28005                 added = [];
28006             } else if (entity) {
28007                 removed = [];
28008                 added = entity.members;
28009             }
28010             for (i = 0; i < removed.length; i++) {
28011                 parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28012             }
28013             for (i = 0; i < added.length; i++) {
28014                 rels = without(parentRels[added[i].id], entity.id);
28015                 rels.push(entity.id);
28016                 parentRels[added[i].id] = rels;
28017             }
28018         }
28019     },
28020
28021
28022     replace: function(entity) {
28023         if (this.entities[entity.id] === entity)
28024             return this;
28025
28026         return this.update(function() {
28027             this._updateCalculated(this.entities[entity.id], entity);
28028             this.entities[entity.id] = entity;
28029         });
28030     },
28031
28032
28033     remove: function(entity) {
28034         return this.update(function() {
28035             this._updateCalculated(entity, undefined);
28036             this.entities[entity.id] = undefined;
28037         });
28038     },
28039
28040
28041     revert: function(id) {
28042         var baseEntity = this.base().entities[id],
28043             headEntity = this.entities[id];
28044
28045         if (headEntity === baseEntity)
28046             return this;
28047
28048         return this.update(function() {
28049             this._updateCalculated(headEntity, baseEntity);
28050             delete this.entities[id];
28051         });
28052     },
28053
28054
28055     update: function() {
28056         var graph = this.frozen ? coreGraph$$1(this, true) : this;
28057
28058         for (var i = 0; i < arguments.length; i++) {
28059             arguments[i].call(graph, graph);
28060         }
28061
28062         if (this.frozen) graph.frozen = true;
28063
28064         return graph;
28065     },
28066
28067
28068     // Obliterates any existing entities
28069     load: function(entities) {
28070         var base = this.base();
28071         this.entities = Object.create(base.entities);
28072
28073         for (var i in entities) {
28074             this.entities[i] = entities[i];
28075             this._updateCalculated(base.entities[i], this.entities[i]);
28076         }
28077
28078         return this;
28079     }
28080 };
28081
28082 var quickselect = partialSort;
28083
28084 // Floyd-Rivest selection algorithm:
28085 // Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];
28086 // The k-th element will have the (k - left + 1)th smallest value in [left, right]
28087
28088 function partialSort(arr, k, left, right, compare) {
28089     left = left || 0;
28090     right = right || (arr.length - 1);
28091     compare = compare || defaultCompare;
28092
28093     while (right > left) {
28094         if (right - left > 600) {
28095             var n = right - left + 1;
28096             var m = k - left + 1;
28097             var z = Math.log(n);
28098             var s = 0.5 * Math.exp(2 * z / 3);
28099             var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
28100             var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
28101             var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
28102             partialSort(arr, k, newLeft, newRight, compare);
28103         }
28104
28105         var t = arr[k];
28106         var i = left;
28107         var j = right;
28108
28109         swap(arr, left, k);
28110         if (compare(arr[right], t) > 0) swap(arr, left, right);
28111
28112         while (i < j) {
28113             swap(arr, i, j);
28114             i++;
28115             j--;
28116             while (compare(arr[i], t) < 0) i++;
28117             while (compare(arr[j], t) > 0) j--;
28118         }
28119
28120         if (compare(arr[left], t) === 0) swap(arr, left, j);
28121         else {
28122             j++;
28123             swap(arr, j, right);
28124         }
28125
28126         if (j <= k) left = j + 1;
28127         if (k <= j) right = j - 1;
28128     }
28129 }
28130
28131 function swap(arr, i, j) {
28132     var tmp = arr[i];
28133     arr[i] = arr[j];
28134     arr[j] = tmp;
28135 }
28136
28137 function defaultCompare(a, b) {
28138     return a < b ? -1 : a > b ? 1 : 0;
28139 }
28140
28141 var rbush_1 = rbush;
28142
28143
28144
28145 function rbush(maxEntries, format) {
28146     if (!(this instanceof rbush)) return new rbush(maxEntries, format);
28147
28148     // max entries in a node is 9 by default; min node fill is 40% for best performance
28149     this._maxEntries = Math.max(4, maxEntries || 9);
28150     this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
28151
28152     if (format) {
28153         this._initFormat(format);
28154     }
28155
28156     this.clear();
28157 }
28158
28159 rbush.prototype = {
28160
28161     all: function () {
28162         return this._all(this.data, []);
28163     },
28164
28165     search: function (bbox) {
28166
28167         var node = this.data,
28168             result = [],
28169             toBBox = this.toBBox;
28170
28171         if (!intersects$1(bbox, node)) return result;
28172
28173         var nodesToSearch = [],
28174             i, len, child, childBBox;
28175
28176         while (node) {
28177             for (i = 0, len = node.children.length; i < len; i++) {
28178
28179                 child = node.children[i];
28180                 childBBox = node.leaf ? toBBox(child) : child;
28181
28182                 if (intersects$1(bbox, childBBox)) {
28183                     if (node.leaf) result.push(child);
28184                     else if (contains$2(bbox, childBBox)) this._all(child, result);
28185                     else nodesToSearch.push(child);
28186                 }
28187             }
28188             node = nodesToSearch.pop();
28189         }
28190
28191         return result;
28192     },
28193
28194     collides: function (bbox) {
28195
28196         var node = this.data,
28197             toBBox = this.toBBox;
28198
28199         if (!intersects$1(bbox, node)) return false;
28200
28201         var nodesToSearch = [],
28202             i, len, child, childBBox;
28203
28204         while (node) {
28205             for (i = 0, len = node.children.length; i < len; i++) {
28206
28207                 child = node.children[i];
28208                 childBBox = node.leaf ? toBBox(child) : child;
28209
28210                 if (intersects$1(bbox, childBBox)) {
28211                     if (node.leaf || contains$2(bbox, childBBox)) return true;
28212                     nodesToSearch.push(child);
28213                 }
28214             }
28215             node = nodesToSearch.pop();
28216         }
28217
28218         return false;
28219     },
28220
28221     load: function (data) {
28222         if (!(data && data.length)) return this;
28223
28224         if (data.length < this._minEntries) {
28225             for (var i = 0, len = data.length; i < len; i++) {
28226                 this.insert(data[i]);
28227             }
28228             return this;
28229         }
28230
28231         // recursively build the tree with the given data from stratch using OMT algorithm
28232         var node = this._build(data.slice(), 0, data.length - 1, 0);
28233
28234         if (!this.data.children.length) {
28235             // save as is if tree is empty
28236             this.data = node;
28237
28238         } else if (this.data.height === node.height) {
28239             // split root if trees have the same height
28240             this._splitRoot(this.data, node);
28241
28242         } else {
28243             if (this.data.height < node.height) {
28244                 // swap trees if inserted one is bigger
28245                 var tmpNode = this.data;
28246                 this.data = node;
28247                 node = tmpNode;
28248             }
28249
28250             // insert the small tree into the large tree at appropriate level
28251             this._insert(node, this.data.height - node.height - 1, true);
28252         }
28253
28254         return this;
28255     },
28256
28257     insert: function (item) {
28258         if (item) this._insert(item, this.data.height - 1);
28259         return this;
28260     },
28261
28262     clear: function () {
28263         this.data = createNode([]);
28264         return this;
28265     },
28266
28267     remove: function (item, equalsFn) {
28268         if (!item) return this;
28269
28270         var node = this.data,
28271             bbox = this.toBBox(item),
28272             path = [],
28273             indexes = [],
28274             i, parent, index, goingUp;
28275
28276         // depth-first iterative tree traversal
28277         while (node || path.length) {
28278
28279             if (!node) { // go up
28280                 node = path.pop();
28281                 parent = path[path.length - 1];
28282                 i = indexes.pop();
28283                 goingUp = true;
28284             }
28285
28286             if (node.leaf) { // check current node
28287                 index = findItem(item, node.children, equalsFn);
28288
28289                 if (index !== -1) {
28290                     // item found, remove the item and condense tree upwards
28291                     node.children.splice(index, 1);
28292                     path.push(node);
28293                     this._condense(path);
28294                     return this;
28295                 }
28296             }
28297
28298             if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
28299                 path.push(node);
28300                 indexes.push(i);
28301                 i = 0;
28302                 parent = node;
28303                 node = node.children[0];
28304
28305             } else if (parent) { // go right
28306                 i++;
28307                 node = parent.children[i];
28308                 goingUp = false;
28309
28310             } else node = null; // nothing found
28311         }
28312
28313         return this;
28314     },
28315
28316     toBBox: function (item) { return item; },
28317
28318     compareMinX: compareNodeMinX,
28319     compareMinY: compareNodeMinY,
28320
28321     toJSON: function () { return this.data; },
28322
28323     fromJSON: function (data) {
28324         this.data = data;
28325         return this;
28326     },
28327
28328     _all: function (node, result) {
28329         var nodesToSearch = [];
28330         while (node) {
28331             if (node.leaf) result.push.apply(result, node.children);
28332             else nodesToSearch.push.apply(nodesToSearch, node.children);
28333
28334             node = nodesToSearch.pop();
28335         }
28336         return result;
28337     },
28338
28339     _build: function (items, left, right, height) {
28340
28341         var N = right - left + 1,
28342             M = this._maxEntries,
28343             node;
28344
28345         if (N <= M) {
28346             // reached leaf level; return leaf
28347             node = createNode(items.slice(left, right + 1));
28348             calcBBox(node, this.toBBox);
28349             return node;
28350         }
28351
28352         if (!height) {
28353             // target height of the bulk-loaded tree
28354             height = Math.ceil(Math.log(N) / Math.log(M));
28355
28356             // target number of root entries to maximize storage utilization
28357             M = Math.ceil(N / Math.pow(M, height - 1));
28358         }
28359
28360         node = createNode([]);
28361         node.leaf = false;
28362         node.height = height;
28363
28364         // split the items into M mostly square tiles
28365
28366         var N2 = Math.ceil(N / M),
28367             N1 = N2 * Math.ceil(Math.sqrt(M)),
28368             i, j, right2, right3;
28369
28370         multiSelect(items, left, right, N1, this.compareMinX);
28371
28372         for (i = left; i <= right; i += N1) {
28373
28374             right2 = Math.min(i + N1 - 1, right);
28375
28376             multiSelect(items, i, right2, N2, this.compareMinY);
28377
28378             for (j = i; j <= right2; j += N2) {
28379
28380                 right3 = Math.min(j + N2 - 1, right2);
28381
28382                 // pack each entry recursively
28383                 node.children.push(this._build(items, j, right3, height - 1));
28384             }
28385         }
28386
28387         calcBBox(node, this.toBBox);
28388
28389         return node;
28390     },
28391
28392     _chooseSubtree: function (bbox, node, level, path) {
28393
28394         var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
28395
28396         while (true) {
28397             path.push(node);
28398
28399             if (node.leaf || path.length - 1 === level) break;
28400
28401             minArea = minEnlargement = Infinity;
28402
28403             for (i = 0, len = node.children.length; i < len; i++) {
28404                 child = node.children[i];
28405                 area = bboxArea(child);
28406                 enlargement = enlargedArea(bbox, child) - area;
28407
28408                 // choose entry with the least area enlargement
28409                 if (enlargement < minEnlargement) {
28410                     minEnlargement = enlargement;
28411                     minArea = area < minArea ? area : minArea;
28412                     targetNode = child;
28413
28414                 } else if (enlargement === minEnlargement) {
28415                     // otherwise choose one with the smallest area
28416                     if (area < minArea) {
28417                         minArea = area;
28418                         targetNode = child;
28419                     }
28420                 }
28421             }
28422
28423             node = targetNode || node.children[0];
28424         }
28425
28426         return node;
28427     },
28428
28429     _insert: function (item, level, isNode) {
28430
28431         var toBBox = this.toBBox,
28432             bbox = isNode ? item : toBBox(item),
28433             insertPath = [];
28434
28435         // find the best node for accommodating the item, saving all nodes along the path too
28436         var node = this._chooseSubtree(bbox, this.data, level, insertPath);
28437
28438         // put the item into the node
28439         node.children.push(item);
28440         extend$1(node, bbox);
28441
28442         // split on node overflow; propagate upwards if necessary
28443         while (level >= 0) {
28444             if (insertPath[level].children.length > this._maxEntries) {
28445                 this._split(insertPath, level);
28446                 level--;
28447             } else break;
28448         }
28449
28450         // adjust bboxes along the insertion path
28451         this._adjustParentBBoxes(bbox, insertPath, level);
28452     },
28453
28454     // split overflowed node into two
28455     _split: function (insertPath, level) {
28456
28457         var node = insertPath[level],
28458             M = node.children.length,
28459             m = this._minEntries;
28460
28461         this._chooseSplitAxis(node, m, M);
28462
28463         var splitIndex = this._chooseSplitIndex(node, m, M);
28464
28465         var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
28466         newNode.height = node.height;
28467         newNode.leaf = node.leaf;
28468
28469         calcBBox(node, this.toBBox);
28470         calcBBox(newNode, this.toBBox);
28471
28472         if (level) insertPath[level - 1].children.push(newNode);
28473         else this._splitRoot(node, newNode);
28474     },
28475
28476     _splitRoot: function (node, newNode) {
28477         // split root node
28478         this.data = createNode([node, newNode]);
28479         this.data.height = node.height + 1;
28480         this.data.leaf = false;
28481         calcBBox(this.data, this.toBBox);
28482     },
28483
28484     _chooseSplitIndex: function (node, m, M) {
28485
28486         var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
28487
28488         minOverlap = minArea = Infinity;
28489
28490         for (i = m; i <= M - m; i++) {
28491             bbox1 = distBBox(node, 0, i, this.toBBox);
28492             bbox2 = distBBox(node, i, M, this.toBBox);
28493
28494             overlap = intersectionArea(bbox1, bbox2);
28495             area = bboxArea(bbox1) + bboxArea(bbox2);
28496
28497             // choose distribution with minimum overlap
28498             if (overlap < minOverlap) {
28499                 minOverlap = overlap;
28500                 index = i;
28501
28502                 minArea = area < minArea ? area : minArea;
28503
28504             } else if (overlap === minOverlap) {
28505                 // otherwise choose distribution with minimum area
28506                 if (area < minArea) {
28507                     minArea = area;
28508                     index = i;
28509                 }
28510             }
28511         }
28512
28513         return index;
28514     },
28515
28516     // sorts node children by the best axis for split
28517     _chooseSplitAxis: function (node, m, M) {
28518
28519         var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
28520             compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
28521             xMargin = this._allDistMargin(node, m, M, compareMinX),
28522             yMargin = this._allDistMargin(node, m, M, compareMinY);
28523
28524         // if total distributions margin value is minimal for x, sort by minX,
28525         // otherwise it's already sorted by minY
28526         if (xMargin < yMargin) node.children.sort(compareMinX);
28527     },
28528
28529     // total margin of all possible split distributions where each node is at least m full
28530     _allDistMargin: function (node, m, M, compare) {
28531
28532         node.children.sort(compare);
28533
28534         var toBBox = this.toBBox,
28535             leftBBox = distBBox(node, 0, m, toBBox),
28536             rightBBox = distBBox(node, M - m, M, toBBox),
28537             margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
28538             i, child;
28539
28540         for (i = m; i < M - m; i++) {
28541             child = node.children[i];
28542             extend$1(leftBBox, node.leaf ? toBBox(child) : child);
28543             margin += bboxMargin(leftBBox);
28544         }
28545
28546         for (i = M - m - 1; i >= m; i--) {
28547             child = node.children[i];
28548             extend$1(rightBBox, node.leaf ? toBBox(child) : child);
28549             margin += bboxMargin(rightBBox);
28550         }
28551
28552         return margin;
28553     },
28554
28555     _adjustParentBBoxes: function (bbox, path, level) {
28556         // adjust bboxes along the given tree path
28557         for (var i = level; i >= 0; i--) {
28558             extend$1(path[i], bbox);
28559         }
28560     },
28561
28562     _condense: function (path) {
28563         // go through the path, removing empty nodes and updating bboxes
28564         for (var i = path.length - 1, siblings; i >= 0; i--) {
28565             if (path[i].children.length === 0) {
28566                 if (i > 0) {
28567                     siblings = path[i - 1].children;
28568                     siblings.splice(siblings.indexOf(path[i]), 1);
28569
28570                 } else this.clear();
28571
28572             } else calcBBox(path[i], this.toBBox);
28573         }
28574     },
28575
28576     _initFormat: function (format) {
28577         // data format (minX, minY, maxX, maxY accessors)
28578
28579         // uses eval-type function compilation instead of just accepting a toBBox function
28580         // because the algorithms are very sensitive to sorting functions performance,
28581         // so they should be dead simple and without inner calls
28582
28583         var compareArr = ['return a', ' - b', ';'];
28584
28585         this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
28586         this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
28587
28588         this.toBBox = new Function('a',
28589             'return {minX: a' + format[0] +
28590             ', minY: a' + format[1] +
28591             ', maxX: a' + format[2] +
28592             ', maxY: a' + format[3] + '};');
28593     }
28594 };
28595
28596 function findItem(item, items, equalsFn) {
28597     if (!equalsFn) return items.indexOf(item);
28598
28599     for (var i = 0; i < items.length; i++) {
28600         if (equalsFn(item, items[i])) return i;
28601     }
28602     return -1;
28603 }
28604
28605 // calculate node's bbox from bboxes of its children
28606 function calcBBox(node, toBBox) {
28607     distBBox(node, 0, node.children.length, toBBox, node);
28608 }
28609
28610 // min bounding rectangle of node children from k to p-1
28611 function distBBox(node, k, p, toBBox, destNode) {
28612     if (!destNode) destNode = createNode(null);
28613     destNode.minX = Infinity;
28614     destNode.minY = Infinity;
28615     destNode.maxX = -Infinity;
28616     destNode.maxY = -Infinity;
28617
28618     for (var i = k, child; i < p; i++) {
28619         child = node.children[i];
28620         extend$1(destNode, node.leaf ? toBBox(child) : child);
28621     }
28622
28623     return destNode;
28624 }
28625
28626 function extend$1(a, b) {
28627     a.minX = Math.min(a.minX, b.minX);
28628     a.minY = Math.min(a.minY, b.minY);
28629     a.maxX = Math.max(a.maxX, b.maxX);
28630     a.maxY = Math.max(a.maxY, b.maxY);
28631     return a;
28632 }
28633
28634 function compareNodeMinX(a, b) { return a.minX - b.minX; }
28635 function compareNodeMinY(a, b) { return a.minY - b.minY; }
28636
28637 function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
28638 function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
28639
28640 function enlargedArea(a, b) {
28641     return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
28642            (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
28643 }
28644
28645 function intersectionArea(a, b) {
28646     var minX = Math.max(a.minX, b.minX),
28647         minY = Math.max(a.minY, b.minY),
28648         maxX = Math.min(a.maxX, b.maxX),
28649         maxY = Math.min(a.maxY, b.maxY);
28650
28651     return Math.max(0, maxX - minX) *
28652            Math.max(0, maxY - minY);
28653 }
28654
28655 function contains$2(a, b) {
28656     return a.minX <= b.minX &&
28657            a.minY <= b.minY &&
28658            b.maxX <= a.maxX &&
28659            b.maxY <= a.maxY;
28660 }
28661
28662 function intersects$1(a, b) {
28663     return b.minX <= a.maxX &&
28664            b.minY <= a.maxY &&
28665            b.maxX >= a.minX &&
28666            b.maxY >= a.minY;
28667 }
28668
28669 function createNode(children) {
28670     return {
28671         children: children,
28672         height: 1,
28673         leaf: true,
28674         minX: Infinity,
28675         minY: Infinity,
28676         maxX: -Infinity,
28677         maxY: -Infinity
28678     };
28679 }
28680
28681 // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
28682 // combines selection algorithm with binary divide & conquer approach
28683
28684 function multiSelect(arr, left, right, n, compare) {
28685     var stack = [left, right],
28686         mid;
28687
28688     while (stack.length) {
28689         right = stack.pop();
28690         left = stack.pop();
28691
28692         if (right - left <= n) continue;
28693
28694         mid = left + Math.ceil((right - left) / n / 2) * n;
28695         quickselect(arr, mid, left, right, compare);
28696
28697         stack.push(left, mid, mid, right);
28698     }
28699 }
28700
28701 function coreTree(head) {
28702     var rtree = rbush_1(),
28703         bboxes = {},
28704         tree = {};
28705
28706
28707     function entityBBox(entity) {
28708         var bbox = entity.extent(head).bbox();
28709         bbox.id = entity.id;
28710         bboxes[entity.id] = bbox;
28711         return bbox;
28712     }
28713
28714
28715     function updateParents(entity, insertions, memo) {
28716         head.parentWays(entity).forEach(function(way) {
28717             if (bboxes[way.id]) {
28718                 rtree.remove(bboxes[way.id]);
28719                 insertions[way.id] = way;
28720             }
28721             updateParents(way, insertions, memo);
28722         });
28723
28724         head.parentRelations(entity).forEach(function(relation) {
28725             if (memo[entity.id]) return;
28726             memo[entity.id] = true;
28727             if (bboxes[relation.id]) {
28728                 rtree.remove(bboxes[relation.id]);
28729                 insertions[relation.id] = relation;
28730             }
28731             updateParents(relation, insertions, memo);
28732         });
28733     }
28734
28735
28736     tree.rebase = function(entities, force) {
28737         var insertions = {};
28738
28739         for (var i = 0; i < entities.length; i++) {
28740             var entity = entities[i];
28741
28742             if (!entity.visible)
28743                 continue;
28744
28745             if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
28746                 if (!force) {
28747                     continue;
28748                 } else if (bboxes[entity.id]) {
28749                     rtree.remove(bboxes[entity.id]);
28750                 }
28751             }
28752
28753             insertions[entity.id] = entity;
28754             updateParents(entity, insertions, {});
28755         }
28756
28757         rtree.load(map$4(insertions, entityBBox));
28758
28759         return tree;
28760     };
28761
28762
28763     tree.intersects = function(extent, graph) {
28764         if (graph !== head) {
28765             var diff = coreDifference(head, graph),
28766                 insertions = {};
28767
28768             head = graph;
28769
28770             diff.deleted().forEach(function(entity) {
28771                 rtree.remove(bboxes[entity.id]);
28772                 delete bboxes[entity.id];
28773             });
28774
28775             diff.modified().forEach(function(entity) {
28776                 rtree.remove(bboxes[entity.id]);
28777                 insertions[entity.id] = entity;
28778                 updateParents(entity, insertions, {});
28779             });
28780
28781             diff.created().forEach(function(entity) {
28782                 insertions[entity.id] = entity;
28783             });
28784
28785             rtree.load(map$4(insertions, entityBBox));
28786         }
28787
28788         return rtree.search(extent.bbox()).map(function(bbox) {
28789             return head.entity(bbox.id);
28790         });
28791     };
28792
28793
28794     return tree;
28795 }
28796
28797 /*
28798  * This code is licensed under the MIT license.
28799  *
28800  * Copyright © 2013, iD authors.
28801  *
28802  * Portions copyright © 2011, Keith Cirkel
28803  * See https://github.com/keithamus/jwerty
28804  *
28805  */
28806 function d3keybinding(namespace$$1) {
28807     var bindings = [];
28808
28809
28810     function testBindings(isCapturing) {
28811         var didMatch = false,
28812             i, binding;
28813
28814         // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
28815         // so we don't strictly match on the shift key, but we prioritize
28816         // shifted bindings first, and fallback to unshifted only if no match.
28817         // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
28818
28819         // priority match shifted bindings first
28820         for (i = 0; i < bindings.length; i++) {
28821             binding = bindings[i];
28822             if (!binding.event.modifiers.shiftKey) continue;  // no shift
28823             if (!!binding.capture !== isCapturing) continue;
28824             if (matches(binding, true)) {
28825                 binding.callback();
28826                 didMatch = true;
28827             }
28828         }
28829
28830         // then unshifted bindings
28831         if (didMatch) return;
28832         for (i = 0; i < bindings.length; i++) {
28833             binding = bindings[i];
28834             if (binding.event.modifiers.shiftKey) continue;   // shift
28835             if (!!binding.capture !== isCapturing) continue;
28836             if (matches(binding, false)) {
28837                 binding.callback();
28838             }
28839         }
28840
28841
28842         function matches(binding, testShift) {
28843             var event$$1 = event;
28844             if (event$$1.key !== undefined) {
28845                 if (binding.event.key === undefined) {
28846                     return false;
28847                 } else if (Array.isArray(binding.event.key)) {
28848                     if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
28849                         return false;
28850                 } else {
28851                     if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
28852                         return false;
28853                 }
28854             } else {
28855                 // check keycodes if browser doesn't support KeyboardEvent.key
28856                 if (event$$1.keyCode !== binding.event.keyCode)
28857                     return false;
28858             }
28859
28860             // test modifier keys
28861             if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
28862                 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
28863                 if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
28864             }
28865             if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
28866             if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
28867
28868             return true;
28869         }
28870     }
28871
28872
28873     function capture() {
28874         testBindings(true);
28875     }
28876
28877
28878     function bubble() {
28879         var tagName = d3_select(event.target).node().tagName;
28880         if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
28881             return;
28882         }
28883         testBindings(false);
28884     }
28885
28886
28887     function keybinding(selection$$1) {
28888         selection$$1 = selection$$1 || d3_select(document);
28889         selection$$1.on('keydown.capture' + namespace$$1, capture, true);
28890         selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
28891         return keybinding;
28892     }
28893
28894
28895     keybinding.off = function(selection$$1) {
28896         bindings = [];
28897         selection$$1 = selection$$1 || d3_select(document);
28898         selection$$1.on('keydown.capture' + namespace$$1, null);
28899         selection$$1.on('keydown.bubble' + namespace$$1, null);
28900         return keybinding;
28901     };
28902
28903
28904     keybinding.on = function(codes, callback, capture) {
28905         var arr = [].concat(codes);
28906         for (var i = 0; i < arr.length; i++) {
28907             var code = arr[i];
28908             var binding = {
28909                 event: {
28910                     key: undefined,
28911                     keyCode: 0, // only for browsers that don't support KeyboardEvent.key
28912                     modifiers: {
28913                         shiftKey: false,
28914                         ctrlKey: false,
28915                         altKey: false,
28916                         metaKey: false
28917                     }
28918                 },
28919                 capture: capture,
28920                 callback: callback
28921             };
28922
28923             code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
28924
28925             for (var j = 0; j < code.length; j++) {
28926                 // Normalise matching errors
28927                 if (code[j] === '++') code[j] = '+';
28928
28929                 if (code[j] in d3keybinding.modifierCodes) {
28930                     binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
28931                 } else {
28932                     binding.event.key = d3keybinding.keys[code[j]] || code[j];
28933                     if (code[j] in d3keybinding.keyCodes) {
28934                         binding.event.keyCode = d3keybinding.keyCodes[code[j]];
28935                     }
28936                 }
28937             }
28938
28939             bindings.push(binding);
28940         }
28941
28942         return keybinding;
28943     };
28944
28945     return keybinding;
28946 }
28947
28948
28949 d3keybinding.modifierCodes = {
28950     // Shift key, ⇧
28951     '⇧': 16, shift: 16,
28952     // CTRL key, on Mac: ⌃
28953     '⌃': 17, ctrl: 17,
28954     // ALT key, on Mac: ⌥ (Alt)
28955     '⌥': 18, alt: 18, option: 18,
28956     // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
28957     '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
28958 };
28959
28960 d3keybinding.modifierProperties = {
28961     16: 'shiftKey',
28962     17: 'ctrlKey',
28963     18: 'altKey',
28964     91: 'metaKey'
28965 };
28966
28967 d3keybinding.keys = {
28968     // Backspace key, on Mac: ⌫ (Backspace)
28969     '⌫': 'Backspace', backspace: 'Backspace',
28970     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28971     '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
28972     // Return key, ↩
28973     '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
28974     // Pause/Break key
28975     'pause': 'Pause', 'pause-break': 'Pause',
28976     // Caps Lock key, ⇪
28977     '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
28978     // Escape key, on Mac: ⎋, on Windows: Esc
28979     '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
28980     // Space key
28981     space: [' ', 'Spacebar'],
28982     // Page-Up key, or pgup, on Mac: ↖
28983     '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
28984     // Page-Down key, or pgdown, on Mac: ↘
28985     '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
28986     // END key, on Mac: ⇟
28987     '⇟': 'End', end: 'End',
28988     // HOME key, on Mac: ⇞
28989     '⇞': 'Home', home: 'Home',
28990     // Insert key, or ins
28991     ins: 'Insert', insert: 'Insert',
28992     // Delete key, on Mac: ⌦ (Delete)
28993     '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
28994     // Left Arrow Key, or ←
28995     '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
28996     // Up Arrow Key, or ↑
28997     '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
28998     // Right Arrow Key, or →
28999     '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29000     // Up Arrow Key, or ↓
29001     '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29002     // odities, stuff for backward compatibility (browsers and code):
29003     // Num-Multiply, or *
29004     '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29005     // Num-Plus or +
29006     '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29007     // Num-Subtract, or -
29008     '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29009     // Semicolon
29010     semicolon: ';',
29011     // = or equals
29012     equals: '=',
29013     // Comma, or ,
29014     comma: ',',
29015     // Period, or ., or full-stop
29016     period: '.', 'full-stop': '.',
29017     // Slash, or /, or forward-slash
29018     slash: '/', 'forward-slash': '/',
29019     // Tick, or `, or back-quote
29020     tick: '`', 'back-quote': '`',
29021     // Open bracket, or [
29022     'open-bracket': '[',
29023     // Back slash, or \
29024     'back-slash': '\\',
29025     // Close backet, or ]
29026     'close-bracket': ']',
29027     // Apostrophe, or Quote, or '
29028     quote: '\'', apostrophe: '\'',
29029     // NUMPAD 0-9
29030     'num-0': '0',
29031     'num-1': '1',
29032     'num-2': '2',
29033     'num-3': '3',
29034     'num-4': '4',
29035     'num-5': '5',
29036     'num-6': '6',
29037     'num-7': '7',
29038     'num-8': '8',
29039     'num-9': '9',
29040     // F1-F25
29041     f1: 'F1',
29042     f2: 'F2',
29043     f3: 'F3',
29044     f4: 'F4',
29045     f5: 'F5',
29046     f6: 'F6',
29047     f7: 'F7',
29048     f8: 'F8',
29049     f9: 'F9',
29050     f10: 'F10',
29051     f11: 'F11',
29052     f12: 'F12',
29053     f13: 'F13',
29054     f14: 'F14',
29055     f15: 'F15',
29056     f16: 'F16',
29057     f17: 'F17',
29058     f18: 'F18',
29059     f19: 'F19',
29060     f20: 'F20',
29061     f21: 'F21',
29062     f22: 'F22',
29063     f23: 'F23',
29064     f24: 'F24',
29065     f25: 'F25'
29066 };
29067
29068 d3keybinding.keyCodes = {
29069     // Backspace key, on Mac: ⌫ (Backspace)
29070     '⌫': 8, backspace: 8,
29071     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29072     '⇥': 9, '⇆': 9, tab: 9,
29073     // Return key, ↩
29074     '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29075     // Pause/Break key
29076     'pause': 19, 'pause-break': 19,
29077     // Caps Lock key, ⇪
29078     '⇪': 20, caps: 20, 'caps-lock': 20,
29079     // Escape key, on Mac: ⎋, on Windows: Esc
29080     '⎋': 27, escape: 27, esc: 27,
29081     // Space key
29082     space: 32,
29083     // Page-Up key, or pgup, on Mac: ↖
29084     '↖': 33, pgup: 33, 'page-up': 33,
29085     // Page-Down key, or pgdown, on Mac: ↘
29086     '↘': 34, pgdown: 34, 'page-down': 34,
29087     // END key, on Mac: ⇟
29088     '⇟': 35, end: 35,
29089     // HOME key, on Mac: ⇞
29090     '⇞': 36, home: 36,
29091     // Insert key, or ins
29092     ins: 45, insert: 45,
29093     // Delete key, on Mac: ⌦ (Delete)
29094     '⌦': 46, del: 46, 'delete': 46,
29095     // Left Arrow Key, or ←
29096     '←': 37, left: 37, 'arrow-left': 37,
29097     // Up Arrow Key, or ↑
29098     '↑': 38, up: 38, 'arrow-up': 38,
29099     // Right Arrow Key, or →
29100     '→': 39, right: 39, 'arrow-right': 39,
29101     // Up Arrow Key, or ↓
29102     '↓': 40, down: 40, 'arrow-down': 40,
29103     // odities, printing characters that come out wrong:
29104     // Firefox Equals
29105     'ffequals': 61,
29106     // Num-Multiply, or *
29107     '*': 106, star: 106, asterisk: 106, multiply: 106,
29108     // Num-Plus or +
29109     '+': 107, 'plus': 107,
29110     // Num-Subtract, or -
29111     '-': 109, subtract: 109,
29112     // Firefox Plus
29113     'ffplus': 171,
29114     // Firefox Minus
29115     'ffminus': 173,
29116     // Semicolon
29117     ';': 186, semicolon: 186,
29118     // = or equals
29119     '=': 187, 'equals': 187,
29120     // Comma, or ,
29121     ',': 188, comma: 188,
29122     // Dash / Underscore key
29123     'dash': 189,
29124     // Period, or ., or full-stop
29125     '.': 190, period: 190, 'full-stop': 190,
29126     // Slash, or /, or forward-slash
29127     '/': 191, slash: 191, 'forward-slash': 191,
29128     // Tick, or `, or back-quote
29129     '`': 192, tick: 192, 'back-quote': 192,
29130     // Open bracket, or [
29131     '[': 219, 'open-bracket': 219,
29132     // Back slash, or \
29133     '\\': 220, 'back-slash': 220,
29134     // Close backet, or ]
29135     ']': 221, 'close-bracket': 221,
29136     // Apostrophe, or Quote, or '
29137     '\'': 222, quote: 222, apostrophe: 222
29138 };
29139
29140 // NUMPAD 0-9
29141 var i$1 = 95;
29142 var n = 0;
29143 while (++i$1 < 106) {
29144     d3keybinding.keyCodes['num-' + n] = i$1;
29145     ++n;
29146 }
29147
29148 // 0-9
29149 i$1 = 47; n = 0;
29150 while (++i$1 < 58) {
29151     d3keybinding.keyCodes[n] = i$1;
29152     ++n;
29153 }
29154
29155 // F1-F25
29156 i$1 = 111; n = 1;
29157 while (++i$1 < 136) {
29158     d3keybinding.keyCodes['f' + n] = i$1;
29159     ++n;
29160 }
29161
29162 // a-z
29163 i$1 = 64;
29164 while (++i$1 < 91) {
29165     d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29166 }
29167
29168 function tooltip() {
29169   var tooltip = function(selection$$1) {
29170       selection$$1.each(setup);
29171     },
29172     animation = utilFunctor(false),
29173     html = utilFunctor(false),
29174     title = function() {
29175       var title = this.getAttribute('data-original-title');
29176       if (title) {
29177         return title;
29178       } else {
29179         title = this.getAttribute('title');
29180         this.removeAttribute('title');
29181         this.setAttribute('data-original-title', title);
29182       }
29183       return title;
29184     },
29185     over = 'mouseenter.tooltip',
29186     out = 'mouseleave.tooltip',
29187     placement = utilFunctor('top');
29188
29189
29190   tooltip.title = function(_) {
29191     if (arguments.length) {
29192       title = utilFunctor(_);
29193       return tooltip;
29194     } else {
29195       return title;
29196     }
29197   };
29198
29199
29200   tooltip.html = function(_) {
29201     if (arguments.length) {
29202       html = utilFunctor(_);
29203       return tooltip;
29204     } else {
29205       return html;
29206     }
29207   };
29208
29209
29210   tooltip.placement = function(_) {
29211     if (arguments.length) {
29212       placement = utilFunctor(_);
29213       return tooltip;
29214     } else {
29215       return placement;
29216     }
29217   };
29218
29219
29220   tooltip.show = function(selection$$1) {
29221     selection$$1.each(show);
29222   };
29223
29224
29225   tooltip.hide = function(selection$$1) {
29226     selection$$1.each(hide);
29227   };
29228
29229
29230   tooltip.toggle = function(selection$$1) {
29231     selection$$1.each(toggle);
29232   };
29233
29234
29235   tooltip.destroy = function(selection$$1) {
29236     selection$$1
29237       .on(over, null)
29238       .on(out, null)
29239       .attr('title', function() {
29240         return this.getAttribute('data-original-title') || this.getAttribute('title');
29241       })
29242       .attr('data-original-title', null)
29243       .selectAll('.tooltip')
29244       .remove();
29245   };
29246
29247
29248   function setup() {
29249     var root = d3_select(this),
29250         animate = animation.apply(this, arguments),
29251         tip = root.selectAll('.tooltip').data([0]);
29252
29253     var enter = tip.enter()
29254       .append('div')
29255       .attr('class', 'tooltip');
29256
29257     enter
29258       .append('div')
29259       .attr('class', 'tooltip-arrow');
29260
29261     enter
29262       .append('div')
29263       .attr('class', 'tooltip-inner');
29264
29265     tip = enter
29266       .merge(tip);
29267
29268     if (animate) {
29269       tip.classed('fade', true);
29270     }
29271
29272     var place = placement.apply(this, arguments);
29273     tip.classed(place, true);
29274
29275     root.on(over, show);
29276     root.on(out, hide);
29277   }
29278
29279
29280   function show() {
29281     var root = d3_select(this),
29282       content = title.apply(this, arguments),
29283       tip = root.selectAll('.tooltip')
29284         .classed('in', true),
29285       markup = html.apply(this, arguments);
29286
29287     tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29288     var place = placement.apply(this, arguments),
29289       outer = getPosition(root.node()),
29290       inner = getPosition(tip.node()),
29291       pos;
29292
29293     switch (place) {
29294       case 'top':
29295         pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29296         break;
29297       case 'right':
29298         pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29299         break;
29300       case 'left':
29301         pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29302         break;
29303       case 'bottom':
29304         pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29305         break;
29306     }
29307
29308     if (pos) {
29309       tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29310     } else {
29311       tip.style('left', null).style('top', null);
29312     }
29313
29314     this.tooltipVisible = true;
29315   }
29316
29317
29318   function hide() {
29319     d3_select(this).selectAll('.tooltip')
29320       .classed('in', false);
29321
29322     this.tooltipVisible = false;
29323   }
29324
29325
29326   function toggle() {
29327     if (this.tooltipVisible) {
29328       hide.apply(this, arguments);
29329     } else {
29330       show.apply(this, arguments);
29331     }
29332   }
29333
29334   return tooltip;
29335 }
29336
29337
29338 function getPosition(node) {
29339   var mode = d3_select(node).style('position');
29340   if (mode === 'absolute' || mode === 'static') {
29341     return {
29342       x: node.offsetLeft,
29343       y: node.offsetTop,
29344       w: node.offsetWidth,
29345       h: node.offsetHeight
29346     };
29347   } else {
29348     return {
29349       x: 0,
29350       y: 0,
29351       w: node.offsetWidth,
29352       h: node.offsetHeight
29353     };
29354   }
29355 }
29356
29357 function behaviorEdit(context) {
29358
29359     function edit() {
29360         context.map()
29361             .minzoom(context.minEditableZoom());
29362     }
29363
29364
29365     edit.off = function() {
29366         context.map()
29367             .minzoom(0);
29368     };
29369
29370
29371     return edit;
29372 }
29373
29374 /*
29375    The hover behavior adds the `.hover` class on mouseover to all elements to which
29376    the identical datum is bound, and removes it on mouseout.
29377
29378    The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29379    representation may consist of several elements scattered throughout the DOM hierarchy.
29380    Only one of these elements can have the :hover pseudo-class, but all of them will
29381    have the .hover class.
29382  */
29383 function behaviorHover(context) {
29384     var dispatch$$1 = dispatch('hover'),
29385         _selection = d3_select(null),
29386         newId = null,
29387         buttonDown,
29388         altDisables,
29389         target;
29390
29391
29392     function keydown() {
29393         if (altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29394             _selection.selectAll('.hover')
29395                 .classed('hover-suppressed', true)
29396                 .classed('hover', false);
29397
29398             _selection
29399                 .classed('hover-disabled', true);
29400
29401             dispatch$$1.call('hover', this, null);
29402         }
29403     }
29404
29405
29406     function keyup() {
29407         if (altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29408             _selection.selectAll('.hover-suppressed')
29409                 .classed('hover-suppressed', false)
29410                 .classed('hover', true);
29411
29412             _selection
29413                 .classed('hover-disabled', false);
29414
29415             dispatch$$1.call('hover', this, target ? target.id : null);
29416         }
29417     }
29418
29419
29420     var hover = function(selection$$1) {
29421         _selection = selection$$1;
29422         newId = null;
29423
29424         _selection
29425             .on('mouseover.hover', mouseover)
29426             .on('mouseout.hover', mouseout)
29427             .on('mousedown.hover', mousedown);
29428
29429         d3_select(window)
29430             .on('keydown.hover', keydown)
29431             .on('keyup.hover', keyup);
29432
29433
29434         function mouseover() {
29435             if (buttonDown) return;
29436             var target = event.target;
29437             enter(target ? target.__data__ : null);
29438         }
29439
29440
29441         function mouseout() {
29442             if (buttonDown) return;
29443             var target = event.relatedTarget;
29444             enter(target ? target.__data__ : null);
29445         }
29446
29447
29448         function mousedown() {
29449             buttonDown = true;
29450             d3_select(window)
29451                 .on('mouseup.hover', mouseup, true);
29452         }
29453
29454
29455         function mouseup() {
29456             buttonDown = false;
29457             d3_select(window)
29458                 .on('mouseup.hover', null, true);
29459         }
29460
29461
29462         function enter(d) {
29463             if (d === target) return;
29464             target = d;
29465
29466             _selection.selectAll('.hover')
29467                 .classed('hover', false);
29468             _selection.selectAll('.hover-suppressed')
29469                 .classed('hover-suppressed', false);
29470
29471             if (target instanceof osmEntity$$1 && target.id !== newId) {
29472
29473                 // If drawing a way, don't hover on a node that was just placed. #3974
29474                 var mode = context.mode() && context.mode().id;
29475                 if ((mode === 'draw-line' || mode === 'draw-area') && !newId && target.type === 'node') {
29476                     newId = target.id;
29477                     return;
29478                 }
29479
29480                 var selector$$1 = '.' + target.id;
29481
29482                 if (target.type === 'relation') {
29483                     target.members.forEach(function(member) {
29484                         selector$$1 += ', .' + member.id;
29485                     });
29486                 }
29487
29488                 var suppressed = altDisables && event && event.altKey;
29489
29490                 _selection.selectAll(selector$$1)
29491                     .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29492
29493                 dispatch$$1.call('hover', this, !suppressed && target.id);
29494
29495             } else {
29496                 dispatch$$1.call('hover', this, null);
29497             }
29498         }
29499
29500     };
29501
29502
29503     hover.off = function(selection$$1) {
29504         selection$$1.selectAll('.hover')
29505             .classed('hover', false);
29506         selection$$1.selectAll('.hover-suppressed')
29507             .classed('hover-suppressed', false);
29508         selection$$1
29509             .classed('hover-disabled', false);
29510
29511
29512         selection$$1
29513             .on('mouseover.hover', null)
29514             .on('mouseout.hover', null)
29515             .on('mousedown.hover', null);
29516
29517         d3_select(window)
29518             .on('keydown.hover', null)
29519             .on('keyup.hover', null);
29520     };
29521
29522
29523     hover.altDisables = function(_) {
29524         if (!arguments.length) return altDisables;
29525         altDisables = _;
29526         return hover;
29527     };
29528
29529
29530     return utilRebind(hover, dispatch$$1, 'on');
29531 }
29532
29533 function refresh(selection, node) {
29534     var cr = node.getBoundingClientRect();
29535     var prop = [cr.width, cr.height];
29536     selection.property('__dimensions__', prop);
29537     return prop;
29538 }
29539
29540 function utilGetDimensions(selection, force) {
29541     if (!selection || selection.empty()) {
29542         return [0, 0];
29543     }
29544     var node = selection.node(),
29545         cached = selection.property('__dimensions__');
29546     return (!cached || force) ? refresh(selection, node) : cached;
29547 }
29548
29549
29550 function utilSetDimensions(selection, dimensions) {
29551     if (!selection || selection.empty()) {
29552         return selection;
29553     }
29554     var node = selection.node();
29555     if (dimensions === null) {
29556         refresh(selection, node);
29557         return selection;
29558     }
29559     return selection
29560         .property('__dimensions__', [dimensions[0], dimensions[1]])
29561         .attr('width', dimensions[0])
29562         .attr('height', dimensions[1]);
29563 }
29564
29565 function behaviorTail() {
29566     var text,
29567         container,
29568         xmargin = 25,
29569         tooltipSize = [0, 0],
29570         selectionSize = [0, 0];
29571
29572
29573     function tail(selection$$1) {
29574         if (!text) return;
29575
29576         d3_select(window)
29577             .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
29578
29579         container = d3_select(document.body)
29580             .append('div')
29581             .style('display', 'none')
29582             .attr('class', 'tail tooltip-inner');
29583
29584         container.append('div')
29585             .text(text);
29586
29587         selection$$1
29588             .on('mousemove.tail', mousemove)
29589             .on('mouseenter.tail', mouseenter)
29590             .on('mouseleave.tail', mouseleave);
29591
29592         container
29593             .on('mousemove.tail', mousemove);
29594
29595         tooltipSize = utilGetDimensions(container);
29596         selectionSize = utilGetDimensions(selection$$1);
29597
29598
29599         function show() {
29600             container.style('display', 'block');
29601             tooltipSize = utilGetDimensions(container);
29602         }
29603
29604
29605         function mousemove() {
29606             if (container.style('display') === 'none') show();
29607             var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
29608                 -tooltipSize[0] - xmargin : xmargin;
29609             container.classed('left', xoffset > 0);
29610             utilSetTransform(container, event.clientX + xoffset, event.clientY);
29611         }
29612
29613
29614         function mouseleave() {
29615             if (event.relatedTarget !== container.node()) {
29616                 container.style('display', 'none');
29617             }
29618         }
29619
29620
29621         function mouseenter() {
29622             if (event.relatedTarget !== container.node()) {
29623                 show();
29624             }
29625         }
29626     }
29627
29628
29629     tail.off = function(selection$$1) {
29630         if (!text) return;
29631
29632         container
29633             .on('mousemove.tail', null)
29634             .remove();
29635
29636         selection$$1
29637             .on('mousemove.tail', null)
29638             .on('mouseenter.tail', null)
29639             .on('mouseleave.tail', null);
29640
29641         d3_select(window)
29642             .on('resize.tail', null);
29643     };
29644
29645
29646     tail.text = function(_) {
29647         if (!arguments.length) return text;
29648         text = _;
29649         return tail;
29650     };
29651
29652
29653     return tail;
29654 }
29655
29656 var usedTails = {};
29657 var disableSpace = false;
29658 var lastSpace = null;
29659
29660
29661 function behaviorDraw(context) {
29662     var dispatch$$1 = dispatch('move', 'click', 'clickWay',
29663             'clickNode', 'undo', 'cancel', 'finish'),
29664         keybinding = d3keybinding('draw'),
29665         hover = behaviorHover(context)
29666             .altDisables(true)
29667             .on('hover', context.ui().sidebar.hover),
29668         tail = behaviorTail(),
29669         edit = behaviorEdit(context),
29670         closeTolerance = 4,
29671         tolerance = 12,
29672         mouseLeave = false,
29673         lastMouse = null;
29674
29675
29676     function datum() {
29677         if (event.altKey) return {};
29678
29679         if (event.type === 'keydown') {
29680             return (lastMouse && lastMouse.target.__data__) || {};
29681         } else {
29682             return event.target.__data__ || {};
29683         }
29684     }
29685
29686
29687     function mousedown() {
29688
29689         function point() {
29690             var p = context.container().node();
29691             return touchId !== null ? d3_touches(p).filter(function(p) {
29692                 return p.identifier === touchId;
29693             })[0] : d3_mouse(p);
29694         }
29695
29696         var element = d3_select(this),
29697             touchId = event.touches ? event.changedTouches[0].identifier : null,
29698             t1 = +new Date(),
29699             p1 = point();
29700
29701         element.on('mousemove.draw', null);
29702
29703         d3_select(window).on('mouseup.draw', function() {
29704             var t2 = +new Date(),
29705                 p2 = point(),
29706                 dist = geoEuclideanDistance(p1, p2);
29707
29708             element.on('mousemove.draw', mousemove);
29709             d3_select(window).on('mouseup.draw', null);
29710
29711             if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
29712                 // Prevent a quick second click
29713                 d3_select(window).on('click.draw-block', function() {
29714                     event.stopPropagation();
29715                 }, true);
29716
29717                 context.map().dblclickEnable(false);
29718
29719                 window.setTimeout(function() {
29720                     context.map().dblclickEnable(true);
29721                     d3_select(window).on('click.draw-block', null);
29722                 }, 500);
29723
29724                 click();
29725             }
29726         }, true);
29727     }
29728
29729
29730     function mousemove() {
29731         lastMouse = event;
29732         dispatch$$1.call('move', this, datum());
29733     }
29734
29735
29736     function mouseenter() {
29737         mouseLeave = false;
29738     }
29739
29740
29741     function mouseleave() {
29742         mouseLeave = true;
29743     }
29744
29745
29746     function click() {
29747         var d = datum();
29748         if (d.type === 'way') {
29749             var dims = context.map().dimensions(),
29750                 mouse = context.mouse(),
29751                 pad = 5,
29752                 trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad &&
29753                     mouse[1] > pad && mouse[1] < dims[1] - pad;
29754
29755             if (trySnap) {
29756                 var choice = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection),
29757                     edge = [d.nodes[choice.index - 1], d.nodes[choice.index]];
29758                 dispatch$$1.call('clickWay', this, choice.loc, edge);
29759             } else {
29760                 dispatch$$1.call('click', this, context.map().mouseCoordinates());
29761             }
29762
29763         } else if (d.type === 'node') {
29764             dispatch$$1.call('clickNode', this, d);
29765
29766         } else {
29767             dispatch$$1.call('click', this, context.map().mouseCoordinates());
29768         }
29769     }
29770
29771
29772     function space() {
29773         event.preventDefault();
29774         event.stopPropagation();
29775
29776         var currSpace = context.mouse();
29777         if (disableSpace && lastSpace) {
29778             var dist = geoEuclideanDistance(lastSpace, currSpace);
29779             if (dist > tolerance) {
29780                 disableSpace = false;
29781             }
29782         }
29783
29784         if (disableSpace || mouseLeave || !lastMouse) return;
29785
29786         // user must move mouse or release space bar to allow another click
29787         lastSpace = currSpace;
29788         disableSpace = true;
29789
29790         d3_select(window).on('keyup.space-block', function() {
29791             event.preventDefault();
29792             event.stopPropagation();
29793             disableSpace = false;
29794             d3_select(window).on('keyup.space-block', null);
29795         });
29796
29797         click();
29798     }
29799
29800
29801     function backspace() {
29802         event.preventDefault();
29803         dispatch$$1.call('undo');
29804     }
29805
29806
29807     function del() {
29808         event.preventDefault();
29809         dispatch$$1.call('cancel');
29810     }
29811
29812
29813     function ret() {
29814         event.preventDefault();
29815         dispatch$$1.call('finish');
29816     }
29817
29818
29819     function draw(selection$$1) {
29820         context.install(hover);
29821         context.install(edit);
29822
29823         if (!context.inIntro() && !usedTails[tail.text()]) {
29824             context.install(tail);
29825         }
29826
29827         keybinding
29828             .on('⌫', backspace)
29829             .on('⌦', del)
29830             .on('⎋', ret)
29831             .on('↩', ret)
29832             .on('space', space)
29833             .on('⌥space', space);
29834
29835         selection$$1
29836             .on('mouseenter.draw', mouseenter)
29837             .on('mouseleave.draw', mouseleave)
29838             .on('mousedown.draw', mousedown)
29839             .on('mousemove.draw', mousemove);
29840
29841         d3_select(document)
29842             .call(keybinding);
29843
29844         return draw;
29845     }
29846
29847
29848     draw.off = function(selection$$1) {
29849         context.ui().sidebar.hover.cancel();
29850         context.uninstall(hover);
29851         context.uninstall(edit);
29852
29853         if (!context.inIntro() && !usedTails[tail.text()]) {
29854             context.uninstall(tail);
29855             usedTails[tail.text()] = true;
29856         }
29857
29858         selection$$1
29859             .on('mouseenter.draw', null)
29860             .on('mouseleave.draw', null)
29861             .on('mousedown.draw', null)
29862             .on('mousemove.draw', null);
29863
29864         d3_select(window)
29865             .on('mouseup.draw', null);
29866             // note: keyup.space-block, click.draw-block should remain
29867
29868         d3_select(document)
29869             .call(keybinding.off);
29870     };
29871
29872
29873     draw.tail = function(_) {
29874         tail.text(_);
29875         return draw;
29876     };
29877
29878
29879     return utilRebind(draw, dispatch$$1, 'on');
29880 }
29881
29882 function modeAddArea$$1(context) {
29883     var mode = {
29884         id: 'add-area',
29885         button: 'area',
29886         title: t('modes.add_area.title'),
29887         description: t('modes.add_area.description'),
29888         key: '3'
29889     };
29890
29891     var behavior = behaviorAddWay(context)
29892             .tail(t('modes.add_area.tail'))
29893             .on('start', start)
29894             .on('startFromWay', startFromWay)
29895             .on('startFromNode', startFromNode),
29896         defaultTags = { area: 'yes' };
29897
29898
29899     function actionClose(wayId) {
29900         return function (graph) {
29901             return graph.replace(graph.entity(wayId).close());
29902         };
29903     }
29904
29905
29906     function start(loc) {
29907         var startGraph = context.graph(),
29908             node = osmNode({ loc: loc }),
29909             way = osmWay({ tags: defaultTags });
29910
29911         context.perform(
29912             actionAddEntity(node),
29913             actionAddEntity(way),
29914             actionAddVertex(way.id, node.id),
29915             actionClose(way.id)
29916         );
29917
29918         context.enter(modeDrawArea(context, way.id, startGraph));
29919     }
29920
29921
29922     function startFromWay(loc, edge) {
29923         var startGraph = context.graph(),
29924             node = osmNode({ loc: loc }),
29925             way = osmWay({ tags: defaultTags });
29926
29927         context.perform(
29928             actionAddEntity(node),
29929             actionAddEntity(way),
29930             actionAddVertex(way.id, node.id),
29931             actionClose(way.id),
29932             actionAddMidpoint({ loc: loc, edge: edge }, node)
29933         );
29934
29935         context.enter(modeDrawArea(context, way.id, startGraph));
29936     }
29937
29938
29939     function startFromNode(node) {
29940         var startGraph = context.graph(),
29941             way = osmWay({ tags: defaultTags });
29942
29943         context.perform(
29944             actionAddEntity(way),
29945             actionAddVertex(way.id, node.id),
29946             actionClose(way.id)
29947         );
29948
29949         context.enter(modeDrawArea(context, way.id, startGraph));
29950     }
29951
29952
29953     mode.enter = function() {
29954         context.install(behavior);
29955     };
29956
29957
29958     mode.exit = function() {
29959         context.uninstall(behavior);
29960     };
29961
29962
29963     return mode;
29964 }
29965
29966 function modeAddLine$$1(context) {
29967     var mode = {
29968         id: 'add-line',
29969         button: 'line',
29970         title: t('modes.add_line.title'),
29971         description: t('modes.add_line.description'),
29972         key: '2'
29973     };
29974
29975     var behavior = behaviorAddWay(context)
29976         .tail(t('modes.add_line.tail'))
29977         .on('start', start)
29978         .on('startFromWay', startFromWay)
29979         .on('startFromNode', startFromNode);
29980
29981
29982     function start(loc) {
29983         var startGraph = context.graph(),
29984             node = osmNode({ loc: loc }),
29985             way = osmWay();
29986
29987         context.perform(
29988             actionAddEntity(node),
29989             actionAddEntity(way),
29990             actionAddVertex(way.id, node.id)
29991         );
29992
29993         context.enter(modeDrawLine(context, way.id, startGraph));
29994     }
29995
29996
29997     function startFromWay(loc, edge) {
29998         var startGraph = context.graph(),
29999             node = osmNode({ loc: loc }),
30000             way = osmWay();
30001
30002         context.perform(
30003             actionAddEntity(node),
30004             actionAddEntity(way),
30005             actionAddVertex(way.id, node.id),
30006             actionAddMidpoint({ loc: loc, edge: edge }, node)
30007         );
30008
30009         context.enter(modeDrawLine(context, way.id, startGraph));
30010     }
30011
30012
30013     function startFromNode(node) {
30014         var startGraph = context.graph(),
30015             way = osmWay();
30016
30017         context.perform(
30018             actionAddEntity(way),
30019             actionAddVertex(way.id, node.id)
30020         );
30021
30022         context.enter(modeDrawLine(context, way.id, startGraph));
30023     }
30024
30025
30026     mode.enter = function() {
30027         context.install(behavior);
30028     };
30029
30030
30031     mode.exit = function() {
30032         context.uninstall(behavior);
30033     };
30034
30035     return mode;
30036 }
30037
30038 function modeAddPoint$$1(context) {
30039     var mode = {
30040         id: 'add-point',
30041         button: 'point',
30042         title: t('modes.add_point.title'),
30043         description: t('modes.add_point.description'),
30044         key: '1'
30045     };
30046
30047     var behavior = behaviorDraw(context)
30048         .tail(t('modes.add_point.tail'))
30049         .on('click', add)
30050         .on('clickWay', addWay)
30051         .on('clickNode', addNode)
30052         .on('cancel', cancel)
30053         .on('finish', cancel);
30054
30055
30056     function add(loc) {
30057         var node = osmNode({ loc: loc });
30058
30059         context.perform(
30060             actionAddEntity(node),
30061             t('operations.add.annotation.point')
30062         );
30063
30064         context.enter(
30065             modeSelect(context, [node.id]).newFeature(true)
30066         );
30067     }
30068
30069
30070     function addWay(loc) {
30071         add(loc);
30072     }
30073
30074
30075     function addNode(node) {
30076         add(node.loc);
30077     }
30078
30079
30080     function cancel() {
30081         context.enter(modeBrowse(context));
30082     }
30083
30084
30085     mode.enter = function() {
30086         context.install(behavior);
30087     };
30088
30089
30090     mode.exit = function() {
30091         context.uninstall(behavior);
30092     };
30093
30094
30095     return mode;
30096 }
30097
30098 function modeDragNode$$1(context) {
30099     var mode = {
30100         id: 'drag-node',
30101         button: 'browse'
30102     };
30103
30104     var nudgeInterval,
30105         activeIDs,
30106         wasMidpoint,
30107         isCancelled,
30108         lastLoc,
30109         selectedIDs = [],
30110         hover = behaviorHover(context).altDisables(true).on('hover', context.ui().sidebar.hover),
30111         edit = behaviorEdit(context);
30112
30113
30114     function vecSub(a, b) {
30115         return [a[0] - b[0], a[1] - b[1]];
30116     }
30117
30118     function edge(point, size) {
30119         var pad = [80, 20, 50, 20],   // top, right, bottom, left
30120             x = 0,
30121             y = 0;
30122
30123         if (point[0] > size[0] - pad[1])
30124             x = -10;
30125         if (point[0] < pad[3])
30126             x = 10;
30127         if (point[1] > size[1] - pad[2])
30128             y = -10;
30129         if (point[1] < pad[0])
30130             y = 10;
30131
30132         if (x || y) {
30133             return [x, y];
30134         } else {
30135             return null;
30136         }
30137     }
30138
30139
30140     function startNudge(entity, nudge) {
30141         if (nudgeInterval) window.clearInterval(nudgeInterval);
30142         nudgeInterval = window.setInterval(function() {
30143             context.pan(nudge);
30144             doMove(entity, nudge);
30145         }, 50);
30146     }
30147
30148
30149     function stopNudge() {
30150         if (nudgeInterval) {
30151             window.clearInterval(nudgeInterval);
30152             nudgeInterval = null;
30153         }
30154     }
30155
30156
30157     function moveAnnotation(entity) {
30158         return t('operations.move.annotation.' + entity.geometry(context.graph()));
30159     }
30160
30161
30162     function connectAnnotation(entity) {
30163         return t('operations.connect.annotation.' + entity.geometry(context.graph()));
30164     }
30165
30166
30167     function origin(entity) {
30168         return context.projection(entity.loc);
30169     }
30170
30171
30172     function start(entity) {
30173         wasMidpoint = entity.type === 'midpoint';
30174
30175         isCancelled = event.sourceEvent.shiftKey ||
30176             context.features().hasHiddenConnections(entity, context.graph());
30177
30178         if (isCancelled) {
30179             return behavior.cancel();
30180         }
30181
30182         if (wasMidpoint) {
30183             var midpoint = entity;
30184             entity = osmNode();
30185             context.perform(actionAddMidpoint(midpoint, entity));
30186
30187             var vertex = context.surface().selectAll('.' + entity.id);
30188             behavior.target(vertex.node(), entity);
30189
30190         } else {
30191             context.perform(actionNoop());
30192         }
30193
30194         // activeIDs generate no pointer events.  This prevents the node or vertex
30195         // being dragged from trying to connect to itself or its parent element.
30196         activeIDs = map$4(context.graph().parentWays(entity), 'id');
30197         activeIDs.push(entity.id);
30198         setActiveElements();
30199
30200         context.enter(mode);
30201     }
30202
30203
30204     function datum() {
30205         var event$$1 = event && event.sourceEvent;
30206         if (!event$$1 || event$$1.altKey) {
30207             return {};
30208         } else {
30209             return event$$1.target.__data__ || {};
30210         }
30211     }
30212
30213
30214     function doMove(entity, nudge) {
30215         nudge = nudge || [0, 0];
30216
30217         var currPoint = (event && event.point) || context.projection(lastLoc),
30218             currMouse = vecSub(currPoint, nudge),
30219             loc = context.projection.invert(currMouse),
30220             d = datum();
30221
30222         if (!nudgeInterval) {
30223             if (d.type === 'node' && d.id !== entity.id) {
30224                 loc = d.loc;
30225             } else if (d.type === 'way' && !d3_select(event.sourceEvent.target).classed('fill')) {
30226                 loc = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection).loc;
30227             }
30228         }
30229
30230         context.replace(
30231             actionMoveNode(entity.id, loc),
30232             moveAnnotation(entity)
30233         );
30234
30235         lastLoc = loc;
30236     }
30237
30238
30239     function move(entity) {
30240         if (isCancelled) return;
30241         event.sourceEvent.stopPropagation();
30242         lastLoc = context.projection.invert(event.point);
30243
30244         doMove(entity);
30245         var nudge = edge(event.point, context.map().dimensions());
30246         if (nudge) {
30247             startNudge(entity, nudge);
30248         } else {
30249             stopNudge();
30250         }
30251     }
30252
30253
30254     function end(entity) {
30255         if (isCancelled) return;
30256
30257         var d = datum();
30258
30259         if (d.type === 'way') {
30260             var choice = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection);
30261             context.replace(
30262                 actionAddMidpoint({ loc: choice.loc, edge: [d.nodes[choice.index - 1], d.nodes[choice.index]] }, entity),
30263                 connectAnnotation(d)
30264             );
30265
30266         } else if (d.type === 'node' && d.id !== entity.id) {
30267             context.replace(
30268                 actionConnect([d.id, entity.id]),
30269                 connectAnnotation(d)
30270             );
30271
30272         } else if (wasMidpoint) {
30273             context.replace(
30274                 actionNoop(),
30275                 t('operations.add.annotation.vertex')
30276             );
30277
30278         } else {
30279             context.replace(
30280                 actionNoop(),
30281                 moveAnnotation(entity)
30282             );
30283         }
30284
30285         var reselection = selectedIDs.filter(function(id) {
30286             return context.graph().hasEntity(id);
30287         });
30288
30289         if (reselection.length) {
30290             context.enter(modeSelect(context, reselection));
30291         } else {
30292             context.enter(modeBrowse(context));
30293         }
30294     }
30295
30296
30297     function cancel() {
30298         behavior.cancel();
30299         context.enter(modeBrowse(context));
30300     }
30301
30302
30303     function setActiveElements() {
30304         context.surface().selectAll(utilEntitySelector(activeIDs))
30305             .classed('active', true);
30306     }
30307
30308
30309     var behavior = behaviorDrag()
30310         .selector('g.node, g.point, g.midpoint')
30311         .surface(d3_select('#map').node())
30312         .origin(origin)
30313         .on('start', start)
30314         .on('move', move)
30315         .on('end', end);
30316
30317
30318     mode.enter = function() {
30319         context.install(hover);
30320         context.install(edit);
30321
30322         context.history()
30323             .on('undone.drag-node', cancel);
30324
30325         context.map()
30326             .on('drawn.drag-node', setActiveElements);
30327
30328         setActiveElements();
30329     };
30330
30331
30332     mode.exit = function() {
30333         context.ui().sidebar.hover.cancel();
30334         context.uninstall(hover);
30335         context.uninstall(edit);
30336
30337         context.history()
30338             .on('undone.drag-node', null);
30339
30340         context.map()
30341             .on('drawn.drag-node', null);
30342
30343         context.surface()
30344             .selectAll('.active')
30345             .classed('active', false);
30346
30347         stopNudge();
30348     };
30349
30350
30351     mode.selectedIDs = function(_) {
30352         if (!arguments.length) return selectedIDs;
30353         selectedIDs = _;
30354         return mode;
30355     };
30356
30357
30358     mode.behavior = behavior;
30359
30360
30361     return mode;
30362 }
30363
30364 function modeBrowse(context) {
30365     var mode = {
30366         button: 'browse',
30367         id: 'browse',
30368         title: t('modes.browse.title'),
30369         description: t('modes.browse.description')
30370     }, sidebar;
30371
30372     var behaviors = [
30373         behaviorPaste(context),
30374         behaviorHover(context).on('hover', context.ui().sidebar.hover),
30375         behaviorSelect(context),
30376         behaviorLasso(context),
30377         modeDragNode$$1(context).behavior
30378     ];
30379
30380
30381     mode.enter = function() {
30382         behaviors.forEach(function(behavior) {
30383             context.install(behavior);
30384         });
30385
30386         // Get focus on the body.
30387         if (document.activeElement && document.activeElement.blur) {
30388             document.activeElement.blur();
30389         }
30390
30391         if (sidebar) {
30392             context.ui().sidebar.show(sidebar);
30393         } else {
30394             context.ui().sidebar.select(null);
30395         }
30396     };
30397
30398
30399     mode.exit = function() {
30400         context.ui().sidebar.hover.cancel();
30401         behaviors.forEach(function(behavior) {
30402             context.uninstall(behavior);
30403         });
30404
30405         if (sidebar) {
30406             context.ui().sidebar.hide();
30407         }
30408     };
30409
30410
30411     mode.sidebar = function(_) {
30412         if (!arguments.length) return sidebar;
30413         sidebar = _;
30414         return mode;
30415     };
30416
30417
30418     return mode;
30419 }
30420
30421 function modeDrawArea(context, wayId, startGraph) {
30422     var mode = {
30423         button: 'area',
30424         id: 'draw-area'
30425     };
30426
30427     var behavior;
30428
30429
30430     mode.enter = function() {
30431         var way = context.entity(wayId);
30432
30433         behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
30434             .tail(t('modes.draw_area.tail'));
30435
30436         var addNode = behavior.addNode;
30437
30438         behavior.addNode = function(node) {
30439             var length = way.nodes.length,
30440                 penultimate = length > 2 ? way.nodes[length - 2] : null;
30441
30442             if (node.id === way.first() || node.id === penultimate) {
30443                 behavior.finish();
30444             } else {
30445                 addNode(node);
30446             }
30447         };
30448
30449         context.install(behavior);
30450     };
30451
30452
30453     mode.exit = function() {
30454         context.uninstall(behavior);
30455     };
30456
30457
30458     mode.selectedIDs = function() {
30459         return [wayId];
30460     };
30461
30462
30463     return mode;
30464 }
30465
30466 function modeDrawLine(context, wayId, startGraph, affix) {
30467     var mode = {
30468         button: 'line',
30469         id: 'draw-line'
30470     };
30471
30472     var behavior;
30473
30474
30475     mode.enter = function() {
30476         var way = context.entity(wayId),
30477             index = (affix === 'prefix') ? 0 : undefined,
30478             headId = (affix === 'prefix') ? way.first() : way.last();
30479
30480         behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
30481             .tail(t('modes.draw_line.tail'));
30482
30483         var addNode = behavior.addNode;
30484
30485         behavior.addNode = function(node) {
30486             if (node.id === headId) {
30487                 behavior.finish();
30488             } else {
30489                 addNode(node);
30490             }
30491         };
30492
30493         context.install(behavior);
30494     };
30495
30496
30497     mode.exit = function() {
30498         context.uninstall(behavior);
30499     };
30500
30501
30502     mode.selectedIDs = function() {
30503         return [wayId];
30504     };
30505
30506
30507     return mode;
30508 }
30509
30510 function operationCircularize(selectedIDs, context) {
30511     var entityId = selectedIDs[0],
30512         entity = context.entity(entityId),
30513         extent = entity.extent(context.graph()),
30514         geometry = context.geometry(entityId),
30515         action = actionCircularize(entityId, context.projection);
30516
30517
30518     var operation = function() {
30519         context.perform(action, operation.annotation());
30520     };
30521
30522
30523     operation.available = function() {
30524         return selectedIDs.length === 1 &&
30525             entity.type === 'way' &&
30526             uniq(entity.nodes).length > 1;
30527     };
30528
30529
30530     operation.disabled = function() {
30531         var reason;
30532         if (extent.percentContainedIn(context.extent()) < 0.8) {
30533             reason = 'too_large';
30534         } else if (context.hasHiddenConnections(entityId)) {
30535             reason = 'connected_to_hidden';
30536         }
30537         return action.disabled(context.graph()) || reason;
30538     };
30539
30540
30541     operation.tooltip = function() {
30542         var disable = operation.disabled();
30543         return disable ?
30544             t('operations.circularize.' + disable) :
30545             t('operations.circularize.description.' + geometry);
30546     };
30547
30548
30549     operation.annotation = function() {
30550         return t('operations.circularize.annotation.' + geometry);
30551     };
30552
30553
30554     operation.id = 'circularize';
30555     operation.keys = [t('operations.circularize.key')];
30556     operation.title = t('operations.circularize.title');
30557     operation.behavior = behaviorOperation(context).which(operation);
30558
30559     return operation;
30560 }
30561
30562 function operationContinue(selectedIDs, context) {
30563     var graph = context.graph(),
30564         entities = selectedIDs.map(function(id) { return graph.entity(id); }),
30565         geometries = assignIn$1({ line: [], vertex: [] },
30566             groupBy(entities, function(entity) { return entity.geometry(graph); })),
30567         vertex = geometries.vertex[0];
30568
30569
30570     function candidateWays() {
30571         return graph.parentWays(vertex).filter(function(parent) {
30572             return parent.geometry(graph) === 'line' &&
30573                 !parent.isClosed() &&
30574                 parent.affix(vertex.id) &&
30575                 (geometries.line.length === 0 || geometries.line[0] === parent);
30576         });
30577     }
30578
30579
30580     var operation = function() {
30581         var candidate = candidateWays()[0];
30582         context.enter(
30583             modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
30584         );
30585     };
30586
30587
30588     operation.available = function() {
30589         return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
30590             !context.features().hasHiddenConnections(vertex, context.graph());
30591     };
30592
30593
30594     operation.disabled = function() {
30595         var candidates = candidateWays();
30596         if (candidates.length === 0)
30597             return 'not_eligible';
30598         if (candidates.length > 1)
30599             return 'multiple';
30600     };
30601
30602
30603     operation.tooltip = function() {
30604         var disable = operation.disabled();
30605         return disable ?
30606             t('operations.continue.' + disable) :
30607             t('operations.continue.description');
30608     };
30609
30610
30611     operation.annotation = function() {
30612         return t('operations.continue.annotation.line');
30613     };
30614
30615
30616     operation.id = 'continue';
30617     operation.keys = [t('operations.continue.key')];
30618     operation.title = t('operations.continue.title');
30619     operation.behavior = behaviorOperation(context).which(operation);
30620
30621     return operation;
30622 }
30623
30624 function operationDelete(selectedIDs, context) {
30625     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
30626         action = actionDeleteMultiple(selectedIDs),
30627         extent = selectedIDs.reduce(function(extent, id) {
30628                 return extent.extend(context.entity(id).extent(context.graph()));
30629             }, geoExtent$$1());
30630
30631
30632     var operation = function() {
30633         var nextSelectedID;
30634
30635         if (selectedIDs.length === 1) {
30636             var id = selectedIDs[0],
30637                 entity = context.entity(id),
30638                 geometry = context.geometry(id),
30639                 parents = context.graph().parentWays(entity),
30640                 parent = parents[0];
30641
30642             // Select the next closest node in the way.
30643             if (geometry === 'vertex' && parent.nodes.length > 2) {
30644                 var nodes = parent.nodes,
30645                     i = nodes.indexOf(id);
30646
30647                 if (i === 0) {
30648                     i++;
30649                 } else if (i === nodes.length - 1) {
30650                     i--;
30651                 } else {
30652                     var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
30653                         b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
30654                     i = a < b ? i - 1 : i + 1;
30655                 }
30656
30657                 nextSelectedID = nodes[i];
30658             }
30659         }
30660
30661         context.perform(action, operation.annotation());
30662
30663         if (nextSelectedID && context.hasEntity(nextSelectedID)) {
30664             context.enter(modeSelect(context, [nextSelectedID]).follow(true));
30665         } else {
30666             context.enter(modeBrowse(context));
30667         }
30668
30669     };
30670
30671
30672     operation.available = function() {
30673         return true;
30674     };
30675
30676
30677     operation.disabled = function() {
30678         var reason;
30679         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
30680             reason = 'too_large';
30681         } else if (some(selectedIDs, context.hasHiddenConnections)) {
30682             reason = 'connected_to_hidden';
30683         } else if (some(selectedIDs, protectedMember)) {
30684             reason = 'part_of_relation';
30685         } else if (some(selectedIDs, incompleteRelation)) {
30686             reason = 'incomplete_relation';
30687         }
30688         return reason;
30689
30690         function incompleteRelation(id) {
30691             var entity = context.entity(id);
30692             return entity.type === 'relation' && !entity.isComplete(context.graph());
30693         }
30694
30695         function protectedMember(id) {
30696             var entity = context.entity(id);
30697             if (entity.type !== 'way') return false;
30698
30699             var parents = context.graph().parentRelations(entity);
30700             for (var i = 0; i < parents.length; i++) {
30701                 var parent = parents[i],
30702                     type = parent.tags.type,
30703                     role = parent.memberById(id).role || 'outer';
30704                 if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
30705                     return true;
30706                 }
30707             }
30708             return false;
30709         }
30710
30711     };
30712
30713
30714     operation.tooltip = function() {
30715         var disable = operation.disabled();
30716         return disable ?
30717             t('operations.delete.' + disable + '.' + multi) :
30718             t('operations.delete.description' + '.' + multi);
30719     };
30720
30721
30722     operation.annotation = function() {
30723         return selectedIDs.length === 1 ?
30724             t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
30725             t('operations.delete.annotation.multiple', { n: selectedIDs.length });
30726     };
30727
30728
30729     operation.id = 'delete';
30730     operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
30731     operation.title = t('operations.delete.title');
30732     operation.behavior = behaviorOperation(context).which(operation);
30733
30734     return operation;
30735 }
30736
30737 function operationDisconnect(selectedIDs, context) {
30738     var vertices = filter(selectedIDs, function(entityId) {
30739         return context.geometry(entityId) === 'vertex';
30740     });
30741
30742     var entityId = vertices[0],
30743         action = actionDisconnect(entityId);
30744
30745     if (selectedIDs.length > 1) {
30746         action.limitWays(without(selectedIDs, entityId));
30747     }
30748
30749
30750     var operation = function() {
30751         context.perform(action, operation.annotation());
30752     };
30753
30754
30755     operation.available = function() {
30756         return vertices.length === 1;
30757     };
30758
30759
30760     operation.disabled = function() {
30761         var reason;
30762         if (some(selectedIDs, context.hasHiddenConnections)) {
30763             reason = 'connected_to_hidden';
30764         }
30765         return action.disabled(context.graph()) || reason;
30766     };
30767
30768
30769     operation.tooltip = function() {
30770         var disable = operation.disabled();
30771         return disable ?
30772             t('operations.disconnect.' + disable) :
30773             t('operations.disconnect.description');
30774     };
30775
30776
30777     operation.annotation = function() {
30778         return t('operations.disconnect.annotation');
30779     };
30780
30781
30782     operation.id = 'disconnect';
30783     operation.keys = [t('operations.disconnect.key')];
30784     operation.title = t('operations.disconnect.title');
30785     operation.behavior = behaviorOperation(context).which(operation);
30786
30787     return operation;
30788 }
30789
30790 function operationMerge(selectedIDs, context) {
30791
30792     function updatePresetTags(newGraph, ids) {
30793         var id = ids[0],
30794             newEntity = newGraph.hasEntity(id);
30795
30796         if (!newEntity) return;
30797
30798         var newPreset = context.presets().match(newEntity, newGraph);
30799
30800         context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
30801     }
30802
30803
30804     var join = actionJoin(selectedIDs),
30805         merge = actionMerge(selectedIDs),
30806         mergePolygon = actionMergePolygon(selectedIDs);
30807
30808
30809     var operation = function() {
30810         var origGraph = context.graph(),
30811             action;
30812
30813         if (!join.disabled(origGraph)) {
30814             action = join;
30815         } else if (!merge.disabled(origGraph)) {
30816             action = merge;
30817         } else {
30818             action = mergePolygon;
30819         }
30820
30821         context.perform(action, operation.annotation());
30822
30823         var ids = selectedIDs.filter(function(id) {
30824             var entity = context.hasEntity(id);
30825             return entity && entity.type !== 'node';
30826         });
30827
30828         // if we merged tags, rematch preset to update tags if necessary (#3851)
30829         if (action === merge) {
30830             updatePresetTags(context.graph(), ids);
30831         }
30832
30833         context.enter(modeSelect(context, ids));
30834     };
30835
30836
30837     operation.available = function() {
30838         return selectedIDs.length >= 2;
30839     };
30840
30841
30842     operation.disabled = function() {
30843         return join.disabled(context.graph()) &&
30844             merge.disabled(context.graph()) &&
30845             mergePolygon.disabled(context.graph());
30846     };
30847
30848
30849     operation.tooltip = function() {
30850         var j = join.disabled(context.graph()),
30851             m = merge.disabled(context.graph()),
30852             p = mergePolygon.disabled(context.graph());
30853
30854         if (j === 'restriction' && m && p) {
30855             return t('operations.merge.restriction',
30856                 { relation: context.presets().item('type/restriction').name() });
30857         }
30858
30859         if (p === 'incomplete_relation' && j && m) {
30860             return t('operations.merge.incomplete_relation');
30861         }
30862
30863         if (j && m && p) {
30864             return t('operations.merge.' + j);
30865         }
30866
30867         return t('operations.merge.description');
30868     };
30869
30870
30871     operation.annotation = function() {
30872         return t('operations.merge.annotation', { n: selectedIDs.length });
30873     };
30874
30875
30876     operation.id = 'merge';
30877     operation.keys = [t('operations.merge.key')];
30878     operation.title = t('operations.merge.title');
30879     operation.behavior = behaviorOperation(context).which(operation);
30880
30881     return operation;
30882 }
30883
30884 function operationMove(selectedIDs, context) {
30885     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
30886         extent = selectedIDs.reduce(function(extent, id) {
30887             return extent.extend(context.entity(id).extent(context.graph()));
30888         }, geoExtent$$1());
30889
30890
30891     var operation = function() {
30892         context.enter(modeMove$$1(context, selectedIDs));
30893     };
30894
30895
30896     operation.available = function() {
30897         return selectedIDs.length > 1 ||
30898             context.entity(selectedIDs[0]).type !== 'node';
30899     };
30900
30901
30902     operation.disabled = function() {
30903         var reason;
30904         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
30905             reason = 'too_large';
30906         } else if (some(selectedIDs, context.hasHiddenConnections)) {
30907             reason = 'connected_to_hidden';
30908         } else if (some(selectedIDs, incompleteRelation)) {
30909             reason = 'incomplete_relation';
30910         }
30911         return reason;
30912
30913         function incompleteRelation(id) {
30914             var entity = context.entity(id);
30915             return entity.type === 'relation' && !entity.isComplete(context.graph());
30916         }
30917     };
30918
30919
30920     operation.tooltip = function() {
30921         var disable = operation.disabled();
30922         return disable ?
30923             t('operations.move.' + disable + '.' + multi) :
30924             t('operations.move.description.' + multi);
30925     };
30926
30927
30928     operation.annotation = function() {
30929         return selectedIDs.length === 1 ?
30930             t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
30931             t('operations.move.annotation.multiple');
30932     };
30933
30934
30935     operation.id = 'move';
30936     operation.keys = [t('operations.move.key')];
30937     operation.title = t('operations.move.title');
30938     operation.behavior = behaviorOperation(context).which(operation);
30939
30940     return operation;
30941 }
30942
30943 function operationOrthogonalize(selectedIDs, context) {
30944     var entityId = selectedIDs[0],
30945         entity = context.entity(entityId),
30946         extent = entity.extent(context.graph()),
30947         geometry = context.geometry(entityId),
30948         action = actionOrthogonalize(entityId, context.projection);
30949
30950
30951     var operation = function() {
30952         context.perform(action, operation.annotation());
30953     };
30954
30955
30956     operation.available = function() {
30957         return selectedIDs.length === 1 &&
30958             entity.type === 'way' &&
30959             entity.isClosed() &&
30960             uniq(entity.nodes).length > 2;
30961     };
30962
30963
30964     operation.disabled = function() {
30965         var reason;
30966         if (extent.percentContainedIn(context.extent()) < 0.8) {
30967             reason = 'too_large';
30968         } else if (context.hasHiddenConnections(entityId)) {
30969             reason = 'connected_to_hidden';
30970         }
30971         return action.disabled(context.graph()) || reason;
30972     };
30973
30974
30975     operation.tooltip = function() {
30976         var disable = operation.disabled();
30977         return disable ?
30978             t('operations.orthogonalize.' + disable) :
30979             t('operations.orthogonalize.description.' + geometry);
30980     };
30981
30982
30983     operation.annotation = function() {
30984         return t('operations.orthogonalize.annotation.' + geometry);
30985     };
30986
30987
30988     operation.id = 'orthogonalize';
30989     operation.keys = [t('operations.orthogonalize.key')];
30990     operation.title = t('operations.orthogonalize.title');
30991     operation.behavior = behaviorOperation(context).which(operation);
30992
30993     return operation;
30994 }
30995
30996 /**
30997  * This method is like `_.uniq` except that it accepts `iteratee` which is
30998  * invoked for each element in `array` to generate the criterion by which
30999  * uniqueness is computed. The order of result values is determined by the
31000  * order they occur in the array. The iteratee is invoked with one argument:
31001  * (value).
31002  *
31003  * @static
31004  * @memberOf _
31005  * @since 4.0.0
31006  * @category Array
31007  * @param {Array} array The array to inspect.
31008  * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
31009  * @returns {Array} Returns the new duplicate free array.
31010  * @example
31011  *
31012  * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
31013  * // => [2.1, 1.2]
31014  *
31015  * // The `_.property` iteratee shorthand.
31016  * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
31017  * // => [{ 'x': 1 }, { 'x': 2 }]
31018  */
31019 function uniqBy(array, iteratee) {
31020   return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
31021 }
31022
31023 function operationReflectShort(selectedIDs, context) {
31024     return operationReflect(selectedIDs, context, 'short');
31025 }
31026
31027
31028 function operationReflectLong(selectedIDs, context) {
31029     return operationReflect(selectedIDs, context, 'long');
31030 }
31031
31032
31033 function operationReflect(selectedIDs, context, axis) {
31034     axis = axis || 'long';
31035     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31036         extent = selectedIDs.reduce(function(extent, id) {
31037             return extent.extend(context.entity(id).extent(context.graph()));
31038         }, geoExtent$$1());
31039
31040
31041     var operation = function() {
31042         var action = actionReflect(selectedIDs, context.projection)
31043             .useLongAxis(Boolean(axis === 'long'));
31044         context.perform(action, operation.annotation());
31045     };
31046
31047
31048     operation.available = function() {
31049         var nodes = utilGetAllNodes(selectedIDs, context.graph());
31050         return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
31051     };
31052
31053
31054     operation.disabled = function() {
31055         var reason;
31056         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31057             reason = 'too_large';
31058         } else if (some(selectedIDs, context.hasHiddenConnections)) {
31059             reason = 'connected_to_hidden';
31060         } else if (some(selectedIDs, incompleteRelation)) {
31061             reason = 'incomplete_relation';
31062         }
31063         return reason;
31064
31065         function incompleteRelation(id) {
31066             var entity = context.entity(id);
31067             return entity.type === 'relation' && !entity.isComplete(context.graph());
31068         }
31069     };
31070
31071
31072     operation.tooltip = function() {
31073         var disable = operation.disabled();
31074         return disable ?
31075             t('operations.reflect.' + disable + '.' + multi) :
31076             t('operations.reflect.description.' + axis + '.' + multi);
31077     };
31078
31079
31080     operation.annotation = function() {
31081         return t('operations.reflect.annotation.' + axis + '.' + multi);
31082     };
31083
31084
31085     operation.id = 'reflect-' + axis;
31086     operation.keys = [t('operations.reflect.key.' + axis)];
31087     operation.title = t('operations.reflect.title.' + axis);
31088     operation.behavior = behaviorOperation(context).which(operation);
31089
31090     return operation;
31091 }
31092
31093 function operationReverse(selectedIDs, context) {
31094     var entityId = selectedIDs[0];
31095
31096     var operation = function() {
31097         context.perform(actionReverse(entityId), operation.annotation());
31098     };
31099
31100
31101     operation.available = function() {
31102         return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
31103     };
31104
31105
31106     operation.disabled = function() {
31107         return false;
31108     };
31109
31110
31111     operation.tooltip = function() {
31112         return t('operations.reverse.description');
31113     };
31114
31115
31116     operation.annotation = function() {
31117         return t('operations.reverse.annotation');
31118     };
31119
31120
31121     operation.id = 'reverse';
31122     operation.keys = [t('operations.reverse.key')];
31123     operation.title = t('operations.reverse.title');
31124     operation.behavior = behaviorOperation(context).which(operation);
31125
31126     return operation;
31127 }
31128
31129 function operationRotate(selectedIDs, context) {
31130     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31131         extent = selectedIDs.reduce(function(extent, id) {
31132             return extent.extend(context.entity(id).extent(context.graph()));
31133         }, geoExtent$$1());
31134
31135
31136     var operation = function() {
31137         context.enter(modeRotate$$1(context, selectedIDs));
31138     };
31139
31140
31141     operation.available = function() {
31142         var nodes = utilGetAllNodes(selectedIDs, context.graph());
31143         return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
31144     };
31145
31146
31147     operation.disabled = function() {
31148         var reason;
31149         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31150             reason = 'too_large';
31151         } else if (some(selectedIDs, context.hasHiddenConnections)) {
31152             reason = 'connected_to_hidden';
31153         } else if (some(selectedIDs, incompleteRelation)) {
31154             reason = 'incomplete_relation';
31155         }
31156         return reason;
31157
31158         function incompleteRelation(id) {
31159             var entity = context.entity(id);
31160             return entity.type === 'relation' && !entity.isComplete(context.graph());
31161         }
31162     };
31163
31164
31165     operation.tooltip = function() {
31166         var disable = operation.disabled();
31167         return disable ?
31168             t('operations.rotate.' + disable + '.' + multi) :
31169             t('operations.rotate.description.' + multi);
31170     };
31171
31172
31173     operation.annotation = function() {
31174         return selectedIDs.length === 1 ?
31175             t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
31176             t('operations.rotate.annotation.multiple');
31177     };
31178
31179
31180     operation.id = 'rotate';
31181     operation.keys = [t('operations.rotate.key')];
31182     operation.title = t('operations.rotate.title');
31183     operation.behavior = behaviorOperation(context).which(operation);
31184
31185     return operation;
31186 }
31187
31188 function operationSplit(selectedIDs, context) {
31189     var vertices = filter(selectedIDs, function(entityId) {
31190         return context.geometry(entityId) === 'vertex';
31191     });
31192
31193     var entityId = vertices[0],
31194         action = actionSplit(entityId),
31195         ways = [];
31196
31197     if (vertices.length === 1) {
31198         if (selectedIDs.length > 1) {
31199             action.limitWays(without(selectedIDs, entityId));
31200         }
31201         ways = action.ways(context.graph());
31202     }
31203
31204
31205     var operation = function() {
31206         var difference = context.perform(action, operation.annotation());
31207         context.enter(modeSelect(context, difference.extantIDs()));
31208     };
31209
31210
31211     operation.available = function() {
31212         return vertices.length === 1;
31213     };
31214
31215
31216     operation.disabled = function() {
31217         var reason;
31218         if (some(selectedIDs, context.hasHiddenConnections)) {
31219             reason = 'connected_to_hidden';
31220         }
31221         return action.disabled(context.graph()) || reason;
31222     };
31223
31224
31225     operation.tooltip = function() {
31226         var disable = operation.disabled();
31227         if (disable) {
31228             return t('operations.split.' + disable);
31229         }
31230         if (ways.length === 1) {
31231             return t('operations.split.description.' + context.geometry(ways[0].id));
31232         } else {
31233             return t('operations.split.description.multiple');
31234         }
31235     };
31236
31237
31238     operation.annotation = function() {
31239         return ways.length === 1 ?
31240             t('operations.split.annotation.' + context.geometry(ways[0].id)) :
31241             t('operations.split.annotation.multiple', { n: ways.length });
31242     };
31243
31244
31245     operation.id = 'split';
31246     operation.keys = [t('operations.split.key')];
31247     operation.title = t('operations.split.title');
31248     operation.behavior = behaviorOperation(context).which(operation);
31249
31250     return operation;
31251 }
31252
31253 function operationStraighten(selectedIDs, context) {
31254     var entityId = selectedIDs[0],
31255         action = actionStraighten(entityId, context.projection);
31256
31257
31258     function operation() {
31259         context.perform(action, operation.annotation());
31260     }
31261
31262
31263     operation.available = function() {
31264         var entity = context.entity(entityId);
31265         return selectedIDs.length === 1 &&
31266             entity.type === 'way' &&
31267             !entity.isClosed() &&
31268             uniq(entity.nodes).length > 2;
31269     };
31270
31271
31272     operation.disabled = function() {
31273         var reason;
31274         if (context.hasHiddenConnections(entityId)) {
31275             reason = 'connected_to_hidden';
31276         }
31277         return action.disabled(context.graph()) || reason;
31278     };
31279
31280
31281     operation.tooltip = function() {
31282         var disable = operation.disabled();
31283         return disable ?
31284             t('operations.straighten.' + disable) :
31285             t('operations.straighten.description');
31286     };
31287
31288
31289     operation.annotation = function() {
31290         return t('operations.straighten.annotation');
31291     };
31292
31293
31294     operation.id = 'straighten';
31295     operation.keys = [t('operations.straighten.key')];
31296     operation.title = t('operations.straighten.title');
31297     operation.behavior = behaviorOperation(context).which(operation);
31298
31299     return operation;
31300 }
31301
31302
31303
31304 var Operations = Object.freeze({
31305         operationCircularize: operationCircularize,
31306         operationContinue: operationContinue,
31307         operationDelete: operationDelete,
31308         operationDisconnect: operationDisconnect,
31309         operationMerge: operationMerge,
31310         operationMove: operationMove,
31311         operationOrthogonalize: operationOrthogonalize,
31312         operationReflectShort: operationReflectShort,
31313         operationReflectLong: operationReflectLong,
31314         operationReverse: operationReverse,
31315         operationRotate: operationRotate,
31316         operationSplit: operationSplit,
31317         operationStraighten: operationStraighten
31318 });
31319
31320 function modeMove$$1(context, entityIDs, baseGraph) {
31321     var mode = {
31322         id: 'move',
31323         button: 'browse'
31324     };
31325
31326     var keybinding = d3keybinding('move'),
31327         behaviors = [
31328             behaviorEdit(context),
31329             operationCircularize(entityIDs, context).behavior,
31330             operationDelete(entityIDs, context).behavior,
31331             operationOrthogonalize(entityIDs, context).behavior,
31332             operationReflectLong(entityIDs, context).behavior,
31333             operationReflectShort(entityIDs, context).behavior,
31334             operationRotate(entityIDs, context).behavior
31335         ],
31336         annotation = entityIDs.length === 1 ?
31337             t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
31338             t('operations.move.annotation.multiple'),
31339         prevGraph,
31340         cache,
31341         origin,
31342         nudgeInterval;
31343
31344
31345     function vecSub(a, b) {
31346         return [a[0] - b[0], a[1] - b[1]];
31347     }
31348
31349
31350     function edge(point, size) {
31351         var pad = [80, 20, 50, 20],   // top, right, bottom, left
31352             x = 0,
31353             y = 0;
31354
31355         if (point[0] > size[0] - pad[1])
31356             x = -10;
31357         if (point[0] < pad[3])
31358             x = 10;
31359         if (point[1] > size[1] - pad[2])
31360             y = -10;
31361         if (point[1] < pad[0])
31362             y = 10;
31363
31364         if (x || y) {
31365             return [x, y];
31366         } else {
31367             return null;
31368         }
31369     }
31370
31371
31372     function doMove(nudge) {
31373         nudge = nudge || [0, 0];
31374
31375         var fn;
31376         if (prevGraph !== context.graph()) {
31377             cache = {};
31378             origin = context.map().mouseCoordinates();
31379             fn = context.perform;
31380         } else {
31381             fn = context.overwrite;
31382         }
31383
31384         var currMouse = context.mouse(),
31385             origMouse = context.projection(origin),
31386             delta = vecSub(vecSub(currMouse, origMouse), nudge);
31387
31388         fn(actionMove(entityIDs, delta, context.projection, cache), annotation);
31389         prevGraph = context.graph();
31390     }
31391
31392
31393     function startNudge(nudge) {
31394         if (nudgeInterval) window.clearInterval(nudgeInterval);
31395         nudgeInterval = window.setInterval(function() {
31396             context.pan(nudge);
31397             doMove(nudge);
31398         }, 50);
31399     }
31400
31401
31402     function stopNudge() {
31403         if (nudgeInterval) {
31404             window.clearInterval(nudgeInterval);
31405             nudgeInterval = null;
31406         }
31407     }
31408
31409
31410     function move() {
31411         doMove();
31412         var nudge = edge(context.mouse(), context.map().dimensions());
31413         if (nudge) {
31414             startNudge(nudge);
31415         } else {
31416             stopNudge();
31417         }
31418     }
31419
31420
31421     function finish() {
31422         event.stopPropagation();
31423         context.enter(modeSelect(context, entityIDs));
31424         stopNudge();
31425     }
31426
31427
31428     function cancel() {
31429         if (baseGraph) {
31430             while (context.graph() !== baseGraph) context.pop();
31431             context.enter(modeBrowse(context));
31432         } else {
31433             context.pop();
31434             context.enter(modeSelect(context, entityIDs));
31435         }
31436         stopNudge();
31437     }
31438
31439
31440     function undone() {
31441         context.enter(modeBrowse(context));
31442     }
31443
31444
31445     mode.enter = function() {
31446         origin = context.map().mouseCoordinates();
31447         prevGraph = null;
31448         cache = {};
31449
31450         behaviors.forEach(function(behavior) {
31451             context.install(behavior);
31452         });
31453
31454         context.surface()
31455             .on('mousemove.move', move)
31456             .on('click.move', finish);
31457
31458         context.history()
31459             .on('undone.move', undone);
31460
31461         keybinding
31462             .on('⎋', cancel)
31463             .on('↩', finish);
31464
31465         d3_select(document)
31466             .call(keybinding);
31467     };
31468
31469
31470     mode.exit = function() {
31471         stopNudge();
31472
31473         behaviors.forEach(function(behavior) {
31474             context.uninstall(behavior);
31475         });
31476
31477         context.surface()
31478             .on('mousemove.move', null)
31479             .on('click.move', null);
31480
31481         context.history()
31482             .on('undone.move', null);
31483
31484         keybinding.off();
31485     };
31486
31487
31488     return mode;
31489 }
31490
31491 function modeRotate$$1(context, entityIDs) {
31492     var mode = {
31493         id: 'rotate',
31494         button: 'browse'
31495     };
31496
31497     var keybinding = d3keybinding('rotate'),
31498         behaviors = [
31499             behaviorEdit(context),
31500             operationCircularize(entityIDs, context).behavior,
31501             operationDelete(entityIDs, context).behavior,
31502             operationMove(entityIDs, context).behavior,
31503             operationOrthogonalize(entityIDs, context).behavior,
31504             operationReflectLong(entityIDs, context).behavior,
31505             operationReflectShort(entityIDs, context).behavior
31506         ],
31507         annotation = entityIDs.length === 1 ?
31508             t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
31509             t('operations.rotate.annotation.multiple'),
31510         prevGraph,
31511         prevAngle,
31512         prevTransform,
31513         pivot;
31514
31515
31516     function doRotate() {
31517         var fn;
31518         if (context.graph() !== prevGraph) {
31519             fn = context.perform;
31520         } else {
31521             fn = context.replace;
31522         }
31523
31524         // projection changed, recalculate pivot
31525         var projection = context.projection;
31526         var currTransform = projection.transform();
31527         if (!prevTransform ||
31528             currTransform.k !== prevTransform.k ||
31529             currTransform.x !== prevTransform.x ||
31530             currTransform.y !== prevTransform.y) {
31531
31532             var nodes = utilGetAllNodes(entityIDs, context.graph()),
31533                 points = nodes.map(function(n) { return projection(n.loc); });
31534
31535             if (points.length === 1) {  // degenerate case
31536                 pivot = points[0];
31537             } else if (points.length === 2) {
31538                 pivot = geoInterp(points[0], points[1], 0.5);
31539             } else {
31540                 pivot = d3_polygonCentroid(d3_polygonHull(points));
31541             }
31542             prevAngle = undefined;
31543         }
31544
31545
31546         var currMouse = context.mouse(),
31547             currAngle = Math.atan2(currMouse[1] - pivot[1], currMouse[0] - pivot[0]);
31548
31549         if (typeof prevAngle === 'undefined') prevAngle = currAngle;
31550         var delta = currAngle - prevAngle;
31551
31552         fn(actionRotate(entityIDs, pivot, delta, projection), annotation);
31553
31554         prevTransform = currTransform;
31555         prevAngle = currAngle;
31556         prevGraph = context.graph();
31557     }
31558
31559
31560     function finish() {
31561         event.stopPropagation();
31562         context.enter(modeSelect(context, entityIDs));
31563     }
31564
31565
31566     function cancel() {
31567         context.pop();
31568         context.enter(modeSelect(context, entityIDs));
31569     }
31570
31571
31572     function undone() {
31573         context.enter(modeBrowse(context));
31574     }
31575
31576
31577     mode.enter = function() {
31578         behaviors.forEach(function(behavior) {
31579             context.install(behavior);
31580         });
31581
31582         context.surface()
31583             .on('mousemove.rotate', doRotate)
31584             .on('click.rotate', finish);
31585
31586         context.history()
31587             .on('undone.rotate', undone);
31588
31589         keybinding
31590             .on('⎋', cancel)
31591             .on('↩', finish);
31592
31593         d3_select(document)
31594             .call(keybinding);
31595     };
31596
31597
31598     mode.exit = function() {
31599         behaviors.forEach(function(behavior) {
31600             context.uninstall(behavior);
31601         });
31602
31603         context.surface()
31604             .on('mousemove.rotate', null)
31605             .on('click.rotate', null);
31606
31607         context.history()
31608             .on('undone.rotate', null);
31609
31610         keybinding.off();
31611     };
31612
31613
31614     return mode;
31615 }
31616
31617 /**
31618  * The base implementation of `_.reduce` and `_.reduceRight`, without support
31619  * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
31620  *
31621  * @private
31622  * @param {Array|Object} collection The collection to iterate over.
31623  * @param {Function} iteratee The function invoked per iteration.
31624  * @param {*} accumulator The initial value.
31625  * @param {boolean} initAccum Specify using the first or last element of
31626  *  `collection` as the initial value.
31627  * @param {Function} eachFunc The function to iterate over `collection`.
31628  * @returns {*} Returns the accumulated value.
31629  */
31630 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
31631   eachFunc(collection, function(value, index, collection) {
31632     accumulator = initAccum
31633       ? (initAccum = false, value)
31634       : iteratee(accumulator, value, index, collection);
31635   });
31636   return accumulator;
31637 }
31638
31639 /**
31640  * Reduces `collection` to a value which is the accumulated result of running
31641  * each element in `collection` thru `iteratee`, where each successive
31642  * invocation is supplied the return value of the previous. If `accumulator`
31643  * is not given, the first element of `collection` is used as the initial
31644  * value. The iteratee is invoked with four arguments:
31645  * (accumulator, value, index|key, collection).
31646  *
31647  * Many lodash methods are guarded to work as iteratees for methods like
31648  * `_.reduce`, `_.reduceRight`, and `_.transform`.
31649  *
31650  * The guarded methods are:
31651  * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
31652  * and `sortBy`
31653  *
31654  * @static
31655  * @memberOf _
31656  * @since 0.1.0
31657  * @category Collection
31658  * @param {Array|Object} collection The collection to iterate over.
31659  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
31660  * @param {*} [accumulator] The initial value.
31661  * @returns {*} Returns the accumulated value.
31662  * @see _.reduceRight
31663  * @example
31664  *
31665  * _.reduce([1, 2], function(sum, n) {
31666  *   return sum + n;
31667  * }, 0);
31668  * // => 3
31669  *
31670  * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
31671  *   (result[value] || (result[value] = [])).push(key);
31672  *   return result;
31673  * }, {});
31674  * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
31675  */
31676 function reduce(collection, iteratee, accumulator) {
31677   var func = isArray(collection) ? arrayReduce : baseReduce,
31678       initAccum = arguments.length < 3;
31679
31680   return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
31681 }
31682
31683 function modeSave$$1(context) {
31684     var mode = {
31685         id: 'save'
31686     };
31687
31688     var keybinding = d3keybinding('select');
31689
31690     var commit = uiCommit(context)
31691         .on('cancel', cancel)
31692         .on('save', save);
31693
31694
31695     function cancel() {
31696         context.enter(modeBrowse(context));
31697     }
31698
31699
31700     function save(changeset, tryAgain) {
31701
31702         var osm = context.connection(),
31703             loading = uiLoading(context).message(t('save.uploading')).blocking(true),
31704             history = context.history(),
31705             origChanges = history.changes(actionDiscardTags(history.difference())),
31706             localGraph = context.graph(),
31707             remoteGraph = coreGraph$$1(history.base(), true),
31708             modified = filter(history.difference().summary(), {changeType: 'modified'}),
31709             toCheck = map$4(map$4(modified, 'entity'), 'id'),
31710             toLoad = withChildNodes(toCheck, localGraph),
31711             conflicts = [],
31712             errors = [];
31713
31714         if (!osm) return;
31715
31716         if (!tryAgain) {
31717             history.perform(actionNoop());  // checkpoint
31718         }
31719
31720         context.container().call(loading);
31721
31722         if (toCheck.length) {
31723             osm.loadMultiple(toLoad, loaded);
31724         } else {
31725             upload();
31726         }
31727
31728
31729         function withChildNodes(ids, graph) {
31730             return uniq(reduce(ids, function(result, id) {
31731                 var entity = graph.entity(id);
31732                 if (entity.type === 'way') {
31733                     try {
31734                         var cn = graph.childNodes(entity);
31735                         result.push.apply(result, map$4(filter(cn, 'version'), 'id'));
31736                     } catch (err) {
31737                         /* eslint-disable no-console */
31738                         if (typeof console !== 'undefined') console.error(err);
31739                         /* eslint-enable no-console */
31740                     }
31741                 }
31742                 return result;
31743             }, clone(ids)));
31744         }
31745
31746
31747         // Reload modified entities into an alternate graph and check for conflicts..
31748         function loaded(err, result) {
31749             if (errors.length) return;
31750
31751             if (err) {
31752                 errors.push({
31753                     msg: err.responseText,
31754                     details: [ t('save.status_code', { code: err.status }) ]
31755                 });
31756                 showErrors();
31757
31758             } else {
31759                 var loadMore = [];
31760                 forEach(result.data, function(entity) {
31761                     remoteGraph.replace(entity);
31762                     toLoad = without(toLoad, entity.id);
31763
31764                     // Because loadMultiple doesn't download /full like loadEntity,
31765                     // need to also load children that aren't already being checked..
31766                     if (!entity.visible) return;
31767                     if (entity.type === 'way') {
31768                         loadMore.push.apply(loadMore,
31769                             difference(entity.nodes, toCheck, toLoad, loadMore));
31770                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
31771                         loadMore.push.apply(loadMore,
31772                             difference(map$4(entity.members, 'id'), toCheck, toLoad, loadMore));
31773                     }
31774                 });
31775
31776                 if (loadMore.length) {
31777                     toLoad.push.apply(toLoad, loadMore);
31778                     osm.loadMultiple(loadMore, loaded);
31779                 }
31780
31781                 if (!toLoad.length) {
31782                     checkConflicts();
31783                 }
31784             }
31785         }
31786
31787
31788         function checkConflicts() {
31789             function choice(id, text, action) {
31790                 return { id: id, text: text, action: function() { history.replace(action); } };
31791             }
31792             function formatUser(d) {
31793                 return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
31794             }
31795             function entityName(entity) {
31796                 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
31797             }
31798
31799             function compareVersions(local, remote) {
31800                 if (local.version !== remote.version) return false;
31801
31802                 if (local.type === 'way') {
31803                     var children = union(local.nodes, remote.nodes);
31804
31805                     for (var i = 0; i < children.length; i++) {
31806                         var a = localGraph.hasEntity(children[i]),
31807                             b = remoteGraph.hasEntity(children[i]);
31808
31809                         if (a && b && a.version !== b.version) return false;
31810                     }
31811                 }
31812
31813                 return true;
31814             }
31815
31816             forEach(toCheck, function(id) {
31817                 var local = localGraph.entity(id),
31818                     remote = remoteGraph.entity(id);
31819
31820                 if (compareVersions(local, remote)) return;
31821
31822                 var action = actionMergeRemoteChanges,
31823                     merge = action(id, localGraph, remoteGraph, formatUser);
31824
31825                 history.replace(merge);
31826
31827                 var mergeConflicts = merge.conflicts();
31828                 if (!mergeConflicts.length) return;  // merged safely
31829
31830                 var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local'),
31831                     forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote'),
31832                     keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore')),
31833                     keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
31834
31835                 conflicts.push({
31836                     id: id,
31837                     name: entityName(local),
31838                     details: mergeConflicts,
31839                     chosen: 1,
31840                     choices: [
31841                         choice(id, keepMine, forceLocal),
31842                         choice(id, keepTheirs, forceRemote)
31843                     ]
31844                 });
31845             });
31846
31847             upload();
31848         }
31849
31850
31851         function upload() {
31852             if (conflicts.length) {
31853                 conflicts.sort(function(a,b) { return b.id.localeCompare(a.id); });
31854                 showConflicts();
31855             } else if (errors.length) {
31856                 showErrors();
31857             } else {
31858                 var changes = history.changes(actionDiscardTags(history.difference()));
31859                 if (changes.modified.length || changes.created.length || changes.deleted.length) {
31860                     osm.putChangeset(changeset, changes, uploadCallback);
31861                 } else {        // changes were insignificant or reverted by user
31862                     d3_select('.inspector-wrap *').remove();
31863                     loading.close();
31864                     context.flush();
31865                     cancel();
31866                 }
31867             }
31868         }
31869
31870
31871         function uploadCallback(err, changeset) {
31872             if (err) {
31873                 errors.push({
31874                     msg: err.responseText,
31875                     details: [ t('save.status_code', { code: err.status }) ]
31876                 });
31877                 showErrors();
31878             } else {
31879                 history.clearSaved();
31880                 success(changeset);
31881                 // Add delay to allow for postgres replication #1646 #2678
31882                 window.setTimeout(function() {
31883                     d3_select('.inspector-wrap *').remove();
31884                     loading.close();
31885                     context.flush();
31886                 }, 2500);
31887             }
31888         }
31889
31890
31891         function showConflicts() {
31892             var selection$$1 = context.container()
31893                 .select('#sidebar')
31894                 .append('div')
31895                 .attr('class','sidebar-component');
31896
31897             loading.close();
31898
31899             selection$$1.call(uiConflicts(context)
31900                 .list(conflicts)
31901                 .origChanges(origChanges)
31902                 .on('cancel', function() {
31903                     history.pop();
31904                     selection$$1.remove();
31905                 })
31906                 .on('save', function() {
31907                     for (var i = 0; i < conflicts.length; i++) {
31908                         if (conflicts[i].chosen === 1) {  // user chose "keep theirs"
31909                             var entity = context.hasEntity(conflicts[i].id);
31910                             if (entity && entity.type === 'way') {
31911                                 var children = uniq(entity.nodes);
31912                                 for (var j = 0; j < children.length; j++) {
31913                                     history.replace(actionRevert(children[j]));
31914                                 }
31915                             }
31916                             history.replace(actionRevert(conflicts[i].id));
31917                         }
31918                     }
31919
31920                     selection$$1.remove();
31921                     save(changeset, true);
31922                 })
31923             );
31924         }
31925
31926
31927         function showErrors() {
31928             var selection$$1 = uiConfirm(context.container());
31929
31930             history.pop();
31931             loading.close();
31932
31933             selection$$1
31934                 .select('.modal-section.header')
31935                 .append('h3')
31936                 .text(t('save.error'));
31937
31938             addErrors(selection$$1, errors);
31939             selection$$1.okButton();
31940         }
31941
31942
31943         function addErrors(selection$$1, data) {
31944             var message = selection$$1
31945                 .select('.modal-section.message-text');
31946
31947             var items = message
31948                 .selectAll('.error-container')
31949                 .data(data);
31950
31951             var enter = items.enter()
31952                 .append('div')
31953                 .attr('class', 'error-container');
31954
31955             enter
31956                 .append('a')
31957                 .attr('class', 'error-description')
31958                 .attr('href', '#')
31959                 .classed('hide-toggle', true)
31960                 .text(function(d) { return d.msg || t('save.unknown_error_details'); })
31961                 .on('click', function() {
31962                     var error = d3_select(this),
31963                         detail = d3_select(this.nextElementSibling),
31964                         exp = error.classed('expanded');
31965
31966                     detail.style('display', exp ? 'none' : 'block');
31967                     error.classed('expanded', !exp);
31968
31969                     event.preventDefault();
31970                 });
31971
31972             var details = enter
31973                 .append('div')
31974                 .attr('class', 'error-detail-container')
31975                 .style('display', 'none');
31976
31977             details
31978                 .append('ul')
31979                 .attr('class', 'error-detail-list')
31980                 .selectAll('li')
31981                 .data(function(d) { return d.details || []; })
31982                 .enter()
31983                 .append('li')
31984                 .attr('class', 'error-detail-item')
31985                 .text(function(d) { return d; });
31986
31987             items.exit()
31988                 .remove();
31989         }
31990
31991     }
31992
31993
31994     function success(changeset) {
31995         commit.reset();
31996         context.enter(modeBrowse(context)
31997             .sidebar(uiSuccess(context)
31998                 .changeset(changeset)
31999                 .on('cancel', function() {
32000                     context.ui().sidebar.hide();
32001                 })
32002             )
32003         );
32004     }
32005
32006
32007     mode.enter = function() {
32008         function done() {
32009             context.ui().sidebar.show(commit);
32010         }
32011
32012         keybinding
32013             .on('⎋', cancel, true);
32014
32015         d3_select(document)
32016             .call(keybinding);
32017
32018         context.container().selectAll('#content')
32019             .attr('class', 'inactive');
32020
32021         var osm = context.connection();
32022         if (!osm) return;
32023
32024         if (osm.authenticated()) {
32025             done();
32026         } else {
32027             osm.authenticate(function(err) {
32028                 if (err) {
32029                     cancel();
32030                 } else {
32031                     done();
32032                 }
32033             });
32034         }
32035     };
32036
32037
32038     mode.exit = function() {
32039         keybinding.off();
32040
32041         context.container().selectAll('#content')
32042             .attr('class', 'active');
32043
32044         context.ui().sidebar.hide();
32045     };
32046
32047     return mode;
32048 }
32049
32050 /* Built-in method references for those with the same name as other `lodash` methods. */
32051 var nativeMin$1 = Math.min;
32052
32053 /**
32054  * The base implementation of methods like `_.intersection`, without support
32055  * for iteratee shorthands, that accepts an array of arrays to inspect.
32056  *
32057  * @private
32058  * @param {Array} arrays The arrays to inspect.
32059  * @param {Function} [iteratee] The iteratee invoked per element.
32060  * @param {Function} [comparator] The comparator invoked per element.
32061  * @returns {Array} Returns the new array of shared values.
32062  */
32063 function baseIntersection(arrays, iteratee, comparator) {
32064   var includes = comparator ? arrayIncludesWith : arrayIncludes,
32065       length = arrays[0].length,
32066       othLength = arrays.length,
32067       othIndex = othLength,
32068       caches = Array(othLength),
32069       maxLength = Infinity,
32070       result = [];
32071
32072   while (othIndex--) {
32073     var array = arrays[othIndex];
32074     if (othIndex && iteratee) {
32075       array = arrayMap(array, baseUnary(iteratee));
32076     }
32077     maxLength = nativeMin$1(array.length, maxLength);
32078     caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
32079       ? new SetCache(othIndex && array)
32080       : undefined;
32081   }
32082   array = arrays[0];
32083
32084   var index = -1,
32085       seen = caches[0];
32086
32087   outer:
32088   while (++index < length && result.length < maxLength) {
32089     var value = array[index],
32090         computed = iteratee ? iteratee(value) : value;
32091
32092     value = (comparator || value !== 0) ? value : 0;
32093     if (!(seen
32094           ? cacheHas(seen, computed)
32095           : includes(result, computed, comparator)
32096         )) {
32097       othIndex = othLength;
32098       while (--othIndex) {
32099         var cache = caches[othIndex];
32100         if (!(cache
32101               ? cacheHas(cache, computed)
32102               : includes(arrays[othIndex], computed, comparator))
32103             ) {
32104           continue outer;
32105         }
32106       }
32107       if (seen) {
32108         seen.push(computed);
32109       }
32110       result.push(value);
32111     }
32112   }
32113   return result;
32114 }
32115
32116 /**
32117  * Casts `value` to an empty array if it's not an array like object.
32118  *
32119  * @private
32120  * @param {*} value The value to inspect.
32121  * @returns {Array|Object} Returns the cast array-like object.
32122  */
32123 function castArrayLikeObject(value) {
32124   return isArrayLikeObject(value) ? value : [];
32125 }
32126
32127 /**
32128  * Creates an array of unique values that are included in all given arrays
32129  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
32130  * for equality comparisons. The order and references of result values are
32131  * determined by the first array.
32132  *
32133  * @static
32134  * @memberOf _
32135  * @since 0.1.0
32136  * @category Array
32137  * @param {...Array} [arrays] The arrays to inspect.
32138  * @returns {Array} Returns the new array of intersecting values.
32139  * @example
32140  *
32141  * _.intersection([2, 1], [2, 3]);
32142  * // => [2]
32143  */
32144 var intersection = baseRest(function(arrays) {
32145   var mapped = arrayMap(arrays, castArrayLikeObject);
32146   return (mapped.length && mapped[0] === arrays[0])
32147     ? baseIntersection(mapped)
32148     : [];
32149 });
32150
32151 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
32152 // For example, ⌘Z -> Ctrl+Z
32153 var uiCmd = function (code) {
32154     var detected = utilDetect();
32155
32156     if (detected.os === 'mac') {
32157         return code;
32158     }
32159
32160     if (detected.os === 'win') {
32161         if (code === '⌘⇧Z') return 'Ctrl+Y';
32162     }
32163
32164     var result = '',
32165         replacements = {
32166             '⌘': 'Ctrl',
32167             '⇧': 'Shift',
32168             '⌥': 'Alt',
32169             '⌫': 'Backspace',
32170             '⌦': 'Delete'
32171         };
32172
32173     for (var i = 0; i < code.length; i++) {
32174         if (code[i] in replacements) {
32175             result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
32176         } else {
32177             result += code[i];
32178         }
32179     }
32180
32181     return result;
32182 };
32183
32184
32185 // return a display-focused string for a given keyboard code
32186 uiCmd.display = function(code) {
32187     if (code.length !== 1) return code;
32188
32189     var detected = utilDetect();
32190     var mac = (detected.os === 'mac');
32191     var replacements = {
32192         '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
32193         '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
32194         '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
32195         '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
32196         '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
32197         '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
32198         '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
32199         '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
32200         '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
32201         '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
32202         '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
32203         '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
32204     };
32205
32206     return replacements[code] || code;
32207 };
32208
32209 // deprecation warning - Radial Menu to be removed in iD v3
32210 var relatedParent;
32211
32212
32213 function modeSelect(context, selectedIDs) {
32214     var mode = {
32215         id: 'select',
32216         button: 'browse'
32217     };
32218
32219     var keybinding = d3keybinding('select'),
32220         timeout = null,
32221         behaviors = [
32222             behaviorCopy(context),
32223             behaviorPaste(context),
32224             behaviorBreathe(context),
32225             behaviorHover(context),
32226             behaviorSelect(context),
32227             behaviorLasso(context),
32228             modeDragNode$$1(context).selectedIDs(selectedIDs).behavior
32229         ],
32230         inspector,
32231         editMenu,
32232         newFeature = false,
32233         suppressMenu = true,
32234         follow = false;
32235
32236
32237     var wrap = context.container()
32238         .select('.inspector-wrap');
32239
32240
32241     function singular() {
32242         if (selectedIDs.length === 1) {
32243             return context.hasEntity(selectedIDs[0]);
32244         }
32245     }
32246
32247
32248     function checkSelectedIDs() {
32249         var ids = [];
32250         if (Array.isArray(selectedIDs)) {
32251             ids = selectedIDs.filter(function(id) {
32252                 return context.hasEntity(id);
32253             });
32254         }
32255
32256         if (ids.length) {
32257             selectedIDs = ids;
32258         } else {
32259             context.enter(modeBrowse(context));
32260         }
32261         return !!ids.length;
32262     }
32263
32264
32265     // find the common parent ways for nextVertex, previousVertex
32266     function commonParents() {
32267         var graph = context.graph(),
32268             commonParents = [];
32269
32270         for (var i = 0; i < selectedIDs.length; i++) {
32271             var entity = context.hasEntity(selectedIDs[i]);
32272             if (!entity || entity.geometry(graph) !== 'vertex') {
32273                 return [];  // selection includes some not vertexes
32274             }
32275
32276             var currParents = map$4(graph.parentWays(entity), 'id');
32277             if (!commonParents.length) {
32278                 commonParents = currParents;
32279                 continue;
32280             }
32281
32282             commonParents = intersection(commonParents, currParents);
32283             if (!commonParents.length) {
32284                 return [];
32285             }
32286         }
32287
32288         return commonParents;
32289     }
32290
32291
32292     function singularParent() {
32293         var parents = commonParents();
32294         if (!parents || parents.length === 0) {
32295             relatedParent = null;
32296             return null;
32297         }
32298
32299         // relatedParent is used when we visit a vertex with multiple
32300         // parents, and we want to remember which parent line we started on.
32301
32302         if (parents.length === 1) {
32303             relatedParent = parents[0];  // remember this parent for later
32304             return relatedParent;
32305         }
32306
32307         if (parents.indexOf(relatedParent) !== -1) {
32308             return relatedParent;   // prefer the previously seen parent
32309         }
32310
32311         return parents[0];
32312     }
32313
32314
32315     function closeMenu() {
32316         if (editMenu) {
32317             context.surface().call(editMenu.close);
32318         }
32319     }
32320
32321
32322     function positionMenu() {
32323         if (!editMenu) { return; }
32324
32325         var entity = singular();
32326         if (entity && context.geometry(entity.id) === 'relation') {
32327             suppressMenu = true;
32328         } else {
32329             var point = context.mouse(),
32330                 viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
32331
32332             if (point && geoPointInPolygon(point, viewport)) {
32333                 editMenu.center(point);
32334             } else {
32335                 suppressMenu = true;
32336             }
32337         }
32338     }
32339
32340
32341     function showMenu() {
32342         closeMenu();
32343         if (editMenu) {
32344             context.surface().call(editMenu);
32345         }
32346     }
32347
32348
32349     function toggleMenu() {
32350         // deprecation warning - Radial Menu to be removed in iD v3
32351         if (d3_select('.edit-menu, .radial-menu').empty()) {
32352             positionMenu();
32353             showMenu();
32354         } else {
32355             closeMenu();
32356         }
32357     }
32358
32359
32360     mode.selectedIDs = function() {
32361         return selectedIDs;
32362     };
32363
32364
32365     mode.reselect = function() {
32366         if (!checkSelectedIDs()) return;
32367
32368         var surfaceNode = context.surface().node();
32369         if (surfaceNode.focus) {   // FF doesn't support it
32370             surfaceNode.focus();
32371         }
32372
32373         positionMenu();
32374         if (!suppressMenu) {
32375             showMenu();
32376         }
32377     };
32378
32379
32380     mode.newFeature = function(_) {
32381         if (!arguments.length) return newFeature;
32382         newFeature = _;
32383         return mode;
32384     };
32385
32386
32387     mode.suppressMenu = function(_) {
32388         if (!arguments.length) return suppressMenu;
32389         suppressMenu = _;
32390         return mode;
32391     };
32392
32393
32394     mode.follow = function(_) {
32395         if (!arguments.length) return follow;
32396         follow = _;
32397         return mode;
32398     };
32399
32400
32401     mode.enter = function() {
32402
32403         function update() {
32404             closeMenu();
32405             checkSelectedIDs();
32406         }
32407
32408
32409         function dblclick() {
32410             var target = d3_select(event.target),
32411                 datum = target.datum();
32412
32413             if (datum instanceof osmWay && !target.classed('fill')) {
32414                 var choice = geoChooseEdge(context.childNodes(datum), context.mouse(), context.projection),
32415                     prev = datum.nodes[choice.index - 1],
32416                     next = datum.nodes[choice.index];
32417
32418                 context.perform(
32419                     actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
32420                     t('operations.add.annotation.vertex')
32421                 );
32422
32423                 event.preventDefault();
32424                 event.stopPropagation();
32425
32426             } else if (datum.type === 'midpoint') {
32427                 context.perform(
32428                     actionAddMidpoint({loc: datum.loc, edge: datum.edge}, osmNode()),
32429                     t('operations.add.annotation.vertex'));
32430
32431                 event.preventDefault();
32432                 event.stopPropagation();
32433             }
32434         }
32435
32436
32437         function selectElements(drawn) {
32438             if (!checkSelectedIDs()) return;
32439
32440             var surface = context.surface(),
32441                 entity = singular();
32442
32443             if (entity && context.geometry(entity.id) === 'relation') {
32444                 suppressMenu = true;
32445                 return;
32446             }
32447
32448             surface.selectAll('.related')
32449                 .classed('related', false);
32450
32451             singularParent();
32452             if (relatedParent) {
32453                 surface.selectAll(utilEntitySelector([relatedParent]))
32454                     .classed('related', true);
32455             }
32456
32457             var selection$$1 = context.surface()
32458                 .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
32459
32460             if (selection$$1.empty()) {
32461                 // Return to browse mode if selected DOM elements have
32462                 // disappeared because the user moved them out of view..
32463                 var source = event && event.type === 'zoom' && event.sourceEvent;
32464                 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
32465                     context.enter(modeBrowse(context));
32466                 }
32467             } else {
32468                 selection$$1
32469                     .classed('selected', true);
32470             }
32471         }
32472
32473
32474         function esc() {
32475             context.enter(modeBrowse(context));
32476         }
32477
32478
32479         function firstVertex() {
32480             event.preventDefault();
32481             var parent = singularParent();
32482             if (parent) {
32483                 var way = context.entity(parent);
32484                 context.enter(
32485                     modeSelect(context, [way.first()]).follow(true)
32486                 );
32487             }
32488         }
32489
32490
32491         function lastVertex() {
32492             event.preventDefault();
32493             var parent = singularParent();
32494             if (parent) {
32495                 var way = context.entity(parent);
32496                 context.enter(
32497                     modeSelect(context, [way.last()]).follow(true)
32498                 );
32499             }
32500         }
32501
32502
32503         function previousVertex() {
32504             event.preventDefault();
32505             var parent = singularParent();
32506             if (!parent) return;
32507
32508             var way = context.entity(parent),
32509                 length = way.nodes.length,
32510                 curr = way.nodes.indexOf(selectedIDs[0]),
32511                 index = -1;
32512
32513             if (curr > 0) {
32514                 index = curr - 1;
32515             } else if (way.isClosed()) {
32516                 index = length - 2;
32517             }
32518
32519             if (index !== -1) {
32520                 context.enter(
32521                     modeSelect(context, [way.nodes[index]]).follow(true)
32522                 );
32523             }
32524         }
32525
32526
32527         function nextVertex() {
32528             event.preventDefault();
32529             var parent = singularParent();
32530             if (!parent) return;
32531
32532             var way = context.entity(parent),
32533                 length = way.nodes.length,
32534                 curr = way.nodes.indexOf(selectedIDs[0]),
32535                 index = -1;
32536
32537             if (curr < length - 1) {
32538                 index = curr + 1;
32539             } else if (way.isClosed()) {
32540                 index = 0;
32541             }
32542
32543             if (index !== -1) {
32544                 context.enter(
32545                     modeSelect(context, [way.nodes[index]]).follow(true)
32546                 );
32547             }
32548         }
32549
32550
32551         function nextParent() {
32552             event.preventDefault();
32553             var parents = uniq(commonParents());
32554             if (!parents || parents.length < 2) return;
32555
32556             var index = parents.indexOf(relatedParent);
32557             if (index < 0 || index > parents.length - 2) {
32558                 relatedParent = parents[0];
32559             } else {
32560                 relatedParent = parents[index + 1];
32561             }
32562
32563             var surface = context.surface();
32564             surface.selectAll('.related')
32565                 .classed('related', false);
32566
32567             if (relatedParent) {
32568                 surface.selectAll(utilEntitySelector([relatedParent]))
32569                     .classed('related', true);
32570             }
32571         }
32572
32573
32574         if (!checkSelectedIDs()) return;
32575
32576         var operations = without(values$1(Operations), operationDelete)
32577                 .map(function(o) { return o(selectedIDs, context); })
32578                 .filter(function(o) { return o.available(); });
32579
32580         // deprecation warning - Radial Menu to be removed in iD v3
32581         var isRadialMenu = context.storage('edit-menu-style') === 'radial';
32582         if (isRadialMenu) {
32583             operations = operations.slice(0,7);
32584             operations.unshift(operationDelete(selectedIDs, context));
32585         } else {
32586             operations.push(operationDelete(selectedIDs, context));
32587         }
32588
32589         operations.forEach(function(operation) {
32590             if (operation.behavior) {
32591                 behaviors.push(operation.behavior);
32592             }
32593         });
32594
32595         behaviors.forEach(function(behavior) {
32596             context.install(behavior);
32597         });
32598
32599         keybinding
32600             .on(['[', 'pgup'], previousVertex)
32601             .on([']', 'pgdown'], nextVertex)
32602             .on(['{', uiCmd('⌘['), 'home'], firstVertex)
32603             .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
32604             .on(['\\', 'pause'], nextParent)
32605             .on('⎋', esc, true)
32606             .on('space', toggleMenu);
32607
32608         d3_select(document)
32609             .call(keybinding);
32610
32611
32612         // deprecation warning - Radial Menu to be removed in iD v3
32613         editMenu = isRadialMenu
32614             ? uiRadialMenu(context, operations)
32615             : uiEditMenu(context, operations);
32616
32617         context.ui().sidebar
32618             .select(singular() ? singular().id : null, newFeature);
32619
32620         context.history()
32621             .on('undone.select', update)
32622             .on('redone.select', update);
32623
32624         context.map()
32625             .on('move.select', closeMenu)
32626             .on('drawn.select', selectElements);
32627
32628         context.surface()
32629             .on('dblclick.select', dblclick);
32630
32631
32632         selectElements();
32633
32634         if (selectedIDs.length > 1) {
32635             var entities = uiSelectionList(context, selectedIDs);
32636             context.ui().sidebar.show(entities);
32637         }
32638
32639         if (follow) {
32640             var extent = geoExtent$$1(),
32641                 graph = context.graph();
32642             selectedIDs.forEach(function(id) {
32643                 var entity = context.entity(id);
32644                 extent._extend(entity.extent(graph));
32645             });
32646
32647             var loc = extent.center();
32648             context.map().centerEase(loc);
32649         } else if (singular() && singular().type === 'way') {
32650             context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
32651         }
32652
32653         timeout = window.setTimeout(function() {
32654             positionMenu();
32655             if (!suppressMenu) {
32656                 showMenu();
32657             }
32658         }, 270);  /* after any centerEase completes */
32659
32660     };
32661
32662
32663     mode.exit = function() {
32664         if (timeout) window.clearTimeout(timeout);
32665
32666         if (inspector) wrap.call(inspector.close);
32667
32668         behaviors.forEach(function(behavior) {
32669             context.uninstall(behavior);
32670         });
32671
32672         keybinding.off();
32673         closeMenu();
32674         editMenu = undefined;
32675
32676         context.history()
32677             .on('undone.select', null)
32678             .on('redone.select', null);
32679
32680         var surface = context.surface();
32681
32682         surface
32683             .on('dblclick.select', null);
32684
32685         surface
32686             .selectAll('.selected')
32687             .classed('selected', false);
32688
32689         surface
32690             .selectAll('.related')
32691             .classed('related', false);
32692
32693         context.map().on('drawn.select', null);
32694         context.ui().sidebar.hide();
32695     };
32696
32697
32698     return mode;
32699 }
32700
32701 function behaviorAddWay(context) {
32702     var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
32703         draw = behaviorDraw(context);
32704
32705     var addWay = function(surface) {
32706         draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
32707             .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
32708             .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
32709             .on('cancel', addWay.cancel)
32710             .on('finish', addWay.cancel);
32711
32712         context.map()
32713             .dblclickEnable(false);
32714
32715         surface.call(draw);
32716     };
32717
32718
32719     addWay.off = function(surface) {
32720         surface.call(draw.off);
32721     };
32722
32723
32724     addWay.cancel = function() {
32725         window.setTimeout(function() {
32726             context.map().dblclickEnable(true);
32727         }, 1000);
32728
32729         context.enter(modeBrowse(context));
32730     };
32731
32732
32733     addWay.tail = function(text) {
32734         draw.tail(text);
32735         return addWay;
32736     };
32737
32738
32739     return utilRebind(addWay, dispatch$$1, 'on');
32740 }
32741
32742 function behaviorBreathe() {
32743     var duration = 800,
32744         steps = 4,
32745         selector$$1 = '.selected.shadow, .selected .shadow',
32746         selected = d3_select(null),
32747         classed = '',
32748         params = {},
32749         done = false,
32750         timer$$1;
32751
32752
32753     function ratchetyInterpolator(a, b, steps, units) {
32754         a = parseFloat(a);
32755         b = parseFloat(b);
32756         var sample = quantize()
32757             .domain([0, 1])
32758             .range(d3_quantize(d3_interpolateNumber(a, b), steps));
32759
32760         return function(t) {
32761             return String(sample(t)) + (units || '');
32762         };
32763     }
32764
32765
32766     function reset(selection$$1) {
32767         selection$$1
32768             .style('stroke-opacity', null)
32769             .style('stroke-width', null)
32770             .style('fill-opacity', null)
32771             .style('r', null);
32772     }
32773
32774
32775     function setAnimationParams(transition, fromTo) {
32776         var toFrom = (fromTo === 'from' ? 'to' : 'from');
32777
32778         transition
32779             .styleTween('stroke-opacity', function(d) {
32780                 return ratchetyInterpolator(
32781                     params[d.id][toFrom].opacity,
32782                     params[d.id][fromTo].opacity,
32783                     steps
32784                 );
32785             })
32786             .styleTween('stroke-width', function(d) {
32787                 return ratchetyInterpolator(
32788                     params[d.id][toFrom].width,
32789                     params[d.id][fromTo].width,
32790                     steps,
32791                     'px'
32792                 );
32793             })
32794             .styleTween('fill-opacity', function(d) {
32795                 return ratchetyInterpolator(
32796                     params[d.id][toFrom].opacity,
32797                     params[d.id][fromTo].opacity,
32798                     steps
32799                 );
32800             })
32801             .styleTween('r', function(d) {
32802                 return ratchetyInterpolator(
32803                     params[d.id][toFrom].width,
32804                     params[d.id][fromTo].width,
32805                     steps,
32806                     'px'
32807                 );
32808             });
32809     }
32810
32811
32812     function calcAnimationParams(selection$$1) {
32813         selection$$1
32814             .call(reset)
32815             .each(function(d) {
32816                 var s = d3_select(this),
32817                     tag = s.node().tagName,
32818                     p = {'from': {}, 'to': {}},
32819                     opacity, width;
32820
32821                 // determine base opacity and width
32822                 if (tag === 'circle') {
32823                     opacity = parseFloat(s.style('fill-opacity') || 0.5);
32824                     width = parseFloat(s.style('r') || 15.5);
32825                 } else {
32826                     opacity = parseFloat(s.style('stroke-opacity') || 0.7);
32827                     width = parseFloat(s.style('stroke-width') || 10);
32828                 }
32829
32830                 // calculate from/to interpolation params..
32831                 p.tag = tag;
32832                 p.from.opacity = opacity * 0.6;
32833                 p.to.opacity = opacity * 1.25;
32834                 p.from.width = width * 0.7;
32835                 p.to.width = width * (tag === 'circle' ? 1.5 : 1);
32836                 params[d.id] = p;
32837             });
32838     }
32839
32840
32841     function run(surface, fromTo) {
32842         var toFrom = (fromTo === 'from' ? 'to' : 'from'),
32843             currSelected = surface.selectAll(selector$$1),
32844             currClassed = surface.attr('class');
32845
32846         if (done || currSelected.empty()) {
32847             selected.call(reset);
32848             return;
32849         }
32850
32851         if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
32852             selected.call(reset);
32853             classed = currClassed;
32854             selected = currSelected.call(calcAnimationParams);
32855         }
32856
32857         selected
32858             .transition()
32859             .duration(duration)
32860             .call(setAnimationParams, fromTo)
32861             .on('end', function() {
32862                 surface.call(run, toFrom);
32863             });
32864     }
32865
32866
32867     var breathe = function(surface) {
32868         done = false;
32869         timer$$1 = timer(function() {
32870             // wait for elements to actually become selected
32871             if (surface.selectAll(selector$$1).empty()) {
32872                 return false;
32873             }
32874
32875             surface.call(run, 'from');
32876             timer$$1.stop();
32877             return true;
32878         }, 20);
32879     };
32880
32881
32882     breathe.off = function() {
32883         done = true;
32884         if (timer$$1) {
32885             timer$$1.stop();
32886         }
32887         selected
32888             .interrupt()
32889             .call(reset);
32890     };
32891
32892
32893     return breathe;
32894 }
32895
32896 function behaviorCopy(context) {
32897     var keybinding = d3keybinding('copy');
32898
32899
32900     function groupEntities(ids, graph) {
32901         var entities = ids.map(function (id) { return graph.entity(id); });
32902         return assignIn$1({relation: [], way: [], node: []},
32903             groupBy(entities, function(entity) { return entity.type; }));
32904     }
32905
32906
32907     function getDescendants(id, graph, descendants) {
32908         var entity = graph.entity(id),
32909             i, children;
32910
32911         descendants = descendants || {};
32912
32913         if (entity.type === 'relation') {
32914             children = map$4(entity.members, 'id');
32915         } else if (entity.type === 'way') {
32916             children = entity.nodes;
32917         } else {
32918             children = [];
32919         }
32920
32921         for (i = 0; i < children.length; i++) {
32922             if (!descendants[children[i]]) {
32923                 descendants[children[i]] = true;
32924                 descendants = getDescendants(children[i], graph, descendants);
32925             }
32926         }
32927
32928         return descendants;
32929     }
32930
32931
32932     function doCopy() {
32933         if (!getSelectionText()) event.preventDefault();
32934
32935         var graph = context.graph(),
32936             selected = groupEntities(context.selectedIDs(), graph),
32937             canCopy = [],
32938             skip = {},
32939             i, entity;
32940
32941         for (i = 0; i < selected.relation.length; i++) {
32942             entity = selected.relation[i];
32943             if (!skip[entity.id] && entity.isComplete(graph)) {
32944                 canCopy.push(entity.id);
32945                 skip = getDescendants(entity.id, graph, skip);
32946             }
32947         }
32948         for (i = 0; i < selected.way.length; i++) {
32949             entity = selected.way[i];
32950             if (!skip[entity.id]) {
32951                 canCopy.push(entity.id);
32952                 skip = getDescendants(entity.id, graph, skip);
32953             }
32954         }
32955         for (i = 0; i < selected.node.length; i++) {
32956             entity = selected.node[i];
32957             if (!skip[entity.id]) {
32958                 canCopy.push(entity.id);
32959             }
32960         }
32961
32962         context.copyIDs(canCopy);
32963     }
32964
32965
32966     function copy() {
32967         keybinding.on(uiCmd('⌘C'), doCopy);
32968         d3_select(document).call(keybinding);
32969         return copy;
32970     }
32971
32972     function getSelectionText() {
32973         return window.getSelection().toString();
32974     }
32975
32976     copy.off = function() {
32977         d3_select(document).call(keybinding.off);
32978     };
32979
32980
32981     return copy;
32982 }
32983
32984 /*
32985     `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
32986
32987     * The `origin` function is expected to return an [x, y] tuple rather than an
32988       {x, y} object.
32989     * The events are `start`, `move`, and `end`.
32990       (https://github.com/mbostock/d3/issues/563)
32991     * The `start` event is not dispatched until the first cursor movement occurs.
32992       (https://github.com/mbostock/d3/pull/368)
32993     * The `move` event has a `point` and `delta` [x, y] tuple properties rather
32994       than `x`, `y`, `dx`, and `dy` properties.
32995     * The `end` event is not dispatched if no movement occurs.
32996     * An `off` function is available that unbinds the drag's internal event handlers.
32997  */
32998
32999 function behaviorDrag() {
33000     var event$$1 = dispatch('start', 'move', 'end'),
33001         origin = null,
33002         selector$$1 = '',
33003         filter = null,
33004         event_, target, surface;
33005
33006
33007     var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect'),
33008         d3_event_userSelectSuppress = function() {
33009             var selection$$1 = selection(),
33010                 select = selection$$1.style(d3_event_userSelectProperty);
33011             selection$$1.style(d3_event_userSelectProperty, 'none');
33012             return function() {
33013                 selection$$1.style(d3_event_userSelectProperty, select);
33014             };
33015         };
33016
33017
33018     function d3_eventCancel() {
33019         event.stopPropagation();
33020         event.preventDefault();
33021     }
33022
33023
33024     function eventOf(thiz, argumentz) {
33025         return function(e1) {
33026             e1.target = drag;
33027             customEvent(e1, event$$1.apply, event$$1, [e1.type, thiz, argumentz]);
33028         };
33029     }
33030
33031
33032     function dragstart() {
33033         target = this;
33034         event_ = eventOf(target, arguments);
33035
33036         var eventTarget = event.target,
33037             touchId = event.touches ? event.changedTouches[0].identifier : null,
33038             offset,
33039             origin_ = point(),
33040             started = false,
33041             selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
33042
33043         d3_select(window)
33044             .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
33045             .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
33046
33047         if (origin) {
33048             offset = origin.apply(target, arguments);
33049             offset = [offset[0] - origin_[0], offset[1] - origin_[1]];
33050         } else {
33051             offset = [0, 0];
33052         }
33053
33054         if (touchId === null) {
33055             event.stopPropagation();
33056         }
33057
33058
33059         function point() {
33060             var p = surface || target.parentNode;
33061             return touchId !== null ? d3_touches(p).filter(function(p) {
33062                 return p.identifier === touchId;
33063             })[0] : d3_mouse(p);
33064         }
33065
33066
33067         function dragmove() {
33068             var p = point(),
33069                 dx = p[0] - origin_[0],
33070                 dy = p[1] - origin_[1];
33071
33072             if (dx === 0 && dy === 0)
33073                 return;
33074
33075             if (!started) {
33076                 started = true;
33077                 event_({ type: 'start' });
33078             }
33079
33080             origin_ = p;
33081             d3_eventCancel();
33082
33083             event_({
33084                 type: 'move',
33085                 point: [p[0] + offset[0],  p[1] + offset[1]],
33086                 delta: [dx, dy]
33087             });
33088         }
33089
33090
33091         function dragend() {
33092             if (started) {
33093                 event_({ type: 'end' });
33094
33095                 d3_eventCancel();
33096                 if (event.target === eventTarget) {
33097                     d3_select(window)
33098                         .on('click.drag', click, true);
33099                 }
33100             }
33101
33102             d3_select(window)
33103                 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
33104                 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
33105
33106             selectEnable();
33107         }
33108
33109
33110         function click() {
33111             d3_eventCancel();
33112             d3_select(window)
33113                 .on('click.drag', null);
33114         }
33115     }
33116
33117
33118     function drag(selection$$1) {
33119         var matchesSelector = utilPrefixDOMProperty('matchesSelector'),
33120             delegate = dragstart;
33121
33122         if (selector$$1) {
33123             delegate = function() {
33124                 var root = this,
33125                     target = event.target;
33126                 for (; target && target !== root; target = target.parentNode) {
33127                     if (target[matchesSelector](selector$$1) &&
33128                             (!filter || filter(target.__data__))) {
33129                         return dragstart.call(target, target.__data__);
33130                     }
33131                 }
33132             };
33133         }
33134
33135         selection$$1
33136             .on('mousedown.drag' + selector$$1, delegate)
33137             .on('touchstart.drag' + selector$$1, delegate);
33138     }
33139
33140
33141     drag.off = function(selection$$1) {
33142         selection$$1
33143             .on('mousedown.drag' + selector$$1, null)
33144             .on('touchstart.drag' + selector$$1, null);
33145     };
33146
33147
33148     drag.selector = function(_) {
33149         if (!arguments.length) return selector$$1;
33150         selector$$1 = _;
33151         return drag;
33152     };
33153
33154
33155     drag.filter = function(_) {
33156         if (!arguments.length) return origin;
33157         filter = _;
33158         return drag;
33159     };
33160
33161
33162     drag.origin = function (_) {
33163         if (!arguments.length) return origin;
33164         origin = _;
33165         return drag;
33166     };
33167
33168
33169     drag.cancel = function() {
33170         d3_select(window)
33171             .on('mousemove.drag', null)
33172             .on('mouseup.drag', null);
33173         return drag;
33174     };
33175
33176
33177     drag.target = function() {
33178         if (!arguments.length) return target;
33179         target = arguments[0];
33180         event_ = eventOf(target, Array.prototype.slice.call(arguments, 1));
33181         return drag;
33182     };
33183
33184
33185     drag.surface = function() {
33186         if (!arguments.length) return surface;
33187         surface = arguments[0];
33188         return drag;
33189     };
33190
33191
33192     return utilRebind(drag, event$$1, 'on');
33193 }
33194
33195 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
33196
33197     var origWay = context.entity(wayId),
33198         isArea = context.geometry(wayId) === 'area',
33199         tempEdits = 0,
33200         annotation = t((origWay.isDegenerate() ?
33201             'operations.start.annotation.' :
33202             'operations.continue.annotation.') + context.geometry(wayId)),
33203         draw = behaviorDraw(context),
33204         startIndex,
33205         start,
33206         end,
33207         segment;
33208
33209
33210     // initialize the temporary drawing entities
33211     if (!isArea) {
33212         startIndex = typeof index === 'undefined' ? origWay.nodes.length - 1 : 0;
33213         start = osmNode({ id: 'nStart', loc: context.entity(origWay.nodes[startIndex]).loc });
33214         end = osmNode({ id: 'nEnd', loc: context.map().mouseCoordinates() });
33215         segment = osmWay({ id: 'wTemp',
33216             nodes: typeof index === 'undefined' ? [start.id, end.id] : [end.id, start.id],
33217             tags: clone(origWay.tags)
33218         });
33219     } else {
33220         end = osmNode({ loc: context.map().mouseCoordinates() });
33221     }
33222
33223     // Push an annotated state for undo to return back to.
33224     // We must make sure to remove this edit later.
33225     context.perform(actionNoop(), annotation);
33226     tempEdits++;
33227
33228     // Add the temporary drawing entities to the graph.
33229     // We must make sure to remove this edit later.
33230     context.perform(AddDrawEntities());
33231     tempEdits++;
33232
33233
33234     function move(datum) {
33235         var loc;
33236
33237         if (datum.type === 'node' && datum.id !== end.id) {
33238             loc = datum.loc;
33239
33240         } else if (datum.type === 'way') {
33241             var dims = context.map().dimensions(),
33242                 mouse = context.mouse(),
33243                 pad = 5,
33244                 trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad &&
33245                     mouse[1] > pad && mouse[1] < dims[1] - pad;
33246
33247             if (trySnap) {
33248                 loc = geoChooseEdge(context.childNodes(datum), context.mouse(), context.projection).loc;
33249             }
33250         }
33251
33252         if (!loc) {
33253             loc = context.map().mouseCoordinates();
33254         }
33255
33256         context.replace(actionMoveNode(end.id, loc));
33257         end = context.entity(end.id);
33258     }
33259
33260
33261     function undone() {
33262         // Undo popped the history back to the initial annotated no-op edit.
33263         // Remove initial no-op edit and whatever edit happened immediately before it.
33264         context.pop(2);
33265         tempEdits = 0;
33266
33267         if (context.hasEntity(wayId)) {
33268             context.enter(mode);
33269         } else {
33270             context.enter(modeBrowse(context));
33271         }
33272     }
33273
33274
33275     function setActiveElements() {
33276         var active = isArea ? [wayId, end.id] : [segment.id, start.id, end.id];
33277         context.surface().selectAll(utilEntitySelector(active))
33278             .classed('active', true);
33279     }
33280
33281
33282     var drawWay = function(surface) {
33283         draw.on('move', move)
33284             .on('click', drawWay.add)
33285             .on('clickWay', drawWay.addWay)
33286             .on('clickNode', drawWay.addNode)
33287             .on('undo', context.undo)
33288             .on('cancel', drawWay.cancel)
33289             .on('finish', drawWay.finish);
33290
33291         context.map()
33292             .dblclickEnable(false)
33293             .on('drawn.draw', setActiveElements);
33294
33295         setActiveElements();
33296
33297         surface.call(draw);
33298
33299         context.history()
33300             .on('undone.draw', undone);
33301     };
33302
33303
33304     drawWay.off = function(surface) {
33305         // Drawing was interrupted unexpectedly.
33306         // This can happen if the user changes modes,
33307         // clicks geolocate button, a hashchange event occurs, etc.
33308         if (tempEdits) {
33309             context.pop(tempEdits);
33310             while (context.graph() !== startGraph) {
33311                 context.pop();
33312             }
33313         }
33314
33315         context.map()
33316             .on('drawn.draw', null);
33317
33318         surface.call(draw.off)
33319             .selectAll('.active')
33320             .classed('active', false);
33321
33322         context.history()
33323             .on('undone.draw', null);
33324     };
33325
33326
33327     function AddDrawEntities() {
33328         return function(graph) {
33329             if (isArea) {
33330                 // For area drawing, there is no need for a temporary node.
33331                 // `end` gets inserted into the way as the penultimate node.
33332                 return graph
33333                     .replace(end)
33334                     .replace(origWay.addNode(end.id));
33335             } else {
33336                 // For line drawing, add a temporary start, end, and segment to the graph.
33337                 // This allows us to class the new segment as `active`, but still
33338                 // connect it back to parts of the way that have already been drawn.
33339                 return graph
33340                     .replace(start)
33341                     .replace(end)
33342                     .replace(segment);
33343             }
33344         };
33345     }
33346
33347
33348     function ReplaceDrawEntities(newNode) {
33349         return function(graph) {
33350             if (isArea) {
33351                 // For area drawing, we didn't create a temporary node.
33352                 // `newNode` gets inserted into the _original_ way as the penultimate node.
33353                 return graph
33354                     .replace(origWay.addNode(newNode.id))
33355                     .remove(end);
33356             } else {
33357                 // For line drawing, add the `newNode` to the way at specified index,
33358                 // and remove the temporary start, end, and segment.
33359                 return graph
33360                     .replace(origWay.addNode(newNode.id, index))
33361                     .remove(end)
33362                     .remove(segment)
33363                     .remove(start);
33364             }
33365         };
33366     }
33367
33368
33369     // Accept the current position of the temporary node and continue drawing.
33370     drawWay.add = function(loc) {
33371         // prevent duplicate nodes
33372         var last = context.hasEntity(origWay.nodes[origWay.nodes.length - (isArea ? 2 : 1)]);
33373         if (last && last.loc[0] === loc[0] && last.loc[1] === loc[1]) return;
33374
33375         context.pop(tempEdits);
33376
33377         if (isArea) {
33378             context.perform(
33379                 AddDrawEntities(),
33380                 annotation
33381             );
33382         } else {
33383             var newNode = osmNode({loc: loc});
33384             context.perform(
33385                 actionAddEntity(newNode),
33386                 ReplaceDrawEntities(newNode),
33387                 annotation
33388             );
33389         }
33390
33391         tempEdits = 0;
33392         context.enter(mode);
33393     };
33394
33395
33396     // Connect the way to an existing way.
33397     drawWay.addWay = function(loc, edge) {
33398         if (isArea) {
33399             context.pop(tempEdits);
33400
33401             context.perform(
33402                 AddDrawEntities(),
33403                 actionAddMidpoint({ loc: loc, edge: edge}, end),
33404                 annotation
33405             );
33406         } else {
33407             var previousEdge = startIndex ?
33408                 [origWay.nodes[startIndex], origWay.nodes[startIndex - 1]] :
33409                 [origWay.nodes[0], origWay.nodes[1]];
33410
33411             // Avoid creating duplicate segments
33412             if (geoEdgeEqual(edge, previousEdge))
33413                 return;
33414
33415             context.pop(tempEdits);
33416
33417             var newNode = osmNode({ loc: loc });
33418             context.perform(
33419                 actionAddMidpoint({ loc: loc, edge: edge}, newNode),
33420                 ReplaceDrawEntities(newNode),
33421                 annotation
33422             );
33423         }
33424
33425         tempEdits = 0;
33426         context.enter(mode);
33427     };
33428
33429
33430     // Connect the way to an existing node and continue drawing.
33431     drawWay.addNode = function(node) {
33432         // Avoid creating duplicate segments
33433         if (origWay.areAdjacent(node.id, origWay.nodes[origWay.nodes.length - 1])) return;
33434
33435         // Clicks should not occur on the drawing node, however a space keypress can
33436         // sometimes grab that node's datum (before it gets classed as `active`?)  #4016
33437         if (node.id === end.id) {
33438             drawWay.add(node.loc);
33439             return;
33440         }
33441
33442         context.pop(tempEdits);
33443
33444         context.perform(
33445             ReplaceDrawEntities(node),
33446             annotation
33447         );
33448
33449         tempEdits = 0;
33450         context.enter(mode);
33451     };
33452
33453
33454     // Finish the draw operation, removing the temporary edits.
33455     // If the way has enough nodes to be valid, it's selected.
33456     // Otherwise, delete everything and return to browse mode.
33457     drawWay.finish = function() {
33458         context.pop(tempEdits);
33459         tempEdits = 0;
33460
33461         var way = context.hasEntity(wayId);
33462         if (!way || way.isDegenerate()) {
33463             drawWay.cancel();
33464             return;
33465         }
33466
33467         window.setTimeout(function() {
33468             context.map().dblclickEnable(true);
33469         }, 1000);
33470
33471         context.enter(modeSelect(context, [wayId]).newFeature(true));
33472     };
33473
33474
33475     // Cancel the draw operation, delete everything, and return to browse mode.
33476     drawWay.cancel = function() {
33477         context.pop(tempEdits);
33478         tempEdits = 0;
33479
33480         while (context.graph() !== startGraph) {
33481             context.pop();
33482         }
33483
33484         window.setTimeout(function() {
33485             context.map().dblclickEnable(true);
33486         }, 1000);
33487
33488         context.enter(modeBrowse(context));
33489     };
33490
33491
33492     drawWay.tail = function(text) {
33493         draw.tail(text);
33494         return drawWay;
33495     };
33496
33497
33498     return drawWay;
33499 }
33500
33501 /** Error message constants. */
33502 var FUNC_ERROR_TEXT$3 = 'Expected a function';
33503
33504 /**
33505  * Creates a throttled function that only invokes `func` at most once per
33506  * every `wait` milliseconds. The throttled function comes with a `cancel`
33507  * method to cancel delayed `func` invocations and a `flush` method to
33508  * immediately invoke them. Provide `options` to indicate whether `func`
33509  * should be invoked on the leading and/or trailing edge of the `wait`
33510  * timeout. The `func` is invoked with the last arguments provided to the
33511  * throttled function. Subsequent calls to the throttled function return the
33512  * result of the last `func` invocation.
33513  *
33514  * **Note:** If `leading` and `trailing` options are `true`, `func` is
33515  * invoked on the trailing edge of the timeout only if the throttled function
33516  * is invoked more than once during the `wait` timeout.
33517  *
33518  * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
33519  * until to the next tick, similar to `setTimeout` with a timeout of `0`.
33520  *
33521  * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
33522  * for details over the differences between `_.throttle` and `_.debounce`.
33523  *
33524  * @static
33525  * @memberOf _
33526  * @since 0.1.0
33527  * @category Function
33528  * @param {Function} func The function to throttle.
33529  * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
33530  * @param {Object} [options={}] The options object.
33531  * @param {boolean} [options.leading=true]
33532  *  Specify invoking on the leading edge of the timeout.
33533  * @param {boolean} [options.trailing=true]
33534  *  Specify invoking on the trailing edge of the timeout.
33535  * @returns {Function} Returns the new throttled function.
33536  * @example
33537  *
33538  * // Avoid excessively updating the position while scrolling.
33539  * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
33540  *
33541  * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
33542  * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
33543  * jQuery(element).on('click', throttled);
33544  *
33545  * // Cancel the trailing throttled invocation.
33546  * jQuery(window).on('popstate', throttled.cancel);
33547  */
33548 function throttle(func, wait, options) {
33549   var leading = true,
33550       trailing = true;
33551
33552   if (typeof func != 'function') {
33553     throw new TypeError(FUNC_ERROR_TEXT$3);
33554   }
33555   if (isObject(options)) {
33556     leading = 'leading' in options ? !!options.leading : leading;
33557     trailing = 'trailing' in options ? !!options.trailing : trailing;
33558   }
33559   return debounce$1(func, wait, {
33560     'leading': leading,
33561     'maxWait': wait,
33562     'trailing': trailing
33563   });
33564 }
33565
33566 function behaviorHash(context) {
33567     var s0 = null, // cached window.location.hash
33568         lat = 90 - 1e-8; // allowable latitude range
33569
33570
33571     var parser = function(map, s) {
33572         var q = utilStringQs(s);
33573         var args = (q.map || '').split('/').map(Number);
33574
33575         if (args.length < 3 || args.some(isNaN)) {
33576             return true; // replace bogus hash
33577
33578         } else if (s !== formatter(map).slice(1)) {   // hash has changed
33579             var mode = context.mode(),
33580                 dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
33581                 maxdist = 500;
33582
33583             // Don't allow the hash location to change too much while drawing
33584             // This can happen if the user accidently hit the back button.  #3996
33585             if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
33586                 context.enter(modeBrowse(context));
33587             }
33588
33589             map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
33590         }
33591     };
33592
33593
33594     var formatter = function(map) {
33595         var center = map.center(),
33596             zoom = map.zoom(),
33597             precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),
33598             q = omit(utilStringQs(window.location.hash.substring(1)),
33599                 ['comment', 'hashtags', 'walkthrough']
33600             ),
33601             newParams = {};
33602
33603         delete q.id;
33604         var selected = context.selectedIDs().filter(function(id) {
33605             return !context.entity(id).isNew();
33606         });
33607         if (selected.length) {
33608             newParams.id = selected.join(',');
33609         }
33610
33611         newParams.map = zoom.toFixed(2) +
33612             '/' + center[1].toFixed(precision) +
33613             '/' + center[0].toFixed(precision);
33614
33615         return '#' + utilQsString(assign(q, newParams), true);
33616     };
33617
33618
33619     function update() {
33620         if (context.inIntro()) return;
33621         var s1 = formatter(context.map());
33622         if (s0 !== s1) {
33623             window.location.replace(s0 = s1);  // don't recenter the map!
33624         }
33625     }
33626
33627
33628     var throttledUpdate = throttle(update, 500);
33629
33630
33631     function hashchange() {
33632         if (window.location.hash === s0) return;  // ignore spurious hashchange events
33633         if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
33634             update(); // replace bogus hash
33635         }
33636     }
33637
33638
33639     function hash() {
33640         context.map()
33641             .on('move.hash', throttledUpdate);
33642
33643         context
33644             .on('enter.hash', throttledUpdate);
33645
33646         d3_select(window)
33647             .on('hashchange.hash', hashchange);
33648
33649         if (window.location.hash) {
33650
33651             var q = utilStringQs(window.location.hash.substring(1));
33652
33653             if (q.id) {
33654                 context.zoomToEntity(q.id.split(',')[0], !q.map);
33655             }
33656
33657             if (q.comment) {
33658                 context.storage('comment', q.comment);
33659                 context.storage('commentDate', Date.now());
33660             }
33661
33662             if (q.hashtags) {
33663                 context.storage('hashtags', q.hashtags);
33664             }
33665
33666             if (q.walkthrough === 'true') {
33667                 hash.startWalkthrough = true;
33668             }
33669
33670             hashchange();
33671
33672             if (q.map) {
33673                 hash.hadHash = true;
33674             }
33675         }
33676     }
33677
33678
33679     hash.off = function() {
33680         throttledUpdate.cancel();
33681
33682         context.map()
33683             .on('move.hash', null);
33684
33685         context
33686             .on('enter.hash', null);
33687
33688         d3_select(window)
33689             .on('hashchange.hash', null);
33690
33691         window.location.hash = '';
33692     };
33693
33694
33695     return hash;
33696 }
33697
33698 function behaviorLasso(context) {
33699
33700     var behavior = function(selection$$1) {
33701         var lasso;
33702
33703
33704         function mousedown() {
33705             var button = 0;  // left
33706             if (event.button === button && event.shiftKey === true) {
33707                 lasso = null;
33708
33709                 d3_select(window)
33710                     .on('mousemove.lasso', mousemove)
33711                     .on('mouseup.lasso', mouseup);
33712
33713                 event.stopPropagation();
33714             }
33715         }
33716
33717
33718         function mousemove() {
33719             if (!lasso) {
33720                 lasso = uiLasso(context);
33721                 context.surface().call(lasso);
33722             }
33723
33724             lasso.p(context.mouse());
33725         }
33726
33727
33728         function normalize(a, b) {
33729             return [
33730                 [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
33731                 [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
33732         }
33733
33734
33735         function lassoed() {
33736             if (!lasso) return [];
33737
33738             var graph = context.graph(),
33739                 bounds = lasso.extent().map(context.projection.invert),
33740                 extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
33741
33742             return map$4(context.intersects(extent).filter(function(entity) {
33743                 return entity.type === 'node' &&
33744                     geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
33745                     !context.features().isHidden(entity, graph, entity.geometry(graph));
33746             }), 'id');
33747         }
33748
33749
33750         function mouseup() {
33751             d3_select(window)
33752                 .on('mousemove.lasso', null)
33753                 .on('mouseup.lasso', null);
33754
33755             if (!lasso) return;
33756
33757             var ids = lassoed();
33758             lasso.close();
33759
33760             if (ids.length) {
33761                 context.enter(modeSelect(context, ids));
33762             }
33763         }
33764
33765         selection$$1
33766             .on('mousedown.lasso', mousedown);
33767     };
33768
33769
33770     behavior.off = function(selection$$1) {
33771         selection$$1.on('mousedown.lasso', null);
33772     };
33773
33774
33775     return behavior;
33776 }
33777
33778 /* Creates a keybinding behavior for an operation */
33779 function behaviorOperation() {
33780     var which, keybinding;
33781
33782
33783     function drawIcon(selection$$1) {
33784         var button = selection$$1
33785             .append('svg')
33786             .attr('class', 'operation-icon')
33787             .append('g')
33788             .attr('class', 'radial-menu-item radial-menu-item-' + which.id)
33789             .attr('transform', 'translate(10,10)')
33790             .classed('disabled', which.disabled());
33791
33792         button
33793             .append('circle')
33794             .attr('r', 9);
33795
33796         button
33797             .append('use')
33798             .attr('transform', 'translate(-7,-7)')
33799             .attr('width', '14')
33800             .attr('height', '14')
33801             .attr('xlink:href', '#operation-' + which.id);
33802
33803         return selection$$1;
33804     }
33805
33806
33807     var behavior = function () {
33808         if (which && which.available()) {
33809             keybinding = d3keybinding('behavior.key.' + which.id);
33810             keybinding.on(which.keys, function() {
33811                 event.preventDefault();
33812                 var disabled = which.disabled();
33813
33814                 if (disabled) {
33815                     uiFlash(3000)
33816                         .html('')
33817                         .call(drawIcon)
33818                         .append('div')
33819                         .attr('class', 'operation-tip')
33820                         .text(which.tooltip);
33821
33822                 } else {
33823                     uiFlash(1500)
33824                         .html('')
33825                         .call(drawIcon)
33826                         .append('div')
33827                         .attr('class', 'operation-tip')
33828                         .text(which.annotation() || which.title);
33829
33830                     which();
33831                 }
33832             });
33833             d3_select(document).call(keybinding);
33834         }
33835         return behavior;
33836     };
33837
33838
33839     behavior.off = function() {
33840         if (keybinding) {
33841             d3_select(document).call(keybinding.off);
33842         }
33843     };
33844
33845
33846     behavior.which = function (_) {
33847         if (!arguments.length) return which;
33848         which = _;
33849         return behavior;
33850     };
33851
33852
33853     return behavior;
33854 }
33855
33856 /**
33857  * The base implementation of `_.invert` and `_.invertBy` which inverts
33858  * `object` with values transformed by `iteratee` and set by `setter`.
33859  *
33860  * @private
33861  * @param {Object} object The object to iterate over.
33862  * @param {Function} setter The function to set `accumulator` values.
33863  * @param {Function} iteratee The iteratee to transform values.
33864  * @param {Object} accumulator The initial inverted object.
33865  * @returns {Function} Returns `accumulator`.
33866  */
33867 function baseInverter(object, setter, iteratee, accumulator) {
33868   baseForOwn(object, function(value, key, object) {
33869     setter(accumulator, iteratee(value), key, object);
33870   });
33871   return accumulator;
33872 }
33873
33874 /**
33875  * Creates a function like `_.invertBy`.
33876  *
33877  * @private
33878  * @param {Function} setter The function to set accumulator values.
33879  * @param {Function} toIteratee The function to resolve iteratees.
33880  * @returns {Function} Returns the new inverter function.
33881  */
33882 function createInverter(setter, toIteratee) {
33883   return function(object, iteratee) {
33884     return baseInverter(object, setter, toIteratee(iteratee), {});
33885   };
33886 }
33887
33888 /**
33889  * Creates an object composed of the inverted keys and values of `object`.
33890  * If `object` contains duplicate values, subsequent values overwrite
33891  * property assignments of previous values.
33892  *
33893  * @static
33894  * @memberOf _
33895  * @since 0.7.0
33896  * @category Object
33897  * @param {Object} object The object to invert.
33898  * @returns {Object} Returns the new inverted object.
33899  * @example
33900  *
33901  * var object = { 'a': 1, 'b': 2, 'c': 1 };
33902  *
33903  * _.invert(object);
33904  * // => { '1': 'c', '2': 'b' }
33905  */
33906 var invert = createInverter(function(result, value, key) {
33907   result[value] = key;
33908 }, constant$13(identity$8));
33909
33910 /**
33911  * Creates an object with the same keys as `object` and values generated
33912  * by running each own enumerable string keyed property of `object` thru
33913  * `iteratee`. The iteratee is invoked with three arguments:
33914  * (value, key, object).
33915  *
33916  * @static
33917  * @memberOf _
33918  * @since 2.4.0
33919  * @category Object
33920  * @param {Object} object The object to iterate over.
33921  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
33922  * @returns {Object} Returns the new mapped object.
33923  * @see _.mapKeys
33924  * @example
33925  *
33926  * var users = {
33927  *   'fred':    { 'user': 'fred',    'age': 40 },
33928  *   'pebbles': { 'user': 'pebbles', 'age': 1 }
33929  * };
33930  *
33931  * _.mapValues(users, function(o) { return o.age; });
33932  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
33933  *
33934  * // The `_.property` iteratee shorthand.
33935  * _.mapValues(users, 'age');
33936  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
33937  */
33938 function mapValues(object, iteratee) {
33939   var result = {};
33940   iteratee = baseIteratee(iteratee, 3);
33941
33942   baseForOwn(object, function(value, key, object) {
33943     baseAssignValue(result, key, iteratee(value, key, object));
33944   });
33945   return result;
33946 }
33947
33948 function behaviorPaste(context) {
33949     var keybinding = d3keybinding('paste');
33950
33951
33952     function doPaste() {
33953         event.preventDefault();
33954
33955         var baseGraph = context.graph(),
33956             mouse = context.mouse(),
33957             projection = context.projection,
33958             viewport = geoExtent$$1(projection.clipExtent()).polygon();
33959
33960         if (!geoPointInPolygon(mouse, viewport)) return;
33961
33962         var extent = geoExtent$$1(),
33963             oldIDs = context.copyIDs(),
33964             oldGraph = context.copyGraph(),
33965             newIDs = [];
33966
33967         if (!oldIDs.length) return;
33968
33969         var action = actionCopyEntities(oldIDs, oldGraph);
33970         context.perform(action);
33971
33972         var copies = action.copies();
33973         var originals = invert(mapValues(copies, 'id'));
33974         for (var id in copies) {
33975             var oldEntity = oldGraph.entity(id),
33976                 newEntity = copies[id];
33977
33978             extent._extend(oldEntity.extent(oldGraph));
33979
33980             // Exclude child nodes from newIDs if their parent way was also copied.
33981             var parents = context.graph().parentWays(newEntity),
33982                 parentCopied = false;
33983             for (var i = 0; i < parents.length; i++) {
33984                 if (originals[parents[i].id]) {
33985                     parentCopied = true;
33986                     break;
33987                 }
33988             }
33989
33990             if (!parentCopied) {
33991                 newIDs.push(newEntity.id);
33992             }
33993         }
33994
33995         // Put pasted objects where mouse pointer is..
33996         var center = projection(extent.center()),
33997             delta = [ mouse[0] - center[0], mouse[1] - center[1] ];
33998
33999         context.perform(actionMove(newIDs, delta, projection));
34000         context.enter(modeMove$$1(context, newIDs, baseGraph));
34001     }
34002
34003
34004     function paste() {
34005         keybinding.on(uiCmd('⌘V'), doPaste);
34006         d3_select(document).call(keybinding);
34007         return paste;
34008     }
34009
34010
34011     paste.off = function() {
34012         d3_select(document).call(keybinding.off);
34013     };
34014
34015
34016     return paste;
34017 }
34018
34019 function behaviorSelect(context) {
34020     var lastMouse = null,
34021         suppressMenu = true,
34022         tolerance = 4,
34023         p1 = null;
34024
34025
34026     function point() {
34027         return d3_mouse(context.container().node());
34028     }
34029
34030
34031     function keydown() {
34032         var e = event;
34033         if (e && e.shiftKey) {
34034             context.surface()
34035                 .classed('behavior-multiselect', true);
34036         }
34037
34038         if (e && e.keyCode === 93) {  // context menu
34039             e.preventDefault();
34040             e.stopPropagation();
34041         }
34042     }
34043
34044
34045     function keyup() {
34046         var e = event;
34047         if (!e || !e.shiftKey) {
34048             context.surface()
34049                 .classed('behavior-multiselect', false);
34050         }
34051
34052
34053         if (e && e.keyCode === 93) {  // context menu
34054             e.preventDefault();
34055             e.stopPropagation();
34056             contextmenu();
34057         }
34058     }
34059
34060
34061     function mousedown() {
34062         if (!p1) p1 = point();
34063         d3_select(window)
34064             .on('mouseup.select', mouseup, true);
34065
34066         var isShowAlways = +context.storage('edit-menu-show-always') === 1;
34067         suppressMenu = !isShowAlways;
34068     }
34069
34070
34071     function mousemove() {
34072         if (event) lastMouse = event;
34073     }
34074
34075
34076     function mouseup() {
34077         click();
34078     }
34079
34080
34081     function contextmenu() {
34082         var e = event;
34083         e.preventDefault();
34084         e.stopPropagation();
34085
34086         if (!+e.clientX && !+e.clientY) {
34087             if (lastMouse) {
34088                 e.sourceEvent = lastMouse;
34089             } else {
34090                 return;
34091             }
34092         }
34093
34094         if (!p1) p1 = point();
34095         suppressMenu = false;
34096         click();
34097     }
34098
34099
34100     function click() {
34101         d3_select(window)
34102             .on('mouseup.select', null, true);
34103
34104         if (!p1) return;
34105         var p2 = point(),
34106             dist = geoEuclideanDistance(p1, p2);
34107
34108         p1 = null;
34109         if (dist > tolerance) {
34110             return;
34111         }
34112
34113         var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node(),
34114             isShowAlways = +context.storage('edit-menu-show-always') === 1,
34115             datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__),
34116             mode = context.mode();
34117
34118
34119         if (datum && datum.type === 'midpoint') {
34120             datum = datum.parents[0];
34121         }
34122
34123         if (!(datum instanceof osmEntity$$1)) {
34124             // clicked nothing..
34125             if (!isMultiselect && mode.id !== 'browse') {
34126                 context.enter(modeBrowse(context));
34127             }
34128
34129         } else {
34130             // clicked an entity..
34131             var selectedIDs = context.selectedIDs();
34132
34133             if (!isMultiselect) {
34134                 if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
34135                     // multiple things already selected, just show the menu...
34136                     mode.suppressMenu(false).reselect();
34137                 } else {
34138                     // select a single thing..
34139                     context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
34140                 }
34141
34142             } else {
34143                 if (selectedIDs.indexOf(datum.id) !== -1) {
34144                     // clicked entity is already in the selectedIDs list..
34145                     if (!suppressMenu && !isShowAlways) {
34146                         // don't deselect clicked entity, just show the menu.
34147                         mode.suppressMenu(false).reselect();
34148                     } else {
34149                         // deselect clicked entity, then reenter select mode or return to browse mode..
34150                         selectedIDs = without(selectedIDs, datum.id);
34151                         context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
34152                     }
34153                 } else {
34154                     // clicked entity is not in the selected list, add it..
34155                     selectedIDs = selectedIDs.concat([datum.id]);
34156                     context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
34157                 }
34158             }
34159         }
34160
34161         // reset for next time..
34162         suppressMenu = true;
34163     }
34164
34165
34166     var behavior = function(selection$$1) {
34167         lastMouse = null;
34168         suppressMenu = true;
34169         p1 = null;
34170
34171         d3_select(window)
34172             .on('keydown.select', keydown)
34173             .on('keyup.select', keyup)
34174             .on('contextmenu.select-window', function() {
34175                 // Edge and IE really like to show the contextmenu on the
34176                 // menubar when user presses a keyboard menu button
34177                 // even after we've already preventdefaulted the key event.
34178                 var e = event;
34179                 if (+e.clientX === 0 && +e.clientY === 0) {
34180                     event.preventDefault();
34181                     event.stopPropagation();
34182                 }
34183             });
34184
34185         selection$$1
34186             .on('mousedown.select', mousedown)
34187             .on('mousemove.select', mousemove)
34188             .on('contextmenu.select', contextmenu);
34189
34190         if (event && event.shiftKey) {
34191             context.surface()
34192                 .classed('behavior-multiselect', true);
34193         }
34194     };
34195
34196
34197     behavior.off = function(selection$$1) {
34198         d3_select(window)
34199             .on('keydown.select', null)
34200             .on('keyup.select', null)
34201             .on('contextmenu.select-window', null)
34202             .on('mouseup.select', null, true);
34203
34204         selection$$1
34205             .on('mousedown.select', null)
34206             .on('mousemove.select', null)
34207             .on('contextmenu.select', null);
34208
34209         context.surface()
34210             .classed('behavior-multiselect', false);
34211     };
34212
34213
34214     return behavior;
34215 }
34216
34217 function d3geoTile() {
34218   var size = [960, 500],
34219       scale = 256,
34220       scaleExtent = [0, 20],
34221       translate = [size[0] / 2, size[1] / 2],
34222       zoomDelta = 0;
34223
34224   function bound(_) {
34225       return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
34226   }
34227
34228   function tile() {
34229     var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
34230         z0 = bound(Math.round(z + zoomDelta)),
34231         k = Math.pow(2, z - z0 + 8),
34232         origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
34233         tiles = [],
34234         cols = d3_range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
34235         rows = d3_range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
34236
34237     rows.forEach(function(y) {
34238       cols.forEach(function(x) {
34239         tiles.push([x, y, z0]);
34240       });
34241     });
34242
34243     tiles.translate = origin;
34244     tiles.scale = k;
34245
34246     return tiles;
34247   }
34248
34249   tile.scaleExtent = function(_) {
34250     if (!arguments.length) return scaleExtent;
34251     scaleExtent = _;
34252     return tile;
34253   };
34254
34255   tile.size = function(_) {
34256     if (!arguments.length) return size;
34257     size = _;
34258     return tile;
34259   };
34260
34261   tile.scale = function(_) {
34262     if (!arguments.length) return scale;
34263     scale = _;
34264     return tile;
34265   };
34266
34267   tile.translate = function(_) {
34268     if (!arguments.length) return translate;
34269     translate = _;
34270     return tile;
34271   };
34272
34273   tile.zoomDelta = function(_) {
34274     if (!arguments.length) return zoomDelta;
34275     zoomDelta = +_;
34276     return tile;
34277   };
34278
34279   return tile;
34280 }
34281
34282 /* global Mapillary:false */
34283 var apibase = 'https://a.mapillary.com/v3/';
34284 var viewercss = 'mapillary-js/mapillary.min.css';
34285 var viewerjs = 'mapillary-js/mapillary.min.js';
34286 var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
34287 var maxResults = 1000;
34288 var tileZoom = 14;
34289 var dispatch$1 = dispatch('loadedImages', 'loadedSigns');
34290 var _mlyCache;
34291 var _mlyClicks;
34292 var _mlySelectedImage;
34293 var _mlySignDefs;
34294 var _mlySignSprite;
34295 var _mlyViewer;
34296
34297
34298 function abortRequest(i) {
34299     i.abort();
34300 }
34301
34302
34303 function nearNullIsland(x, y, z) {
34304     if (z >= 7) {
34305         var center = Math.pow(2, z - 1),
34306             width = Math.pow(2, z - 6),
34307             min$$1 = center - (width / 2),
34308             max$$1 = center + (width / 2) - 1;
34309         return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
34310     }
34311     return false;
34312 }
34313
34314
34315 function maxPageAtZoom(z) {
34316     if (z < 15)   return 2;
34317     if (z === 15) return 5;
34318     if (z === 16) return 10;
34319     if (z === 17) return 20;
34320     if (z === 18) return 40;
34321     if (z > 18)   return 80;
34322 }
34323
34324
34325 function localeTimestamp(s) {
34326     if (!s) return null;
34327     var d = new Date(s);
34328     if (isNaN(d.getTime())) return null;
34329     return d.toLocaleString(undefined, { timeZone: 'UTC' });
34330 }
34331
34332
34333 function getTiles(projection) {
34334     var s = projection.scale() * 2 * Math.PI,
34335         z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
34336         ts = 256 * Math.pow(2, z - tileZoom),
34337         origin = [
34338             s / 2 - projection.translate()[0],
34339             s / 2 - projection.translate()[1]];
34340
34341     return d3geoTile()
34342         .scaleExtent([tileZoom, tileZoom])
34343         .scale(s)
34344         .size(projection.clipExtent()[1])
34345         .translate(projection.translate())()
34346         .map(function(tile) {
34347             var x = tile[0] * ts - origin[0],
34348                 y = tile[1] * ts - origin[1];
34349
34350             return {
34351                 id: tile.toString(),
34352                 xyz: tile,
34353                 extent: geoExtent$$1(
34354                     projection.invert([x, y + ts]),
34355                     projection.invert([x + ts, y])
34356                 )
34357             };
34358         });
34359 }
34360
34361
34362 function loadTiles(which, url, projection) {
34363     var s = projection.scale() * 2 * Math.PI,
34364         currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
34365
34366     var tiles = getTiles(projection).filter(function(t) {
34367             return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
34368         });
34369
34370     filter(which.inflight, function(v, k) {
34371         var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
34372         if (!wanted) delete which.inflight[k];
34373         return !wanted;
34374     }).map(abortRequest);
34375
34376     tiles.forEach(function(tile) {
34377         loadNextTilePage(which, currZoom, url, tile);
34378     });
34379 }
34380
34381
34382 function loadNextTilePage(which, currZoom, url, tile) {
34383     var cache = _mlyCache[which],
34384         rect = tile.extent.rectangle(),
34385         maxPages = maxPageAtZoom(currZoom),
34386         nextPage = cache.nextPage[tile.id] || 0,
34387         nextURL = cache.nextURL[tile.id] || url +
34388             utilQsString({
34389                 per_page: maxResults,
34390                 page: nextPage,
34391                 client_id: clientId,
34392                 bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
34393             });
34394
34395     if (nextPage > maxPages) return;
34396
34397     var id = tile.id + ',' + String(nextPage);
34398     if (cache.loaded[id] || cache.inflight[id]) return;
34399     cache.inflight[id] = d3_request(nextURL)
34400         .mimeType('application/json')
34401         .response(function(xhr) {
34402             var linkHeader = xhr.getResponseHeader('Link');
34403             if (linkHeader) {
34404                 var pagination = parsePagination(xhr.getResponseHeader('Link'));
34405                 if (pagination.next) {
34406                     cache.nextURL[tile.id] = pagination.next;
34407                 }
34408             }
34409             return JSON.parse(xhr.responseText);
34410         })
34411         .get(function(err, data) {
34412             cache.loaded[id] = true;
34413             delete cache.inflight[id];
34414             if (err || !data.features || !data.features.length) return;
34415
34416             var features = data.features.map(function(feature) {
34417                 var loc = feature.geometry.coordinates,
34418                     d;
34419
34420                 if (which === 'images') {
34421                     d = {
34422                         loc: loc,
34423                         key: feature.properties.key,
34424                         ca: feature.properties.ca,
34425                         captured_at: feature.properties.captured_at,
34426                         pano: feature.properties.pano
34427                     };
34428                     cache.forImageKey[d.key] = d;     // cache imageKey -> image
34429
34430                 } else if (which === 'sequences') {
34431                     var sequenceKey = feature.properties.key;
34432                     cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
34433                     feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
34434                         cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
34435                     });
34436                     return false;  // because no `d` data worth loading into an rbush
34437
34438                 } else if (which === 'objects') {
34439                     d = {
34440                         loc: loc,
34441                         key: feature.properties.key,
34442                         value: feature.properties.value,
34443                         package: feature.properties.package,
34444                         detections: feature.properties.detections
34445                     };
34446
34447                     // cache imageKey -> detectionKey
34448                     feature.properties.detections.forEach(function(detection) {
34449                         var imageKey = detection.image_key;
34450                         var detectionKey = detection.detection_key;
34451                         if (!_mlyCache.detections[imageKey]) {
34452                             _mlyCache.detections[imageKey] = {};
34453                         }
34454                         if (!_mlyCache.detections[imageKey][detectionKey]) {
34455                             _mlyCache.detections[imageKey][detectionKey] = {};
34456                         }
34457                     });
34458                 }
34459
34460                 return {
34461                     minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
34462                 };
34463
34464             }).filter(Boolean);
34465
34466             cache.rtree.load(features);
34467
34468             if (which === 'images' || which === 'sequences') {
34469                 dispatch$1.call('loadedImages');
34470             } else if (which === 'objects') {
34471                 dispatch$1.call('loadedSigns');
34472             }
34473
34474             if (data.features.length === maxResults) {  // more pages to load
34475                 cache.nextPage[tile.id] = nextPage + 1;
34476                 loadNextTilePage(which, currZoom, url, tile);
34477             } else {
34478                 cache.nextPage[tile.id] = Infinity;     // no more pages to load
34479             }
34480         });
34481 }
34482
34483 // extract links to pages of API results
34484 function parsePagination(links) {
34485     return links.split(',').map(function(rel) {
34486         var elements = rel.split(';');
34487         if (elements.length === 2) {
34488             return [
34489                 /<(.+)>/.exec(elements[0])[1],
34490                 /rel="(.+)"/.exec(elements[1])[1]
34491                 ];
34492         } else {
34493             return ['',''];
34494         }
34495     }).reduce(function(pagination, val) {
34496         pagination[val[1]] = val[0];
34497         return pagination;
34498     }, {});
34499 }
34500
34501
34502 // partition viewport into `psize` x `psize` regions
34503 function partitionViewport(psize, projection) {
34504     var dimensions = projection.clipExtent()[1];
34505     psize = psize || 16;
34506     var cols = d3_range(0, dimensions[0], psize),
34507         rows = d3_range(0, dimensions[1], psize),
34508         partitions = [];
34509
34510     rows.forEach(function(y) {
34511         cols.forEach(function(x) {
34512             var min$$1 = [x, y + psize],
34513                 max$$1 = [x + psize, y];
34514             partitions.push(
34515                 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
34516         });
34517     });
34518
34519     return partitions;
34520 }
34521
34522
34523 // no more than `limit` results per partition.
34524 function searchLimited(psize, limit, projection, rtree) {
34525     limit = limit || 3;
34526
34527     var partitions = partitionViewport(psize, projection);
34528     var results;
34529
34530     // console.time('previous');
34531     results =  flatten(map$4(partitions, function(extent$$1) {
34532         return rtree.search(extent$$1.bbox())
34533             .slice(0, limit)
34534             .map(function(d) { return d.data; });
34535     }));
34536     // console.timeEnd('previous');
34537
34538     // console.time('new');
34539     // results = partitions.reduce(function(result, extent) {
34540     //     var found = rtree.search(extent.bbox())
34541     //         .map(function(d) { return d.data; })
34542     //         .sort(function(a, b) {
34543     //             return a.loc[1] - b.loc[1];
34544     //             // return a.key.localeCompare(b.key);
34545     //         })
34546     //         .slice(0, limit);
34547
34548     //     return (found.length ? result.concat(found) : result);
34549     // }, []);
34550     // console.timeEnd('new');
34551
34552     return results;
34553 }
34554
34555
34556
34557 var serviceMapillary = {
34558
34559     init: function() {
34560         if (!_mlyCache) {
34561             this.reset();
34562         }
34563
34564         this.event = utilRebind(this, dispatch$1, 'on');
34565     },
34566
34567     reset: function() {
34568         var cache = _mlyCache;
34569
34570         if (cache) {
34571             if (cache.images && cache.images.inflight) {
34572                 forEach(cache.images.inflight, abortRequest);
34573             }
34574             if (cache.objects && cache.objects.inflight) {
34575                 forEach(cache.objects.inflight, abortRequest);
34576             }
34577             if (cache.sequences && cache.sequences.inflight) {
34578                 forEach(cache.sequences.inflight, abortRequest);
34579             }
34580         }
34581
34582         _mlyCache = {
34583             images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
34584             objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
34585             sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} },
34586             detections: {}
34587         };
34588
34589         _mlySelectedImage = null;
34590         _mlyClicks = [];
34591     },
34592
34593
34594     images: function(projection) {
34595         var psize = 16, limit = 3;
34596         return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
34597     },
34598
34599
34600     signs: function(projection) {
34601         var psize = 32, limit = 3;
34602         return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
34603     },
34604
34605
34606     sequences: function(projection) {
34607         var viewport = projection.clipExtent();
34608         var min$$1 = [viewport[0][0], viewport[1][1]];
34609         var max$$1 = [viewport[1][0], viewport[0][1]];
34610         var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
34611         var sequenceKeys = {};
34612
34613         // all sequences for images in viewport
34614         _mlyCache.images.rtree.search(bbox)
34615             .forEach(function(d) {
34616                 var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
34617                 if (sequenceKey) {
34618                     sequenceKeys[sequenceKey] = true;
34619                 }
34620             });
34621
34622         // Return lineStrings for the sequences
34623         return Object.keys(sequenceKeys).map(function(sequenceKey) {
34624             return _mlyCache.sequences.lineString[sequenceKey];
34625         });
34626     },
34627
34628
34629     signsSupported: function() {
34630         var detected = utilDetect();
34631         if (detected.ie) return false;
34632         if ((detected.browser.toLowerCase() === 'safari') && (parseFloat(detected.version) < 10)) return false;
34633         return true;
34634     },
34635
34636
34637     signHTML: function(d) {
34638         if (!_mlySignDefs || !_mlySignSprite) return;
34639         var position = _mlySignDefs[d.value];
34640         if (!position) return '<div></div>';
34641         var iconStyle = [
34642             'background-image:url(' + _mlySignSprite + ')',
34643             'background-repeat:no-repeat',
34644             'height:' + position.height + 'px',
34645             'width:' + position.width + 'px',
34646             'background-position-x:-' + position.x + 'px',
34647             'background-position-y:-' + position.y + 'px',
34648         ];
34649
34650         return '<div style="' + iconStyle.join(';') +'"></div>';
34651     },
34652
34653
34654     loadImages: function(projection) {
34655         loadTiles('images', apibase + 'images?', projection);
34656         loadTiles('sequences', apibase + 'sequences?', projection);
34657     },
34658
34659
34660     loadSigns: function(context, projection) {
34661         // if we are looking at signs, we'll actually need to fetch images too
34662         loadTiles('images', apibase + 'images?', projection);
34663         loadTiles('objects', apibase + 'objects?', projection);
34664
34665         // load traffic sign defs
34666         if (!_mlySignDefs) {
34667             _mlySignSprite = context.asset('img/traffic-signs/traffic-signs.png');
34668             _mlySignDefs = {};
34669             d3_json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
34670                 if (err) return;
34671                 _mlySignDefs = data;
34672             });
34673         }
34674     },
34675
34676
34677     loadViewer: function(context) {
34678         // add mly-wrapper for viewer-js
34679         d3_select('#photoviewer').selectAll('.mly-wrapper')
34680             .data([0])
34681             .enter()
34682             .append('div')
34683             .attr('id', 'mly')
34684             .attr('class', 'photo-wrapper mly-wrapper')
34685             .classed('hide', true);
34686
34687         // load mapillary-viewercss
34688         d3_select('head').selectAll('#mapillary-viewercss')
34689             .data([0])
34690             .enter()
34691             .append('link')
34692             .attr('id', 'mapillary-viewercss')
34693             .attr('rel', 'stylesheet')
34694             .attr('href', context.asset(viewercss));
34695
34696         // load mapillary-viewerjs
34697         d3_select('head').selectAll('#mapillary-viewerjs')
34698             .data([0])
34699             .enter()
34700             .append('script')
34701             .attr('id', 'mapillary-viewerjs')
34702             .attr('src', context.asset(viewerjs));
34703     },
34704
34705
34706     showViewer: function() {
34707         var wrap = d3_select('#photoviewer')
34708             .classed('hide', false);
34709
34710         var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
34711
34712         if (isHidden) {
34713             wrap
34714                 .selectAll('.photo-wrapper:not(.mly-wrapper)')
34715                 .classed('hide', true);
34716
34717             wrap
34718                 .selectAll('.photo-wrapper.mly-wrapper')
34719                 .classed('hide', false);
34720
34721             _mlyViewer.resize();
34722         }
34723
34724         return this;
34725     },
34726
34727
34728     hideViewer: function() {
34729         _mlySelectedImage = null;
34730
34731         var viewer = d3_select('#photoviewer');
34732         if (!viewer.empty()) viewer.datum(null);
34733
34734         viewer
34735             .classed('hide', true)
34736             .selectAll('.photo-wrapper')
34737             .classed('hide', true);
34738
34739         d3_selectAll('.viewfield-group, .sequence, .icon-sign')
34740             .classed('selected', false);
34741
34742         return this.setStyles(null, true);
34743     },
34744
34745
34746     parsePagination: parsePagination,
34747
34748
34749     updateViewer: function(imageKey, context) {
34750         if (!imageKey) return this;
34751
34752         if (!_mlyViewer) {
34753             this.initViewer(imageKey, context);
34754         } else {
34755             _mlyViewer.moveToKey(imageKey);
34756         }
34757
34758         return this;
34759     },
34760
34761
34762     initViewer: function(imageKey, context) {
34763         var that = this;
34764         if (Mapillary && imageKey) {
34765             var opts = {
34766                 baseImageSize: 320,
34767                 component: {
34768                     cover: false,
34769                     keyboard: false,
34770                     tag: true
34771                 }
34772             };
34773
34774             _mlyViewer = new Mapillary.Viewer('mly', clientId, imageKey, opts);
34775             _mlyViewer.on('nodechanged', nodeChanged);
34776         }
34777
34778         // nodeChanged: called after the viewer has changed images and is ready.
34779         //
34780         // There is some logic here to batch up clicks into a _mlyClicks array
34781         // because the user might click on a lot of markers quickly and nodechanged
34782         // may be called out of order asychronously.
34783         //
34784         // Clicks are added to the array in `selectedImage` and removed here.
34785         //
34786         function nodeChanged(node) {
34787             _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
34788
34789             var clicks = _mlyClicks;
34790             var index = clicks.indexOf(node.key);
34791             var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
34792
34793             if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
34794                 clicks.splice(index, 1);   // remove the click
34795                 // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
34796                 // one more time to update the detections and attribution..
34797                 if (node.key === selectedKey) {
34798                     that.selectImage(_mlySelectedImage, node.key, true);
34799                 }
34800             } else {             // `nodechanged` initiated from the Mapillary viewer controls..
34801                 var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
34802                 context.map().centerEase(loc);
34803                 that.selectImage(undefined, node.key, true);
34804             }
34805         }
34806     },
34807
34808
34809     // Pass the image datum itself in `d` or the `imageKey` string.
34810     // This allows images to be selected from places that dont have access
34811     // to the full image datum (like the street signs layer or the js viewer)
34812     selectImage: function(d, imageKey, fromViewer) {
34813         if (!d && imageKey) {
34814             // If the user clicked on something that's not an image marker, we
34815             // might get in here.. Cache lookup can fail, e.g. if the user
34816             // clicked a streetsign, but images are loading slowly asynchronously.
34817             // We'll try to carry on anyway if there is no datum.  There just
34818             // might be a delay before user sees detections, captured_at, etc.
34819             d = _mlyCache.images.forImageKey[imageKey];
34820         }
34821
34822         _mlySelectedImage = d;
34823         var viewer = d3_select('#photoviewer');
34824         if (!viewer.empty()) viewer.datum(d);
34825
34826         imageKey = (d && d.key) || imageKey;
34827         if (!fromViewer && imageKey) {
34828             _mlyClicks.push(imageKey);
34829         }
34830
34831         this.setStyles(null, true);
34832
34833         d3_selectAll('.layer-mapillary-signs .icon-sign')
34834             .classed('selected', function(d) {
34835                 return some(d.detections, function(detection) {
34836                     return detection.image_key === imageKey;
34837                 });
34838             });
34839
34840         if (!d) return this;
34841
34842         // if viewer is just starting up, attribution might not be available yet
34843         var attribution = d3_select('.mapillary-js-dom .Attribution');
34844         var timestamp = localeTimestamp(d.captured_at);
34845         var capturedAt = attribution.selectAll('.captured-at');
34846         if (capturedAt.empty()) {
34847             capturedAt = attribution
34848                 .insert('span', ':last-child')
34849                 .attr('class', 'captured-at');
34850
34851             attribution
34852                 .insert('span', ':last-child')
34853                 .text('|');
34854         }
34855         capturedAt
34856             .text(timestamp);
34857
34858         this.updateDetections(d);
34859
34860         return this;
34861     },
34862
34863
34864     getSelectedImage: function() {
34865         return _mlySelectedImage;
34866     },
34867
34868
34869     getSequenceKeyForImage: function(d) {
34870         var imageKey = d && d.key;
34871         return imageKey && _mlyCache.sequences.forImageKey[imageKey];
34872     },
34873
34874
34875     setStyles: function(hovered, reset) {
34876         if (reset) {  // reset all layers
34877             d3_selectAll('.viewfield-group')
34878                 .classed('highlighted', false)
34879                 .classed('hovered', false)
34880                 .classed('selected', false);
34881
34882             d3_selectAll('.sequence')
34883                 .classed('highlighted', false)
34884                 .classed('selected', false);
34885         }
34886
34887         var hoveredImageKey = hovered && hovered.key;
34888         var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
34889         var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
34890         var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
34891
34892         var viewer = d3_select('#photoviewer');
34893         var selected = viewer.empty() ? undefined : viewer.datum();
34894         var selectedImageKey = selected && selected.key;
34895         var selectedSequenceKey = this.getSequenceKeyForImage(selected);
34896         var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
34897         var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
34898
34899         // highlight sibling viewfields on either the selected or the hovered sequences
34900         var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
34901
34902         d3_selectAll('.layer-mapillary-images .viewfield-group')
34903             .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
34904             .classed('hovered', function(d) { return d.key === hoveredImageKey; })
34905             .classed('selected', function(d) { return d.key === selectedImageKey; });
34906
34907         d3_selectAll('.layer-mapillary-images .sequence')
34908             .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
34909             .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
34910
34911         return this;
34912     },
34913
34914
34915     updateDetections: function(d) {
34916         if (!_mlyViewer) return;
34917
34918         var imageKey = d && d.key;
34919         var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
34920
34921         forEach(detections, function(data, k) {
34922             if (isEmpty(data)) {
34923                 loadDetection(k);
34924             } else {
34925                 var tag = makeTag(data);
34926                 if (tag) {
34927                     var tagComponent = _mlyViewer.getComponent('tag');
34928                     tagComponent.add([tag]);
34929                 }
34930             }
34931         });
34932
34933
34934         function loadDetection(detectionKey) {
34935             var url = apibase + 'detections/'+
34936                 detectionKey + '?' + utilQsString({
34937                     client_id: clientId,
34938                 });
34939
34940             d3_request(url)
34941                 .mimeType('application/json')
34942                 .response(function(xhr) {
34943                     return JSON.parse(xhr.responseText);
34944                 })
34945                 .get(function(err, data) {
34946                     if (!data || !data.properties) return;
34947
34948                     var imageKey = data.properties.image_key;
34949                     _mlyCache.detections[imageKey][detectionKey] = data;
34950
34951                     var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
34952                     if (imageKey === selectedKey) {
34953                         var tag = makeTag(data);
34954                         if (tag) {
34955                             var tagComponent = _mlyViewer.getComponent('tag');
34956                             tagComponent.add([tag]);
34957                         }
34958                     }
34959                 });
34960         }
34961
34962
34963         function makeTag(data) {
34964             var valueParts = data.properties.value.split('--');
34965             if (valueParts.length !== 3) return;
34966
34967             var text = valueParts[1].replace(/-/g, ' ');
34968             var tag;
34969
34970             // Currently only two shapes <Polygon|Point>
34971             if (data.properties.shape.type === 'Polygon') {
34972                 var polygonGeometry = new Mapillary
34973                     .TagComponent
34974                     .PolygonGeometry(data.properties.shape.coordinates[0]);
34975
34976                 tag = new Mapillary.TagComponent.OutlineTag(
34977                     data.properties.key,
34978                     polygonGeometry,
34979                     {
34980                         text: text,
34981                         textColor: 0xffff00,
34982                         lineColor: 0xffff00,
34983                         lineWidth: 2,
34984                         fillColor: 0xffff00,
34985                         fillOpacity: 0.3,
34986                     }
34987                 );
34988
34989             } else if (data.properties.shape.type === 'Point') {
34990                 var pointGeometry = new Mapillary
34991                     .TagComponent
34992                     .PointGeometry(data.properties.shape.coordinates[0]);
34993
34994                 tag = new Mapillary.TagComponent.SpotTag(
34995                     data.properties.key,
34996                     pointGeometry,
34997                     {
34998                         text: text,
34999                         color: 0xffff00,
35000                         textColor: 0xffff00
35001                     }
35002                 );
35003             }
35004
35005             return tag;
35006         }
35007     },
35008
35009
35010     cache: function() {
35011         return _mlyCache;
35012     },
35013
35014
35015     signDefs: function(_) {
35016         if (!arguments.length) return _mlySignDefs;
35017         _mlySignDefs = _;
35018         return this;
35019     }
35020
35021 };
35022
35023 var apibase$1 = 'https://nominatim.openstreetmap.org/';
35024 var inflight = {};
35025 var nominatimCache;
35026
35027
35028 var serviceNominatim = {
35029
35030     init: function() {
35031         inflight = {};
35032         nominatimCache = rbush_1();
35033     },
35034
35035     reset: function() {
35036         forEach(inflight, function(req) { req.abort(); });
35037         inflight = {};
35038         nominatimCache = rbush_1();
35039     },
35040
35041
35042     countryCode: function (location, callback) {
35043         this.reverse(location, function(err, result) {
35044             if (err) {
35045                 return callback(err);
35046             } else if (result.address) {
35047                 return callback(null, result.address.country_code);
35048             } else {
35049                 return callback('Unable to geocode', null);
35050             }
35051         });
35052     },
35053
35054
35055     reverse: function (location, callback) {
35056         var cached = nominatimCache.search(
35057             { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
35058         );
35059
35060         if (cached.length > 0) {
35061             return callback(null, cached[0].data);
35062         }
35063
35064         var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
35065         var url = apibase$1 + 'reverse?' + utilQsString(params);
35066         if (inflight[url]) return;
35067
35068         inflight[url] = d3_json(url, function(err, result) {
35069             delete inflight[url];
35070
35071             if (err) {
35072                 return callback(err);
35073             } else if (result && result.error) {
35074                 return callback(result.error);
35075             }
35076
35077             var extent = geoExtent$$1(location).padByMeters(200);
35078             nominatimCache.insert(assign(extent.bbox(), {data: result}));
35079
35080             callback(null, result);
35081         });
35082     },
35083
35084
35085     search: function (val, callback) {
35086         var searchVal = encodeURIComponent(val);
35087         var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
35088         if (inflight[url]) return;
35089
35090         inflight[url] = d3_json(url, function(err, result) {
35091             delete inflight[url];
35092             callback(err, result);
35093         });
35094     }
35095
35096 };
35097
35098 var apibase$2 = 'http://openstreetcam.org';
35099 var maxResults$1 = 1000;
35100 var tileZoom$1 = 14;
35101 var dispatch$2 = dispatch('loadedImages');
35102 var _oscCache;
35103 var _oscSelectedImage;
35104
35105
35106 function abortRequest$1(i) {
35107     i.abort();
35108 }
35109
35110
35111 function nearNullIsland$1(x, y, z) {
35112     if (z >= 7) {
35113         var center = Math.pow(2, z - 1),
35114             width = Math.pow(2, z - 6),
35115             min$$1 = center - (width / 2),
35116             max$$1 = center + (width / 2) - 1;
35117         return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
35118     }
35119     return false;
35120 }
35121
35122
35123 function maxPageAtZoom$1(z) {
35124     if (z < 15)   return 2;
35125     if (z === 15) return 5;
35126     if (z === 16) return 10;
35127     if (z === 17) return 20;
35128     if (z === 18) return 40;
35129     if (z > 18)   return 80;
35130 }
35131
35132
35133 function getTiles$1(projection) {
35134     var s = projection.scale() * 2 * Math.PI,
35135         z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
35136         ts = 256 * Math.pow(2, z - tileZoom$1),
35137         origin = [
35138             s / 2 - projection.translate()[0],
35139             s / 2 - projection.translate()[1]];
35140
35141     return d3geoTile()
35142         .scaleExtent([tileZoom$1, tileZoom$1])
35143         .scale(s)
35144         .size(projection.clipExtent()[1])
35145         .translate(projection.translate())()
35146         .map(function(tile) {
35147             var x = tile[0] * ts - origin[0],
35148                 y = tile[1] * ts - origin[1];
35149
35150             return {
35151                 id: tile.toString(),
35152                 xyz: tile,
35153                 extent: geoExtent$$1(
35154                     projection.invert([x, y + ts]),
35155                     projection.invert([x + ts, y])
35156                 )
35157             };
35158         });
35159 }
35160
35161
35162 function loadTiles$1(which, url, projection) {
35163     var s = projection.scale() * 2 * Math.PI,
35164         currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
35165
35166     var tiles = getTiles$1(projection).filter(function(t) {
35167             return !nearNullIsland$1(t.xyz[0], t.xyz[1], t.xyz[2]);
35168         });
35169
35170     filter(which.inflight, function(v, k) {
35171         var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
35172         if (!wanted) delete which.inflight[k];
35173         return !wanted;
35174     }).map(abortRequest$1);
35175
35176     tiles.forEach(function(tile) {
35177         loadNextTilePage$1(which, currZoom, url, tile);
35178     });
35179 }
35180
35181
35182 function loadNextTilePage$1(which, currZoom, url, tile) {
35183     var cache = _oscCache[which];
35184     var bbox = tile.extent.bbox();
35185     var maxPages = maxPageAtZoom$1(currZoom);
35186     var nextPage = cache.nextPage[tile.id] || 1;
35187     var params = utilQsString({
35188             ipp: maxResults$1,
35189             page: nextPage,
35190             // client_id: clientId,
35191             bbTopLeft: [bbox.maxY, bbox.minX].join(','),
35192             bbBottomRight: [bbox.minY, bbox.maxX].join(',')
35193         }, true);
35194
35195     if (nextPage > maxPages) return;
35196
35197     var id = tile.id + ',' + String(nextPage);
35198     if (cache.loaded[id] || cache.inflight[id]) return;
35199
35200     cache.inflight[id] = d3_request(url)
35201         .mimeType('application/json')
35202         .header('Content-type', 'application/x-www-form-urlencoded')
35203         .response(function(xhr) { return JSON.parse(xhr.responseText); })
35204         .post(params, function(err, data) {
35205             cache.loaded[id] = true;
35206             delete cache.inflight[id];
35207             if (err || !data.currentPageItems || !data.currentPageItems.length) return;
35208
35209             function localeDateString(s) {
35210                 if (!s) return null;
35211                 var d = new Date(s);
35212                 if (isNaN(d.getTime())) return null;
35213                 return d.toLocaleDateString();
35214             }
35215
35216             var features = data.currentPageItems.map(function(item) {
35217                 var loc = [+item.lng, +item.lat],
35218                     d;
35219
35220                 if (which === 'images') {
35221                     d = {
35222                         loc: loc,
35223                         key: item.id,
35224                         ca: +item.heading,
35225                         captured_at: localeDateString(item.shot_date || item.date_added),
35226                         captured_by: item.username,
35227                         imagePath: item.lth_name,
35228                         sequence_id: item.sequence_id,
35229                         sequence_index: +item.sequence_index
35230                     };
35231
35232                     // cache sequence info
35233                     var seq = _oscCache.sequences[d.sequence_id];
35234                     if (!seq) {
35235                         seq = { rotation: 0, images: [] };
35236                         _oscCache.sequences[d.sequence_id] = seq;
35237                     }
35238                     seq.images[d.sequence_index] = d;
35239                 }
35240
35241                 return {
35242                     minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
35243                 };
35244             });
35245
35246             cache.rtree.load(features);
35247
35248             if (which === 'images') {
35249                 dispatch$2.call('loadedImages');
35250             }
35251
35252             if (data.currentPageItems.length === maxResults$1) {  // more pages to load
35253                 cache.nextPage[tile.id] = nextPage + 1;
35254                 loadNextTilePage$1(which, currZoom, url, tile);
35255             } else {
35256                 cache.nextPage[tile.id] = Infinity;     // no more pages to load
35257             }
35258         });
35259 }
35260
35261
35262 // partition viewport into `psize` x `psize` regions
35263 function partitionViewport$1(psize, projection) {
35264     var dimensions = projection.clipExtent()[1];
35265     psize = psize || 16;
35266     var cols = d3_range(0, dimensions[0], psize),
35267         rows = d3_range(0, dimensions[1], psize),
35268         partitions = [];
35269
35270     rows.forEach(function(y) {
35271         cols.forEach(function(x) {
35272             var min$$1 = [x, y + psize],
35273                 max$$1 = [x + psize, y];
35274             partitions.push(
35275                 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
35276         });
35277     });
35278
35279     return partitions;
35280 }
35281
35282
35283 // no more than `limit` results per partition.
35284 function searchLimited$1(psize, limit, projection, rtree) {
35285     limit = limit || 3;
35286
35287     var partitions = partitionViewport$1(psize, projection);
35288     var results;
35289
35290     results = flatten(map$4(partitions, function(extent$$1) {
35291         return rtree.search(extent$$1.bbox())
35292             .slice(0, limit)
35293             .map(function(d) { return d.data; });
35294     }));
35295     return results;
35296 }
35297
35298
35299
35300 var serviceOpenstreetcam = {
35301
35302     init: function() {
35303         if (!_oscCache) {
35304             this.reset();
35305         }
35306
35307         this.event = utilRebind(this, dispatch$2, 'on');
35308     },
35309
35310     reset: function() {
35311         var cache = _oscCache;
35312
35313         if (cache) {
35314             if (cache.images && cache.images.inflight) {
35315                 forEach(cache.images.inflight, abortRequest$1);
35316             }
35317         }
35318
35319         _oscCache = {
35320             images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
35321             sequences: {}
35322         };
35323
35324         _oscSelectedImage = null;
35325     },
35326
35327
35328     images: function(projection) {
35329         var psize = 16, limit = 3;
35330         return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
35331     },
35332
35333
35334     sequences: function(projection) {
35335         var viewport = projection.clipExtent();
35336         var min$$1 = [viewport[0][0], viewport[1][1]];
35337         var max$$1 = [viewport[1][0], viewport[0][1]];
35338         var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
35339         var sequenceKeys = {};
35340
35341         // all sequences for images in viewport
35342         _oscCache.images.rtree.search(bbox)
35343             .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
35344
35345         // make linestrings from those sequences
35346         var lineStrings = [];
35347         Object.keys(sequenceKeys)
35348             .forEach(function(sequenceKey) {
35349                 var seq = _oscCache.sequences[sequenceKey];
35350                 var images = seq && seq.images;
35351                 if (images) {
35352                     lineStrings.push({
35353                         type: 'LineString',
35354                         coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
35355                         properties: { key: sequenceKey }
35356                     });
35357                 }
35358             });
35359         return lineStrings;
35360     },
35361
35362
35363     loadImages: function(projection) {
35364         var url = apibase$2 + '/1.0/list/nearby-photos/';
35365         loadTiles$1('images', url, projection);
35366     },
35367
35368
35369     loadViewer: function(context) {
35370         var that = this;
35371
35372         // add osc-wrapper
35373         var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
35374             .data([0]);
35375
35376         var wrapEnter = wrap.enter()
35377             .append('div')
35378             .attr('class', 'photo-wrapper osc-wrapper')
35379             .classed('hide', true);
35380
35381         wrapEnter
35382             .append('div')
35383             .attr('class', 'osc-attribution fillD');
35384
35385         var controlsEnter = wrapEnter
35386             .append('div')
35387             .attr('class', 'osc-controls-wrap')
35388             .append('div')
35389             .attr('class', 'osc-controls');
35390
35391         controlsEnter
35392             .append('button')
35393             .on('click.back', step(-1))
35394             .text('◄');
35395
35396         controlsEnter
35397             .append('button')
35398             .on('click.rotate-ccw', rotate(-90))
35399             .text('⤿');
35400
35401         controlsEnter
35402             .append('button')
35403             .on('click.rotate-cw', rotate(90))
35404             .text('⤾');
35405
35406         controlsEnter
35407             .append('button')
35408             .on('click.forward', step(1))
35409             .text('►');
35410
35411
35412         function rotate(deg) {
35413             return function() {
35414                 if (!_oscSelectedImage) return;
35415                 var sequenceKey = _oscSelectedImage.sequence_id;
35416                 var sequence = _oscCache.sequences[sequenceKey];
35417                 if (!sequence) return;
35418
35419                 var r = sequence.rotation || 0;
35420                 r += deg;
35421                 sequence.rotation = r;
35422
35423                 d3_select('#photoviewer .osc-wrapper .osc-image')
35424                     .transition()
35425                     .duration(100)
35426                     .style('transform', 'rotate(' + r + 'deg)');
35427             };
35428         }
35429
35430         function step(stepBy) {
35431             return function() {
35432                 if (!_oscSelectedImage) return;
35433                 var sequenceKey = _oscSelectedImage.sequence_id;
35434                 var sequence = _oscCache.sequences[sequenceKey];
35435                 if (!sequence) return;
35436
35437                 var nextIndex = _oscSelectedImage.sequence_index + stepBy;
35438                 var nextImage = sequence.images[nextIndex];
35439                 if (!nextImage) return;
35440
35441                 context.map().centerEase(nextImage.loc);
35442
35443                 that
35444                     .selectImage(nextImage)
35445                     .updateViewer(nextImage);
35446             };
35447         }
35448     },
35449
35450
35451     showViewer: function() {
35452         var viewer = d3_select('#photoviewer')
35453             .classed('hide', false);
35454
35455         var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
35456
35457         if (isHidden) {
35458             viewer
35459                 .selectAll('.photo-wrapper:not(.osc-wrapper)')
35460                 .classed('hide', true);
35461
35462             viewer
35463                 .selectAll('.photo-wrapper.osc-wrapper')
35464                 .classed('hide', false);
35465         }
35466
35467         return this;
35468     },
35469
35470
35471     hideViewer: function() {
35472         _oscSelectedImage = null;
35473
35474         var viewer = d3_select('#photoviewer');
35475         if (!viewer.empty()) viewer.datum(null);
35476
35477         viewer
35478             .classed('hide', true)
35479             .selectAll('.photo-wrapper')
35480             .classed('hide', true);
35481
35482         d3_selectAll('.viewfield-group, .sequence, .icon-sign')
35483             .classed('selected', false);
35484
35485         return this.setStyles(null, true);
35486     },
35487
35488
35489     updateViewer: function(d) {
35490         var wrap = d3_select('#photoviewer .osc-wrapper');
35491
35492         wrap.selectAll('.osc-image')
35493             .remove();
35494
35495         if (d) {
35496             var sequence = _oscCache.sequences[d.sequence_id];
35497             var r = (sequence && sequence.rotation) || 0;
35498
35499             wrap.append('img')
35500                 .attr('class', 'osc-image')
35501                 .style('transform', 'rotate(' + r + 'deg)')
35502                 .attr('src', apibase$2 + '/' + d.imagePath);
35503
35504             var attribution = wrap.selectAll('.osc-attribution').html('');
35505
35506             if (d.captured_by) {
35507                 attribution
35508                     .append('a')
35509                     .attr('class', 'captured_by')
35510                     .attr('target', '_blank')
35511                     .attr('href', apibase$2 + '/user/' + d.captured_by)
35512                     .text('@' + d.captured_by);
35513
35514                 attribution
35515                     .append('span')
35516                     .text('|');
35517             }
35518
35519             if (d.captured_at) {
35520                 attribution
35521                     .append('span')
35522                     .attr('class', 'captured_at')
35523                     .text(d.captured_at);
35524
35525                 attribution
35526                     .append('span')
35527                     .text('|');
35528             }
35529
35530             attribution
35531                 .append('a')
35532                 .attr('class', 'image_link')
35533                 .attr('target', '_blank')
35534                 .attr('href', apibase$2 + '/details/' + d.sequence_id + '/' + d.sequence_index)
35535                 .text('openstreetcam.org');
35536         }
35537         return this;
35538     },
35539
35540
35541     selectImage: function(d) {
35542         _oscSelectedImage = d;
35543         var viewer = d3_select('#photoviewer');
35544         if (!viewer.empty()) viewer.datum(d);
35545
35546         this.setStyles(null, true);
35547
35548         d3_selectAll('.icon-sign')
35549             .classed('selected', false);
35550
35551         return this;
35552     },
35553
35554
35555     getSelectedImage: function() {
35556         return _oscSelectedImage;
35557     },
35558
35559
35560     getSequenceKeyForImage: function(d) {
35561         return d && d.sequence_id;
35562     },
35563
35564
35565     setStyles: function(hovered, reset) {
35566         if (reset) {  // reset all layers
35567             d3_selectAll('.viewfield-group')
35568                 .classed('highlighted', false)
35569                 .classed('hovered', false)
35570                 .classed('selected', false);
35571
35572             d3_selectAll('.sequence')
35573                 .classed('highlighted', false)
35574                 .classed('selected', false);
35575         }
35576
35577         var hoveredImageKey = hovered && hovered.key;
35578         var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
35579         var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
35580         var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
35581
35582         var viewer = d3_select('#photoviewer');
35583         var selected = viewer.empty() ? undefined : viewer.datum();
35584         var selectedImageKey = selected && selected.key;
35585         var selectedSequenceKey = this.getSequenceKeyForImage(selected);
35586         var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
35587         var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
35588
35589         // highlight sibling viewfields on either the selected or the hovered sequences
35590         var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
35591
35592         d3_selectAll('.layer-openstreetcam-images .viewfield-group')
35593             .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
35594             .classed('hovered', function(d) { return d.key === hoveredImageKey; })
35595             .classed('selected', function(d) { return d.key === selectedImageKey; });
35596
35597         d3_selectAll('.layer-openstreetcam-images .sequence')
35598             .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
35599             .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
35600
35601         return this;
35602     },
35603
35604
35605     cache: function() {
35606         return _oscCache;
35607     }
35608
35609 };
35610
35611 /* Built-in method references for those with the same name as other `lodash` methods. */
35612 var nativeCeil = Math.ceil;
35613 var nativeMax$4 = Math.max;
35614
35615 /**
35616  * Creates an array of elements split into groups the length of `size`.
35617  * If `array` can't be split evenly, the final chunk will be the remaining
35618  * elements.
35619  *
35620  * @static
35621  * @memberOf _
35622  * @since 3.0.0
35623  * @category Array
35624  * @param {Array} array The array to process.
35625  * @param {number} [size=1] The length of each chunk
35626  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
35627  * @returns {Array} Returns the new array of chunks.
35628  * @example
35629  *
35630  * _.chunk(['a', 'b', 'c', 'd'], 2);
35631  * // => [['a', 'b'], ['c', 'd']]
35632  *
35633  * _.chunk(['a', 'b', 'c', 'd'], 3);
35634  * // => [['a', 'b', 'c'], ['d']]
35635  */
35636 function chunk(array, size, guard) {
35637   if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
35638     size = 1;
35639   } else {
35640     size = nativeMax$4(toInteger(size), 0);
35641   }
35642   var length = array == null ? 0 : array.length;
35643   if (!length || size < 1) {
35644     return [];
35645   }
35646   var index = 0,
35647       resIndex = 0,
35648       result = Array(nativeCeil(length / size));
35649
35650   while (index < length) {
35651     result[resIndex++] = baseSlice(array, index, (index += size));
35652   }
35653   return result;
35654 }
35655
35656 var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
35657
35658
35659
35660
35661
35662 function createCommonjsModule(fn, module) {
35663         return module = { exports: {} }, fn(module, module.exports), module.exports;
35664 }
35665
35666 var hashes = createCommonjsModule(function (module, exports) {
35667 /**
35668  * jshashes - https://github.com/h2non/jshashes
35669  * Released under the "New BSD" license
35670  *
35671  * Algorithms specification:
35672  *
35673  * MD5 - http://www.ietf.org/rfc/rfc1321.txt
35674  * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
35675  * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
35676  * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
35677  * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
35678  * HMAC - http://www.ietf.org/rfc/rfc2104.txt
35679  */
35680 (function() {
35681   var Hashes;
35682
35683   function utf8Encode(str) {
35684     var x, y, output = '',
35685       i = -1,
35686       l;
35687
35688     if (str && str.length) {
35689       l = str.length;
35690       while ((i += 1) < l) {
35691         /* Decode utf-16 surrogate pairs */
35692         x = str.charCodeAt(i);
35693         y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
35694         if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
35695           x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
35696           i += 1;
35697         }
35698         /* Encode output as utf-8 */
35699         if (x <= 0x7F) {
35700           output += String.fromCharCode(x);
35701         } else if (x <= 0x7FF) {
35702           output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
35703             0x80 | (x & 0x3F));
35704         } else if (x <= 0xFFFF) {
35705           output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
35706             0x80 | ((x >>> 6) & 0x3F),
35707             0x80 | (x & 0x3F));
35708         } else if (x <= 0x1FFFFF) {
35709           output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
35710             0x80 | ((x >>> 12) & 0x3F),
35711             0x80 | ((x >>> 6) & 0x3F),
35712             0x80 | (x & 0x3F));
35713         }
35714       }
35715     }
35716     return output;
35717   }
35718
35719   function utf8Decode(str) {
35720     var i, ac, c1, c2, c3, arr = [],
35721       l;
35722     i = ac = c1 = c2 = c3 = 0;
35723
35724     if (str && str.length) {
35725       l = str.length;
35726       str += '';
35727
35728       while (i < l) {
35729         c1 = str.charCodeAt(i);
35730         ac += 1;
35731         if (c1 < 128) {
35732           arr[ac] = String.fromCharCode(c1);
35733           i += 1;
35734         } else if (c1 > 191 && c1 < 224) {
35735           c2 = str.charCodeAt(i + 1);
35736           arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
35737           i += 2;
35738         } else {
35739           c2 = str.charCodeAt(i + 1);
35740           c3 = str.charCodeAt(i + 2);
35741           arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
35742           i += 3;
35743         }
35744       }
35745     }
35746     return arr.join('');
35747   }
35748
35749   /**
35750    * Add integers, wrapping at 2^32. This uses 16-bit operations internally
35751    * to work around bugs in some JS interpreters.
35752    */
35753
35754   function safe_add(x, y) {
35755     var lsw = (x & 0xFFFF) + (y & 0xFFFF),
35756       msw = (x >> 16) + (y >> 16) + (lsw >> 16);
35757     return (msw << 16) | (lsw & 0xFFFF);
35758   }
35759
35760   /**
35761    * Bitwise rotate a 32-bit number to the left.
35762    */
35763
35764   function bit_rol(num, cnt) {
35765     return (num << cnt) | (num >>> (32 - cnt));
35766   }
35767
35768   /**
35769    * Convert a raw string to a hex string
35770    */
35771
35772   function rstr2hex(input, hexcase) {
35773     var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
35774       output = '',
35775       x, i = 0,
35776       l = input.length;
35777     for (; i < l; i += 1) {
35778       x = input.charCodeAt(i);
35779       output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
35780     }
35781     return output;
35782   }
35783
35784   /**
35785    * Encode a string as utf-16
35786    */
35787
35788   function binb2rstr(input) {
35789     var i, l = input.length * 32,
35790       output = '';
35791     for (i = 0; i < l; i += 8) {
35792       output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
35793     }
35794     return output;
35795   }
35796
35797   /**
35798    * Convert an array of little-endian words to a string
35799    */
35800
35801   function binl2rstr(input) {
35802     var i, l = input.length * 32,
35803       output = '';
35804     for (i = 0; i < l; i += 8) {
35805       output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
35806     }
35807     return output;
35808   }
35809
35810   /**
35811    * Convert a raw string to an array of little-endian words
35812    * Characters >255 have their high-byte silently ignored.
35813    */
35814
35815   function rstr2binl(input) {
35816     var i, l = input.length * 8,
35817       output = Array(input.length >> 2),
35818       lo = output.length;
35819     for (i = 0; i < lo; i += 1) {
35820       output[i] = 0;
35821     }
35822     for (i = 0; i < l; i += 8) {
35823       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
35824     }
35825     return output;
35826   }
35827
35828   /**
35829    * Convert a raw string to an array of big-endian words
35830    * Characters >255 have their high-byte silently ignored.
35831    */
35832
35833   function rstr2binb(input) {
35834     var i, l = input.length * 8,
35835       output = Array(input.length >> 2),
35836       lo = output.length;
35837     for (i = 0; i < lo; i += 1) {
35838       output[i] = 0;
35839     }
35840     for (i = 0; i < l; i += 8) {
35841       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
35842     }
35843     return output;
35844   }
35845
35846   /**
35847    * Convert a raw string to an arbitrary string encoding
35848    */
35849
35850   function rstr2any(input, encoding) {
35851     var divisor = encoding.length,
35852       remainders = Array(),
35853       i, q, x, ld, quotient, dividend, output, full_length;
35854
35855     /* Convert to an array of 16-bit big-endian values, forming the dividend */
35856     dividend = Array(Math.ceil(input.length / 2));
35857     ld = dividend.length;
35858     for (i = 0; i < ld; i += 1) {
35859       dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
35860     }
35861
35862     /**
35863      * Repeatedly perform a long division. The binary array forms the dividend,
35864      * the length of the encoding is the divisor. Once computed, the quotient
35865      * forms the dividend for the next step. We stop when the dividend is zerHashes.
35866      * All remainders are stored for later use.
35867      */
35868     while (dividend.length > 0) {
35869       quotient = Array();
35870       x = 0;
35871       for (i = 0; i < dividend.length; i += 1) {
35872         x = (x << 16) + dividend[i];
35873         q = Math.floor(x / divisor);
35874         x -= q * divisor;
35875         if (quotient.length > 0 || q > 0) {
35876           quotient[quotient.length] = q;
35877         }
35878       }
35879       remainders[remainders.length] = x;
35880       dividend = quotient;
35881     }
35882
35883     /* Convert the remainders to the output string */
35884     output = '';
35885     for (i = remainders.length - 1; i >= 0; i--) {
35886       output += encoding.charAt(remainders[i]);
35887     }
35888
35889     /* Append leading zero equivalents */
35890     full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
35891     for (i = output.length; i < full_length; i += 1) {
35892       output = encoding[0] + output;
35893     }
35894     return output;
35895   }
35896
35897   /**
35898    * Convert a raw string to a base-64 string
35899    */
35900
35901   function rstr2b64(input, b64pad) {
35902     var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
35903       output = '',
35904       len = input.length,
35905       i, j, triplet;
35906     b64pad = b64pad || '=';
35907     for (i = 0; i < len; i += 3) {
35908       triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
35909       for (j = 0; j < 4; j += 1) {
35910         if (i * 8 + j * 6 > input.length * 8) {
35911           output += b64pad;
35912         } else {
35913           output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
35914         }
35915       }
35916     }
35917     return output;
35918   }
35919
35920   Hashes = {
35921     /**
35922      * @property {String} version
35923      * @readonly
35924      */
35925     VERSION: '1.0.6',
35926     /**
35927      * @member Hashes
35928      * @class Base64
35929      * @constructor
35930      */
35931     Base64: function() {
35932       // private properties
35933       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
35934         pad = '=', // default pad according with the RFC standard
35935         url = false, // URL encoding support @todo
35936         utf8 = true; // by default enable UTF-8 support encoding
35937
35938       // public method for encoding
35939       this.encode = function(input) {
35940         var i, j, triplet,
35941           output = '',
35942           len = input.length;
35943
35944         pad = pad || '=';
35945         input = (utf8) ? utf8Encode(input) : input;
35946
35947         for (i = 0; i < len; i += 3) {
35948           triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
35949           for (j = 0; j < 4; j += 1) {
35950             if (i * 8 + j * 6 > len * 8) {
35951               output += pad;
35952             } else {
35953               output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
35954             }
35955           }
35956         }
35957         return output;
35958       };
35959
35960       // public method for decoding
35961       this.decode = function(input) {
35962         // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
35963         var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
35964           dec = '',
35965           arr = [];
35966         if (!input) {
35967           return input;
35968         }
35969
35970         i = ac = 0;
35971         input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
35972         //input += '';
35973
35974         do { // unpack four hexets into three octets using index points in b64
35975           h1 = tab.indexOf(input.charAt(i += 1));
35976           h2 = tab.indexOf(input.charAt(i += 1));
35977           h3 = tab.indexOf(input.charAt(i += 1));
35978           h4 = tab.indexOf(input.charAt(i += 1));
35979
35980           bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
35981
35982           o1 = bits >> 16 & 0xff;
35983           o2 = bits >> 8 & 0xff;
35984           o3 = bits & 0xff;
35985           ac += 1;
35986
35987           if (h3 === 64) {
35988             arr[ac] = String.fromCharCode(o1);
35989           } else if (h4 === 64) {
35990             arr[ac] = String.fromCharCode(o1, o2);
35991           } else {
35992             arr[ac] = String.fromCharCode(o1, o2, o3);
35993           }
35994         } while (i < input.length);
35995
35996         dec = arr.join('');
35997         dec = (utf8) ? utf8Decode(dec) : dec;
35998
35999         return dec;
36000       };
36001
36002       // set custom pad string
36003       this.setPad = function(str) {
36004         pad = str || pad;
36005         return this;
36006       };
36007       // set custom tab string characters
36008       this.setTab = function(str) {
36009         tab = str || tab;
36010         return this;
36011       };
36012       this.setUTF8 = function(bool) {
36013         if (typeof bool === 'boolean') {
36014           utf8 = bool;
36015         }
36016         return this;
36017       };
36018     },
36019
36020     /**
36021      * CRC-32 calculation
36022      * @member Hashes
36023      * @method CRC32
36024      * @static
36025      * @param {String} str Input String
36026      * @return {String}
36027      */
36028     CRC32: function(str) {
36029       var crc = 0,
36030         x = 0,
36031         y = 0,
36032         table, i, iTop;
36033       str = utf8Encode(str);
36034
36035       table = [
36036         '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
36037         '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
36038         '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
36039         '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
36040         'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
36041         '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
36042         'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
36043         '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
36044         'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
36045         '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
36046         'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
36047         '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
36048         'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
36049         '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
36050         '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
36051         '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
36052         '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
36053         'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
36054         '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
36055         'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
36056         '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
36057         'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
36058         '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
36059         'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
36060         '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
36061         'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
36062       ].join('');
36063
36064       crc = crc ^ (-1);
36065       for (i = 0, iTop = str.length; i < iTop; i += 1) {
36066         y = (crc ^ str.charCodeAt(i)) & 0xFF;
36067         x = '0x' + table.substr(y * 9, 8);
36068         crc = (crc >>> 8) ^ x;
36069       }
36070       // always return a positive number (that's what >>> 0 does)
36071       return (crc ^ (-1)) >>> 0;
36072     },
36073     /**
36074      * @member Hashes
36075      * @class MD5
36076      * @constructor
36077      * @param {Object} [config]
36078      *
36079      * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
36080      * Digest Algorithm, as defined in RFC 1321.
36081      * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
36082      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36083      * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
36084      */
36085     MD5: function(options) {
36086       /**
36087        * Private config properties. You may need to tweak these to be compatible with
36088        * the server-side, but the defaults work in most cases.
36089        * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
36090        */
36091       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
36092         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
36093         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
36094
36095       // privileged (public) methods
36096       this.hex = function(s) {
36097         return rstr2hex(rstr(s, utf8), hexcase);
36098       };
36099       this.b64 = function(s) {
36100         return rstr2b64(rstr(s), b64pad);
36101       };
36102       this.any = function(s, e) {
36103         return rstr2any(rstr(s, utf8), e);
36104       };
36105       this.raw = function(s) {
36106         return rstr(s, utf8);
36107       };
36108       this.hex_hmac = function(k, d) {
36109         return rstr2hex(rstr_hmac(k, d), hexcase);
36110       };
36111       this.b64_hmac = function(k, d) {
36112         return rstr2b64(rstr_hmac(k, d), b64pad);
36113       };
36114       this.any_hmac = function(k, d, e) {
36115         return rstr2any(rstr_hmac(k, d), e);
36116       };
36117       /**
36118        * Perform a simple self-test to see if the VM is working
36119        * @return {String} Hexadecimal hash sample
36120        */
36121       this.vm_test = function() {
36122         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36123       };
36124       /**
36125        * Enable/disable uppercase hexadecimal returned string
36126        * @param {Boolean}
36127        * @return {Object} this
36128        */
36129       this.setUpperCase = function(a) {
36130         if (typeof a === 'boolean') {
36131           hexcase = a;
36132         }
36133         return this;
36134       };
36135       /**
36136        * Defines a base64 pad string
36137        * @param {String} Pad
36138        * @return {Object} this
36139        */
36140       this.setPad = function(a) {
36141         b64pad = a || b64pad;
36142         return this;
36143       };
36144       /**
36145        * Defines a base64 pad string
36146        * @param {Boolean}
36147        * @return {Object} [this]
36148        */
36149       this.setUTF8 = function(a) {
36150         if (typeof a === 'boolean') {
36151           utf8 = a;
36152         }
36153         return this;
36154       };
36155
36156       // private methods
36157
36158       /**
36159        * Calculate the MD5 of a raw string
36160        */
36161
36162       function rstr(s) {
36163         s = (utf8) ? utf8Encode(s) : s;
36164         return binl2rstr(binl(rstr2binl(s), s.length * 8));
36165       }
36166
36167       /**
36168        * Calculate the HMAC-MD5, of a key and some data (raw strings)
36169        */
36170
36171       function rstr_hmac(key, data) {
36172         var bkey, ipad, opad, hash, i;
36173
36174         key = (utf8) ? utf8Encode(key) : key;
36175         data = (utf8) ? utf8Encode(data) : data;
36176         bkey = rstr2binl(key);
36177         if (bkey.length > 16) {
36178           bkey = binl(bkey, key.length * 8);
36179         }
36180
36181         ipad = Array(16), opad = Array(16);
36182         for (i = 0; i < 16; i += 1) {
36183           ipad[i] = bkey[i] ^ 0x36363636;
36184           opad[i] = bkey[i] ^ 0x5C5C5C5C;
36185         }
36186         hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
36187         return binl2rstr(binl(opad.concat(hash), 512 + 128));
36188       }
36189
36190       /**
36191        * Calculate the MD5 of an array of little-endian words, and a bit length.
36192        */
36193
36194       function binl(x, len) {
36195         var i, olda, oldb, oldc, oldd,
36196           a = 1732584193,
36197           b = -271733879,
36198           c = -1732584194,
36199           d = 271733878;
36200
36201         /* append padding */
36202         x[len >> 5] |= 0x80 << ((len) % 32);
36203         x[(((len + 64) >>> 9) << 4) + 14] = len;
36204
36205         for (i = 0; i < x.length; i += 16) {
36206           olda = a;
36207           oldb = b;
36208           oldc = c;
36209           oldd = d;
36210
36211           a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
36212           d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
36213           c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
36214           b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
36215           a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
36216           d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
36217           c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
36218           b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
36219           a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
36220           d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
36221           c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
36222           b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
36223           a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
36224           d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
36225           c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
36226           b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
36227
36228           a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
36229           d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
36230           c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
36231           b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
36232           a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
36233           d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
36234           c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
36235           b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
36236           a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
36237           d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
36238           c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
36239           b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
36240           a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
36241           d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
36242           c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
36243           b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
36244
36245           a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
36246           d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
36247           c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
36248           b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
36249           a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
36250           d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
36251           c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
36252           b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
36253           a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
36254           d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
36255           c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
36256           b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
36257           a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
36258           d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
36259           c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
36260           b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
36261
36262           a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
36263           d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
36264           c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
36265           b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
36266           a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
36267           d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
36268           c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
36269           b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
36270           a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
36271           d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
36272           c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
36273           b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
36274           a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
36275           d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
36276           c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
36277           b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
36278
36279           a = safe_add(a, olda);
36280           b = safe_add(b, oldb);
36281           c = safe_add(c, oldc);
36282           d = safe_add(d, oldd);
36283         }
36284         return Array(a, b, c, d);
36285       }
36286
36287       /**
36288        * These functions implement the four basic operations the algorithm uses.
36289        */
36290
36291       function md5_cmn(q, a, b, x, s, t) {
36292         return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
36293       }
36294
36295       function md5_ff(a, b, c, d, x, s, t) {
36296         return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
36297       }
36298
36299       function md5_gg(a, b, c, d, x, s, t) {
36300         return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
36301       }
36302
36303       function md5_hh(a, b, c, d, x, s, t) {
36304         return md5_cmn(b ^ c ^ d, a, b, x, s, t);
36305       }
36306
36307       function md5_ii(a, b, c, d, x, s, t) {
36308         return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
36309       }
36310     },
36311     /**
36312      * @member Hashes
36313      * @class Hashes.SHA1
36314      * @param {Object} [config]
36315      * @constructor
36316      *
36317      * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
36318      * Version 2.2 Copyright Paul Johnston 2000 - 2009.
36319      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36320      * See http://pajhome.org.uk/crypt/md5 for details.
36321      */
36322     SHA1: function(options) {
36323       /**
36324        * Private config properties. You may need to tweak these to be compatible with
36325        * the server-side, but the defaults work in most cases.
36326        * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
36327        */
36328       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
36329         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
36330         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
36331
36332       // public methods
36333       this.hex = function(s) {
36334         return rstr2hex(rstr(s, utf8), hexcase);
36335       };
36336       this.b64 = function(s) {
36337         return rstr2b64(rstr(s, utf8), b64pad);
36338       };
36339       this.any = function(s, e) {
36340         return rstr2any(rstr(s, utf8), e);
36341       };
36342       this.raw = function(s) {
36343         return rstr(s, utf8);
36344       };
36345       this.hex_hmac = function(k, d) {
36346         return rstr2hex(rstr_hmac(k, d));
36347       };
36348       this.b64_hmac = function(k, d) {
36349         return rstr2b64(rstr_hmac(k, d), b64pad);
36350       };
36351       this.any_hmac = function(k, d, e) {
36352         return rstr2any(rstr_hmac(k, d), e);
36353       };
36354       /**
36355        * Perform a simple self-test to see if the VM is working
36356        * @return {String} Hexadecimal hash sample
36357        * @public
36358        */
36359       this.vm_test = function() {
36360         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36361       };
36362       /**
36363        * @description Enable/disable uppercase hexadecimal returned string
36364        * @param {boolean}
36365        * @return {Object} this
36366        * @public
36367        */
36368       this.setUpperCase = function(a) {
36369         if (typeof a === 'boolean') {
36370           hexcase = a;
36371         }
36372         return this;
36373       };
36374       /**
36375        * @description Defines a base64 pad string
36376        * @param {string} Pad
36377        * @return {Object} this
36378        * @public
36379        */
36380       this.setPad = function(a) {
36381         b64pad = a || b64pad;
36382         return this;
36383       };
36384       /**
36385        * @description Defines a base64 pad string
36386        * @param {boolean}
36387        * @return {Object} this
36388        * @public
36389        */
36390       this.setUTF8 = function(a) {
36391         if (typeof a === 'boolean') {
36392           utf8 = a;
36393         }
36394         return this;
36395       };
36396
36397       // private methods
36398
36399       /**
36400        * Calculate the SHA-512 of a raw string
36401        */
36402
36403       function rstr(s) {
36404         s = (utf8) ? utf8Encode(s) : s;
36405         return binb2rstr(binb(rstr2binb(s), s.length * 8));
36406       }
36407
36408       /**
36409        * Calculate the HMAC-SHA1 of a key and some data (raw strings)
36410        */
36411
36412       function rstr_hmac(key, data) {
36413         var bkey, ipad, opad, i, hash;
36414         key = (utf8) ? utf8Encode(key) : key;
36415         data = (utf8) ? utf8Encode(data) : data;
36416         bkey = rstr2binb(key);
36417
36418         if (bkey.length > 16) {
36419           bkey = binb(bkey, key.length * 8);
36420         }
36421         ipad = Array(16), opad = Array(16);
36422         for (i = 0; i < 16; i += 1) {
36423           ipad[i] = bkey[i] ^ 0x36363636;
36424           opad[i] = bkey[i] ^ 0x5C5C5C5C;
36425         }
36426         hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
36427         return binb2rstr(binb(opad.concat(hash), 512 + 160));
36428       }
36429
36430       /**
36431        * Calculate the SHA-1 of an array of big-endian words, and a bit length
36432        */
36433
36434       function binb(x, len) {
36435         var i, j, t, olda, oldb, oldc, oldd, olde,
36436           w = Array(80),
36437           a = 1732584193,
36438           b = -271733879,
36439           c = -1732584194,
36440           d = 271733878,
36441           e = -1009589776;
36442
36443         /* append padding */
36444         x[len >> 5] |= 0x80 << (24 - len % 32);
36445         x[((len + 64 >> 9) << 4) + 15] = len;
36446
36447         for (i = 0; i < x.length; i += 16) {
36448           olda = a;
36449           oldb = b;
36450           oldc = c;
36451           oldd = d;
36452           olde = e;
36453
36454           for (j = 0; j < 80; j += 1) {
36455             if (j < 16) {
36456               w[j] = x[i + j];
36457             } else {
36458               w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
36459             }
36460             t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
36461               safe_add(safe_add(e, w[j]), sha1_kt(j)));
36462             e = d;
36463             d = c;
36464             c = bit_rol(b, 30);
36465             b = a;
36466             a = t;
36467           }
36468
36469           a = safe_add(a, olda);
36470           b = safe_add(b, oldb);
36471           c = safe_add(c, oldc);
36472           d = safe_add(d, oldd);
36473           e = safe_add(e, olde);
36474         }
36475         return Array(a, b, c, d, e);
36476       }
36477
36478       /**
36479        * Perform the appropriate triplet combination function for the current
36480        * iteration
36481        */
36482
36483       function sha1_ft(t, b, c, d) {
36484         if (t < 20) {
36485           return (b & c) | ((~b) & d);
36486         }
36487         if (t < 40) {
36488           return b ^ c ^ d;
36489         }
36490         if (t < 60) {
36491           return (b & c) | (b & d) | (c & d);
36492         }
36493         return b ^ c ^ d;
36494       }
36495
36496       /**
36497        * Determine the appropriate additive constant for the current iteration
36498        */
36499
36500       function sha1_kt(t) {
36501         return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
36502           (t < 60) ? -1894007588 : -899497514;
36503       }
36504     },
36505     /**
36506      * @class Hashes.SHA256
36507      * @param {config}
36508      *
36509      * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
36510      * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
36511      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36512      * See http://pajhome.org.uk/crypt/md5 for details.
36513      * Also http://anmar.eu.org/projects/jssha2/
36514      */
36515     SHA256: function(options) {
36516       /**
36517        * Private properties configuration variables. You may need to tweak these to be compatible with
36518        * the server-side, but the defaults work in most cases.
36519        * @see this.setUpperCase() method
36520        * @see this.setPad() method
36521        */
36522       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
36523         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
36524         /* base-64 pad character. Default '=' for strict RFC compliance   */
36525         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
36526         /* enable/disable utf8 encoding */
36527         sha256_K;
36528
36529       /* privileged (public) methods */
36530       this.hex = function(s) {
36531         return rstr2hex(rstr(s, utf8));
36532       };
36533       this.b64 = function(s) {
36534         return rstr2b64(rstr(s, utf8), b64pad);
36535       };
36536       this.any = function(s, e) {
36537         return rstr2any(rstr(s, utf8), e);
36538       };
36539       this.raw = function(s) {
36540         return rstr(s, utf8);
36541       };
36542       this.hex_hmac = function(k, d) {
36543         return rstr2hex(rstr_hmac(k, d));
36544       };
36545       this.b64_hmac = function(k, d) {
36546         return rstr2b64(rstr_hmac(k, d), b64pad);
36547       };
36548       this.any_hmac = function(k, d, e) {
36549         return rstr2any(rstr_hmac(k, d), e);
36550       };
36551       /**
36552        * Perform a simple self-test to see if the VM is working
36553        * @return {String} Hexadecimal hash sample
36554        * @public
36555        */
36556       this.vm_test = function() {
36557         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36558       };
36559       /**
36560        * Enable/disable uppercase hexadecimal returned string
36561        * @param {boolean}
36562        * @return {Object} this
36563        * @public
36564        */
36565       this.setUpperCase = function(a) {
36566         if (typeof a === 'boolean') {
36567           hexcase = a;
36568         }
36569         return this;
36570       };
36571       /**
36572        * @description Defines a base64 pad string
36573        * @param {string} Pad
36574        * @return {Object} this
36575        * @public
36576        */
36577       this.setPad = function(a) {
36578         b64pad = a || b64pad;
36579         return this;
36580       };
36581       /**
36582        * Defines a base64 pad string
36583        * @param {boolean}
36584        * @return {Object} this
36585        * @public
36586        */
36587       this.setUTF8 = function(a) {
36588         if (typeof a === 'boolean') {
36589           utf8 = a;
36590         }
36591         return this;
36592       };
36593
36594       // private methods
36595
36596       /**
36597        * Calculate the SHA-512 of a raw string
36598        */
36599
36600       function rstr(s, utf8) {
36601         s = (utf8) ? utf8Encode(s) : s;
36602         return binb2rstr(binb(rstr2binb(s), s.length * 8));
36603       }
36604
36605       /**
36606        * Calculate the HMAC-sha256 of a key and some data (raw strings)
36607        */
36608
36609       function rstr_hmac(key, data) {
36610         key = (utf8) ? utf8Encode(key) : key;
36611         data = (utf8) ? utf8Encode(data) : data;
36612         var hash, i = 0,
36613           bkey = rstr2binb(key),
36614           ipad = Array(16),
36615           opad = Array(16);
36616
36617         if (bkey.length > 16) {
36618           bkey = binb(bkey, key.length * 8);
36619         }
36620
36621         for (; i < 16; i += 1) {
36622           ipad[i] = bkey[i] ^ 0x36363636;
36623           opad[i] = bkey[i] ^ 0x5C5C5C5C;
36624         }
36625
36626         hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
36627         return binb2rstr(binb(opad.concat(hash), 512 + 256));
36628       }
36629
36630       /*
36631        * Main sha256 function, with its support functions
36632        */
36633
36634       function sha256_S(X, n) {
36635         return (X >>> n) | (X << (32 - n));
36636       }
36637
36638       function sha256_R(X, n) {
36639         return (X >>> n);
36640       }
36641
36642       function sha256_Ch(x, y, z) {
36643         return ((x & y) ^ ((~x) & z));
36644       }
36645
36646       function sha256_Maj(x, y, z) {
36647         return ((x & y) ^ (x & z) ^ (y & z));
36648       }
36649
36650       function sha256_Sigma0256(x) {
36651         return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
36652       }
36653
36654       function sha256_Sigma1256(x) {
36655         return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
36656       }
36657
36658       function sha256_Gamma0256(x) {
36659         return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
36660       }
36661
36662       function sha256_Gamma1256(x) {
36663         return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
36664       }
36665
36666       sha256_K = [
36667         1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
36668         1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
36669         264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
36670         113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
36671         1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
36672         430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
36673         1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
36674       ];
36675
36676       function binb(m, l) {
36677         var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
36678           1359893119, -1694144372, 528734635, 1541459225
36679         ];
36680         var W = new Array(64);
36681         var a, b, c, d, e, f, g, h;
36682         var i, j, T1, T2;
36683
36684         /* append padding */
36685         m[l >> 5] |= 0x80 << (24 - l % 32);
36686         m[((l + 64 >> 9) << 4) + 15] = l;
36687
36688         for (i = 0; i < m.length; i += 16) {
36689           a = HASH[0];
36690           b = HASH[1];
36691           c = HASH[2];
36692           d = HASH[3];
36693           e = HASH[4];
36694           f = HASH[5];
36695           g = HASH[6];
36696           h = HASH[7];
36697
36698           for (j = 0; j < 64; j += 1) {
36699             if (j < 16) {
36700               W[j] = m[j + i];
36701             } else {
36702               W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
36703                 sha256_Gamma0256(W[j - 15])), W[j - 16]);
36704             }
36705
36706             T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
36707               sha256_K[j]), W[j]);
36708             T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
36709             h = g;
36710             g = f;
36711             f = e;
36712             e = safe_add(d, T1);
36713             d = c;
36714             c = b;
36715             b = a;
36716             a = safe_add(T1, T2);
36717           }
36718
36719           HASH[0] = safe_add(a, HASH[0]);
36720           HASH[1] = safe_add(b, HASH[1]);
36721           HASH[2] = safe_add(c, HASH[2]);
36722           HASH[3] = safe_add(d, HASH[3]);
36723           HASH[4] = safe_add(e, HASH[4]);
36724           HASH[5] = safe_add(f, HASH[5]);
36725           HASH[6] = safe_add(g, HASH[6]);
36726           HASH[7] = safe_add(h, HASH[7]);
36727         }
36728         return HASH;
36729       }
36730
36731     },
36732
36733     /**
36734      * @class Hashes.SHA512
36735      * @param {config}
36736      *
36737      * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
36738      * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
36739      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36740      * See http://pajhome.org.uk/crypt/md5 for details.
36741      */
36742     SHA512: function(options) {
36743       /**
36744        * Private properties configuration variables. You may need to tweak these to be compatible with
36745        * the server-side, but the defaults work in most cases.
36746        * @see this.setUpperCase() method
36747        * @see this.setPad() method
36748        */
36749       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
36750         /* hexadecimal output case format. false - lowercase; true - uppercase  */
36751         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
36752         /* base-64 pad character. Default '=' for strict RFC compliance   */
36753         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
36754         /* enable/disable utf8 encoding */
36755         sha512_k;
36756
36757       /* privileged (public) methods */
36758       this.hex = function(s) {
36759         return rstr2hex(rstr(s));
36760       };
36761       this.b64 = function(s) {
36762         return rstr2b64(rstr(s), b64pad);
36763       };
36764       this.any = function(s, e) {
36765         return rstr2any(rstr(s), e);
36766       };
36767       this.raw = function(s) {
36768         return rstr(s, utf8);
36769       };
36770       this.hex_hmac = function(k, d) {
36771         return rstr2hex(rstr_hmac(k, d));
36772       };
36773       this.b64_hmac = function(k, d) {
36774         return rstr2b64(rstr_hmac(k, d), b64pad);
36775       };
36776       this.any_hmac = function(k, d, e) {
36777         return rstr2any(rstr_hmac(k, d), e);
36778       };
36779       /**
36780        * Perform a simple self-test to see if the VM is working
36781        * @return {String} Hexadecimal hash sample
36782        * @public
36783        */
36784       this.vm_test = function() {
36785         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36786       };
36787       /**
36788        * @description Enable/disable uppercase hexadecimal returned string
36789        * @param {boolean}
36790        * @return {Object} this
36791        * @public
36792        */
36793       this.setUpperCase = function(a) {
36794         if (typeof a === 'boolean') {
36795           hexcase = a;
36796         }
36797         return this;
36798       };
36799       /**
36800        * @description Defines a base64 pad string
36801        * @param {string} Pad
36802        * @return {Object} this
36803        * @public
36804        */
36805       this.setPad = function(a) {
36806         b64pad = a || b64pad;
36807         return this;
36808       };
36809       /**
36810        * @description Defines a base64 pad string
36811        * @param {boolean}
36812        * @return {Object} this
36813        * @public
36814        */
36815       this.setUTF8 = function(a) {
36816         if (typeof a === 'boolean') {
36817           utf8 = a;
36818         }
36819         return this;
36820       };
36821
36822       /* private methods */
36823
36824       /**
36825        * Calculate the SHA-512 of a raw string
36826        */
36827
36828       function rstr(s) {
36829         s = (utf8) ? utf8Encode(s) : s;
36830         return binb2rstr(binb(rstr2binb(s), s.length * 8));
36831       }
36832       /*
36833        * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
36834        */
36835
36836       function rstr_hmac(key, data) {
36837         key = (utf8) ? utf8Encode(key) : key;
36838         data = (utf8) ? utf8Encode(data) : data;
36839
36840         var hash, i = 0,
36841           bkey = rstr2binb(key),
36842           ipad = Array(32),
36843           opad = Array(32);
36844
36845         if (bkey.length > 32) {
36846           bkey = binb(bkey, key.length * 8);
36847         }
36848
36849         for (; i < 32; i += 1) {
36850           ipad[i] = bkey[i] ^ 0x36363636;
36851           opad[i] = bkey[i] ^ 0x5C5C5C5C;
36852         }
36853
36854         hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
36855         return binb2rstr(binb(opad.concat(hash), 1024 + 512));
36856       }
36857
36858       /**
36859        * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
36860        */
36861
36862       function binb(x, len) {
36863         var j, i, l,
36864           W = new Array(80),
36865           hash = new Array(16),
36866           //Initial hash values
36867           H = [
36868             new int64(0x6a09e667, -205731576),
36869             new int64(-1150833019, -2067093701),
36870             new int64(0x3c6ef372, -23791573),
36871             new int64(-1521486534, 0x5f1d36f1),
36872             new int64(0x510e527f, -1377402159),
36873             new int64(-1694144372, 0x2b3e6c1f),
36874             new int64(0x1f83d9ab, -79577749),
36875             new int64(0x5be0cd19, 0x137e2179)
36876           ],
36877           T1 = new int64(0, 0),
36878           T2 = new int64(0, 0),
36879           a = new int64(0, 0),
36880           b = new int64(0, 0),
36881           c = new int64(0, 0),
36882           d = new int64(0, 0),
36883           e = new int64(0, 0),
36884           f = new int64(0, 0),
36885           g = new int64(0, 0),
36886           h = new int64(0, 0),
36887           //Temporary variables not specified by the document
36888           s0 = new int64(0, 0),
36889           s1 = new int64(0, 0),
36890           Ch = new int64(0, 0),
36891           Maj = new int64(0, 0),
36892           r1 = new int64(0, 0),
36893           r2 = new int64(0, 0),
36894           r3 = new int64(0, 0);
36895
36896         if (sha512_k === undefined) {
36897           //SHA512 constants
36898           sha512_k = [
36899             new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
36900             new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
36901             new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
36902             new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
36903             new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
36904             new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
36905             new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
36906             new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
36907             new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
36908             new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
36909             new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
36910             new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
36911             new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
36912             new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
36913             new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
36914             new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
36915             new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
36916             new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
36917             new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
36918             new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
36919             new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
36920             new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
36921             new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
36922             new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
36923             new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
36924             new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
36925             new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
36926             new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
36927             new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
36928             new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
36929             new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
36930             new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
36931             new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
36932             new int64(-354779690, -840897762), new int64(-176337025, -294727304),
36933             new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
36934             new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
36935             new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
36936             new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
36937             new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
36938             new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
36939           ];
36940         }
36941
36942         for (i = 0; i < 80; i += 1) {
36943           W[i] = new int64(0, 0);
36944         }
36945
36946         // append padding to the source string. The format is described in the FIPS.
36947         x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
36948         x[((len + 128 >> 10) << 5) + 31] = len;
36949         l = x.length;
36950         for (i = 0; i < l; i += 32) { //32 dwords is the block size
36951           int64copy(a, H[0]);
36952           int64copy(b, H[1]);
36953           int64copy(c, H[2]);
36954           int64copy(d, H[3]);
36955           int64copy(e, H[4]);
36956           int64copy(f, H[5]);
36957           int64copy(g, H[6]);
36958           int64copy(h, H[7]);
36959
36960           for (j = 0; j < 16; j += 1) {
36961             W[j].h = x[i + 2 * j];
36962             W[j].l = x[i + 2 * j + 1];
36963           }
36964
36965           for (j = 16; j < 80; j += 1) {
36966             //sigma1
36967             int64rrot(r1, W[j - 2], 19);
36968             int64revrrot(r2, W[j - 2], 29);
36969             int64shr(r3, W[j - 2], 6);
36970             s1.l = r1.l ^ r2.l ^ r3.l;
36971             s1.h = r1.h ^ r2.h ^ r3.h;
36972             //sigma0
36973             int64rrot(r1, W[j - 15], 1);
36974             int64rrot(r2, W[j - 15], 8);
36975             int64shr(r3, W[j - 15], 7);
36976             s0.l = r1.l ^ r2.l ^ r3.l;
36977             s0.h = r1.h ^ r2.h ^ r3.h;
36978
36979             int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
36980           }
36981
36982           for (j = 0; j < 80; j += 1) {
36983             //Ch
36984             Ch.l = (e.l & f.l) ^ (~e.l & g.l);
36985             Ch.h = (e.h & f.h) ^ (~e.h & g.h);
36986
36987             //Sigma1
36988             int64rrot(r1, e, 14);
36989             int64rrot(r2, e, 18);
36990             int64revrrot(r3, e, 9);
36991             s1.l = r1.l ^ r2.l ^ r3.l;
36992             s1.h = r1.h ^ r2.h ^ r3.h;
36993
36994             //Sigma0
36995             int64rrot(r1, a, 28);
36996             int64revrrot(r2, a, 2);
36997             int64revrrot(r3, a, 7);
36998             s0.l = r1.l ^ r2.l ^ r3.l;
36999             s0.h = r1.h ^ r2.h ^ r3.h;
37000
37001             //Maj
37002             Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
37003             Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
37004
37005             int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
37006             int64add(T2, s0, Maj);
37007
37008             int64copy(h, g);
37009             int64copy(g, f);
37010             int64copy(f, e);
37011             int64add(e, d, T1);
37012             int64copy(d, c);
37013             int64copy(c, b);
37014             int64copy(b, a);
37015             int64add(a, T1, T2);
37016           }
37017           int64add(H[0], H[0], a);
37018           int64add(H[1], H[1], b);
37019           int64add(H[2], H[2], c);
37020           int64add(H[3], H[3], d);
37021           int64add(H[4], H[4], e);
37022           int64add(H[5], H[5], f);
37023           int64add(H[6], H[6], g);
37024           int64add(H[7], H[7], h);
37025         }
37026
37027         //represent the hash as an array of 32-bit dwords
37028         for (i = 0; i < 8; i += 1) {
37029           hash[2 * i] = H[i].h;
37030           hash[2 * i + 1] = H[i].l;
37031         }
37032         return hash;
37033       }
37034
37035       //A constructor for 64-bit numbers
37036
37037       function int64(h, l) {
37038         this.h = h;
37039         this.l = l;
37040         //this.toString = int64toString;
37041       }
37042
37043       //Copies src into dst, assuming both are 64-bit numbers
37044
37045       function int64copy(dst, src) {
37046         dst.h = src.h;
37047         dst.l = src.l;
37048       }
37049
37050       //Right-rotates a 64-bit number by shift
37051       //Won't handle cases of shift>=32
37052       //The function revrrot() is for that
37053
37054       function int64rrot(dst, x, shift) {
37055         dst.l = (x.l >>> shift) | (x.h << (32 - shift));
37056         dst.h = (x.h >>> shift) | (x.l << (32 - shift));
37057       }
37058
37059       //Reverses the dwords of the source and then rotates right by shift.
37060       //This is equivalent to rotation by 32+shift
37061
37062       function int64revrrot(dst, x, shift) {
37063         dst.l = (x.h >>> shift) | (x.l << (32 - shift));
37064         dst.h = (x.l >>> shift) | (x.h << (32 - shift));
37065       }
37066
37067       //Bitwise-shifts right a 64-bit number by shift
37068       //Won't handle shift>=32, but it's never needed in SHA512
37069
37070       function int64shr(dst, x, shift) {
37071         dst.l = (x.l >>> shift) | (x.h << (32 - shift));
37072         dst.h = (x.h >>> shift);
37073       }
37074
37075       //Adds two 64-bit numbers
37076       //Like the original implementation, does not rely on 32-bit operations
37077
37078       function int64add(dst, x, y) {
37079         var w0 = (x.l & 0xffff) + (y.l & 0xffff);
37080         var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
37081         var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
37082         var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
37083         dst.l = (w0 & 0xffff) | (w1 << 16);
37084         dst.h = (w2 & 0xffff) | (w3 << 16);
37085       }
37086
37087       //Same, except with 4 addends. Works faster than adding them one by one.
37088
37089       function int64add4(dst, a, b, c, d) {
37090         var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
37091         var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
37092         var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
37093         var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
37094         dst.l = (w0 & 0xffff) | (w1 << 16);
37095         dst.h = (w2 & 0xffff) | (w3 << 16);
37096       }
37097
37098       //Same, except with 5 addends
37099
37100       function int64add5(dst, a, b, c, d, e) {
37101         var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
37102           w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
37103           w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
37104           w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
37105         dst.l = (w0 & 0xffff) | (w1 << 16);
37106         dst.h = (w2 & 0xffff) | (w3 << 16);
37107       }
37108     },
37109     /**
37110      * @class Hashes.RMD160
37111      * @constructor
37112      * @param {Object} [config]
37113      *
37114      * A JavaScript implementation of the RIPEMD-160 Algorithm
37115      * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
37116      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
37117      * See http://pajhome.org.uk/crypt/md5 for details.
37118      * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
37119      */
37120     RMD160: function(options) {
37121       /**
37122        * Private properties configuration variables. You may need to tweak these to be compatible with
37123        * the server-side, but the defaults work in most cases.
37124        * @see this.setUpperCase() method
37125        * @see this.setPad() method
37126        */
37127       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
37128         /* hexadecimal output case format. false - lowercase; true - uppercase  */
37129         b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
37130         /* base-64 pad character. Default '=' for strict RFC compliance   */
37131         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
37132         /* enable/disable utf8 encoding */
37133         rmd160_r1 = [
37134           0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
37135           7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
37136           3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
37137           1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
37138           4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
37139         ],
37140         rmd160_r2 = [
37141           5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
37142           6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
37143           15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
37144           8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
37145           12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
37146         ],
37147         rmd160_s1 = [
37148           11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
37149           7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
37150           11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
37151           11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
37152           9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
37153         ],
37154         rmd160_s2 = [
37155           8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
37156           9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
37157           9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
37158           15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
37159           8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
37160         ];
37161
37162       /* privileged (public) methods */
37163       this.hex = function(s) {
37164         return rstr2hex(rstr(s, utf8));
37165       };
37166       this.b64 = function(s) {
37167         return rstr2b64(rstr(s, utf8), b64pad);
37168       };
37169       this.any = function(s, e) {
37170         return rstr2any(rstr(s, utf8), e);
37171       };
37172       this.raw = function(s) {
37173         return rstr(s, utf8);
37174       };
37175       this.hex_hmac = function(k, d) {
37176         return rstr2hex(rstr_hmac(k, d));
37177       };
37178       this.b64_hmac = function(k, d) {
37179         return rstr2b64(rstr_hmac(k, d), b64pad);
37180       };
37181       this.any_hmac = function(k, d, e) {
37182         return rstr2any(rstr_hmac(k, d), e);
37183       };
37184       /**
37185        * Perform a simple self-test to see if the VM is working
37186        * @return {String} Hexadecimal hash sample
37187        * @public
37188        */
37189       this.vm_test = function() {
37190         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37191       };
37192       /**
37193        * @description Enable/disable uppercase hexadecimal returned string
37194        * @param {boolean}
37195        * @return {Object} this
37196        * @public
37197        */
37198       this.setUpperCase = function(a) {
37199         if (typeof a === 'boolean') {
37200           hexcase = a;
37201         }
37202         return this;
37203       };
37204       /**
37205        * @description Defines a base64 pad string
37206        * @param {string} Pad
37207        * @return {Object} this
37208        * @public
37209        */
37210       this.setPad = function(a) {
37211         if (typeof a !== 'undefined') {
37212           b64pad = a;
37213         }
37214         return this;
37215       };
37216       /**
37217        * @description Defines a base64 pad string
37218        * @param {boolean}
37219        * @return {Object} this
37220        * @public
37221        */
37222       this.setUTF8 = function(a) {
37223         if (typeof a === 'boolean') {
37224           utf8 = a;
37225         }
37226         return this;
37227       };
37228
37229       /* private methods */
37230
37231       /**
37232        * Calculate the rmd160 of a raw string
37233        */
37234
37235       function rstr(s) {
37236         s = (utf8) ? utf8Encode(s) : s;
37237         return binl2rstr(binl(rstr2binl(s), s.length * 8));
37238       }
37239
37240       /**
37241        * Calculate the HMAC-rmd160 of a key and some data (raw strings)
37242        */
37243
37244       function rstr_hmac(key, data) {
37245         key = (utf8) ? utf8Encode(key) : key;
37246         data = (utf8) ? utf8Encode(data) : data;
37247         var i, hash,
37248           bkey = rstr2binl(key),
37249           ipad = Array(16),
37250           opad = Array(16);
37251
37252         if (bkey.length > 16) {
37253           bkey = binl(bkey, key.length * 8);
37254         }
37255
37256         for (i = 0; i < 16; i += 1) {
37257           ipad[i] = bkey[i] ^ 0x36363636;
37258           opad[i] = bkey[i] ^ 0x5C5C5C5C;
37259         }
37260         hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
37261         return binl2rstr(binl(opad.concat(hash), 512 + 160));
37262       }
37263
37264       /**
37265        * Convert an array of little-endian words to a string
37266        */
37267
37268       function binl2rstr(input) {
37269         var i, output = '',
37270           l = input.length * 32;
37271         for (i = 0; i < l; i += 8) {
37272           output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
37273         }
37274         return output;
37275       }
37276
37277       /**
37278        * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
37279        */
37280
37281       function binl(x, len) {
37282         var T, j, i, l,
37283           h0 = 0x67452301,
37284           h1 = 0xefcdab89,
37285           h2 = 0x98badcfe,
37286           h3 = 0x10325476,
37287           h4 = 0xc3d2e1f0,
37288           A1, B1, C1, D1, E1,
37289           A2, B2, C2, D2, E2;
37290
37291         /* append padding */
37292         x[len >> 5] |= 0x80 << (len % 32);
37293         x[(((len + 64) >>> 9) << 4) + 14] = len;
37294         l = x.length;
37295
37296         for (i = 0; i < l; i += 16) {
37297           A1 = A2 = h0;
37298           B1 = B2 = h1;
37299           C1 = C2 = h2;
37300           D1 = D2 = h3;
37301           E1 = E2 = h4;
37302           for (j = 0; j <= 79; j += 1) {
37303             T = safe_add(A1, rmd160_f(j, B1, C1, D1));
37304             T = safe_add(T, x[i + rmd160_r1[j]]);
37305             T = safe_add(T, rmd160_K1(j));
37306             T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
37307             A1 = E1;
37308             E1 = D1;
37309             D1 = bit_rol(C1, 10);
37310             C1 = B1;
37311             B1 = T;
37312             T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
37313             T = safe_add(T, x[i + rmd160_r2[j]]);
37314             T = safe_add(T, rmd160_K2(j));
37315             T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
37316             A2 = E2;
37317             E2 = D2;
37318             D2 = bit_rol(C2, 10);
37319             C2 = B2;
37320             B2 = T;
37321           }
37322
37323           T = safe_add(h1, safe_add(C1, D2));
37324           h1 = safe_add(h2, safe_add(D1, E2));
37325           h2 = safe_add(h3, safe_add(E1, A2));
37326           h3 = safe_add(h4, safe_add(A1, B2));
37327           h4 = safe_add(h0, safe_add(B1, C2));
37328           h0 = T;
37329         }
37330         return [h0, h1, h2, h3, h4];
37331       }
37332
37333       // specific algorithm methods
37334
37335       function rmd160_f(j, x, y, z) {
37336         return (0 <= j && j <= 15) ? (x ^ y ^ z) :
37337           (16 <= j && j <= 31) ? (x & y) | (~x & z) :
37338           (32 <= j && j <= 47) ? (x | ~y) ^ z :
37339           (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
37340           (64 <= j && j <= 79) ? x ^ (y | ~z) :
37341           'rmd160_f: j out of range';
37342       }
37343
37344       function rmd160_K1(j) {
37345         return (0 <= j && j <= 15) ? 0x00000000 :
37346           (16 <= j && j <= 31) ? 0x5a827999 :
37347           (32 <= j && j <= 47) ? 0x6ed9eba1 :
37348           (48 <= j && j <= 63) ? 0x8f1bbcdc :
37349           (64 <= j && j <= 79) ? 0xa953fd4e :
37350           'rmd160_K1: j out of range';
37351       }
37352
37353       function rmd160_K2(j) {
37354         return (0 <= j && j <= 15) ? 0x50a28be6 :
37355           (16 <= j && j <= 31) ? 0x5c4dd124 :
37356           (32 <= j && j <= 47) ? 0x6d703ef3 :
37357           (48 <= j && j <= 63) ? 0x7a6d76e9 :
37358           (64 <= j && j <= 79) ? 0x00000000 :
37359           'rmd160_K2: j out of range';
37360       }
37361     }
37362   };
37363
37364   // exposes Hashes
37365   (function(window, undefined) {
37366     var freeExports = false;
37367     {
37368       freeExports = exports;
37369       if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
37370         window = commonjsGlobal;
37371       }
37372     }
37373
37374     if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
37375       // define as an anonymous module, so, through path mapping, it can be aliased
37376       undefined(function() {
37377         return Hashes;
37378       });
37379     } else if (freeExports) {
37380       // in Node.js or RingoJS v0.8.0+
37381       if ('object' === 'object' && module && module.exports === freeExports) {
37382         module.exports = Hashes;
37383       }
37384       // in Narwhal or RingoJS v0.7.0-
37385       else {
37386         freeExports.Hashes = Hashes;
37387       }
37388     } else {
37389       // in a browser or Rhino
37390       window.Hashes = Hashes;
37391     }
37392   }(this));
37393 }()); // IIFE
37394 });
37395
37396 var immutable = extend$2;
37397
37398 var hasOwnProperty$16 = Object.prototype.hasOwnProperty;
37399
37400 function extend$2() {
37401     var target = {};
37402
37403     for (var i = 0; i < arguments.length; i++) {
37404         var source = arguments[i];
37405
37406         for (var key in source) {
37407             if (hasOwnProperty$16.call(source, key)) {
37408                 target[key] = source[key];
37409             }
37410         }
37411     }
37412
37413     return target
37414 }
37415
37416 var sha1 = new hashes.SHA1();
37417
37418 var ohauth = {};
37419
37420 ohauth.qsString = function(obj) {
37421     return Object.keys(obj).sort().map(function(key) {
37422         return ohauth.percentEncode(key) + '=' +
37423             ohauth.percentEncode(obj[key]);
37424     }).join('&');
37425 };
37426
37427 ohauth.stringQs = function(str) {
37428     return str.split('&').filter(function (pair) {
37429         return pair !== '';
37430     }).reduce(function(obj, pair){
37431         var parts = pair.split('=');
37432         obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
37433             '' : decodeURIComponent(parts[1]);
37434         return obj;
37435     }, {});
37436 };
37437
37438 ohauth.rawxhr = function(method, url, data, headers, callback) {
37439     var xhr = new XMLHttpRequest(),
37440         twoHundred = /^20\d$/;
37441     xhr.onreadystatechange = function() {
37442         if (4 === xhr.readyState && 0 !== xhr.status) {
37443             if (twoHundred.test(xhr.status)) callback(null, xhr);
37444             else return callback(xhr, null);
37445         }
37446     };
37447     xhr.onerror = function(e) { return callback(e, null); };
37448     xhr.open(method, url, true);
37449     for (var h in headers) xhr.setRequestHeader(h, headers[h]);
37450     xhr.send(data);
37451     return xhr;
37452 };
37453
37454 ohauth.xhr = function(method, url, auth, data, options, callback) {
37455     var headers = (options && options.header) || {
37456         'Content-Type': 'application/x-www-form-urlencoded'
37457     };
37458     headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
37459     return ohauth.rawxhr(method, url, data, headers, callback);
37460 };
37461
37462 ohauth.nonce = function() {
37463     for (var o = ''; o.length < 6;) {
37464         o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
37465     }
37466     return o;
37467 };
37468
37469 ohauth.authHeader = function(obj) {
37470     return Object.keys(obj).sort().map(function(key) {
37471         return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
37472     }).join(', ');
37473 };
37474
37475 ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
37476
37477 ohauth.percentEncode = function(s) {
37478     return encodeURIComponent(s)
37479         .replace(/\!/g, '%21').replace(/\'/g, '%27')
37480         .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
37481 };
37482
37483 ohauth.baseString = function(method, url, params) {
37484     if (params.oauth_signature) delete params.oauth_signature;
37485     return [
37486         method,
37487         ohauth.percentEncode(url),
37488         ohauth.percentEncode(ohauth.qsString(params))].join('&');
37489 };
37490
37491 ohauth.signature = function(oauth_secret, token_secret, baseString) {
37492     return sha1.b64_hmac(
37493         ohauth.percentEncode(oauth_secret) + '&' +
37494         ohauth.percentEncode(token_secret),
37495         baseString);
37496 };
37497
37498 /**
37499  * Takes an options object for configuration (consumer_key,
37500  * consumer_secret, version, signature_method, token, token_secret)
37501  * and returns a function that generates the Authorization header
37502  * for given data.
37503  *
37504  * The returned function takes these parameters:
37505  * - method: GET/POST/...
37506  * - uri: full URI with protocol, port, path and query string
37507  * - extra_params: any extra parameters (that are passed in the POST data),
37508  *   can be an object or a from-urlencoded string.
37509  *
37510  * Returned function returns full OAuth header with "OAuth" string in it.
37511  */
37512
37513 ohauth.headerGenerator = function(options) {
37514     options = options || {};
37515     var consumer_key = options.consumer_key || '',
37516         consumer_secret = options.consumer_secret || '',
37517         signature_method = options.signature_method || 'HMAC-SHA1',
37518         version = options.version || '1.0',
37519         token = options.token || '',
37520         token_secret = options.token_secret || '';
37521
37522     return function(method, uri, extra_params) {
37523         method = method.toUpperCase();
37524         if (typeof extra_params === 'string' && extra_params.length > 0) {
37525             extra_params = ohauth.stringQs(extra_params);
37526         }
37527
37528         var uri_parts = uri.split('?', 2),
37529         base_uri = uri_parts[0];
37530
37531         var query_params = uri_parts.length === 2 ?
37532             ohauth.stringQs(uri_parts[1]) : {};
37533
37534         var oauth_params = {
37535             oauth_consumer_key: consumer_key,
37536             oauth_signature_method: signature_method,
37537             oauth_version: version,
37538             oauth_timestamp: ohauth.timestamp(),
37539             oauth_nonce: ohauth.nonce()
37540         };
37541
37542         if (token) oauth_params.oauth_token = token;
37543
37544         var all_params = immutable({}, oauth_params, query_params, extra_params),
37545             base_str = ohauth.baseString(method, base_uri, all_params);
37546
37547         oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
37548
37549         return 'OAuth ' + ohauth.authHeader(oauth_params);
37550     };
37551 };
37552
37553 var ohauth_1 = ohauth;
37554
37555 var resolveUrl = createCommonjsModule(function (module, exports) {
37556 // Copyright 2014 Simon Lydell
37557 // X11 (“MIT”) Licensed. (See LICENSE.)
37558
37559 void (function(root, factory) {
37560   if (typeof undefined === "function" && undefined.amd) {
37561     undefined(factory);
37562   } else {
37563     module.exports = factory();
37564   }
37565 }(commonjsGlobal, function() {
37566
37567   function resolveUrl(/* ...urls */) {
37568     var numUrls = arguments.length;
37569
37570     if (numUrls === 0) {
37571       throw new Error("resolveUrl requires at least one argument; got none.")
37572     }
37573
37574     var base = document.createElement("base");
37575     base.href = arguments[0];
37576
37577     if (numUrls === 1) {
37578       return base.href
37579     }
37580
37581     var head = document.getElementsByTagName("head")[0];
37582     head.insertBefore(base, head.firstChild);
37583
37584     var a = document.createElement("a");
37585     var resolved;
37586
37587     for (var index = 1; index < numUrls; index++) {
37588       a.href = arguments[index];
37589       resolved = a.href;
37590       base.href = resolved;
37591     }
37592
37593     head.removeChild(base);
37594
37595     return resolved
37596   }
37597
37598   return resolveUrl
37599
37600 }));
37601 });
37602
37603 var assign$1 = make_assign();
37604 var create$2 = make_create();
37605 var trim = make_trim();
37606 var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
37607
37608 var util = {
37609         assign: assign$1,
37610         create: create$2,
37611         trim: trim,
37612         bind: bind$1,
37613         slice: slice$8,
37614         each: each$1,
37615         map: map$5,
37616         pluck: pluck$1,
37617         isList: isList$1,
37618         isFunction: isFunction$2,
37619         isObject: isObject$3,
37620         Global: Global
37621 };
37622
37623 function make_assign() {
37624         if (Object.assign) {
37625                 return Object.assign
37626         } else {
37627                 return function shimAssign(obj, props1, props2, etc) {
37628                         for (var i = 1; i < arguments.length; i++) {
37629                                 each$1(Object(arguments[i]), function(val, key) {
37630                                         obj[key] = val;
37631                                 });
37632                         }                       
37633                         return obj
37634                 }
37635         }
37636 }
37637
37638 function make_create() {
37639         if (Object.create) {
37640                 return function create(obj, assignProps1, assignProps2, etc) {
37641                         var assignArgsList = slice$8(arguments, 1);
37642                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
37643                 }
37644         } else {
37645                 function F() {} // eslint-disable-line no-inner-declarations
37646                 return function create(obj, assignProps1, assignProps2, etc) {
37647                         var assignArgsList = slice$8(arguments, 1);
37648                         F.prototype = obj;
37649                         return assign$1.apply(this, [new F()].concat(assignArgsList))
37650                 }
37651         }
37652 }
37653
37654 function make_trim() {
37655         if (String.prototype.trim) {
37656                 return function trim(str) {
37657                         return String.prototype.trim.call(str)
37658                 }
37659         } else {
37660                 return function trim(str) {
37661                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
37662                 }
37663         }
37664 }
37665
37666 function bind$1(obj, fn) {
37667         return function() {
37668                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
37669         }
37670 }
37671
37672 function slice$8(arr, index) {
37673         return Array.prototype.slice.call(arr, index || 0)
37674 }
37675
37676 function each$1(obj, fn) {
37677         pluck$1(obj, function(val, key) {
37678                 fn(val, key);
37679                 return false
37680         });
37681 }
37682
37683 function map$5(obj, fn) {
37684         var res = (isList$1(obj) ? [] : {});
37685         pluck$1(obj, function(v, k) {
37686                 res[k] = fn(v, k);
37687                 return false
37688         });
37689         return res
37690 }
37691
37692 function pluck$1(obj, fn) {
37693         if (isList$1(obj)) {
37694                 for (var i=0; i<obj.length; i++) {
37695                         if (fn(obj[i], i)) {
37696                                 return obj[i]
37697                         }
37698                 }
37699         } else {
37700                 for (var key in obj) {
37701                         if (obj.hasOwnProperty(key)) {
37702                                 if (fn(obj[key], key)) {
37703                                         return obj[key]
37704                                 }
37705                         }
37706                 }
37707         }
37708 }
37709
37710 function isList$1(val) {
37711         return (val != null && typeof val != 'function' && typeof val.length == 'number')
37712 }
37713
37714 function isFunction$2(val) {
37715         return val && {}.toString.call(val) === '[object Function]'
37716 }
37717
37718 function isObject$3(val) {
37719         return val && {}.toString.call(val) === '[object Object]'
37720 }
37721
37722 var slice$7 = util.slice;
37723 var pluck = util.pluck;
37724 var each = util.each;
37725 var bind = util.bind;
37726 var create$1 = util.create;
37727 var isList = util.isList;
37728 var isFunction$1 = util.isFunction;
37729 var isObject$2 = util.isObject;
37730
37731 var storeEngine = {
37732         createStore: createStore
37733 };
37734
37735 var storeAPI = {
37736         version: '2.0.12',
37737         enabled: false,
37738         
37739         // get returns the value of the given key. If that value
37740         // is undefined, it returns optionalDefaultValue instead.
37741         get: function(key, optionalDefaultValue) {
37742                 var data = this.storage.read(this._namespacePrefix + key);
37743                 return this._deserialize(data, optionalDefaultValue)
37744         },
37745
37746         // set will store the given value at key and returns value.
37747         // Calling set with value === undefined is equivalent to calling remove.
37748         set: function(key, value) {
37749                 if (value === undefined) {
37750                         return this.remove(key)
37751                 }
37752                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
37753                 return value
37754         },
37755
37756         // remove deletes the key and value stored at the given key.
37757         remove: function(key) {
37758                 this.storage.remove(this._namespacePrefix + key);
37759         },
37760
37761         // each will call the given callback once for each key-value pair
37762         // in this store.
37763         each: function(callback) {
37764                 var self = this;
37765                 this.storage.each(function(val, namespacedKey) {
37766                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
37767                 });
37768         },
37769
37770         // clearAll will remove all the stored key-value pairs in this store.
37771         clearAll: function() {
37772                 this.storage.clearAll();
37773         },
37774
37775         // additional functionality that can't live in plugins
37776         // ---------------------------------------------------
37777
37778         // hasNamespace returns true if this store instance has the given namespace.
37779         hasNamespace: function(namespace) {
37780                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
37781         },
37782
37783         // createStore creates a store.js instance with the first
37784         // functioning storage in the list of storage candidates,
37785         // and applies the the given mixins to the instance.
37786         createStore: function() {
37787                 return createStore.apply(this, arguments)
37788         },
37789         
37790         addPlugin: function(plugin) {
37791                 this._addPlugin(plugin);
37792         },
37793         
37794         namespace: function(namespace) {
37795                 return createStore(this.storage, this.plugins, namespace)
37796         }
37797 };
37798
37799 function _warn() {
37800         var _console = (typeof console == 'undefined' ? null : console);
37801         if (!_console) { return }
37802         var fn = (_console.warn ? _console.warn : _console.log);
37803         fn.apply(_console, arguments);
37804 }
37805
37806 function createStore(storages, plugins, namespace) {
37807         if (!namespace) {
37808                 namespace = '';
37809         }
37810         if (storages && !isList(storages)) {
37811                 storages = [storages];
37812         }
37813         if (plugins && !isList(plugins)) {
37814                 plugins = [plugins];
37815         }
37816
37817         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
37818         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
37819         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
37820         if (!legalNamespaces.test(namespace)) {
37821                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
37822         }
37823         
37824         var _privateStoreProps = {
37825                 _namespacePrefix: namespacePrefix,
37826                 _namespaceRegexp: namespaceRegexp,
37827
37828                 _testStorage: function(storage) {
37829                         try {
37830                                 var testStr = '__storejs__test__';
37831                                 storage.write(testStr, testStr);
37832                                 var ok = (storage.read(testStr) === testStr);
37833                                 storage.remove(testStr);
37834                                 return ok
37835                         } catch(e) {
37836                                 return false
37837                         }
37838                 },
37839
37840                 _assignPluginFnProp: function(pluginFnProp, propName) {
37841                         var oldFn = this[propName];
37842                         this[propName] = function pluginFn() {
37843                                 var args = slice$7(arguments, 0);
37844                                 var self = this;
37845
37846                                 // super_fn calls the old function which was overwritten by
37847                                 // this mixin.
37848                                 function super_fn() {
37849                                         if (!oldFn) { return }
37850                                         each(arguments, function(arg, i) {
37851                                                 args[i] = arg;
37852                                         });
37853                                         return oldFn.apply(self, args)
37854                                 }
37855
37856                                 // Give mixing function access to super_fn by prefixing all mixin function
37857                                 // arguments with super_fn.
37858                                 var newFnArgs = [super_fn].concat(args);
37859
37860                                 return pluginFnProp.apply(self, newFnArgs)
37861                         };
37862                 },
37863
37864                 _serialize: function(obj) {
37865                         return JSON.stringify(obj)
37866                 },
37867
37868                 _deserialize: function(strVal, defaultVal) {
37869                         if (!strVal) { return defaultVal }
37870                         // It is possible that a raw string value has been previously stored
37871                         // in a storage without using store.js, meaning it will be a raw
37872                         // string value instead of a JSON serialized string. By defaulting
37873                         // to the raw string value in case of a JSON parse error, we allow
37874                         // for past stored values to be forwards-compatible with store.js
37875                         var val = '';
37876                         try { val = JSON.parse(strVal); }
37877                         catch(e) { val = strVal; }
37878
37879                         return (val !== undefined ? val : defaultVal)
37880                 },
37881                 
37882                 _addStorage: function(storage) {
37883                         if (this.enabled) { return }
37884                         if (this._testStorage(storage)) {
37885                                 this.storage = storage;
37886                                 this.enabled = true;
37887                         }
37888                 },
37889
37890                 _addPlugin: function(plugin) {
37891                         var self = this;
37892
37893                         // If the plugin is an array, then add all plugins in the array.
37894                         // This allows for a plugin to depend on other plugins.
37895                         if (isList(plugin)) {
37896                                 each(plugin, function(plugin) {
37897                                         self._addPlugin(plugin);
37898                                 });
37899                                 return
37900                         }
37901
37902                         // Keep track of all plugins we've seen so far, so that we
37903                         // don't add any of them twice.
37904                         var seenPlugin = pluck(this.plugins, function(seenPlugin) {
37905                                 return (plugin === seenPlugin)
37906                         });
37907                         if (seenPlugin) {
37908                                 return
37909                         }
37910                         this.plugins.push(plugin);
37911
37912                         // Check that the plugin is properly formed
37913                         if (!isFunction$1(plugin)) {
37914                                 throw new Error('Plugins must be function values that return objects')
37915                         }
37916
37917                         var pluginProperties = plugin.call(this);
37918                         if (!isObject$2(pluginProperties)) {
37919                                 throw new Error('Plugins must return an object of function properties')
37920                         }
37921
37922                         // Add the plugin function properties to this store instance.
37923                         each(pluginProperties, function(pluginFnProp, propName) {
37924                                 if (!isFunction$1(pluginFnProp)) {
37925                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
37926                                 }
37927                                 self._assignPluginFnProp(pluginFnProp, propName);
37928                         });
37929                 },
37930                 
37931                 // Put deprecated properties in the private API, so as to not expose it to accidential
37932                 // discovery through inspection of the store object.
37933                 
37934                 // Deprecated: addStorage
37935                 addStorage: function(storage) {
37936                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
37937                         this._addStorage(storage);
37938                 }
37939         };
37940
37941         var store = create$1(_privateStoreProps, storeAPI, {
37942                 plugins: []
37943         });
37944         store.raw = {};
37945         each(store, function(prop, propName) {
37946                 if (isFunction$1(prop)) {
37947                         store.raw[propName] = bind(store, prop);                        
37948                 }
37949         });
37950         each(storages, function(storage) {
37951                 store._addStorage(storage);
37952         });
37953         each(plugins, function(plugin) {
37954                 store._addPlugin(plugin);
37955         });
37956         return store
37957 }
37958
37959 var Global$1 = util.Global;
37960
37961 var localStorage_1 = {
37962         name: 'localStorage',
37963         read: read,
37964         write: write,
37965         each: each$2,
37966         remove: remove$2,
37967         clearAll: clearAll,
37968 };
37969
37970 function localStorage$1() {
37971         return Global$1.localStorage
37972 }
37973
37974 function read(key) {
37975         return localStorage$1().getItem(key)
37976 }
37977
37978 function write(key, data) {
37979         return localStorage$1().setItem(key, data)
37980 }
37981
37982 function each$2(fn) {
37983         for (var i = localStorage$1().length - 1; i >= 0; i--) {
37984                 var key = localStorage$1().key(i);
37985                 fn(read(key), key);
37986         }
37987 }
37988
37989 function remove$2(key) {
37990         return localStorage$1().removeItem(key)
37991 }
37992
37993 function clearAll() {
37994         return localStorage$1().clear()
37995 }
37996
37997 // oldFF-globalStorage provides storage for Firefox
37998 // versions 6 and 7, where no localStorage, etc
37999 // is available.
38000
38001
38002 var Global$2 = util.Global;
38003
38004 var oldFFGlobalStorage = {
38005         name: 'oldFF-globalStorage',
38006         read: read$1,
38007         write: write$1,
38008         each: each$3,
38009         remove: remove$3,
38010         clearAll: clearAll$1,
38011 };
38012
38013 var globalStorage = Global$2.globalStorage;
38014
38015 function read$1(key) {
38016         return globalStorage[key]
38017 }
38018
38019 function write$1(key, data) {
38020         globalStorage[key] = data;
38021 }
38022
38023 function each$3(fn) {
38024         for (var i = globalStorage.length - 1; i >= 0; i--) {
38025                 var key = globalStorage.key(i);
38026                 fn(globalStorage[key], key);
38027         }
38028 }
38029
38030 function remove$3(key) {
38031         return globalStorage.removeItem(key)
38032 }
38033
38034 function clearAll$1() {
38035         each$3(function(key, _) {
38036                 delete globalStorage[key];
38037         });
38038 }
38039
38040 // oldIE-userDataStorage provides storage for Internet Explorer
38041 // versions 6 and 7, where no localStorage, sessionStorage, etc
38042 // is available.
38043
38044
38045 var Global$3 = util.Global;
38046
38047 var oldIEUserDataStorage = {
38048         name: 'oldIE-userDataStorage',
38049         write: write$2,
38050         read: read$2,
38051         each: each$4,
38052         remove: remove$4,
38053         clearAll: clearAll$2,
38054 };
38055
38056 var storageName = 'storejs';
38057 var doc = Global$3.document;
38058 var _withStorageEl = _makeIEStorageElFunction();
38059 var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
38060
38061 function write$2(unfixedKey, data) {
38062         if (disable) { return }
38063         var fixedKey = fixKey(unfixedKey);
38064         _withStorageEl(function(storageEl) {
38065                 storageEl.setAttribute(fixedKey, data);
38066                 storageEl.save(storageName);
38067         });
38068 }
38069
38070 function read$2(unfixedKey) {
38071         if (disable) { return }
38072         var fixedKey = fixKey(unfixedKey);
38073         var res = null;
38074         _withStorageEl(function(storageEl) {
38075                 res = storageEl.getAttribute(fixedKey);
38076         });
38077         return res
38078 }
38079
38080 function each$4(callback) {
38081         _withStorageEl(function(storageEl) {
38082                 var attributes = storageEl.XMLDocument.documentElement.attributes;
38083                 for (var i=attributes.length-1; i>=0; i--) {
38084                         var attr = attributes[i];
38085                         callback(storageEl.getAttribute(attr.name), attr.name);
38086                 }
38087         });
38088 }
38089
38090 function remove$4(unfixedKey) {
38091         var fixedKey = fixKey(unfixedKey);
38092         _withStorageEl(function(storageEl) {
38093                 storageEl.removeAttribute(fixedKey);
38094                 storageEl.save(storageName);
38095         });
38096 }
38097
38098 function clearAll$2() {
38099         _withStorageEl(function(storageEl) {
38100                 var attributes = storageEl.XMLDocument.documentElement.attributes;
38101                 storageEl.load(storageName);
38102                 for (var i=attributes.length-1; i>=0; i--) {
38103                         storageEl.removeAttribute(attributes[i].name);
38104                 }
38105                 storageEl.save(storageName);
38106         });
38107 }
38108
38109 // Helpers
38110 //////////
38111
38112 // In IE7, keys cannot start with a digit or contain certain chars.
38113 // See https://github.com/marcuswestin/store.js/issues/40
38114 // See https://github.com/marcuswestin/store.js/issues/83
38115 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
38116 function fixKey(key) {
38117         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
38118 }
38119
38120 function _makeIEStorageElFunction() {
38121         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
38122                 return null
38123         }
38124         var scriptTag = 'script',
38125                 storageOwner,
38126                 storageContainer,
38127                 storageEl;
38128
38129         // Since #userData storage applies only to specific paths, we need to
38130         // somehow link our data to a specific path.  We choose /favicon.ico
38131         // as a pretty safe option, since all browsers already make a request to
38132         // this URL anyway and being a 404 will not hurt us here.  We wrap an
38133         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
38134         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
38135         // since the iframe access rules appear to allow direct access and
38136         // manipulation of the document element, even for a 404 page.  This
38137         // document can be used instead of the current document (which would
38138         // have been limited to the current path) to perform #userData storage.
38139         try {
38140                 /* global ActiveXObject */
38141                 storageContainer = new ActiveXObject('htmlfile');
38142                 storageContainer.open();
38143                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
38144                 storageContainer.close();
38145                 storageOwner = storageContainer.w.frames[0].document;
38146                 storageEl = storageOwner.createElement('div');
38147         } catch(e) {
38148                 // somehow ActiveXObject instantiation failed (perhaps some special
38149                 // security settings or otherwse), fall back to per-path storage
38150                 storageEl = doc.createElement('div');
38151                 storageOwner = doc.body;
38152         }
38153
38154         return function(storeFunction) {
38155                 var args = [].slice.call(arguments, 0);
38156                 args.unshift(storageEl);
38157                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
38158                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
38159                 storageOwner.appendChild(storageEl);
38160                 storageEl.addBehavior('#default#userData');
38161                 storageEl.load(storageName);
38162                 storeFunction.apply(this, args);
38163                 storageOwner.removeChild(storageEl);
38164                 return
38165         }
38166 }
38167
38168 // cookieStorage is useful Safari private browser mode, where localStorage
38169 // doesn't work but cookies do. This implementation is adopted from
38170 // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
38171
38172
38173 var Global$4 = util.Global;
38174 var trim$1 = util.trim;
38175
38176 var cookieStorage = {
38177         name: 'cookieStorage',
38178         read: read$3,
38179         write: write$3,
38180         each: each$5,
38181         remove: remove$5,
38182         clearAll: clearAll$3,
38183 };
38184
38185 var doc$1 = Global$4.document;
38186
38187 function read$3(key) {
38188         if (!key || !_has(key)) { return null }
38189         var regexpStr = "(?:^|.*;\\s*)" +
38190                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
38191                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
38192         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
38193 }
38194
38195 function each$5(callback) {
38196         var cookies = doc$1.cookie.split(/; ?/g);
38197         for (var i = cookies.length - 1; i >= 0; i--) {
38198                 if (!trim$1(cookies[i])) {
38199                         continue
38200                 }
38201                 var kvp = cookies[i].split('=');
38202                 var key = unescape(kvp[0]);
38203                 var val = unescape(kvp[1]);
38204                 callback(val, key);
38205         }
38206 }
38207
38208 function write$3(key, data) {
38209         if(!key) { return }
38210         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
38211 }
38212
38213 function remove$5(key) {
38214         if (!key || !_has(key)) {
38215                 return
38216         }
38217         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
38218 }
38219
38220 function clearAll$3() {
38221         each$5(function(_, key) {
38222                 remove$5(key);
38223         });
38224 }
38225
38226 function _has(key) {
38227         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
38228 }
38229
38230 var Global$5 = util.Global;
38231
38232 var sessionStorage_1 = {
38233         name: 'sessionStorage',
38234         read: read$4,
38235         write: write$4,
38236         each: each$6,
38237         remove: remove$6,
38238         clearAll: clearAll$4
38239 };
38240
38241 function sessionStorage() {
38242         return Global$5.sessionStorage
38243 }
38244
38245 function read$4(key) {
38246         return sessionStorage().getItem(key)
38247 }
38248
38249 function write$4(key, data) {
38250         return sessionStorage().setItem(key, data)
38251 }
38252
38253 function each$6(fn) {
38254         for (var i = sessionStorage().length - 1; i >= 0; i--) {
38255                 var key = sessionStorage().key(i);
38256                 fn(read$4(key), key);
38257         }
38258 }
38259
38260 function remove$6(key) {
38261         return sessionStorage().removeItem(key)
38262 }
38263
38264 function clearAll$4() {
38265         return sessionStorage().clear()
38266 }
38267
38268 // memoryStorage is a useful last fallback to ensure that the store
38269 // is functions (meaning store.get(), store.set(), etc will all function).
38270 // However, stored values will not persist when the browser navigates to
38271 // a new page or reloads the current page.
38272
38273 var memoryStorage_1 = {
38274         name: 'memoryStorage',
38275         read: read$5,
38276         write: write$5,
38277         each: each$7,
38278         remove: remove$7,
38279         clearAll: clearAll$5,
38280 };
38281
38282 var memoryStorage = {};
38283
38284 function read$5(key) {
38285         return memoryStorage[key]
38286 }
38287
38288 function write$5(key, data) {
38289         memoryStorage[key] = data;
38290 }
38291
38292 function each$7(callback) {
38293         for (var key in memoryStorage) {
38294                 if (memoryStorage.hasOwnProperty(key)) {
38295                         callback(memoryStorage[key], key);
38296                 }
38297         }
38298 }
38299
38300 function remove$7(key) {
38301         delete memoryStorage[key];
38302 }
38303
38304 function clearAll$5(key) {
38305         memoryStorage = {};
38306 }
38307
38308 var all$3 = [
38309         // Listed in order of usage preference
38310         localStorage_1,
38311         oldFFGlobalStorage,
38312         oldIEUserDataStorage,
38313         cookieStorage,
38314         sessionStorage_1,
38315         memoryStorage_1
38316 ];
38317
38318 /* eslint-disable */
38319
38320 //  json2.js
38321 //  2016-10-28
38322 //  Public Domain.
38323 //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
38324 //  See http://www.JSON.org/js.html
38325 //  This code should be minified before deployment.
38326 //  See http://javascript.crockford.com/jsmin.html
38327
38328 //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
38329 //  NOT CONTROL.
38330
38331 //  This file creates a global JSON object containing two methods: stringify
38332 //  and parse. This file provides the ES5 JSON capability to ES3 systems.
38333 //  If a project might run on IE8 or earlier, then this file should be included.
38334 //  This file does nothing on ES5 systems.
38335
38336 //      JSON.stringify(value, replacer, space)
38337 //          value       any JavaScript value, usually an object or array.
38338 //          replacer    an optional parameter that determines how object
38339 //                      values are stringified for objects. It can be a
38340 //                      function or an array of strings.
38341 //          space       an optional parameter that specifies the indentation
38342 //                      of nested structures. If it is omitted, the text will
38343 //                      be packed without extra whitespace. If it is a number,
38344 //                      it will specify the number of spaces to indent at each
38345 //                      level. If it is a string (such as "\t" or "&nbsp;"),
38346 //                      it contains the characters used to indent at each level.
38347 //          This method produces a JSON text from a JavaScript value.
38348 //          When an object value is found, if the object contains a toJSON
38349 //          method, its toJSON method will be called and the result will be
38350 //          stringified. A toJSON method does not serialize: it returns the
38351 //          value represented by the name/value pair that should be serialized,
38352 //          or undefined if nothing should be serialized. The toJSON method
38353 //          will be passed the key associated with the value, and this will be
38354 //          bound to the value.
38355
38356 //          For example, this would serialize Dates as ISO strings.
38357
38358 //              Date.prototype.toJSON = function (key) {
38359 //                  function f(n) {
38360 //                      // Format integers to have at least two digits.
38361 //                      return (n < 10)
38362 //                          ? "0" + n
38363 //                          : n;
38364 //                  }
38365 //                  return this.getUTCFullYear()   + "-" +
38366 //                       f(this.getUTCMonth() + 1) + "-" +
38367 //                       f(this.getUTCDate())      + "T" +
38368 //                       f(this.getUTCHours())     + ":" +
38369 //                       f(this.getUTCMinutes())   + ":" +
38370 //                       f(this.getUTCSeconds())   + "Z";
38371 //              };
38372
38373 //          You can provide an optional replacer method. It will be passed the
38374 //          key and value of each member, with this bound to the containing
38375 //          object. The value that is returned from your method will be
38376 //          serialized. If your method returns undefined, then the member will
38377 //          be excluded from the serialization.
38378
38379 //          If the replacer parameter is an array of strings, then it will be
38380 //          used to select the members to be serialized. It filters the results
38381 //          such that only members with keys listed in the replacer array are
38382 //          stringified.
38383
38384 //          Values that do not have JSON representations, such as undefined or
38385 //          functions, will not be serialized. Such values in objects will be
38386 //          dropped; in arrays they will be replaced with null. You can use
38387 //          a replacer function to replace those with JSON values.
38388
38389 //          JSON.stringify(undefined) returns undefined.
38390
38391 //          The optional space parameter produces a stringification of the
38392 //          value that is filled with line breaks and indentation to make it
38393 //          easier to read.
38394
38395 //          If the space parameter is a non-empty string, then that string will
38396 //          be used for indentation. If the space parameter is a number, then
38397 //          the indentation will be that many spaces.
38398
38399 //          Example:
38400
38401 //          text = JSON.stringify(["e", {pluribus: "unum"}]);
38402 //          // text is '["e",{"pluribus":"unum"}]'
38403
38404 //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
38405 //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
38406
38407 //          text = JSON.stringify([new Date()], function (key, value) {
38408 //              return this[key] instanceof Date
38409 //                  ? "Date(" + this[key] + ")"
38410 //                  : value;
38411 //          });
38412 //          // text is '["Date(---current time---)"]'
38413
38414 //      JSON.parse(text, reviver)
38415 //          This method parses a JSON text to produce an object or array.
38416 //          It can throw a SyntaxError exception.
38417
38418 //          The optional reviver parameter is a function that can filter and
38419 //          transform the results. It receives each of the keys and values,
38420 //          and its return value is used instead of the original value.
38421 //          If it returns what it received, then the structure is not modified.
38422 //          If it returns undefined then the member is deleted.
38423
38424 //          Example:
38425
38426 //          // Parse the text. Values that look like ISO date strings will
38427 //          // be converted to Date objects.
38428
38429 //          myData = JSON.parse(text, function (key, value) {
38430 //              var a;
38431 //              if (typeof value === "string") {
38432 //                  a =
38433 //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
38434 //                  if (a) {
38435 //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
38436 //                          +a[5], +a[6]));
38437 //                  }
38438 //              }
38439 //              return value;
38440 //          });
38441
38442 //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
38443 //              var d;
38444 //              if (typeof value === "string" &&
38445 //                      value.slice(0, 5) === "Date(" &&
38446 //                      value.slice(-1) === ")") {
38447 //                  d = new Date(value.slice(5, -1));
38448 //                  if (d) {
38449 //                      return d;
38450 //                  }
38451 //              }
38452 //              return value;
38453 //          });
38454
38455 //  This is a reference implementation. You are free to copy, modify, or
38456 //  redistribute.
38457
38458 /*jslint
38459     eval, for, this
38460 */
38461
38462 /*property
38463     JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
38464     getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
38465     lastIndex, length, parse, prototype, push, replace, slice, stringify,
38466     test, toJSON, toString, valueOf
38467 */
38468
38469
38470 // Create a JSON object only if one does not already exist. We create the
38471 // methods in a closure to avoid creating global variables.
38472
38473 if (typeof JSON !== "object") {
38474     JSON = {};
38475 }
38476
38477 (function () {
38478     "use strict";
38479
38480     var rx_one = /^[\],:{}\s]*$/;
38481     var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
38482     var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
38483     var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
38484     var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
38485     var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
38486
38487     function f(n) {
38488         // Format integers to have at least two digits.
38489         return n < 10
38490             ? "0" + n
38491             : n;
38492     }
38493
38494     function this_value() {
38495         return this.valueOf();
38496     }
38497
38498     if (typeof Date.prototype.toJSON !== "function") {
38499
38500         Date.prototype.toJSON = function () {
38501
38502             return isFinite(this.valueOf())
38503                 ? this.getUTCFullYear() + "-" +
38504                         f(this.getUTCMonth() + 1) + "-" +
38505                         f(this.getUTCDate()) + "T" +
38506                         f(this.getUTCHours()) + ":" +
38507                         f(this.getUTCMinutes()) + ":" +
38508                         f(this.getUTCSeconds()) + "Z"
38509                 : null;
38510         };
38511
38512         Boolean.prototype.toJSON = this_value;
38513         Number.prototype.toJSON = this_value;
38514         String.prototype.toJSON = this_value;
38515     }
38516
38517     var gap;
38518     var indent;
38519     var meta;
38520     var rep;
38521
38522
38523     function quote(string) {
38524
38525 // If the string contains no control characters, no quote characters, and no
38526 // backslash characters, then we can safely slap some quotes around it.
38527 // Otherwise we must also replace the offending characters with safe escape
38528 // sequences.
38529
38530         rx_escapable.lastIndex = 0;
38531         return rx_escapable.test(string)
38532             ? "\"" + string.replace(rx_escapable, function (a) {
38533                 var c = meta[a];
38534                 return typeof c === "string"
38535                     ? c
38536                     : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
38537             }) + "\""
38538             : "\"" + string + "\"";
38539     }
38540
38541
38542     function str(key, holder) {
38543
38544 // Produce a string from holder[key].
38545
38546         var i;          // The loop counter.
38547         var k;          // The member key.
38548         var v;          // The member value.
38549         var length;
38550         var mind = gap;
38551         var partial;
38552         var value = holder[key];
38553
38554 // If the value has a toJSON method, call it to obtain a replacement value.
38555
38556         if (value && typeof value === "object" &&
38557                 typeof value.toJSON === "function") {
38558             value = value.toJSON(key);
38559         }
38560
38561 // If we were called with a replacer function, then call the replacer to
38562 // obtain a replacement value.
38563
38564         if (typeof rep === "function") {
38565             value = rep.call(holder, key, value);
38566         }
38567
38568 // What happens next depends on the value's type.
38569
38570         switch (typeof value) {
38571         case "string":
38572             return quote(value);
38573
38574         case "number":
38575
38576 // JSON numbers must be finite. Encode non-finite numbers as null.
38577
38578             return isFinite(value)
38579                 ? String(value)
38580                 : "null";
38581
38582         case "boolean":
38583         case "null":
38584
38585 // If the value is a boolean or null, convert it to a string. Note:
38586 // typeof null does not produce "null". The case is included here in
38587 // the remote chance that this gets fixed someday.
38588
38589             return String(value);
38590
38591 // If the type is "object", we might be dealing with an object or an array or
38592 // null.
38593
38594         case "object":
38595
38596 // Due to a specification blunder in ECMAScript, typeof null is "object",
38597 // so watch out for that case.
38598
38599             if (!value) {
38600                 return "null";
38601             }
38602
38603 // Make an array to hold the partial results of stringifying this object value.
38604
38605             gap += indent;
38606             partial = [];
38607
38608 // Is the value an array?
38609
38610             if (Object.prototype.toString.apply(value) === "[object Array]") {
38611
38612 // The value is an array. Stringify every element. Use null as a placeholder
38613 // for non-JSON values.
38614
38615                 length = value.length;
38616                 for (i = 0; i < length; i += 1) {
38617                     partial[i] = str(i, value) || "null";
38618                 }
38619
38620 // Join all of the elements together, separated with commas, and wrap them in
38621 // brackets.
38622
38623                 v = partial.length === 0
38624                     ? "[]"
38625                     : gap
38626                         ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
38627                         : "[" + partial.join(",") + "]";
38628                 gap = mind;
38629                 return v;
38630             }
38631
38632 // If the replacer is an array, use it to select the members to be stringified.
38633
38634             if (rep && typeof rep === "object") {
38635                 length = rep.length;
38636                 for (i = 0; i < length; i += 1) {
38637                     if (typeof rep[i] === "string") {
38638                         k = rep[i];
38639                         v = str(k, value);
38640                         if (v) {
38641                             partial.push(quote(k) + (
38642                                 gap
38643                                     ? ": "
38644                                     : ":"
38645                             ) + v);
38646                         }
38647                     }
38648                 }
38649             } else {
38650
38651 // Otherwise, iterate through all of the keys in the object.
38652
38653                 for (k in value) {
38654                     if (Object.prototype.hasOwnProperty.call(value, k)) {
38655                         v = str(k, value);
38656                         if (v) {
38657                             partial.push(quote(k) + (
38658                                 gap
38659                                     ? ": "
38660                                     : ":"
38661                             ) + v);
38662                         }
38663                     }
38664                 }
38665             }
38666
38667 // Join all of the member texts together, separated with commas,
38668 // and wrap them in braces.
38669
38670             v = partial.length === 0
38671                 ? "{}"
38672                 : gap
38673                     ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
38674                     : "{" + partial.join(",") + "}";
38675             gap = mind;
38676             return v;
38677         }
38678     }
38679
38680 // If the JSON object does not yet have a stringify method, give it one.
38681
38682     if (typeof JSON.stringify !== "function") {
38683         meta = {    // table of character substitutions
38684             "\b": "\\b",
38685             "\t": "\\t",
38686             "\n": "\\n",
38687             "\f": "\\f",
38688             "\r": "\\r",
38689             "\"": "\\\"",
38690             "\\": "\\\\"
38691         };
38692         JSON.stringify = function (value, replacer, space) {
38693
38694 // The stringify method takes a value and an optional replacer, and an optional
38695 // space parameter, and returns a JSON text. The replacer can be a function
38696 // that can replace values, or an array of strings that will select the keys.
38697 // A default replacer method can be provided. Use of the space parameter can
38698 // produce text that is more easily readable.
38699
38700             var i;
38701             gap = "";
38702             indent = "";
38703
38704 // If the space parameter is a number, make an indent string containing that
38705 // many spaces.
38706
38707             if (typeof space === "number") {
38708                 for (i = 0; i < space; i += 1) {
38709                     indent += " ";
38710                 }
38711
38712 // If the space parameter is a string, it will be used as the indent string.
38713
38714             } else if (typeof space === "string") {
38715                 indent = space;
38716             }
38717
38718 // If there is a replacer, it must be a function or an array.
38719 // Otherwise, throw an error.
38720
38721             rep = replacer;
38722             if (replacer && typeof replacer !== "function" &&
38723                     (typeof replacer !== "object" ||
38724                     typeof replacer.length !== "number")) {
38725                 throw new Error("JSON.stringify");
38726             }
38727
38728 // Make a fake root object containing our value under the key of "".
38729 // Return the result of stringifying the value.
38730
38731             return str("", {"": value});
38732         };
38733     }
38734
38735
38736 // If the JSON object does not yet have a parse method, give it one.
38737
38738     if (typeof JSON.parse !== "function") {
38739         JSON.parse = function (text, reviver) {
38740
38741 // The parse method takes a text and an optional reviver function, and returns
38742 // a JavaScript value if the text is a valid JSON text.
38743
38744             var j;
38745
38746             function walk(holder, key) {
38747
38748 // The walk method is used to recursively walk the resulting structure so
38749 // that modifications can be made.
38750
38751                 var k;
38752                 var v;
38753                 var value = holder[key];
38754                 if (value && typeof value === "object") {
38755                     for (k in value) {
38756                         if (Object.prototype.hasOwnProperty.call(value, k)) {
38757                             v = walk(value, k);
38758                             if (v !== undefined) {
38759                                 value[k] = v;
38760                             } else {
38761                                 delete value[k];
38762                             }
38763                         }
38764                     }
38765                 }
38766                 return reviver.call(holder, key, value);
38767             }
38768
38769
38770 // Parsing happens in four stages. In the first stage, we replace certain
38771 // Unicode characters with escape sequences. JavaScript handles many characters
38772 // incorrectly, either silently deleting them, or treating them as line endings.
38773
38774             text = String(text);
38775             rx_dangerous.lastIndex = 0;
38776             if (rx_dangerous.test(text)) {
38777                 text = text.replace(rx_dangerous, function (a) {
38778                     return "\\u" +
38779                             ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
38780                 });
38781             }
38782
38783 // In the second stage, we run the text against regular expressions that look
38784 // for non-JSON patterns. We are especially concerned with "()" and "new"
38785 // because they can cause invocation, and "=" because it can cause mutation.
38786 // But just to be safe, we want to reject all unexpected forms.
38787
38788 // We split the second stage into 4 regexp operations in order to work around
38789 // crippling inefficiencies in IE's and Safari's regexp engines. First we
38790 // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
38791 // replace all simple value tokens with "]" characters. Third, we delete all
38792 // open brackets that follow a colon or comma or that begin the text. Finally,
38793 // we look to see that the remaining characters are only whitespace or "]" or
38794 // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
38795
38796             if (
38797                 rx_one.test(
38798                     text
38799                         .replace(rx_two, "@")
38800                         .replace(rx_three, "]")
38801                         .replace(rx_four, "")
38802                 )
38803             ) {
38804
38805 // In the third stage we use the eval function to compile the text into a
38806 // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
38807 // in JavaScript: it can begin a block or an object literal. We wrap the text
38808 // in parens to eliminate the ambiguity.
38809
38810                 j = eval("(" + text + ")");
38811
38812 // In the optional fourth stage, we recursively walk the new structure, passing
38813 // each name/value pair to a reviver function for possible transformation.
38814
38815                 return (typeof reviver === "function")
38816                     ? walk({"": j}, "")
38817                     : j;
38818             }
38819
38820 // If the text is not JSON parseable, then a SyntaxError is thrown.
38821
38822             throw new SyntaxError("JSON.parse");
38823         };
38824     }
38825 }());
38826
38827 var json2 = json2Plugin;
38828
38829 function json2Plugin() {
38830         
38831         return {}
38832 }
38833
38834 var plugins = [json2];
38835
38836 var store_legacy = storeEngine.createStore(all$3, plugins);
38837
38838 // # osm-auth
38839 //
38840 // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
38841 // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
38842 // does not support custom headers, which this uses everywhere.
38843 var osmAuth = function(o) {
38844
38845     var oauth = {};
38846
38847     // authenticated users will also have a request token secret, but it's
38848     // not used in transactions with the server
38849     oauth.authenticated = function() {
38850         return !!(token('oauth_token') && token('oauth_token_secret'));
38851     };
38852
38853     oauth.logout = function() {
38854         token('oauth_token', '');
38855         token('oauth_token_secret', '');
38856         token('oauth_request_token_secret', '');
38857         return oauth;
38858     };
38859
38860     // TODO: detect lack of click event
38861     oauth.authenticate = function(callback) {
38862         if (oauth.authenticated()) return callback();
38863
38864         oauth.logout();
38865
38866         // ## Getting a request token
38867         var params = timenonce(getAuth(o)),
38868             url = o.url + '/oauth/request_token';
38869
38870         params.oauth_signature = ohauth_1.signature(
38871             o.oauth_secret, '',
38872             ohauth_1.baseString('POST', url, params));
38873
38874         if (!o.singlepage) {
38875             // Create a 600x550 popup window in the center of the screen
38876             var w = 600, h = 550,
38877                 settings = [
38878                     ['width', w], ['height', h],
38879                     ['left', screen.width / 2 - w / 2],
38880                     ['top', screen.height / 2 - h / 2]].map(function(x) {
38881                         return x.join('=');
38882                     }).join(','),
38883                 popup = window.open('about:blank', 'oauth_window', settings);
38884         }
38885
38886         // Request a request token. When this is complete, the popup
38887         // window is redirected to OSM's authorization page.
38888         ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
38889         o.loading();
38890
38891         function reqTokenDone(err, xhr) {
38892             o.done();
38893             if (err) return callback(err);
38894             var resp = ohauth_1.stringQs(xhr.response);
38895             token('oauth_request_token_secret', resp.oauth_token_secret);
38896             var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
38897                 oauth_token: resp.oauth_token,
38898                 oauth_callback: resolveUrl(o.landing)
38899             });
38900
38901             if (o.singlepage) {
38902                 location.href = authorize_url;
38903             } else {
38904                 popup.location = authorize_url;
38905             }
38906         }
38907
38908         // Called by a function in a landing page, in the popup window. The
38909         // window closes itself.
38910         window.authComplete = function(token) {
38911             var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
38912             get_access_token(oauth_token.oauth_token);
38913             delete window.authComplete;
38914         };
38915
38916         // ## Getting an request token
38917         //
38918         // At this point we have an `oauth_token`, brought in from a function
38919         // call on a landing page popup.
38920         function get_access_token(oauth_token) {
38921             var url = o.url + '/oauth/access_token',
38922                 params = timenonce(getAuth(o)),
38923                 request_token_secret = token('oauth_request_token_secret');
38924             params.oauth_token = oauth_token;
38925             params.oauth_signature = ohauth_1.signature(
38926                 o.oauth_secret,
38927                 request_token_secret,
38928                 ohauth_1.baseString('POST', url, params));
38929
38930             // ## Getting an access token
38931             //
38932             // The final token required for authentication. At this point
38933             // we have a `request token secret`
38934             ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
38935             o.loading();
38936         }
38937
38938         function accessTokenDone(err, xhr) {
38939             o.done();
38940             if (err) return callback(err);
38941             var access_token = ohauth_1.stringQs(xhr.response);
38942             token('oauth_token', access_token.oauth_token);
38943             token('oauth_token_secret', access_token.oauth_token_secret);
38944             callback(null, oauth);
38945         }
38946     };
38947
38948     oauth.bootstrapToken = function(oauth_token, callback) {
38949         // ## Getting an request token
38950         // At this point we have an `oauth_token`, brought in from a function
38951         // call on a landing page popup.
38952         function get_access_token(oauth_token) {
38953             var url = o.url + '/oauth/access_token',
38954                 params = timenonce(getAuth(o)),
38955                 request_token_secret = token('oauth_request_token_secret');
38956             params.oauth_token = oauth_token;
38957             params.oauth_signature = ohauth_1.signature(
38958                 o.oauth_secret,
38959                 request_token_secret,
38960                 ohauth_1.baseString('POST', url, params));
38961
38962             // ## Getting an access token
38963             // The final token required for authentication. At this point
38964             // we have a `request token secret`
38965             ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
38966             o.loading();
38967         }
38968
38969         function accessTokenDone(err, xhr) {
38970             o.done();
38971             if (err) return callback(err);
38972             var access_token = ohauth_1.stringQs(xhr.response);
38973             token('oauth_token', access_token.oauth_token);
38974             token('oauth_token_secret', access_token.oauth_token_secret);
38975             callback(null, oauth);
38976         }
38977
38978         get_access_token(oauth_token);
38979     };
38980
38981     // # xhr
38982     //
38983     // A single XMLHttpRequest wrapper that does authenticated calls if the
38984     // user has logged in.
38985     oauth.xhr = function(options, callback) {
38986         if (!oauth.authenticated()) {
38987             if (o.auto) {
38988                 return oauth.authenticate(run);
38989             } else {
38990                 callback('not authenticated', null);
38991                 return;
38992             }
38993         } else {
38994             return run();
38995         }
38996
38997         function run() {
38998             var params = timenonce(getAuth(o)),
38999                 oauth_token_secret = token('oauth_token_secret'),
39000                 url = (options.prefix !== false) ? o.url + options.path : options.path,
39001                 url_parts = url.replace(/#.*$/, '').split('?', 2),
39002                 base_url = url_parts[0],
39003                 query = (url_parts.length === 2) ? url_parts[1] : '';
39004
39005             // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
39006             if ((!options.options || !options.options.header ||
39007                 options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
39008                 options.content) {
39009                 params = immutable(params, ohauth_1.stringQs(options.content));
39010             }
39011
39012             params.oauth_token = token('oauth_token');
39013             params.oauth_signature = ohauth_1.signature(
39014                 o.oauth_secret,
39015                 oauth_token_secret,
39016                 ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
39017             );
39018
39019             return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
39020         }
39021
39022         function done(err, xhr) {
39023             if (err) return callback(err);
39024             else if (xhr.responseXML) return callback(err, xhr.responseXML);
39025             else return callback(err, xhr.response);
39026         }
39027     };
39028
39029     // pre-authorize this object, if we can just get a token and token_secret
39030     // from the start
39031     oauth.preauth = function(c) {
39032         if (!c) return;
39033         if (c.oauth_token) token('oauth_token', c.oauth_token);
39034         if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
39035         return oauth;
39036     };
39037
39038     oauth.options = function(_) {
39039         if (!arguments.length) return o;
39040
39041         o = _;
39042         o.url = o.url || 'https://www.openstreetmap.org';
39043         o.landing = o.landing || 'land.html';
39044         o.singlepage = o.singlepage || false;
39045
39046         // Optional loading and loading-done functions for nice UI feedback.
39047         // by default, no-ops
39048         o.loading = o.loading || function() {};
39049         o.done = o.done || function() {};
39050
39051         return oauth.preauth(o);
39052     };
39053
39054     // 'stamp' an authentication object from `getAuth()`
39055     // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
39056     // and timestamp
39057     function timenonce(o) {
39058         o.oauth_timestamp = ohauth_1.timestamp();
39059         o.oauth_nonce = ohauth_1.nonce();
39060         return o;
39061     }
39062
39063     // get/set tokens. These are prefixed with the base URL so that `osm-auth`
39064     // can be used with multiple APIs and the keys in `localStorage`
39065     // will not clash
39066     var token;
39067
39068     if (store_legacy.enabled) {
39069         token = function (x, y) {
39070             if (arguments.length === 1) return store_legacy.get(o.url + x);
39071             else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
39072         };
39073     } else {
39074         var storage = {};
39075         token = function (x, y) {
39076             if (arguments.length === 1) return storage[o.url + x];
39077             else if (arguments.length === 2) return storage[o.url + x] = y;
39078         };
39079     }
39080
39081     // Get an authentication object. If you just add and remove properties
39082     // from a single object, you'll need to use `delete` to make sure that
39083     // it doesn't contain undesired properties for authentication
39084     function getAuth(o) {
39085         return {
39086             oauth_consumer_key: o.oauth_consumer_key,
39087             oauth_signature_method: 'HMAC-SHA1'
39088         };
39089     }
39090
39091     // potentially pre-authorize
39092     oauth.options(o);
39093
39094     return oauth;
39095 };
39096
39097 var JXON = new (function () {
39098   var
39099     sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
39100     aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
39101
39102   function parseText (sValue) {
39103     if (rIsNull.test(sValue)) { return null; }
39104     if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
39105     if (isFinite(sValue)) { return parseFloat(sValue); }
39106     if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
39107     return sValue;
39108   }
39109
39110   function EmptyTree () { }
39111   EmptyTree.prototype.toString = function () { return 'null'; };
39112   EmptyTree.prototype.valueOf = function () { return null; };
39113
39114   function objectify (vValue) {
39115     return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
39116   }
39117
39118   function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
39119     var
39120       nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
39121       bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
39122
39123     var
39124       sProp, vContent, nLength = 0, sCollectedTxt = '',
39125       vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
39126
39127     if (bChildren) {
39128       for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
39129         oNode = oParentNode.childNodes.item(nItem);
39130         if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
39131         else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
39132         else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
39133       }
39134     }
39135
39136     var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
39137
39138     if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
39139
39140     for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
39141       sProp = aCache[nElId].nodeName.toLowerCase();
39142       vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
39143       if (vResult.hasOwnProperty(sProp)) {
39144         if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
39145         vResult[sProp].push(vContent);
39146       } else {
39147         vResult[sProp] = vContent;
39148         nLength++;
39149       }
39150     }
39151
39152     if (bAttributes) {
39153       var
39154         nAttrLen = oParentNode.attributes.length,
39155         sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
39156
39157       for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
39158         oAttrib = oParentNode.attributes.item(nAttrib);
39159         oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
39160       }
39161
39162       if (bNesteAttr) {
39163         if (bFreeze) { Object.freeze(oAttrParent); }
39164         vResult[sAttributesProp] = oAttrParent;
39165         nLength -= nAttrLen - 1;
39166       }
39167     }
39168
39169     if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
39170       vResult[sValueProp] = vBuiltVal;
39171     } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
39172       vResult = vBuiltVal;
39173     }
39174
39175     if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
39176
39177     aCache.length = nLevelStart;
39178
39179     return vResult;
39180   }
39181
39182   function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
39183     var vValue, oChild;
39184
39185     if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
39186       oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
39187     } else if (oParentObj.constructor === Date) {
39188       oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
39189     }
39190
39191     for (var sName in oParentObj) {
39192       vValue = oParentObj[sName];
39193       if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
39194       if (sName === sValueProp) {
39195         if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
39196       } else if (sName === sAttributesProp) { /* verbosity level is 3 */
39197         for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
39198       } else if (sName.charAt(0) === sAttrPref) {
39199         oParentEl.setAttribute(sName.slice(1), vValue);
39200       } else if (vValue.constructor === Array) {
39201         for (var nItem = 0; nItem < vValue.length; nItem++) {
39202           oChild = oXMLDoc.createElement(sName);
39203           loadObjTree(oXMLDoc, oChild, vValue[nItem]);
39204           oParentEl.appendChild(oChild);
39205         }
39206       } else {
39207         oChild = oXMLDoc.createElement(sName);
39208         if (vValue instanceof Object) {
39209           loadObjTree(oXMLDoc, oChild, vValue);
39210         } else if (vValue !== null && vValue !== true) {
39211           oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
39212         }
39213         oParentEl.appendChild(oChild);
39214      }
39215    }
39216   }
39217
39218   this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
39219     var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
39220     return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
39221   };
39222
39223   this.unbuild = function (oObjTree) {    
39224     var oNewDoc = document.implementation.createDocument('', '', null);
39225     loadObjTree(oNewDoc, oNewDoc, oObjTree);
39226     return oNewDoc;
39227   };
39228
39229   this.stringify = function (oObjTree) {
39230     return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
39231   };
39232 })();
39233
39234 // var myObject = JXON.build(doc);
39235 // we got our javascript object! try: alert(JSON.stringify(myObject));
39236
39237 // var newDoc = JXON.unbuild(myObject);
39238 // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
39239
39240 var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
39241 var urlroot = 'https://www.openstreetmap.org';
39242 var blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
39243 var inflight$1 = {};
39244 var loadedTiles = {};
39245 var entityCache = {};
39246 var tileZoom$2 = 16;
39247 var oauth = osmAuth({
39248         url: urlroot,
39249         oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
39250         oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
39251         loading: authLoading,
39252         done: authDone
39253     });
39254 var rateLimitError;
39255 var userChangesets;
39256 var userDetails;
39257 var off;
39258
39259
39260 function authLoading() {
39261     dispatch$3.call('authLoading');
39262 }
39263
39264
39265 function authDone() {
39266     dispatch$3.call('authDone');
39267 }
39268
39269
39270 function abortRequest$2(i) {
39271     if (i) {
39272         i.abort();
39273     }
39274 }
39275
39276
39277 function getLoc(attrs) {
39278     var lon = attrs.lon && attrs.lon.value,
39279         lat = attrs.lat && attrs.lat.value;
39280     return [parseFloat(lon), parseFloat(lat)];
39281 }
39282
39283
39284 function getNodes(obj) {
39285     var elems = obj.getElementsByTagName('nd'),
39286         nodes = new Array(elems.length);
39287     for (var i = 0, l = elems.length; i < l; i++) {
39288         nodes[i] = 'n' + elems[i].attributes.ref.value;
39289     }
39290     return nodes;
39291 }
39292
39293
39294 function getTags(obj) {
39295     var elems = obj.getElementsByTagName('tag'),
39296         tags = {};
39297     for (var i = 0, l = elems.length; i < l; i++) {
39298         var attrs = elems[i].attributes;
39299         tags[attrs.k.value] = attrs.v.value;
39300     }
39301
39302     return tags;
39303 }
39304
39305
39306 function getMembers(obj) {
39307     var elems = obj.getElementsByTagName('member'),
39308         members = new Array(elems.length);
39309     for (var i = 0, l = elems.length; i < l; i++) {
39310         var attrs = elems[i].attributes;
39311         members[i] = {
39312             id: attrs.type.value[0] + attrs.ref.value,
39313             type: attrs.type.value,
39314             role: attrs.role.value
39315         };
39316     }
39317     return members;
39318 }
39319
39320
39321 function getVisible(attrs) {
39322     return (!attrs.visible || attrs.visible.value !== 'false');
39323 }
39324
39325
39326 var parsers = {
39327     node: function nodeData(obj, uid) {
39328         var attrs = obj.attributes;
39329         return new osmNode({
39330             id:uid,
39331             visible: getVisible(attrs),
39332             version: attrs.version.value,
39333             changeset: attrs.changeset && attrs.changeset.value,
39334             timestamp: attrs.timestamp && attrs.timestamp.value,
39335             user: attrs.user && attrs.user.value,
39336             uid: attrs.uid && attrs.uid.value,
39337             loc: getLoc(attrs),
39338             tags: getTags(obj)
39339         });
39340     },
39341
39342     way: function wayData(obj, uid) {
39343         var attrs = obj.attributes;
39344         return new osmWay({
39345             id: uid,
39346             visible: getVisible(attrs),
39347             version: attrs.version.value,
39348             changeset: attrs.changeset && attrs.changeset.value,
39349             timestamp: attrs.timestamp && attrs.timestamp.value,
39350             user: attrs.user && attrs.user.value,
39351             uid: attrs.uid && attrs.uid.value,
39352             tags: getTags(obj),
39353             nodes: getNodes(obj),
39354         });
39355     },
39356
39357     relation: function relationData(obj, uid) {
39358         var attrs = obj.attributes;
39359         return new osmRelation({
39360             id: uid,
39361             visible: getVisible(attrs),
39362             version: attrs.version.value,
39363             changeset: attrs.changeset && attrs.changeset.value,
39364             timestamp: attrs.timestamp && attrs.timestamp.value,
39365             user: attrs.user && attrs.user.value,
39366             uid: attrs.uid && attrs.uid.value,
39367             tags: getTags(obj),
39368             members: getMembers(obj)
39369         });
39370     }
39371 };
39372
39373
39374 function parse(xml, callback, options) {
39375     options = assignIn$1({ cache: true }, options);
39376     if (!xml || !xml.childNodes) return;
39377
39378     var root = xml.childNodes[0],
39379         children = root.childNodes;
39380
39381     function parseChild(child) {
39382         var parser = parsers[child.nodeName];
39383         if (parser) {
39384             var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
39385             if (options.cache && entityCache[uid]) {
39386                 return null;
39387             }
39388             return parser(child, uid);
39389         }
39390     }
39391
39392     utilIdleWorker(children, parseChild, callback);
39393 }
39394
39395
39396 var serviceOsm = {
39397
39398     init: function() {
39399         utilRebind(this, dispatch$3, 'on');
39400     },
39401
39402
39403     reset: function() {
39404         userChangesets = undefined;
39405         userDetails = undefined;
39406         rateLimitError = undefined;
39407         forEach(inflight$1, abortRequest$2);
39408         entityCache = {};
39409         loadedTiles = {};
39410         inflight$1 = {};
39411         return this;
39412     },
39413
39414
39415     changesetURL: function(changesetId) {
39416         return urlroot + '/changeset/' + changesetId;
39417     },
39418
39419
39420     changesetsURL: function(center, zoom) {
39421         var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
39422         return urlroot + '/history#map=' +
39423             Math.floor(zoom) + '/' +
39424             center[1].toFixed(precision) + '/' +
39425             center[0].toFixed(precision);
39426     },
39427
39428
39429     entityURL: function(entity) {
39430         return urlroot + '/' + entity.type + '/' + entity.osmId();
39431     },
39432
39433
39434     historyURL: function(entity) {
39435         return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
39436     },
39437
39438
39439     userURL: function(username) {
39440         return urlroot + '/user/' + username;
39441     },
39442
39443
39444     loadFromAPI: function(path, callback, options) {
39445         options = assignIn$1({ cache: true }, options);
39446         var that = this;
39447
39448         function done(err, xml) {
39449             var isAuthenticated = that.authenticated();
39450
39451             // 400 Bad Request, 401 Unauthorized, 403 Forbidden
39452             // Logout and retry the request..
39453             if (isAuthenticated && err &&
39454                     (err.status === 400 || err.status === 401 || err.status === 403)) {
39455                 that.logout();
39456                 that.loadFromAPI(path, callback);
39457
39458             // else, no retry..
39459             } else {
39460                 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
39461                 // Set the rateLimitError flag and trigger a warning..
39462                 if (!isAuthenticated && !rateLimitError && err &&
39463                         (err.status === 509 || err.status === 429)) {
39464                     rateLimitError = err;
39465                     dispatch$3.call('change');
39466                 }
39467
39468                 if (callback) {
39469                     if (err) return callback(err, null);
39470                     parse(xml, function (entities) {
39471                         if (options.cache) {
39472                             for (var i in entities) {
39473                                 entityCache[entities[i].id] = true;
39474                             }
39475                         }
39476                         callback(null, entities);
39477                     }, options);
39478                 }
39479             }
39480         }
39481
39482         if (this.authenticated()) {
39483             return oauth.xhr({ method: 'GET', path: path }, done);
39484         } else {
39485             var url = urlroot + path;
39486             return d3_xml(url).get(done);
39487         }
39488     },
39489
39490
39491     loadEntity: function(id, callback) {
39492         var type = osmEntity$$1.id.type(id),
39493             osmID = osmEntity$$1.id.toOSM(id),
39494             options = { cache: false };
39495
39496         this.loadFromAPI(
39497             '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
39498             function(err, entities) {
39499                 if (callback) callback(err, { data: entities });
39500             },
39501             options
39502         );
39503     },
39504
39505
39506     loadEntityVersion: function(id, version, callback) {
39507         var type = osmEntity$$1.id.type(id),
39508             osmID = osmEntity$$1.id.toOSM(id),
39509             options = { cache: false };
39510
39511         this.loadFromAPI(
39512             '/api/0.6/' + type + '/' + osmID + '/' + version,
39513             function(err, entities) {
39514                 if (callback) callback(err, { data: entities });
39515             },
39516             options
39517         );
39518     },
39519
39520
39521     loadMultiple: function(ids, callback) {
39522         var that = this;
39523
39524         forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
39525             var type = k + 's',
39526                 osmIDs = map$4(v, osmEntity$$1.id.toOSM),
39527                 options = { cache: false };
39528
39529             forEach(chunk(osmIDs, 150), function(arr) {
39530                 that.loadFromAPI(
39531                     '/api/0.6/' + type + '?' + type + '=' + arr.join(),
39532                     function(err, entities) {
39533                         if (callback) callback(err, { data: entities });
39534                     },
39535                     options
39536                 );
39537             });
39538         });
39539     },
39540
39541
39542     authenticated: function() {
39543         return oauth.authenticated();
39544     },
39545
39546
39547     putChangeset: function(changeset, changes, callback) {
39548
39549         // Create the changeset..
39550         oauth.xhr({
39551             method: 'PUT',
39552             path: '/api/0.6/changeset/create',
39553             options: { header: { 'Content-Type': 'text/xml' } },
39554             content: JXON.stringify(changeset.asJXON())
39555         }, createdChangeset);
39556
39557
39558         function createdChangeset(err, changeset_id) {
39559             if (err) return callback(err);
39560             changeset = changeset.update({ id: changeset_id });
39561
39562             // Upload the changeset..
39563             oauth.xhr({
39564                 method: 'POST',
39565                 path: '/api/0.6/changeset/' + changeset_id + '/upload',
39566                 options: { header: { 'Content-Type': 'text/xml' } },
39567                 content: JXON.stringify(changeset.osmChangeJXON(changes))
39568             }, uploadedChangeset);
39569         }
39570
39571
39572         function uploadedChangeset(err) {
39573             if (err) return callback(err);
39574
39575             // Upload was successful, safe to call the callback.
39576             // Add delay to allow for postgres replication #1646 #2678
39577             window.setTimeout(function() {
39578                 callback(null, changeset);
39579             }, 2500);
39580
39581             // Still attempt to close changeset, but ignore response because #2667
39582             oauth.xhr({
39583                 method: 'PUT',
39584                 path: '/api/0.6/changeset/' + changeset.id + '/close',
39585                 options: { header: { 'Content-Type': 'text/xml' } }
39586             }, function() { return true; });
39587         }
39588     },
39589
39590
39591     userDetails: function(callback) {
39592         if (userDetails) {
39593             callback(undefined, userDetails);
39594             return;
39595         }
39596
39597         function done(err, user_details) {
39598             if (err) return callback(err);
39599
39600             var u = user_details.getElementsByTagName('user')[0],
39601                 img = u.getElementsByTagName('img'),
39602                 image_url = '';
39603
39604             if (img && img[0] && img[0].getAttribute('href')) {
39605                 image_url = img[0].getAttribute('href');
39606             }
39607
39608             var changesets = u.getElementsByTagName('changesets'),
39609                 changesets_count = 0;
39610
39611             if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
39612                 changesets_count = changesets[0].getAttribute('count');
39613             }
39614
39615             userDetails = {
39616                 id: u.attributes.id.value,
39617                 display_name: u.attributes.display_name.value,
39618                 image_url: image_url,
39619                 changesets_count: changesets_count
39620             };
39621
39622             callback(undefined, userDetails);
39623         }
39624
39625         oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
39626     },
39627
39628
39629     userChangesets: function(callback) {
39630         if (userChangesets) {
39631             callback(undefined, userChangesets);
39632             return;
39633         }
39634
39635         this.userDetails(function(err, user) {
39636             if (err) {
39637                 callback(err);
39638                 return;
39639             }
39640
39641             function done(err, changesets) {
39642                 if (err) {
39643                     callback(err);
39644                 } else {
39645                     userChangesets = Array.prototype.map.call(
39646                         changesets.getElementsByTagName('changeset'),
39647                         function (changeset) {
39648                             return { tags: getTags(changeset) };
39649                         }
39650                     ).filter(function (changeset) {
39651                         var comment = changeset.tags.comment;
39652                         return comment && comment !== '';
39653                     });
39654                     callback(undefined, userChangesets);
39655                 }
39656             }
39657
39658             oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
39659         });
39660     },
39661
39662
39663     status: function(callback) {
39664         function done(xml) {
39665             // update blacklists
39666             var elements = xml.getElementsByTagName('blacklist'),
39667                 regexes = [];
39668             for (var i = 0; i < elements.length; i++) {
39669                 var regex = elements[i].getAttribute('regex');  // needs unencode?
39670                 if (regex) {
39671                     regexes.push(regex);
39672                 }
39673             }
39674             if (regexes.length) {
39675                 blacklists = regexes;
39676             }
39677
39678
39679             if (rateLimitError) {
39680                 callback(rateLimitError, 'rateLimited');
39681             } else {
39682                 var apiStatus = xml.getElementsByTagName('status'),
39683                     val = apiStatus[0].getAttribute('api');
39684
39685                 callback(undefined, val);
39686             }
39687         }
39688
39689         d3_xml(urlroot + '/api/capabilities').get()
39690             .on('load', done)
39691             .on('error', callback);
39692     },
39693
39694
39695     imageryBlacklists: function() {
39696         return blacklists;
39697     },
39698
39699
39700     tileZoom: function(_) {
39701         if (!arguments.length) return tileZoom$2;
39702         tileZoom$2 = _;
39703         return this;
39704     },
39705
39706
39707     loadTiles: function(projection, dimensions, callback) {
39708         if (off) return;
39709
39710         var that = this,
39711             s = projection.scale() * 2 * Math.PI,
39712             z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
39713             ts = 256 * Math.pow(2, z - tileZoom$2),
39714             origin = [
39715                 s / 2 - projection.translate()[0],
39716                 s / 2 - projection.translate()[1]
39717             ];
39718
39719         var tiles = d3geoTile()
39720             .scaleExtent([tileZoom$2, tileZoom$2])
39721             .scale(s)
39722             .size(dimensions)
39723             .translate(projection.translate())()
39724             .map(function(tile) {
39725                 var x = tile[0] * ts - origin[0],
39726                     y = tile[1] * ts - origin[1];
39727
39728                 return {
39729                     id: tile.toString(),
39730                     extent: geoExtent$$1(
39731                         projection.invert([x, y + ts]),
39732                         projection.invert([x + ts, y]))
39733                 };
39734             });
39735
39736         filter(inflight$1, function(v, i) {
39737             var wanted = find$1(tiles, function(tile) {
39738                 return i === tile.id;
39739             });
39740             if (!wanted) delete inflight$1[i];
39741             return !wanted;
39742         }).map(abortRequest$2);
39743
39744         tiles.forEach(function(tile) {
39745             var id = tile.id;
39746
39747             if (loadedTiles[id] || inflight$1[id]) return;
39748
39749             if (isEmpty(inflight$1)) {
39750                 dispatch$3.call('loading');
39751             }
39752
39753             inflight$1[id] = that.loadFromAPI(
39754                 '/api/0.6/map?bbox=' + tile.extent.toParam(),
39755                 function(err, parsed) {
39756                     delete inflight$1[id];
39757                     if (!err) {
39758                         loadedTiles[id] = true;
39759                     }
39760
39761                     if (callback) {
39762                         callback(err, assignIn$1({ data: parsed }, tile));
39763                     }
39764
39765                     if (isEmpty(inflight$1)) {
39766                         dispatch$3.call('loaded');
39767                     }
39768                 }
39769             );
39770         });
39771     },
39772
39773
39774     switch: function(options) {
39775         urlroot = options.urlroot;
39776
39777         oauth.options(assignIn$1({
39778             url: urlroot,
39779             loading: authLoading,
39780             done: authDone
39781         }, options));
39782
39783         dispatch$3.call('change');
39784         this.reset();
39785         this.userChangesets(function() {});  // eagerly load user details/changesets
39786         return this;
39787     },
39788
39789
39790     toggle: function(_) {
39791         off = !_;
39792         return this;
39793     },
39794
39795
39796     loadedTiles: function(_) {
39797         if (!arguments.length) return loadedTiles;
39798         loadedTiles = _;
39799         return this;
39800     },
39801
39802
39803     logout: function() {
39804         userChangesets = undefined;
39805         userDetails = undefined;
39806         oauth.logout();
39807         dispatch$3.call('change');
39808         return this;
39809     },
39810
39811
39812     authenticate: function(callback) {
39813         var that = this;
39814         userChangesets = undefined;
39815         userDetails = undefined;
39816
39817         function done(err, res) {
39818             rateLimitError = undefined;
39819             dispatch$3.call('change');
39820             if (callback) callback(err, res);
39821             that.userChangesets(function() {});  // eagerly load user details/changesets
39822         }
39823
39824         return oauth.authenticate(done);
39825     }
39826 };
39827
39828 var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/';
39829 var inflight$2 = {};
39830 var popularKeys = {};
39831 var taginfoCache = {};
39832 var tag_sorts = {
39833         point: 'count_nodes',
39834         vertex: 'count_nodes',
39835         area: 'count_ways',
39836         line: 'count_ways'
39837     };
39838 var tag_sort_members = {
39839         point: 'count_node_members',
39840         vertex: 'count_node_members',
39841         area: 'count_way_members',
39842         line: 'count_way_members',
39843         relation: 'count_relation_members'
39844     };
39845 var tag_filters = {
39846         point: 'nodes',
39847         vertex: 'nodes',
39848         area: 'ways',
39849         line: 'ways'
39850     };
39851 var tag_members_fractions = {
39852         point: 'count_node_members_fraction',
39853         vertex: 'count_node_members_fraction',
39854         area: 'count_way_members_fraction',
39855         line: 'count_way_members_fraction',
39856         relation: 'count_relation_members_fraction'
39857     };
39858
39859
39860 function sets(params, n, o) {
39861     if (params.geometry && o[params.geometry]) {
39862         params[n] = o[params.geometry];
39863     }
39864     return params;
39865 }
39866
39867
39868 function setFilter(params) {
39869     return sets(params, 'filter', tag_filters);
39870 }
39871
39872
39873 function setSort(params) {
39874     return sets(params, 'sortname', tag_sorts);
39875 }
39876
39877
39878 function setSortMembers(params) {
39879     return sets(params, 'sortname', tag_sort_members);
39880 }
39881
39882
39883 function clean(params) {
39884     return omit(params, ['geometry', 'debounce']);
39885 }
39886
39887
39888 function filterKeys(type) {
39889     var count_type = type ? 'count_' + type : 'count_all';
39890     return function(d) {
39891         return parseFloat(d[count_type]) > 2500 || d.in_wiki;
39892     };
39893 }
39894
39895
39896 function filterMultikeys(prefix) {
39897     return function(d) {
39898         // d.key begins with prefix, and d.key contains no additional ':'s
39899         var re = new RegExp('^' + prefix + '(.*)$');
39900         var matches = d.key.match(re) || [];
39901         return (matches.length === 2 && matches[1].indexOf(':') === -1);
39902     };
39903 }
39904
39905
39906 function filterValues(allowUpperCase) {
39907     return function(d) {
39908         if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
39909         if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
39910         return parseFloat(d.fraction) > 0.0 || d.in_wiki;
39911     };
39912 }
39913
39914
39915 function filterRoles(geometry) {
39916     return function(d) {
39917         if (d.role === '') return false; // exclude empty role
39918         if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
39919         return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
39920     };
39921 }
39922
39923
39924 function valKey(d) {
39925     return {
39926         value: d.key,
39927         title: d.key
39928     };
39929 }
39930
39931
39932 function valKeyDescription(d) {
39933     return {
39934         value: d.value,
39935         title: d.description || d.value
39936     };
39937 }
39938
39939
39940 function roleKey(d) {
39941     return {
39942         value: d.role,
39943         title: d.role
39944     };
39945 }
39946
39947
39948 // sort keys with ':' lower than keys without ':'
39949 function sortKeys(a, b) {
39950     return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
39951         : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
39952         : 0;
39953 }
39954
39955
39956 var debouncedRequest = debounce$1(request, 500, { leading: false });
39957
39958 function request(url, params, exactMatch, callback, loaded) {
39959     if (inflight$2[url]) return;
39960
39961     if (checkCache(url, params, exactMatch, callback)) return;
39962
39963     inflight$2[url] = d3_json(url, function (err, data) {
39964         delete inflight$2[url];
39965         loaded(err, data);
39966     });
39967 }
39968
39969
39970 function checkCache(url, params, exactMatch, callback) {
39971     var rp = params.rp || 25,
39972         testQuery = params.query || '',
39973         testUrl = url;
39974
39975     do {
39976         var hit = taginfoCache[testUrl];
39977
39978         // exact match, or shorter match yielding fewer than max results (rp)
39979         if (hit && (url === testUrl || hit.length < rp)) {
39980             callback(null, hit);
39981             return true;
39982         }
39983
39984         // don't try to shorten the query
39985         if (exactMatch || !testQuery.length) return false;
39986
39987         // do shorten the query to see if we already have a cached result
39988         // that has returned fewer than max results (rp)
39989         testQuery = testQuery.slice(0, -1);
39990         testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
39991     } while (testQuery.length >= 0);
39992
39993     return false;
39994 }
39995
39996
39997 var serviceTaginfo = {
39998
39999     init: function() {
40000         inflight$2 = {};
40001         taginfoCache = {};
40002         popularKeys = {};
40003
40004         // Fetch popular keys.  We'll exclude these from `values`
40005         // lookups because they stress taginfo, and they aren't likely
40006         // to yield meaningful autocomplete results.. see #3955
40007         var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
40008         this.keys(params, function(err, data) {
40009             if (err) return;
40010             data.forEach(function(d) {
40011                 if (d.value === 'opening_hours') return;  // exception
40012                 popularKeys[d.value] = true;
40013             });
40014         });
40015     },
40016
40017
40018     reset: function() {
40019         forEach(inflight$2, function(req) { req.abort(); });
40020         inflight$2 = {};
40021     },
40022
40023
40024     keys: function(params, callback) {
40025         var doRequest = params.debounce ? debouncedRequest : request;
40026         params = clean(setSort(params));
40027         params = assignIn$1({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40028
40029         var url = apibase$3 + 'keys/all?' + utilQsString(params);
40030         doRequest(url, params, false, callback, function(err, d) {
40031             if (err) {
40032                 callback(err);
40033             } else {
40034                 var f = filterKeys(params.filter);
40035                 var result = d.data.filter(f).sort(sortKeys).map(valKey);
40036                 taginfoCache[url] = result;
40037                 callback(null, result);
40038             }
40039         });
40040     },
40041
40042
40043     multikeys: function(params, callback) {
40044         var doRequest = params.debounce ? debouncedRequest : request;
40045         params = clean(setSort(params));
40046         params = assignIn$1({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40047         var prefix = params.query;
40048
40049         var url = apibase$3 + 'keys/all?' + utilQsString(params);
40050         doRequest(url, params, true, callback, function(err, d) {
40051             if (err) {
40052                 callback(err);
40053             } else {
40054                 var f = filterMultikeys(prefix);
40055                 var result = d.data.filter(f).map(valKey);
40056                 taginfoCache[url] = result;
40057                 callback(null, result);
40058             }
40059         });
40060     },
40061
40062
40063     values: function(params, callback) {
40064         // Exclude popular keys from values lookups.. see #3955
40065         var key = params.key;
40066         if (key && popularKeys[key]) {
40067             callback(null, []);
40068             return;
40069         }
40070
40071         var doRequest = params.debounce ? debouncedRequest : request;
40072         params = clean(setSort(setFilter(params)));
40073         params = assignIn$1({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40074
40075         var url = apibase$3 + 'key/values?' + utilQsString(params);
40076         doRequest(url, params, false, callback, function(err, d) {
40077             if (err) {
40078                 callback(err);
40079             } else {
40080                 // In most cases we prefer taginfo value results with lowercase letters.
40081                 // A few OSM keys expect values to contain uppercase values (see #3377).
40082                 // This is not an exhaustive list (e.g. `name` also has uppercase values)
40083                 // but these are the fields where taginfo value lookup is most useful.
40084                 var re = /network|taxon|genus|species|brand|grape_variety|rating|:output|_hours|_times/;
40085                 var allowUpperCase = (params.key.match(re) !== null);
40086                 var f = filterValues(allowUpperCase);
40087
40088                 var result = d.data.filter(f).map(valKeyDescription);
40089                 taginfoCache[url] = result;
40090                 callback(null, result);
40091             }
40092         });
40093     },
40094
40095
40096     roles: function(params, callback) {
40097         var doRequest = params.debounce ? debouncedRequest : request;
40098         var geometry = params.geometry;
40099         params = clean(setSortMembers(params));
40100         params = assignIn$1({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
40101
40102         var url = apibase$3 + 'relation/roles?' + utilQsString(params);
40103         doRequest(url, params, true, callback, function(err, d) {
40104             if (err) {
40105                 callback(err);
40106             } else {
40107                 var f = filterRoles(geometry);
40108                 var result = d.data.filter(f).map(roleKey);
40109                 taginfoCache[url] = result;
40110                 callback(null, result);
40111             }
40112         });
40113     },
40114
40115
40116     docs: function(params, callback) {
40117         var doRequest = params.debounce ? debouncedRequest : request;
40118         params = clean(setSort(params));
40119
40120         var path = 'key/wiki_pages?';
40121         if (params.value) path = 'tag/wiki_pages?';
40122         else if (params.rtype) path = 'relation/wiki_pages?';
40123
40124         var url = apibase$3 + path + utilQsString(params);
40125         doRequest(url, params, true, callback, function(err, d) {
40126             if (err) {
40127                 callback(err);
40128             } else {
40129                 taginfoCache[url] = d.data;
40130                 callback(null, d.data);
40131             }
40132         });
40133     },
40134
40135
40136     apibase: function(_) {
40137         if (!arguments.length) return apibase$3;
40138         apibase$3 = _;
40139         return this;
40140     }
40141
40142 };
40143
40144 var jsonpCache = {};
40145 window.jsonpCache = jsonpCache;
40146
40147 function jsonpRequest(url, callback) {
40148
40149   if (window.JSONP_FIX) {
40150     if (window.JSONP_DELAY === 0) {
40151       callback(window.JSONP_FIX);
40152     } else {
40153       setTimeout(function() {
40154         callback(window.JSONP_FIX);
40155       }, window.JSONP_DELAY || 0);
40156     }
40157     return;
40158   }
40159
40160   function rand() {
40161     var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
40162       c = '', i = -1;
40163     while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
40164     return c;
40165   }
40166
40167   function create(url) {
40168     var e = url.match(/callback=(\w+)/),
40169       c = e ? e[1] : rand();
40170     jsonpCache[c] = function(data) {
40171       callback(data);
40172       delete jsonpCache[c];
40173       script.remove();
40174     };
40175     return 'jsonpCache.' + c;
40176   }
40177
40178   var cb = create(url),
40179     script = d3_select('head')
40180     .append('script')
40181     .attr('type', 'text/javascript')
40182     .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
40183 }
40184
40185 var endpoint = 'https://www.wikidata.org/w/api.php?';
40186
40187 var serviceWikidata = {
40188
40189     init: function() {},
40190     reset: function() {},
40191
40192
40193     // Given a Wikipedia language and article title, return an array of
40194     // corresponding Wikidata entities.
40195     itemsByTitle: function(lang, title, callback) {
40196         if (!title) {
40197             callback('', {});
40198             return;
40199         }
40200
40201         lang = lang || 'en';
40202         jsonpRequest(endpoint + utilQsString({
40203             action: 'wbgetentities',
40204             format: 'json',
40205             sites: lang.replace(/-/g, '_') + 'wiki',
40206             titles: title,
40207             languages: 'en', // shrink response by filtering to one language
40208             callback: '{callback}'
40209         }), function(data) {
40210             if (!data || data.error) {
40211                 callback('', {});
40212             } else {
40213                 callback(title, data.entities || {});
40214             }
40215         });
40216     }
40217
40218 };
40219
40220 var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
40221
40222 var serviceWikipedia = {
40223
40224     init: function() {},
40225     reset: function() {},
40226
40227
40228     search: function(lang, query, callback) {
40229         if (!query) {
40230             callback('', []);
40231             return;
40232         }
40233
40234         lang = lang || 'en';
40235         jsonpRequest(endpoint$1.replace('en', lang) +
40236             utilQsString({
40237                 action: 'query',
40238                 list: 'search',
40239                 srlimit: '10',
40240                 srinfo: 'suggestion',
40241                 format: 'json',
40242                 callback: '{callback}',
40243                 srsearch: query
40244             }), function(data) {
40245                 if (!data || !data.query || !data.query.search || data.error) {
40246                     callback('', []);
40247                 } else {
40248                     var results = data.query.search.map(function(d) { return d.title; });
40249                     callback(query, results);
40250                 }
40251             }
40252         );
40253     },
40254
40255
40256     suggestions: function(lang, query, callback) {
40257         if (!query) {
40258             callback('', []);
40259             return;
40260         }
40261
40262         lang = lang || 'en';
40263         jsonpRequest(endpoint$1.replace('en', lang) +
40264             utilQsString({
40265                 action: 'opensearch',
40266                 namespace: 0,
40267                 suggest: '',
40268                 format: 'json',
40269                 callback: '{callback}',
40270                 search: query
40271             }), function(data) {
40272                 if (!data || data.error) {
40273                     callback('', []);
40274                 } else {
40275                     callback(data[0], data[1] || []);
40276                 }
40277             }
40278         );
40279     },
40280
40281
40282     translations: function(lang, title, callback) {
40283         if (!title) {
40284             callback({});
40285             return;
40286         }
40287
40288         jsonpRequest(endpoint$1.replace('en', lang) +
40289             utilQsString({
40290                 action: 'query',
40291                 prop: 'langlinks',
40292                 format: 'json',
40293                 callback: '{callback}',
40294                 lllimit: 500,
40295                 titles: title
40296             }), function(data) {
40297                 if (!data || !data.query || !data.query.pages || data.error) {
40298                     callback({});
40299                 } else {
40300                     var list = data.query.pages[Object.keys(data.query.pages)[0]],
40301                         translations = {};
40302                     if (list && list.langlinks) {
40303                         list.langlinks.forEach(function(d) {
40304                             translations[d.lang] = d['*'];
40305                         });
40306                     }
40307                     callback(translations);
40308                 }
40309             }
40310         );
40311     }
40312
40313 };
40314
40315 var services = {
40316     geocoder: serviceNominatim,
40317     mapillary: serviceMapillary,
40318     openstreetcam: serviceOpenstreetcam,
40319     osm: serviceOsm,
40320     taginfo: serviceTaginfo,
40321     wikidata: serviceWikidata,
40322     wikipedia: serviceWikipedia
40323 };
40324
40325 function svgAreas$$1(projection, context) {
40326     // Patterns only work in Firefox when set directly on element.
40327     // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
40328     var patterns = {
40329         beach: 'beach',
40330         cemetery: 'cemetery',
40331         construction: 'construction',
40332         farm: 'farmland',
40333         farmland: 'farmland',
40334         grave_yard: 'cemetery',
40335         meadow: 'meadow',
40336         military: 'construction',
40337         orchard: 'orchard',
40338         sand: 'beach',
40339         scrub: 'scrub',
40340         wetland: 'wetland',
40341     };
40342
40343     var patternKeys = ['landuse', 'natural', 'amenity'];
40344
40345
40346     function setPattern(d) {
40347         for (var i = 0; i < patternKeys.length; i++) {
40348             if (d.tags.building && d.tags.building !== 'no') continue;
40349
40350             if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
40351                 this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
40352                 return;
40353             }
40354         }
40355         this.style.fill = this.style.stroke = '';
40356     }
40357
40358
40359     return function drawAreas(selection, graph, entities, filter) {
40360         var path = svgPath(projection, graph, true),
40361             areas = {},
40362             multipolygon;
40363
40364         for (var i = 0; i < entities.length; i++) {
40365             var entity = entities[i];
40366             if (entity.geometry(graph) !== 'area') continue;
40367
40368             multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
40369             if (multipolygon) {
40370                 areas[multipolygon.id] = {
40371                     entity: multipolygon.mergeTags(entity.tags),
40372                     area: Math.abs(entity.area(graph))
40373                 };
40374             } else if (!areas[entity.id]) {
40375                 areas[entity.id] = {
40376                     entity: entity,
40377                     area: Math.abs(entity.area(graph))
40378                 };
40379             }
40380         }
40381
40382         areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
40383         areas.sort(function areaSort(a, b) { return b.area - a.area; });
40384         areas = map$4(areas, 'entity');
40385
40386         var strokes = areas.filter(function(area) {
40387             return area.type === 'way';
40388         });
40389
40390         var data = {
40391             clip: areas,
40392             shadow: strokes,
40393             stroke: strokes,
40394             fill: areas
40395         };
40396
40397         var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
40398            .filter(filter)
40399            .data(data.clip, osmEntity$$1.key);
40400
40401         clipPaths.exit()
40402            .remove();
40403
40404         var clipPathsEnter = clipPaths.enter()
40405            .append('clipPath')
40406            .attr('class', 'clipPath')
40407            .attr('id', function(entity) { return entity.id + '-clippath'; });
40408
40409         clipPathsEnter
40410            .append('path');
40411
40412         clipPaths.merge(clipPathsEnter)
40413            .selectAll('path')
40414            .attr('d', path);
40415
40416
40417         var layer = selection.selectAll('.layer-areas');
40418
40419         var areagroup = layer
40420             .selectAll('g.areagroup')
40421             .data(['fill', 'shadow', 'stroke']);
40422
40423         areagroup = areagroup.enter()
40424             .append('g')
40425             .attr('class', function(d) { return 'areagroup area-' + d; })
40426             .merge(areagroup);
40427
40428         var paths = areagroup
40429             .selectAll('path')
40430             .filter(filter)
40431             .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
40432
40433         paths.exit()
40434             .remove();
40435
40436         var fills = selection.selectAll('.area-fill path.area').nodes();
40437
40438         var bisect = d3_bisector(function(node) {
40439             return -node.__data__.area(graph);
40440         }).left;
40441
40442         function sortedByArea(entity) {
40443             if (this._parent.__data__ === 'fill') {
40444                 return fills[bisect(fills, -entity.area(graph))];
40445             }
40446         }
40447
40448         paths = paths.enter()
40449             .insert('path', sortedByArea)
40450             .merge(paths)
40451             .each(function(entity) {
40452                 var layer = this.parentNode.__data__;
40453
40454                 this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
40455
40456                 if (layer === 'fill') {
40457                     this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
40458                     setPattern.apply(this, arguments);
40459                 }
40460             })
40461             .call(svgTagClasses())
40462             .attr('d', path);
40463     };
40464 }
40465
40466 function svgDebug(projection$$1, context) {
40467
40468     function multipolygons(imagery) {
40469         return imagery.map(function(data$$1) {
40470             return {
40471                 type: 'MultiPolygon',
40472                 coordinates: [ data$$1.polygon ]
40473             };
40474         });
40475     }
40476
40477     function drawDebug(selection$$1) {
40478         var showsTile = context.getDebug('tile'),
40479             showsCollision = context.getDebug('collision'),
40480             showsImagery = context.getDebug('imagery'),
40481             showsImperial = context.getDebug('imperial'),
40482             showsDriveLeft = context.getDebug('driveLeft'),
40483             path = d3_geoPath(projection$$1);
40484
40485
40486         var debugData = [];
40487         if (showsTile) {
40488             debugData.push({ class: 'red', label: 'tile' });
40489         }
40490         if (showsCollision) {
40491             debugData.push({ class: 'yellow', label: 'collision' });
40492         }
40493         if (showsImagery) {
40494             debugData.push({ class: 'orange', label: 'imagery' });
40495         }
40496         if (showsImperial) {
40497             debugData.push({ class: 'cyan', label: 'imperial' });
40498         }
40499         if (showsDriveLeft) {
40500             debugData.push({ class: 'green', label: 'driveLeft' });
40501         }
40502
40503
40504         var legend = d3_select('#content')
40505             .selectAll('.debug-legend')
40506             .data(debugData.length ? [0] : []);
40507
40508         legend.exit()
40509             .remove();
40510
40511         legend = legend.enter()
40512             .append('div')
40513             .attr('class', 'fillD debug-legend')
40514             .merge(legend);
40515
40516
40517         var legendItems = legend.selectAll('.debug-legend-item')
40518             .data(debugData, function(d) { return d.label; });
40519
40520         legendItems.exit()
40521             .remove();
40522
40523         legendItems.enter()
40524             .append('span')
40525             .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
40526             .text(function(d) { return d.label; });
40527
40528
40529         var layer = selection$$1.selectAll('.layer-debug')
40530             .data(showsImagery || showsImperial || showsDriveLeft ? [0] : []);
40531
40532         layer.exit()
40533             .remove();
40534
40535         layer = layer.enter()
40536             .append('g')
40537             .attr('class', 'layer-debug')
40538             .merge(layer);
40539
40540
40541         var extent = context.map().extent(),
40542             dataImagery = data.imagery || [],
40543             availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
40544                 if (!source.polygon) return false;
40545                 return source.polygon.some(function(polygon) {
40546                     return geoPolygonIntersectsPolygon(polygon, extent, true);
40547                 });
40548             }));
40549
40550         var imagery = layer.selectAll('path.debug-imagery')
40551             .data(showsImagery ? availableImagery : []);
40552
40553         imagery.exit()
40554             .remove();
40555
40556         imagery.enter()
40557             .append('path')
40558             .attr('class', 'debug-imagery debug orange');
40559
40560
40561         var imperial = layer
40562             .selectAll('path.debug-imperial')
40563             .data(showsImperial ? [dataImperial] : []);
40564
40565         imperial.exit()
40566             .remove();
40567
40568         imperial.enter()
40569             .append('path')
40570             .attr('class', 'debug-imperial debug cyan');
40571
40572
40573         var driveLeft = layer
40574             .selectAll('path.debug-drive-left')
40575             .data(showsDriveLeft ? [dataDriveLeft] : []);
40576
40577         driveLeft.exit()
40578             .remove();
40579
40580         driveLeft.enter()
40581             .append('path')
40582             .attr('class', 'debug-drive-left debug green');
40583
40584
40585         // update
40586         layer.selectAll('path')
40587             .attr('d', path);
40588     }
40589
40590
40591     // This looks strange because `enabled` methods on other layers are
40592     // chainable getter/setters, and this one is just a getter.
40593     drawDebug.enabled = function() {
40594         if (!arguments.length) {
40595             return context.getDebug('tile') ||
40596                 context.getDebug('collision') ||
40597                 context.getDebug('imagery') ||
40598                 context.getDebug('imperial') ||
40599                 context.getDebug('driveLeft');
40600         } else {
40601             return this;
40602         }
40603     };
40604
40605
40606     return drawDebug;
40607 }
40608
40609 /*
40610     A standalone SVG element that contains only a `defs` sub-element. To be
40611     used once globally, since defs IDs must be unique within a document.
40612 */
40613 function svgDefs(context) {
40614
40615     function SVGSpriteDefinition(id, href) {
40616         return function(defs) {
40617             d3_request(href)
40618                 .mimeType('image/svg+xml')
40619                 .response(function(xhr) { return xhr.responseXML; })
40620                 .get(function(err, svg) {
40621                     if (err) return;
40622                     defs.node().appendChild(
40623                         d3_select(svg.documentElement).attr('id', id).node()
40624                     );
40625                 });
40626         };
40627     }
40628
40629
40630     return function drawDefs(selection$$1) {
40631         var defs = selection$$1.append('defs');
40632
40633         // marker
40634         defs.append('marker')
40635             .attr('id', 'oneway-marker')
40636             .attr('viewBox', '0 0 10 10')
40637             .attr('refY', 2.5)
40638             .attr('refX', 5)
40639             .attr('markerWidth', 2)
40640             .attr('markerHeight', 2)
40641             .attr('markerUnits', 'strokeWidth')
40642             .attr('orient', 'auto')
40643
40644             .append('path')
40645             .attr('class', 'oneway')
40646             .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')
40647             .attr('stroke', 'none')
40648             .attr('fill', '#000')
40649             .attr('opacity', '0.75');
40650
40651         // patterns
40652         var patterns = defs.selectAll('pattern')
40653             .data([
40654                 // pattern name, pattern image name
40655                 ['wetland', 'wetland'],
40656                 ['construction', 'construction'],
40657                 ['cemetery', 'cemetery'],
40658                 ['orchard', 'orchard'],
40659                 ['farmland', 'farmland'],
40660                 ['beach', 'dots'],
40661                 ['scrub', 'dots'],
40662                 ['meadow', 'dots']
40663             ])
40664             .enter()
40665             .append('pattern')
40666             .attr('id', function (d) {
40667                 return 'pattern-' + d[0];
40668             })
40669             .attr('width', 32)
40670             .attr('height', 32)
40671             .attr('patternUnits', 'userSpaceOnUse');
40672
40673         patterns.append('rect')
40674             .attr('x', 0)
40675             .attr('y', 0)
40676             .attr('width', 32)
40677             .attr('height', 32)
40678             .attr('class', function (d) {
40679                     return 'pattern-color-' + d[0];
40680             });
40681
40682         patterns.append('image')
40683             .attr('x', 0)
40684             .attr('y', 0)
40685             .attr('width', 32)
40686             .attr('height', 32)
40687             .attr('xlink:href', function (d) {
40688                 return context.imagePath('pattern/' + d[1] + '.png');
40689             });
40690
40691         // clip paths
40692         defs.selectAll()
40693             .data([12, 18, 20, 32, 45])
40694             .enter()
40695             .append('clipPath')
40696             .attr('id', function (d) {
40697                 return 'clip-square-' + d;
40698             })
40699             .append('rect')
40700             .attr('x', 0)
40701             .attr('y', 0)
40702             .attr('width', function (d) {
40703                 return d;
40704             })
40705             .attr('height', function (d) {
40706                 return d;
40707             });
40708
40709         defs.call(SVGSpriteDefinition(
40710             'iD-sprite',
40711             context.imagePath('iD-sprite.svg')));
40712
40713         defs.call(SVGSpriteDefinition(
40714             'maki-sprite',
40715             context.imagePath('maki-sprite.svg')));
40716     };
40717 }
40718
40719 /**
40720  * Checks if `value` is `undefined`.
40721  *
40722  * @static
40723  * @since 0.1.0
40724  * @memberOf _
40725  * @category Lang
40726  * @param {*} value The value to check.
40727  * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
40728  * @example
40729  *
40730  * _.isUndefined(void 0);
40731  * // => true
40732  *
40733  * _.isUndefined(null);
40734  * // => false
40735  */
40736 function isUndefined(value) {
40737   return value === undefined;
40738 }
40739
40740 //[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]
40741 //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
40742 //[5]           Name       ::=          NameStartChar (NameChar)*
40743 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
40744 var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
40745 var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
40746 //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
40747 //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(',')
40748
40749 //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
40750 //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
40751 var S_TAG = 0;//tag name offerring
40752 var S_ATTR = 1;//attr name offerring 
40753 var S_ATTR_SPACE=2;//attr name end and space offer
40754 var S_EQ = 3;//=space?
40755 var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
40756 var S_ATTR_END = 5;//attr value end and no space(quot end)
40757 var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
40758 var S_TAG_CLOSE = 7;//closed el<el />
40759
40760 function XMLReader(){
40761         
40762 }
40763
40764 XMLReader.prototype = {
40765         parse:function(source,defaultNSMap,entityMap){
40766                 var domBuilder = this.domBuilder;
40767                 domBuilder.startDocument();
40768                 _copy(defaultNSMap ,defaultNSMap = {});
40769                 parse$1(source,defaultNSMap,entityMap,
40770                                 domBuilder,this.errorHandler);
40771                 domBuilder.endDocument();
40772         }
40773 };
40774 function parse$1(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
40775         function fixedFromCharCode(code) {
40776                 // String.prototype.fromCharCode does not supports
40777                 // > 2 bytes unicode chars directly
40778                 if (code > 0xffff) {
40779                         code -= 0x10000;
40780                         var surrogate1 = 0xd800 + (code >> 10)
40781                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
40782
40783                         return String.fromCharCode(surrogate1, surrogate2);
40784                 } else {
40785                         return String.fromCharCode(code);
40786                 }
40787         }
40788         function entityReplacer(a){
40789                 var k = a.slice(1,-1);
40790                 if(k in entityMap){
40791                         return entityMap[k]; 
40792                 }else if(k.charAt(0) === '#'){
40793                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
40794                 }else{
40795                         errorHandler.error('entity not found:'+a);
40796                         return a;
40797                 }
40798         }
40799         function appendText(end){//has some bugs
40800                 if(end>start){
40801                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
40802                         locator&&position(start);
40803                         domBuilder.characters(xt,0,end-start);
40804                         start = end;
40805                 }
40806         }
40807         function position(p,m){
40808                 while(p>=lineEnd && (m = linePattern.exec(source))){
40809                         lineStart = m.index;
40810                         lineEnd = lineStart + m[0].length;
40811                         locator.lineNumber++;
40812                         //console.log('line++:',locator,startPos,endPos)
40813                 }
40814                 locator.columnNumber = p-lineStart+1;
40815         }
40816         var lineStart = 0;
40817         var lineEnd = 0;
40818         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
40819         var locator = domBuilder.locator;
40820         
40821         var parseStack = [{currentNSMap:defaultNSMapCopy}];
40822         var closeMap = {};
40823         var start = 0;
40824         while(true){
40825                 try{
40826                         var tagStart = source.indexOf('<',start);
40827                         if(tagStart<0){
40828                                 if(!source.substr(start).match(/^\s*$/)){
40829                                         var doc = domBuilder.doc;
40830                                 var text = doc.createTextNode(source.substr(start));
40831                                 doc.appendChild(text);
40832                                 domBuilder.currentElement = text;
40833                                 }
40834                                 return;
40835                         }
40836                         if(tagStart>start){
40837                                 appendText(tagStart);
40838                         }
40839                         switch(source.charAt(tagStart+1)){
40840                         case '/':
40841                                 var end = source.indexOf('>',tagStart+3);
40842                                 var tagName = source.substring(tagStart+2,end);
40843                                 var config = parseStack.pop();
40844                                 if(end<0){
40845                                         
40846                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
40847                                 //console.error('#@@@@@@'+tagName)
40848                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
40849                                 end = tagStart+1+tagName.length;
40850                         }else if(tagName.match(/\s</)){
40851                                 tagName = tagName.replace(/[\s<].*/,'');
40852                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
40853                                 end = tagStart+1+tagName.length;
40854                                 }
40855                                 //console.error(parseStack.length,parseStack)
40856                                 //console.error(config);
40857                                 var localNSMap = config.localNSMap;
40858                                 var endMatch = config.tagName == tagName;
40859                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
40860                         if(endIgnoreCaseMach){
40861                                 domBuilder.endElement(config.uri,config.localName,tagName);
40862                                         if(localNSMap){
40863                                                 for(var prefix in localNSMap){
40864                                                         domBuilder.endPrefixMapping(prefix) ;
40865                                                 }
40866                                         }
40867                                         if(!endMatch){
40868                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
40869                                         }
40870                         }else{
40871                                 parseStack.push(config);
40872                         }
40873                                 
40874                                 end++;
40875                                 break;
40876                                 // end elment
40877                         case '?':// <?...?>
40878                                 locator&&position(tagStart);
40879                                 end = parseInstruction(source,tagStart,domBuilder);
40880                                 break;
40881                         case '!':// <!doctype,<![CDATA,<!--
40882                                 locator&&position(tagStart);
40883                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
40884                                 break;
40885                         default:
40886                                 locator&&position(tagStart);
40887                                 var el = new ElementAttributes();
40888                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
40889                                 //elStartEnd
40890                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
40891                                 var len = el.length;
40892                                 
40893                                 
40894                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
40895                                         el.closed = true;
40896                                         if(!entityMap.nbsp){
40897                                                 errorHandler.warning('unclosed xml attribute');
40898                                         }
40899                                 }
40900                                 if(locator && len){
40901                                         var locator2 = copyLocator(locator,{});
40902                                         //try{//attribute position fixed
40903                                         for(var i = 0;i<len;i++){
40904                                                 var a = el[i];
40905                                                 position(a.offset);
40906                                                 a.locator = copyLocator(locator,{});
40907                                         }
40908                                         //}catch(e){console.error('@@@@@'+e)}
40909                                         domBuilder.locator = locator2;
40910                                         if(appendElement(el,domBuilder,currentNSMap)){
40911                                                 parseStack.push(el);
40912                                         }
40913                                         domBuilder.locator = locator;
40914                                 }else{
40915                                         if(appendElement(el,domBuilder,currentNSMap)){
40916                                                 parseStack.push(el);
40917                                         }
40918                                 }
40919                                 
40920                                 
40921                                 
40922                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
40923                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
40924                                 }else{
40925                                         end++;
40926                                 }
40927                         }
40928                 }catch(e){
40929                         errorHandler.error('element parse error: '+e);
40930                         //errorHandler.error('element parse error: '+e);
40931                         end = -1;
40932                         //throw e;
40933                 }
40934                 if(end>start){
40935                         start = end;
40936                 }else{
40937                         //TODO: 这里有可能sax回退,有位置错误风险
40938                         appendText(Math.max(tagStart,start)+1);
40939                 }
40940         }
40941 }
40942 function copyLocator(f,t){
40943         t.lineNumber = f.lineNumber;
40944         t.columnNumber = f.columnNumber;
40945         return t;
40946 }
40947
40948 /**
40949  * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
40950  * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
40951  */
40952 function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
40953         var attrName;
40954         var value;
40955         var p = ++start;
40956         var s = S_TAG;//status
40957         while(true){
40958                 var c = source.charAt(p);
40959                 switch(c){
40960                 case '=':
40961                         if(s === S_ATTR){//attrName
40962                                 attrName = source.slice(start,p);
40963                                 s = S_EQ;
40964                         }else if(s === S_ATTR_SPACE){
40965                                 s = S_EQ;
40966                         }else{
40967                                 //fatalError: equal must after attrName or space after attrName
40968                                 throw new Error('attribute equal must after attrName');
40969                         }
40970                         break;
40971                 case '\'':
40972                 case '"':
40973                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
40974                                 ){//equal
40975                                 if(s === S_ATTR){
40976                                         errorHandler.warning('attribute value must after "="');
40977                                         attrName = source.slice(start,p);
40978                                 }
40979                                 start = p+1;
40980                                 p = source.indexOf(c,start);
40981                                 if(p>0){
40982                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
40983                                         el.add(attrName,value,start-1);
40984                                         s = S_ATTR_END;
40985                                 }else{
40986                                         //fatalError: no end quot match
40987                                         throw new Error('attribute value no end \''+c+'\' match');
40988                                 }
40989                         }else if(s == S_ATTR_NOQUOT_VALUE){
40990                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
40991                                 //console.log(attrName,value,start,p)
40992                                 el.add(attrName,value,start);
40993                                 //console.dir(el)
40994                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
40995                                 start = p+1;
40996                                 s = S_ATTR_END;
40997                         }else{
40998                                 //fatalError: no equal before
40999                                 throw new Error('attribute value must after "="');
41000                         }
41001                         break;
41002                 case '/':
41003                         switch(s){
41004                         case S_TAG:
41005                                 el.setTagName(source.slice(start,p));
41006                         case S_ATTR_END:
41007                         case S_TAG_SPACE:
41008                         case S_TAG_CLOSE:
41009                                 s =S_TAG_CLOSE;
41010                                 el.closed = true;
41011                         case S_ATTR_NOQUOT_VALUE:
41012                         case S_ATTR:
41013                         case S_ATTR_SPACE:
41014                                 break;
41015                         //case S_EQ:
41016                         default:
41017                                 throw new Error("attribute invalid close char('/')")
41018                         }
41019                         break;
41020                 case ''://end document
41021                         //throw new Error('unexpected end of input')
41022                         errorHandler.error('unexpected end of input');
41023                         if(s == S_TAG){
41024                                 el.setTagName(source.slice(start,p));
41025                         }
41026                         return p;
41027                 case '>':
41028                         switch(s){
41029                         case S_TAG:
41030                                 el.setTagName(source.slice(start,p));
41031                         case S_ATTR_END:
41032                         case S_TAG_SPACE:
41033                         case S_TAG_CLOSE:
41034                                 break;//normal
41035                         case S_ATTR_NOQUOT_VALUE://Compatible state
41036                         case S_ATTR:
41037                                 value = source.slice(start,p);
41038                                 if(value.slice(-1) === '/'){
41039                                         el.closed  = true;
41040                                         value = value.slice(0,-1);
41041                                 }
41042                         case S_ATTR_SPACE:
41043                                 if(s === S_ATTR_SPACE){
41044                                         value = attrName;
41045                                 }
41046                                 if(s == S_ATTR_NOQUOT_VALUE){
41047                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
41048                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
41049                                 }else{
41050                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
41051                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
41052                                         }
41053                                         el.add(value,value,start);
41054                                 }
41055                                 break;
41056                         case S_EQ:
41057                                 throw new Error('attribute value missed!!');
41058                         }
41059 //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
41060                         return p;
41061                 /*xml space '\x20' | #x9 | #xD | #xA; */
41062                 case '\u0080':
41063                         c = ' ';
41064                 default:
41065                         if(c<= ' '){//space
41066                                 switch(s){
41067                                 case S_TAG:
41068                                         el.setTagName(source.slice(start,p));//tagName
41069                                         s = S_TAG_SPACE;
41070                                         break;
41071                                 case S_ATTR:
41072                                         attrName = source.slice(start,p);
41073                                         s = S_ATTR_SPACE;
41074                                         break;
41075                                 case S_ATTR_NOQUOT_VALUE:
41076                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41077                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
41078                                         el.add(attrName,value,start);
41079                                 case S_ATTR_END:
41080                                         s = S_TAG_SPACE;
41081                                         break;
41082                                 //case S_TAG_SPACE:
41083                                 //case S_EQ:
41084                                 //case S_ATTR_SPACE:
41085                                 //      void();break;
41086                                 //case S_TAG_CLOSE:
41087                                         //ignore warning
41088                                 }
41089                         }else{//not space
41090 //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
41091 //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
41092                                 switch(s){
41093                                 //case S_TAG:void();break;
41094                                 //case S_ATTR:void();break;
41095                                 //case S_ATTR_NOQUOT_VALUE:void();break;
41096                                 case S_ATTR_SPACE:
41097                                         var tagName =  el.tagName;
41098                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
41099                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
41100                                         }
41101                                         el.add(attrName,attrName,start);
41102                                         start = p;
41103                                         s = S_ATTR;
41104                                         break;
41105                                 case S_ATTR_END:
41106                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
41107                                 case S_TAG_SPACE:
41108                                         s = S_ATTR;
41109                                         start = p;
41110                                         break;
41111                                 case S_EQ:
41112                                         s = S_ATTR_NOQUOT_VALUE;
41113                                         start = p;
41114                                         break;
41115                                 case S_TAG_CLOSE:
41116                                         throw new Error("elements closed character '/' and '>' must be connected to");
41117                                 }
41118                         }
41119                 }//end outer switch
41120                 //console.log('p++',p)
41121                 p++;
41122         }
41123 }
41124 /**
41125  * @return true if has new namespace define
41126  */
41127 function appendElement(el,domBuilder,currentNSMap){
41128         var tagName = el.tagName;
41129         var localNSMap = null;
41130         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
41131         var i = el.length;
41132         while(i--){
41133                 var a = el[i];
41134                 var qName = a.qName;
41135                 var value = a.value;
41136                 var nsp = qName.indexOf(':');
41137                 if(nsp>0){
41138                         var prefix = a.prefix = qName.slice(0,nsp);
41139                         var localName = qName.slice(nsp+1);
41140                         var nsPrefix = prefix === 'xmlns' && localName;
41141                 }else{
41142                         localName = qName;
41143                         prefix = null;
41144                         nsPrefix = qName === 'xmlns' && '';
41145                 }
41146                 //can not set prefix,because prefix !== ''
41147                 a.localName = localName ;
41148                 //prefix == null for no ns prefix attribute 
41149                 if(nsPrefix !== false){//hack!!
41150                         if(localNSMap == null){
41151                                 localNSMap = {};
41152                                 //console.log(currentNSMap,0)
41153                                 _copy(currentNSMap,currentNSMap={});
41154                                 //console.log(currentNSMap,1)
41155                         }
41156                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
41157                         a.uri = 'http://www.w3.org/2000/xmlns/';
41158                         domBuilder.startPrefixMapping(nsPrefix, value); 
41159                 }
41160         }
41161         var i = el.length;
41162         while(i--){
41163                 a = el[i];
41164                 var prefix = a.prefix;
41165                 if(prefix){//no prefix attribute has no namespace
41166                         if(prefix === 'xml'){
41167                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
41168                         }if(prefix !== 'xmlns'){
41169                                 a.uri = currentNSMap[prefix || ''];
41170                                 
41171                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
41172                         }
41173                 }
41174         }
41175         var nsp = tagName.indexOf(':');
41176         if(nsp>0){
41177                 prefix = el.prefix = tagName.slice(0,nsp);
41178                 localName = el.localName = tagName.slice(nsp+1);
41179         }else{
41180                 prefix = null;//important!!
41181                 localName = el.localName = tagName;
41182         }
41183         //no prefix element has default namespace
41184         var ns = el.uri = currentNSMap[prefix || ''];
41185         domBuilder.startElement(ns,localName,tagName,el);
41186         //endPrefixMapping and startPrefixMapping have not any help for dom builder
41187         //localNSMap = null
41188         if(el.closed){
41189                 domBuilder.endElement(ns,localName,tagName);
41190                 if(localNSMap){
41191                         for(prefix in localNSMap){
41192                                 domBuilder.endPrefixMapping(prefix); 
41193                         }
41194                 }
41195         }else{
41196                 el.currentNSMap = currentNSMap;
41197                 el.localNSMap = localNSMap;
41198                 //parseStack.push(el);
41199                 return true;
41200         }
41201 }
41202 function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
41203         if(/^(?:script|textarea)$/i.test(tagName)){
41204                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
41205                 var text = source.substring(elStartEnd+1,elEndStart);
41206                 if(/[&<]/.test(text)){
41207                         if(/^script$/i.test(tagName)){
41208                                 //if(!/\]\]>/.test(text)){
41209                                         //lexHandler.startCDATA();
41210                                         domBuilder.characters(text,0,text.length);
41211                                         //lexHandler.endCDATA();
41212                                         return elEndStart;
41213                                 //}
41214                         }//}else{//text area
41215                                 text = text.replace(/&#?\w+;/g,entityReplacer);
41216                                 domBuilder.characters(text,0,text.length);
41217                                 return elEndStart;
41218                         //}
41219                         
41220                 }
41221         }
41222         return elStartEnd+1;
41223 }
41224 function fixSelfClosed(source,elStartEnd,tagName,closeMap){
41225         //if(tagName in closeMap){
41226         var pos = closeMap[tagName];
41227         if(pos == null){
41228                 //console.log(tagName)
41229                 pos =  source.lastIndexOf('</'+tagName+'>');
41230                 if(pos<elStartEnd){//忘记闭合
41231                         pos = source.lastIndexOf('</'+tagName);
41232                 }
41233                 closeMap[tagName] =pos;
41234         }
41235         return pos<elStartEnd;
41236         //} 
41237 }
41238 function _copy(source,target){
41239         for(var n in source){target[n] = source[n];}
41240 }
41241 function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
41242         var next= source.charAt(start+2);
41243         switch(next){
41244         case '-':
41245                 if(source.charAt(start + 3) === '-'){
41246                         var end = source.indexOf('-->',start+4);
41247                         //append comment source.substring(4,end)//<!--
41248                         if(end>start){
41249                                 domBuilder.comment(source,start+4,end-start-4);
41250                                 return end+3;
41251                         }else{
41252                                 errorHandler.error("Unclosed comment");
41253                                 return -1;
41254                         }
41255                 }else{
41256                         //error
41257                         return -1;
41258                 }
41259         default:
41260                 if(source.substr(start+3,6) == 'CDATA['){
41261                         var end = source.indexOf(']]>',start+9);
41262                         domBuilder.startCDATA();
41263                         domBuilder.characters(source,start+9,end-start-9);
41264                         domBuilder.endCDATA(); 
41265                         return end+3;
41266                 }
41267                 //<!DOCTYPE
41268                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
41269                 var matchs = split(source,start);
41270                 var len = matchs.length;
41271                 if(len>1 && /!doctype/i.test(matchs[0][0])){
41272                         var name = matchs[1][0];
41273                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
41274                         var sysid = len>4 && matchs[4][0];
41275                         var lastMatch = matchs[len-1];
41276                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
41277                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
41278                         domBuilder.endDTD();
41279                         
41280                         return lastMatch.index+lastMatch[0].length
41281                 }
41282         }
41283         return -1;
41284 }
41285
41286
41287
41288 function parseInstruction(source,start,domBuilder){
41289         var end = source.indexOf('?>',start);
41290         if(end){
41291                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
41292                 if(match){
41293                         var len = match[0].length;
41294                         domBuilder.processingInstruction(match[1], match[2]) ;
41295                         return end+2;
41296                 }else{//error
41297                         return -1;
41298                 }
41299         }
41300         return -1;
41301 }
41302
41303 /**
41304  * @param source
41305  */
41306 function ElementAttributes(source){
41307         
41308 }
41309 ElementAttributes.prototype = {
41310         setTagName:function(tagName){
41311                 if(!tagNamePattern.test(tagName)){
41312                         throw new Error('invalid tagName:'+tagName)
41313                 }
41314                 this.tagName = tagName;
41315         },
41316         add:function(qName,value,offset){
41317                 if(!tagNamePattern.test(qName)){
41318                         throw new Error('invalid attribute:'+qName)
41319                 }
41320                 this[this.length++] = {qName:qName,value:value,offset:offset};
41321         },
41322         length:0,
41323         getLocalName:function(i){return this[i].localName},
41324         getLocator:function(i){return this[i].locator},
41325         getQName:function(i){return this[i].qName},
41326         getURI:function(i){return this[i].uri},
41327         getValue:function(i){return this[i].value}
41328 //      ,getIndex:function(uri, localName)){
41329 //              if(localName){
41330 //                      
41331 //              }else{
41332 //                      var qName = uri
41333 //              }
41334 //      },
41335 //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
41336 //      getType:function(uri,localName){}
41337 //      getType:function(i){},
41338 };
41339
41340
41341
41342
41343 function _set_proto_(thiz,parent){
41344         thiz.__proto__ = parent;
41345         return thiz;
41346 }
41347 if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
41348         _set_proto_ = function(thiz,parent){
41349                 function p(){}
41350                 p.prototype = parent;
41351                 p = new p();
41352                 for(parent in thiz){
41353                         p[parent] = thiz[parent];
41354                 }
41355                 return p;
41356         };
41357 }
41358
41359 function split(source,start){
41360         var match;
41361         var buf = [];
41362         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
41363         reg.lastIndex = start;
41364         reg.exec(source);//skip <
41365         while(match = reg.exec(source)){
41366                 buf.push(match);
41367                 if(match[1])return buf;
41368         }
41369 }
41370
41371 var XMLReader_1 = XMLReader;
41372
41373 var sax = {
41374         XMLReader: XMLReader_1
41375 };
41376
41377 /*
41378  * DOM Level 2
41379  * Object DOMException
41380  * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
41381  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
41382  */
41383
41384 function copy$1(src,dest){
41385         for(var p in src){
41386                 dest[p] = src[p];
41387         }
41388 }
41389 /**
41390 ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
41391 ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
41392  */
41393 function _extends(Class,Super){
41394         var pt = Class.prototype;
41395         if(Object.create){
41396                 var ppt = Object.create(Super.prototype);
41397                 pt.__proto__ = ppt;
41398         }
41399         if(!(pt instanceof Super)){
41400                 function t(){}
41401                 t.prototype = Super.prototype;
41402                 t = new t();
41403                 copy$1(pt,t);
41404                 Class.prototype = pt = t;
41405         }
41406         if(pt.constructor != Class){
41407                 if(typeof Class != 'function'){
41408                         console.error("unknow Class:"+Class);
41409                 }
41410                 pt.constructor = Class;
41411         }
41412 }
41413 var htmlns = 'http://www.w3.org/1999/xhtml';
41414 // Node Types
41415 var NodeType = {};
41416 var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
41417 var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
41418 var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
41419 var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
41420 var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
41421 var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
41422 var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
41423 var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
41424 var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
41425 var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
41426 var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
41427 var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
41428
41429 // ExceptionCode
41430 var ExceptionCode = {};
41431 var ExceptionMessage = {};
41432 var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
41433 var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
41434 var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
41435 var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
41436 var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
41437 var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
41438 var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
41439 var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
41440 var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
41441 var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
41442 //level2
41443 var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
41444 var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
41445 var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
41446 var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
41447 var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
41448
41449
41450 function DOMException(code, message) {
41451         if(message instanceof Error){
41452                 var error = message;
41453         }else{
41454                 error = this;
41455                 Error.call(this, ExceptionMessage[code]);
41456                 this.message = ExceptionMessage[code];
41457                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
41458         }
41459         error.code = code;
41460         if(message) this.message = this.message + ": " + message;
41461         return error;
41462 }
41463 DOMException.prototype = Error.prototype;
41464 copy$1(ExceptionCode,DOMException);
41465 /**
41466  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
41467  * 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.
41468  * The items in the NodeList are accessible via an integral index, starting from 0.
41469  */
41470 function NodeList() {
41471 }
41472 NodeList.prototype = {
41473         /**
41474          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
41475          * @standard level1
41476          */
41477         length:0, 
41478         /**
41479          * 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.
41480          * @standard level1
41481          * @param index  unsigned long 
41482          *   Index into the collection.
41483          * @return Node
41484          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
41485          */
41486         item: function(index) {
41487                 return this[index] || null;
41488         },
41489         toString:function(isHTML,nodeFilter){
41490                 for(var buf = [], i = 0;i<this.length;i++){
41491                         serializeToString(this[i],buf,isHTML,nodeFilter);
41492                 }
41493                 return buf.join('');
41494         }
41495 };
41496 function LiveNodeList(node,refresh){
41497         this._node = node;
41498         this._refresh = refresh;
41499         _updateLiveList(this);
41500 }
41501 function _updateLiveList(list){
41502         var inc = list._node._inc || list._node.ownerDocument._inc;
41503         if(list._inc != inc){
41504                 var ls = list._refresh(list._node);
41505                 //console.log(ls.length)
41506                 __set__(list,'length',ls.length);
41507                 copy$1(ls,list);
41508                 list._inc = inc;
41509         }
41510 }
41511 LiveNodeList.prototype.item = function(i){
41512         _updateLiveList(this);
41513         return this[i];
41514 };
41515
41516 _extends(LiveNodeList,NodeList);
41517 /**
41518  * 
41519  * 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.
41520  * NamedNodeMap objects in the DOM are live.
41521  * used for attributes or DocumentType entities 
41522  */
41523 function NamedNodeMap() {
41524 }
41525
41526 function _findNodeIndex(list,node){
41527         var i = list.length;
41528         while(i--){
41529                 if(list[i] === node){return i}
41530         }
41531 }
41532
41533 function _addNamedNode(el,list,newAttr,oldAttr){
41534         if(oldAttr){
41535                 list[_findNodeIndex(list,oldAttr)] = newAttr;
41536         }else{
41537                 list[list.length++] = newAttr;
41538         }
41539         if(el){
41540                 newAttr.ownerElement = el;
41541                 var doc = el.ownerDocument;
41542                 if(doc){
41543                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
41544                         _onAddAttribute(doc,el,newAttr);
41545                 }
41546         }
41547 }
41548 function _removeNamedNode(el,list,attr){
41549         //console.log('remove attr:'+attr)
41550         var i = _findNodeIndex(list,attr);
41551         if(i>=0){
41552                 var lastIndex = list.length-1;
41553                 while(i<lastIndex){
41554                         list[i] = list[++i];
41555                 }
41556                 list.length = lastIndex;
41557                 if(el){
41558                         var doc = el.ownerDocument;
41559                         if(doc){
41560                                 _onRemoveAttribute(doc,el,attr);
41561                                 attr.ownerElement = null;
41562                         }
41563                 }
41564         }else{
41565                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
41566         }
41567 }
41568 NamedNodeMap.prototype = {
41569         length:0,
41570         item:NodeList.prototype.item,
41571         getNamedItem: function(key) {
41572 //              if(key.indexOf(':')>0 || key == 'xmlns'){
41573 //                      return null;
41574 //              }
41575                 //console.log()
41576                 var i = this.length;
41577                 while(i--){
41578                         var attr = this[i];
41579                         //console.log(attr.nodeName,key)
41580                         if(attr.nodeName == key){
41581                                 return attr;
41582                         }
41583                 }
41584         },
41585         setNamedItem: function(attr) {
41586                 var el = attr.ownerElement;
41587                 if(el && el!=this._ownerElement){
41588                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
41589                 }
41590                 var oldAttr = this.getNamedItem(attr.nodeName);
41591                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
41592                 return oldAttr;
41593         },
41594         /* returns Node */
41595         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
41596                 var el = attr.ownerElement, oldAttr;
41597                 if(el && el!=this._ownerElement){
41598                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
41599                 }
41600                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
41601                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
41602                 return oldAttr;
41603         },
41604
41605         /* returns Node */
41606         removeNamedItem: function(key) {
41607                 var attr = this.getNamedItem(key);
41608                 _removeNamedNode(this._ownerElement,this,attr);
41609                 return attr;
41610                 
41611                 
41612         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
41613         
41614         //for level2
41615         removeNamedItemNS:function(namespaceURI,localName){
41616                 var attr = this.getNamedItemNS(namespaceURI,localName);
41617                 _removeNamedNode(this._ownerElement,this,attr);
41618                 return attr;
41619         },
41620         getNamedItemNS: function(namespaceURI, localName) {
41621                 var i = this.length;
41622                 while(i--){
41623                         var node = this[i];
41624                         if(node.localName == localName && node.namespaceURI == namespaceURI){
41625                                 return node;
41626                         }
41627                 }
41628                 return null;
41629         }
41630 };
41631 /**
41632  * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
41633  */
41634 function DOMImplementation(/* Object */ features) {
41635         this._features = {};
41636         if (features) {
41637                 for (var feature in features) {
41638                          this._features = features[feature];
41639                 }
41640         }
41641 }
41642
41643 DOMImplementation.prototype = {
41644         hasFeature: function(/* string */ feature, /* string */ version) {
41645                 var versions = this._features[feature.toLowerCase()];
41646                 if (versions && (!version || version in versions)) {
41647                         return true;
41648                 } else {
41649                         return false;
41650                 }
41651         },
41652         // Introduced in DOM Level 2:
41653         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
41654                 var doc = new Document();
41655                 doc.implementation = this;
41656                 doc.childNodes = new NodeList();
41657                 doc.doctype = doctype;
41658                 if(doctype){
41659                         doc.appendChild(doctype);
41660                 }
41661                 if(qualifiedName){
41662                         var root = doc.createElementNS(namespaceURI,qualifiedName);
41663                         doc.appendChild(root);
41664                 }
41665                 return doc;
41666         },
41667         // Introduced in DOM Level 2:
41668         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
41669                 var node = new DocumentType();
41670                 node.name = qualifiedName;
41671                 node.nodeName = qualifiedName;
41672                 node.publicId = publicId;
41673                 node.systemId = systemId;
41674                 // Introduced in DOM Level 2:
41675                 //readonly attribute DOMString        internalSubset;
41676                 
41677                 //TODO:..
41678                 //  readonly attribute NamedNodeMap     entities;
41679                 //  readonly attribute NamedNodeMap     notations;
41680                 return node;
41681         }
41682 };
41683
41684
41685 /**
41686  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
41687  */
41688
41689 function Node$2() {
41690 }
41691
41692 Node$2.prototype = {
41693         firstChild : null,
41694         lastChild : null,
41695         previousSibling : null,
41696         nextSibling : null,
41697         attributes : null,
41698         parentNode : null,
41699         childNodes : null,
41700         ownerDocument : null,
41701         nodeValue : null,
41702         namespaceURI : null,
41703         prefix : null,
41704         localName : null,
41705         // Modified in DOM Level 2:
41706         insertBefore:function(newChild, refChild){//raises 
41707                 return _insertBefore(this,newChild,refChild);
41708         },
41709         replaceChild:function(newChild, oldChild){//raises 
41710                 this.insertBefore(newChild,oldChild);
41711                 if(oldChild){
41712                         this.removeChild(oldChild);
41713                 }
41714         },
41715         removeChild:function(oldChild){
41716                 return _removeChild(this,oldChild);
41717         },
41718         appendChild:function(newChild){
41719                 return this.insertBefore(newChild,null);
41720         },
41721         hasChildNodes:function(){
41722                 return this.firstChild != null;
41723         },
41724         cloneNode:function(deep){
41725                 return cloneNode(this.ownerDocument||this,this,deep);
41726         },
41727         // Modified in DOM Level 2:
41728         normalize:function(){
41729                 var child = this.firstChild;
41730                 while(child){
41731                         var next = child.nextSibling;
41732                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
41733                                 this.removeChild(next);
41734                                 child.appendData(next.data);
41735                         }else{
41736                                 child.normalize();
41737                                 child = next;
41738                         }
41739                 }
41740         },
41741         // Introduced in DOM Level 2:
41742         isSupported:function(feature, version){
41743                 return this.ownerDocument.implementation.hasFeature(feature,version);
41744         },
41745     // Introduced in DOM Level 2:
41746     hasAttributes:function(){
41747         return this.attributes.length>0;
41748     },
41749     lookupPrefix:function(namespaceURI){
41750         var el = this;
41751         while(el){
41752                 var map = el._nsMap;
41753                 //console.dir(map)
41754                 if(map){
41755                         for(var n in map){
41756                                 if(map[n] == namespaceURI){
41757                                         return n;
41758                                 }
41759                         }
41760                 }
41761                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
41762         }
41763         return null;
41764     },
41765     // Introduced in DOM Level 3:
41766     lookupNamespaceURI:function(prefix){
41767         var el = this;
41768         while(el){
41769                 var map = el._nsMap;
41770                 //console.dir(map)
41771                 if(map){
41772                         if(prefix in map){
41773                                 return map[prefix] ;
41774                         }
41775                 }
41776                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
41777         }
41778         return null;
41779     },
41780     // Introduced in DOM Level 3:
41781     isDefaultNamespace:function(namespaceURI){
41782         var prefix = this.lookupPrefix(namespaceURI);
41783         return prefix == null;
41784     }
41785 };
41786
41787
41788 function _xmlEncoder(c){
41789         return c == '<' && '&lt;' ||
41790          c == '>' && '&gt;' ||
41791          c == '&' && '&amp;' ||
41792          c == '"' && '&quot;' ||
41793          '&#'+c.charCodeAt()+';'
41794 }
41795
41796
41797 copy$1(NodeType,Node$2);
41798 copy$1(NodeType,Node$2.prototype);
41799
41800 /**
41801  * @param callback return true for continue,false for break
41802  * @return boolean true: break visit;
41803  */
41804 function _visitNode(node,callback){
41805         if(callback(node)){
41806                 return true;
41807         }
41808         if(node = node.firstChild){
41809                 do{
41810                         if(_visitNode(node,callback)){return true}
41811         }while(node=node.nextSibling)
41812     }
41813 }
41814
41815
41816
41817 function Document(){
41818 }
41819 function _onAddAttribute(doc,el,newAttr){
41820         doc && doc._inc++;
41821         var ns = newAttr.namespaceURI;
41822         if(ns == 'http://www.w3.org/2000/xmlns/'){
41823                 //update namespace
41824                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
41825         }
41826 }
41827 function _onRemoveAttribute(doc,el,newAttr,remove){
41828         doc && doc._inc++;
41829         var ns = newAttr.namespaceURI;
41830         if(ns == 'http://www.w3.org/2000/xmlns/'){
41831                 //update namespace
41832                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
41833         }
41834 }
41835 function _onUpdateChild(doc,el,newChild){
41836         if(doc && doc._inc){
41837                 doc._inc++;
41838                 //update childNodes
41839                 var cs = el.childNodes;
41840                 if(newChild){
41841                         cs[cs.length++] = newChild;
41842                 }else{
41843                         //console.log(1)
41844                         var child = el.firstChild;
41845                         var i = 0;
41846                         while(child){
41847                                 cs[i++] = child;
41848                                 child =child.nextSibling;
41849                         }
41850                         cs.length = i;
41851                 }
41852         }
41853 }
41854
41855 /**
41856  * attributes;
41857  * children;
41858  * 
41859  * writeable properties:
41860  * nodeValue,Attr:value,CharacterData:data
41861  * prefix
41862  */
41863 function _removeChild(parentNode,child){
41864         var previous = child.previousSibling;
41865         var next = child.nextSibling;
41866         if(previous){
41867                 previous.nextSibling = next;
41868         }else{
41869                 parentNode.firstChild = next;
41870         }
41871         if(next){
41872                 next.previousSibling = previous;
41873         }else{
41874                 parentNode.lastChild = previous;
41875         }
41876         _onUpdateChild(parentNode.ownerDocument,parentNode);
41877         return child;
41878 }
41879 /**
41880  * preformance key(refChild == null)
41881  */
41882 function _insertBefore(parentNode,newChild,nextChild){
41883         var cp = newChild.parentNode;
41884         if(cp){
41885                 cp.removeChild(newChild);//remove and update
41886         }
41887         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
41888                 var newFirst = newChild.firstChild;
41889                 if (newFirst == null) {
41890                         return newChild;
41891                 }
41892                 var newLast = newChild.lastChild;
41893         }else{
41894                 newFirst = newLast = newChild;
41895         }
41896         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
41897
41898         newFirst.previousSibling = pre;
41899         newLast.nextSibling = nextChild;
41900         
41901         
41902         if(pre){
41903                 pre.nextSibling = newFirst;
41904         }else{
41905                 parentNode.firstChild = newFirst;
41906         }
41907         if(nextChild == null){
41908                 parentNode.lastChild = newLast;
41909         }else{
41910                 nextChild.previousSibling = newLast;
41911         }
41912         do{
41913                 newFirst.parentNode = parentNode;
41914         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
41915         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
41916         //console.log(parentNode.lastChild.nextSibling == null)
41917         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
41918                 newChild.firstChild = newChild.lastChild = null;
41919         }
41920         return newChild;
41921 }
41922 function _appendSingleChild(parentNode,newChild){
41923         var cp = newChild.parentNode;
41924         if(cp){
41925                 var pre = parentNode.lastChild;
41926                 cp.removeChild(newChild);//remove and update
41927                 var pre = parentNode.lastChild;
41928         }
41929         var pre = parentNode.lastChild;
41930         newChild.parentNode = parentNode;
41931         newChild.previousSibling = pre;
41932         newChild.nextSibling = null;
41933         if(pre){
41934                 pre.nextSibling = newChild;
41935         }else{
41936                 parentNode.firstChild = newChild;
41937         }
41938         parentNode.lastChild = newChild;
41939         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
41940         return newChild;
41941         //console.log("__aa",parentNode.lastChild.nextSibling == null)
41942 }
41943 Document.prototype = {
41944         //implementation : null,
41945         nodeName :  '#document',
41946         nodeType :  DOCUMENT_NODE,
41947         doctype :  null,
41948         documentElement :  null,
41949         _inc : 1,
41950         
41951         insertBefore :  function(newChild, refChild){//raises 
41952                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
41953                         var child = newChild.firstChild;
41954                         while(child){
41955                                 var next = child.nextSibling;
41956                                 this.insertBefore(child,refChild);
41957                                 child = next;
41958                         }
41959                         return newChild;
41960                 }
41961                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
41962                         this.documentElement = newChild;
41963                 }
41964                 
41965                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
41966         },
41967         removeChild :  function(oldChild){
41968                 if(this.documentElement == oldChild){
41969                         this.documentElement = null;
41970                 }
41971                 return _removeChild(this,oldChild);
41972         },
41973         // Introduced in DOM Level 2:
41974         importNode : function(importedNode,deep){
41975                 return importNode(this,importedNode,deep);
41976         },
41977         // Introduced in DOM Level 2:
41978         getElementById :        function(id){
41979                 var rtv = null;
41980                 _visitNode(this.documentElement,function(node){
41981                         if(node.nodeType == ELEMENT_NODE){
41982                                 if(node.getAttribute('id') == id){
41983                                         rtv = node;
41984                                         return true;
41985                                 }
41986                         }
41987                 });
41988                 return rtv;
41989         },
41990         
41991         //document factory method:
41992         createElement : function(tagName){
41993                 var node = new Element();
41994                 node.ownerDocument = this;
41995                 node.nodeName = tagName;
41996                 node.tagName = tagName;
41997                 node.childNodes = new NodeList();
41998                 var attrs       = node.attributes = new NamedNodeMap();
41999                 attrs._ownerElement = node;
42000                 return node;
42001         },
42002         createDocumentFragment :        function(){
42003                 var node = new DocumentFragment();
42004                 node.ownerDocument = this;
42005                 node.childNodes = new NodeList();
42006                 return node;
42007         },
42008         createTextNode :        function(data){
42009                 var node = new Text();
42010                 node.ownerDocument = this;
42011                 node.appendData(data);
42012                 return node;
42013         },
42014         createComment : function(data){
42015                 var node = new Comment();
42016                 node.ownerDocument = this;
42017                 node.appendData(data);
42018                 return node;
42019         },
42020         createCDATASection :    function(data){
42021                 var node = new CDATASection();
42022                 node.ownerDocument = this;
42023                 node.appendData(data);
42024                 return node;
42025         },
42026         createProcessingInstruction :   function(target,data){
42027                 var node = new ProcessingInstruction();
42028                 node.ownerDocument = this;
42029                 node.tagName = node.target = target;
42030                 node.nodeValue= node.data = data;
42031                 return node;
42032         },
42033         createAttribute :       function(name){
42034                 var node = new Attr();
42035                 node.ownerDocument      = this;
42036                 node.name = name;
42037                 node.nodeName   = name;
42038                 node.localName = name;
42039                 node.specified = true;
42040                 return node;
42041         },
42042         createEntityReference : function(name){
42043                 var node = new EntityReference();
42044                 node.ownerDocument      = this;
42045                 node.nodeName   = name;
42046                 return node;
42047         },
42048         // Introduced in DOM Level 2:
42049         createElementNS :       function(namespaceURI,qualifiedName){
42050                 var node = new Element();
42051                 var pl = qualifiedName.split(':');
42052                 var attrs       = node.attributes = new NamedNodeMap();
42053                 node.childNodes = new NodeList();
42054                 node.ownerDocument = this;
42055                 node.nodeName = qualifiedName;
42056                 node.tagName = qualifiedName;
42057                 node.namespaceURI = namespaceURI;
42058                 if(pl.length == 2){
42059                         node.prefix = pl[0];
42060                         node.localName = pl[1];
42061                 }else{
42062                         //el.prefix = null;
42063                         node.localName = qualifiedName;
42064                 }
42065                 attrs._ownerElement = node;
42066                 return node;
42067         },
42068         // Introduced in DOM Level 2:
42069         createAttributeNS :     function(namespaceURI,qualifiedName){
42070                 var node = new Attr();
42071                 var pl = qualifiedName.split(':');
42072                 node.ownerDocument = this;
42073                 node.nodeName = qualifiedName;
42074                 node.name = qualifiedName;
42075                 node.namespaceURI = namespaceURI;
42076                 node.specified = true;
42077                 if(pl.length == 2){
42078                         node.prefix = pl[0];
42079                         node.localName = pl[1];
42080                 }else{
42081                         //el.prefix = null;
42082                         node.localName = qualifiedName;
42083                 }
42084                 return node;
42085         }
42086 };
42087 _extends(Document,Node$2);
42088
42089
42090 function Element() {
42091         this._nsMap = {};
42092 }
42093 Element.prototype = {
42094         nodeType : ELEMENT_NODE,
42095         hasAttribute : function(name){
42096                 return this.getAttributeNode(name)!=null;
42097         },
42098         getAttribute : function(name){
42099                 var attr = this.getAttributeNode(name);
42100                 return attr && attr.value || '';
42101         },
42102         getAttributeNode : function(name){
42103                 return this.attributes.getNamedItem(name);
42104         },
42105         setAttribute : function(name, value){
42106                 var attr = this.ownerDocument.createAttribute(name);
42107                 attr.value = attr.nodeValue = "" + value;
42108                 this.setAttributeNode(attr);
42109         },
42110         removeAttribute : function(name){
42111                 var attr = this.getAttributeNode(name);
42112                 attr && this.removeAttributeNode(attr);
42113         },
42114         
42115         //four real opeartion method
42116         appendChild:function(newChild){
42117                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
42118                         return this.insertBefore(newChild,null);
42119                 }else{
42120                         return _appendSingleChild(this,newChild);
42121                 }
42122         },
42123         setAttributeNode : function(newAttr){
42124                 return this.attributes.setNamedItem(newAttr);
42125         },
42126         setAttributeNodeNS : function(newAttr){
42127                 return this.attributes.setNamedItemNS(newAttr);
42128         },
42129         removeAttributeNode : function(oldAttr){
42130                 //console.log(this == oldAttr.ownerElement)
42131                 return this.attributes.removeNamedItem(oldAttr.nodeName);
42132         },
42133         //get real attribute name,and remove it by removeAttributeNode
42134         removeAttributeNS : function(namespaceURI, localName){
42135                 var old = this.getAttributeNodeNS(namespaceURI, localName);
42136                 old && this.removeAttributeNode(old);
42137         },
42138         
42139         hasAttributeNS : function(namespaceURI, localName){
42140                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
42141         },
42142         getAttributeNS : function(namespaceURI, localName){
42143                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
42144                 return attr && attr.value || '';
42145         },
42146         setAttributeNS : function(namespaceURI, qualifiedName, value){
42147                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
42148                 attr.value = attr.nodeValue = "" + value;
42149                 this.setAttributeNode(attr);
42150         },
42151         getAttributeNodeNS : function(namespaceURI, localName){
42152                 return this.attributes.getNamedItemNS(namespaceURI, localName);
42153         },
42154         
42155         getElementsByTagName : function(tagName){
42156                 return new LiveNodeList(this,function(base){
42157                         var ls = [];
42158                         _visitNode(base,function(node){
42159                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
42160                                         ls.push(node);
42161                                 }
42162                         });
42163                         return ls;
42164                 });
42165         },
42166         getElementsByTagNameNS : function(namespaceURI, localName){
42167                 return new LiveNodeList(this,function(base){
42168                         var ls = [];
42169                         _visitNode(base,function(node){
42170                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
42171                                         ls.push(node);
42172                                 }
42173                         });
42174                         return ls;
42175                         
42176                 });
42177         }
42178 };
42179 Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
42180 Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
42181
42182
42183 _extends(Element,Node$2);
42184 function Attr() {
42185 }
42186 Attr.prototype.nodeType = ATTRIBUTE_NODE;
42187 _extends(Attr,Node$2);
42188
42189
42190 function CharacterData() {
42191 }
42192 CharacterData.prototype = {
42193         data : '',
42194         substringData : function(offset, count) {
42195                 return this.data.substring(offset, offset+count);
42196         },
42197         appendData: function(text) {
42198                 text = this.data+text;
42199                 this.nodeValue = this.data = text;
42200                 this.length = text.length;
42201         },
42202         insertData: function(offset,text) {
42203                 this.replaceData(offset,0,text);
42204         
42205         },
42206         appendChild:function(newChild){
42207                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
42208         },
42209         deleteData: function(offset, count) {
42210                 this.replaceData(offset,count,"");
42211         },
42212         replaceData: function(offset, count, text) {
42213                 var start = this.data.substring(0,offset);
42214                 var end = this.data.substring(offset+count);
42215                 text = start + text + end;
42216                 this.nodeValue = this.data = text;
42217                 this.length = text.length;
42218         }
42219 };
42220 _extends(CharacterData,Node$2);
42221 function Text() {
42222 }
42223 Text.prototype = {
42224         nodeName : "#text",
42225         nodeType : TEXT_NODE,
42226         splitText : function(offset) {
42227                 var text = this.data;
42228                 var newText = text.substring(offset);
42229                 text = text.substring(0, offset);
42230                 this.data = this.nodeValue = text;
42231                 this.length = text.length;
42232                 var newNode = this.ownerDocument.createTextNode(newText);
42233                 if(this.parentNode){
42234                         this.parentNode.insertBefore(newNode, this.nextSibling);
42235                 }
42236                 return newNode;
42237         }
42238 };
42239 _extends(Text,CharacterData);
42240 function Comment() {
42241 }
42242 Comment.prototype = {
42243         nodeName : "#comment",
42244         nodeType : COMMENT_NODE
42245 };
42246 _extends(Comment,CharacterData);
42247
42248 function CDATASection() {
42249 }
42250 CDATASection.prototype = {
42251         nodeName : "#cdata-section",
42252         nodeType : CDATA_SECTION_NODE
42253 };
42254 _extends(CDATASection,CharacterData);
42255
42256
42257 function DocumentType() {
42258 }
42259 DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
42260 _extends(DocumentType,Node$2);
42261
42262 function Notation() {
42263 }
42264 Notation.prototype.nodeType = NOTATION_NODE;
42265 _extends(Notation,Node$2);
42266
42267 function Entity() {
42268 }
42269 Entity.prototype.nodeType = ENTITY_NODE;
42270 _extends(Entity,Node$2);
42271
42272 function EntityReference() {
42273 }
42274 EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
42275 _extends(EntityReference,Node$2);
42276
42277 function DocumentFragment() {
42278 }
42279 DocumentFragment.prototype.nodeName =   "#document-fragment";
42280 DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
42281 _extends(DocumentFragment,Node$2);
42282
42283
42284 function ProcessingInstruction() {
42285 }
42286 ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
42287 _extends(ProcessingInstruction,Node$2);
42288 function XMLSerializer$1(){}
42289 XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
42290         return nodeSerializeToString.call(node,isHtml,nodeFilter);
42291 };
42292 Node$2.prototype.toString = nodeSerializeToString;
42293 function nodeSerializeToString(isHtml,nodeFilter){
42294         var buf = [];
42295         var refNode = this.nodeType == 9?this.documentElement:this;
42296         var prefix = refNode.prefix;
42297         var uri = refNode.namespaceURI;
42298         
42299         if(uri && prefix == null){
42300                 //console.log(prefix)
42301                 var prefix = refNode.lookupPrefix(uri);
42302                 if(prefix == null){
42303                         //isHTML = true;
42304                         var visibleNamespaces=[
42305                         {namespace:uri,prefix:null}
42306                         //{namespace:uri,prefix:''}
42307                         ];
42308                 }
42309         }
42310         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
42311         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
42312         return buf.join('');
42313 }
42314 function needNamespaceDefine(node,isHTML, visibleNamespaces) {
42315         var prefix = node.prefix||'';
42316         var uri = node.namespaceURI;
42317         if (!prefix && !uri){
42318                 return false;
42319         }
42320         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
42321                 || uri == 'http://www.w3.org/2000/xmlns/'){
42322                 return false;
42323         }
42324         
42325         var i = visibleNamespaces.length; 
42326         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
42327         while (i--) {
42328                 var ns = visibleNamespaces[i];
42329                 // get namespace prefix
42330                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
42331                 if (ns.prefix == prefix){
42332                         return ns.namespace != uri;
42333                 }
42334         }
42335         //console.log(isHTML,uri,prefix=='')
42336         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
42337         //      return false;
42338         //}
42339         //node.flag = '11111'
42340         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
42341         return true;
42342 }
42343 function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
42344         if(nodeFilter){
42345                 node = nodeFilter(node);
42346                 if(node){
42347                         if(typeof node == 'string'){
42348                                 buf.push(node);
42349                                 return;
42350                         }
42351                 }else{
42352                         return;
42353                 }
42354                 //buf.sort.apply(attrs, attributeSorter);
42355         }
42356         switch(node.nodeType){
42357         case ELEMENT_NODE:
42358                 if (!visibleNamespaces) visibleNamespaces = [];
42359                 var startVisibleNamespaces = visibleNamespaces.length;
42360                 var attrs = node.attributes;
42361                 var len = attrs.length;
42362                 var child = node.firstChild;
42363                 var nodeName = node.tagName;
42364                 
42365                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
42366                 buf.push('<',nodeName);
42367                 
42368                 
42369                 
42370                 for(var i=0;i<len;i++){
42371                         // add namespaces for attributes
42372                         var attr = attrs.item(i);
42373                         if (attr.prefix == 'xmlns') {
42374                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
42375                         }else if(attr.nodeName == 'xmlns'){
42376                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
42377                         }
42378                 }
42379                 for(var i=0;i<len;i++){
42380                         var attr = attrs.item(i);
42381                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
42382                                 var prefix = attr.prefix||'';
42383                                 var uri = attr.namespaceURI;
42384                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
42385                                 buf.push(ns, '="' , uri , '"');
42386                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
42387                         }
42388                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
42389                 }
42390                 // add namespace for current node               
42391                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
42392                         var prefix = node.prefix||'';
42393                         var uri = node.namespaceURI;
42394                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
42395                         buf.push(ns, '="' , uri , '"');
42396                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
42397                 }
42398                 
42399                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
42400                         buf.push('>');
42401                         //if is cdata child node
42402                         if(isHTML && /^script$/i.test(nodeName)){
42403                                 while(child){
42404                                         if(child.data){
42405                                                 buf.push(child.data);
42406                                         }else{
42407                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
42408                                         }
42409                                         child = child.nextSibling;
42410                                 }
42411                         }else
42412                         {
42413                                 while(child){
42414                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
42415                                         child = child.nextSibling;
42416                                 }
42417                         }
42418                         buf.push('</',nodeName,'>');
42419                 }else{
42420                         buf.push('/>');
42421                 }
42422                 // remove added visible namespaces
42423                 //visibleNamespaces.length = startVisibleNamespaces;
42424                 return;
42425         case DOCUMENT_NODE:
42426         case DOCUMENT_FRAGMENT_NODE:
42427                 var child = node.firstChild;
42428                 while(child){
42429                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
42430                         child = child.nextSibling;
42431                 }
42432                 return;
42433         case ATTRIBUTE_NODE:
42434                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
42435         case TEXT_NODE:
42436                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
42437         case CDATA_SECTION_NODE:
42438                 return buf.push( '<![CDATA[',node.data,']]>');
42439         case COMMENT_NODE:
42440                 return buf.push( "<!--",node.data,"-->");
42441         case DOCUMENT_TYPE_NODE:
42442                 var pubid = node.publicId;
42443                 var sysid = node.systemId;
42444                 buf.push('<!DOCTYPE ',node.name);
42445                 if(pubid){
42446                         buf.push(' PUBLIC "',pubid);
42447                         if (sysid && sysid!='.') {
42448                                 buf.push( '" "',sysid);
42449                         }
42450                         buf.push('">');
42451                 }else if(sysid && sysid!='.'){
42452                         buf.push(' SYSTEM "',sysid,'">');
42453                 }else{
42454                         var sub = node.internalSubset;
42455                         if(sub){
42456                                 buf.push(" [",sub,"]");
42457                         }
42458                         buf.push(">");
42459                 }
42460                 return;
42461         case PROCESSING_INSTRUCTION_NODE:
42462                 return buf.push( "<?",node.target," ",node.data,"?>");
42463         case ENTITY_REFERENCE_NODE:
42464                 return buf.push( '&',node.nodeName,';');
42465         //case ENTITY_NODE:
42466         //case NOTATION_NODE:
42467         default:
42468                 buf.push('??',node.nodeName);
42469         }
42470 }
42471 function importNode(doc,node,deep){
42472         var node2;
42473         switch (node.nodeType) {
42474         case ELEMENT_NODE:
42475                 node2 = node.cloneNode(false);
42476                 node2.ownerDocument = doc;
42477                 //var attrs = node2.attributes;
42478                 //var len = attrs.length;
42479                 //for(var i=0;i<len;i++){
42480                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
42481                 //}
42482         case DOCUMENT_FRAGMENT_NODE:
42483                 break;
42484         case ATTRIBUTE_NODE:
42485                 deep = true;
42486                 break;
42487         //case ENTITY_REFERENCE_NODE:
42488         //case PROCESSING_INSTRUCTION_NODE:
42489         ////case TEXT_NODE:
42490         //case CDATA_SECTION_NODE:
42491         //case COMMENT_NODE:
42492         //      deep = false;
42493         //      break;
42494         //case DOCUMENT_NODE:
42495         //case DOCUMENT_TYPE_NODE:
42496         //cannot be imported.
42497         //case ENTITY_NODE:
42498         //case NOTATION_NODE:
42499         //can not hit in level3
42500         //default:throw e;
42501         }
42502         if(!node2){
42503                 node2 = node.cloneNode(false);//false
42504         }
42505         node2.ownerDocument = doc;
42506         node2.parentNode = null;
42507         if(deep){
42508                 var child = node.firstChild;
42509                 while(child){
42510                         node2.appendChild(importNode(doc,child,deep));
42511                         child = child.nextSibling;
42512                 }
42513         }
42514         return node2;
42515 }
42516 //
42517 //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
42518 //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
42519 function cloneNode(doc,node,deep){
42520         var node2 = new node.constructor();
42521         for(var n in node){
42522                 var v = node[n];
42523                 if(typeof v != 'object' ){
42524                         if(v != node2[n]){
42525                                 node2[n] = v;
42526                         }
42527                 }
42528         }
42529         if(node.childNodes){
42530                 node2.childNodes = new NodeList();
42531         }
42532         node2.ownerDocument = doc;
42533         switch (node2.nodeType) {
42534         case ELEMENT_NODE:
42535                 var attrs       = node.attributes;
42536                 var attrs2      = node2.attributes = new NamedNodeMap();
42537                 var len = attrs.length;
42538                 attrs2._ownerElement = node2;
42539                 for(var i=0;i<len;i++){
42540                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
42541                 }
42542                 break;;
42543         case ATTRIBUTE_NODE:
42544                 deep = true;
42545         }
42546         if(deep){
42547                 var child = node.firstChild;
42548                 while(child){
42549                         node2.appendChild(cloneNode(doc,child,deep));
42550                         child = child.nextSibling;
42551                 }
42552         }
42553         return node2;
42554 }
42555
42556 function __set__(object,key,value){
42557         object[key] = value;
42558 }
42559 //do dynamic
42560 try{
42561         if(Object.defineProperty){
42562                 Object.defineProperty(LiveNodeList.prototype,'length',{
42563                         get:function(){
42564                                 _updateLiveList(this);
42565                                 return this.$$length;
42566                         }
42567                 });
42568                 Object.defineProperty(Node$2.prototype,'textContent',{
42569                         get:function(){
42570                                 return getTextContent(this);
42571                         },
42572                         set:function(data){
42573                                 switch(this.nodeType){
42574                                 case ELEMENT_NODE:
42575                                 case DOCUMENT_FRAGMENT_NODE:
42576                                         while(this.firstChild){
42577                                                 this.removeChild(this.firstChild);
42578                                         }
42579                                         if(data || String(data)){
42580                                                 this.appendChild(this.ownerDocument.createTextNode(data));
42581                                         }
42582                                         break;
42583                                 default:
42584                                         //TODO:
42585                                         this.data = data;
42586                                         this.value = data;
42587                                         this.nodeValue = data;
42588                                 }
42589                         }
42590                 });
42591                 
42592                 function getTextContent(node){
42593                         switch(node.nodeType){
42594                         case ELEMENT_NODE:
42595                         case DOCUMENT_FRAGMENT_NODE:
42596                                 var buf = [];
42597                                 node = node.firstChild;
42598                                 while(node){
42599                                         if(node.nodeType!==7 && node.nodeType !==8){
42600                                                 buf.push(getTextContent(node));
42601                                         }
42602                                         node = node.nextSibling;
42603                                 }
42604                                 return buf.join('');
42605                         default:
42606                                 return node.nodeValue;
42607                         }
42608                 }
42609                 __set__ = function(object,key,value){
42610                         //console.log(value)
42611                         object['$$'+key] = value;
42612                 };
42613         }
42614 }catch(e){//ie8
42615 }
42616
42617 //if(typeof require == 'function'){
42618         var DOMImplementation_1 = DOMImplementation;
42619         var XMLSerializer_1 = XMLSerializer$1;
42620 //}
42621
42622 var dom = {
42623         DOMImplementation: DOMImplementation_1,
42624         XMLSerializer: XMLSerializer_1
42625 };
42626
42627 var domParser = createCommonjsModule(function (module, exports) {
42628 function DOMParser(options){
42629         this.options = options ||{locator:{}};
42630         
42631 }
42632 DOMParser.prototype.parseFromString = function(source,mimeType){
42633         var options = this.options;
42634         var sax$$1 =  new XMLReader();
42635         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
42636         var errorHandler = options.errorHandler;
42637         var locator = options.locator;
42638         var defaultNSMap = options.xmlns||{};
42639         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
42640         if(locator){
42641                 domBuilder.setDocumentLocator(locator);
42642         }
42643         
42644         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
42645         sax$$1.domBuilder = options.domBuilder || domBuilder;
42646         if(/\/x?html?$/.test(mimeType)){
42647                 entityMap.nbsp = '\xa0';
42648                 entityMap.copy = '\xa9';
42649                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
42650         }
42651         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
42652         if(source){
42653                 sax$$1.parse(source,defaultNSMap,entityMap);
42654         }else{
42655                 sax$$1.errorHandler.error("invalid doc source");
42656         }
42657         return domBuilder.doc;
42658 };
42659 function buildErrorHandler(errorImpl,domBuilder,locator){
42660         if(!errorImpl){
42661                 if(domBuilder instanceof DOMHandler){
42662                         return domBuilder;
42663                 }
42664                 errorImpl = domBuilder ;
42665         }
42666         var errorHandler = {};
42667         var isCallback = errorImpl instanceof Function;
42668         locator = locator||{};
42669         function build(key){
42670                 var fn = errorImpl[key];
42671                 if(!fn && isCallback){
42672                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
42673                 }
42674                 errorHandler[key] = fn && function(msg){
42675                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
42676                 }||function(){};
42677         }
42678         build('warning');
42679         build('error');
42680         build('fatalError');
42681         return errorHandler;
42682 }
42683
42684 //console.log('#\n\n\n\n\n\n\n####')
42685 /**
42686  * +ContentHandler+ErrorHandler
42687  * +LexicalHandler+EntityResolver2
42688  * -DeclHandler-DTDHandler 
42689  * 
42690  * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
42691  * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
42692  * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
42693  */
42694 function DOMHandler() {
42695     this.cdata = false;
42696 }
42697 function position(locator,node){
42698         node.lineNumber = locator.lineNumber;
42699         node.columnNumber = locator.columnNumber;
42700 }
42701 /**
42702  * @see org.xml.sax.ContentHandler#startDocument
42703  * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
42704  */ 
42705 DOMHandler.prototype = {
42706         startDocument : function() {
42707         this.doc = new DOMImplementation().createDocument(null, null, null);
42708         if (this.locator) {
42709                 this.doc.documentURI = this.locator.systemId;
42710         }
42711         },
42712         startElement:function(namespaceURI, localName, qName, attrs) {
42713                 var doc = this.doc;
42714             var el = doc.createElementNS(namespaceURI, qName||localName);
42715             var len = attrs.length;
42716             appendElement(this, el);
42717             this.currentElement = el;
42718             
42719                 this.locator && position(this.locator,el);
42720             for (var i = 0 ; i < len; i++) {
42721                 var namespaceURI = attrs.getURI(i);
42722                 var value = attrs.getValue(i);
42723                 var qName = attrs.getQName(i);
42724                         var attr = doc.createAttributeNS(namespaceURI, qName);
42725                         this.locator &&position(attrs.getLocator(i),attr);
42726                         attr.value = attr.nodeValue = value;
42727                         el.setAttributeNode(attr);
42728             }
42729         },
42730         endElement:function(namespaceURI, localName, qName) {
42731                 var current = this.currentElement;
42732                 var tagName = current.tagName;
42733                 this.currentElement = current.parentNode;
42734         },
42735         startPrefixMapping:function(prefix, uri) {
42736         },
42737         endPrefixMapping:function(prefix) {
42738         },
42739         processingInstruction:function(target, data) {
42740             var ins = this.doc.createProcessingInstruction(target, data);
42741             this.locator && position(this.locator,ins);
42742             appendElement(this, ins);
42743         },
42744         ignorableWhitespace:function(ch, start, length) {
42745         },
42746         characters:function(chars, start, length) {
42747                 chars = _toString.apply(this,arguments);
42748                 //console.log(chars)
42749                 if(chars){
42750                         if (this.cdata) {
42751                                 var charNode = this.doc.createCDATASection(chars);
42752                         } else {
42753                                 var charNode = this.doc.createTextNode(chars);
42754                         }
42755                         if(this.currentElement){
42756                                 this.currentElement.appendChild(charNode);
42757                         }else if(/^\s*$/.test(chars)){
42758                                 this.doc.appendChild(charNode);
42759                                 //process xml
42760                         }
42761                         this.locator && position(this.locator,charNode);
42762                 }
42763         },
42764         skippedEntity:function(name) {
42765         },
42766         endDocument:function() {
42767                 this.doc.normalize();
42768         },
42769         setDocumentLocator:function (locator) {
42770             if(this.locator = locator){// && !('lineNumber' in locator)){
42771                 locator.lineNumber = 0;
42772             }
42773         },
42774         //LexicalHandler
42775         comment:function(chars, start, length) {
42776                 chars = _toString.apply(this,arguments);
42777             var comm = this.doc.createComment(chars);
42778             this.locator && position(this.locator,comm);
42779             appendElement(this, comm);
42780         },
42781         
42782         startCDATA:function() {
42783             //used in characters() methods
42784             this.cdata = true;
42785         },
42786         endCDATA:function() {
42787             this.cdata = false;
42788         },
42789         
42790         startDTD:function(name, publicId, systemId) {
42791                 var impl = this.doc.implementation;
42792             if (impl && impl.createDocumentType) {
42793                 var dt = impl.createDocumentType(name, publicId, systemId);
42794                 this.locator && position(this.locator,dt);
42795                 appendElement(this, dt);
42796             }
42797         },
42798         /**
42799          * @see org.xml.sax.ErrorHandler
42800          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
42801          */
42802         warning:function(error) {
42803                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
42804         },
42805         error:function(error) {
42806                 console.error('[xmldom error]\t'+error,_locator(this.locator));
42807         },
42808         fatalError:function(error) {
42809                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
42810             throw error;
42811         }
42812 };
42813 function _locator(l){
42814         if(l){
42815                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
42816         }
42817 }
42818 function _toString(chars,start,length){
42819         if(typeof chars == 'string'){
42820                 return chars.substr(start,length)
42821         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
42822                 if(chars.length >= start+length || start){
42823                         return new java.lang.String(chars,start,length)+'';
42824                 }
42825                 return chars;
42826         }
42827 }
42828
42829 /*
42830  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
42831  * used method of org.xml.sax.ext.LexicalHandler:
42832  *  #comment(chars, start, length)
42833  *  #startCDATA()
42834  *  #endCDATA()
42835  *  #startDTD(name, publicId, systemId)
42836  *
42837  *
42838  * IGNORED method of org.xml.sax.ext.LexicalHandler:
42839  *  #endDTD()
42840  *  #startEntity(name)
42841  *  #endEntity(name)
42842  *
42843  *
42844  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
42845  * IGNORED method of org.xml.sax.ext.DeclHandler
42846  *      #attributeDecl(eName, aName, type, mode, value)
42847  *  #elementDecl(name, model)
42848  *  #externalEntityDecl(name, publicId, systemId)
42849  *  #internalEntityDecl(name, value)
42850  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
42851  * IGNORED method of org.xml.sax.EntityResolver2
42852  *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
42853  *  #resolveEntity(publicId, systemId)
42854  *  #getExternalSubset(name, baseURI)
42855  * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
42856  * IGNORED method of org.xml.sax.DTDHandler
42857  *  #notationDecl(name, publicId, systemId) {};
42858  *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
42859  */
42860 "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
42861         DOMHandler.prototype[key] = function(){return null};
42862 });
42863
42864 /* 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 */
42865 function appendElement (hander,node) {
42866     if (!hander.currentElement) {
42867         hander.doc.appendChild(node);
42868     } else {
42869         hander.currentElement.appendChild(node);
42870     }
42871 }//appendChild and setAttributeNS are preformance key
42872
42873 //if(typeof require == 'function'){
42874         var XMLReader = sax.XMLReader;
42875         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
42876         exports.XMLSerializer = dom.XMLSerializer ;
42877         exports.DOMParser = DOMParser;
42878 //}
42879 });
42880
42881 var togeojson = createCommonjsModule(function (module, exports) {
42882 var toGeoJSON = (function() {
42883     'use strict';
42884
42885     var removeSpace = /\s*/g,
42886         trimSpace = /^\s*|\s*$/g,
42887         splitSpace = /\s+/;
42888     // generate a short, numeric hash of a string
42889     function okhash(x) {
42890         if (!x || !x.length) return 0;
42891         for (var i = 0, h = 0; i < x.length; i++) {
42892             h = ((h << 5) - h) + x.charCodeAt(i) | 0;
42893         } return h;
42894     }
42895     // all Y children of X
42896     function get(x, y) { return x.getElementsByTagName(y); }
42897     function attr(x, y) { return x.getAttribute(y); }
42898     function attrf(x, y) { return parseFloat(attr(x, y)); }
42899     // one Y child of X, if any, otherwise null
42900     function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
42901     // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
42902     function norm(el) { if (el.normalize) { el.normalize(); } return el; }
42903     // cast array x into numbers
42904     function numarray(x) {
42905         for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
42906         return o;
42907     }
42908     // get the content of a text node, if any
42909     function nodeVal(x) {
42910         if (x) { norm(x); }
42911         return (x && x.textContent) || '';
42912     }
42913     // get the contents of multiple text nodes, if present
42914     function getMulti(x, ys) {
42915         var o = {}, n, k;
42916         for (k = 0; k < ys.length; k++) {
42917             n = get1(x, ys[k]);
42918             if (n) o[ys[k]] = nodeVal(n);
42919         }
42920         return o;
42921     }
42922     // add properties of Y to X, overwriting if present in both
42923     function extend(x, y) { for (var k in y) x[k] = y[k]; }
42924     // get one coordinate from a coordinate array, if any
42925     function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
42926     // get all coordinates from a coordinate array as [[],[]]
42927     function coord(v) {
42928         var coords = v.replace(trimSpace, '').split(splitSpace),
42929             o = [];
42930         for (var i = 0; i < coords.length; i++) {
42931             o.push(coord1(coords[i]));
42932         }
42933         return o;
42934     }
42935     function coordPair(x) {
42936         var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
42937             ele = get1(x, 'ele'),
42938             // handle namespaced attribute in browser
42939             heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
42940             time = get1(x, 'time'),
42941             e;
42942         if (ele) {
42943             e = parseFloat(nodeVal(ele));
42944             if (!isNaN(e)) {
42945                 ll.push(e);
42946             }
42947         }
42948         return {
42949             coordinates: ll,
42950             time: time ? nodeVal(time) : null,
42951             heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
42952         };
42953     }
42954
42955     // create a new feature collection parent object
42956     function fc() {
42957         return {
42958             type: 'FeatureCollection',
42959             features: []
42960         };
42961     }
42962
42963     var serializer;
42964     if (typeof XMLSerializer !== 'undefined') {
42965         /* istanbul ignore next */
42966         serializer = new XMLSerializer();
42967     // only require xmldom in a node environment
42968     } else if ('object' === 'object' && typeof process === 'object' && !process.browser) {
42969         serializer = new (domParser.XMLSerializer)();
42970     }
42971     function xml2str(str) {
42972         // IE9 will create a new XMLSerializer but it'll crash immediately.
42973         // This line is ignored because we don't run coverage tests in IE9
42974         /* istanbul ignore next */
42975         if (str.xml !== undefined) return str.xml;
42976         return serializer.serializeToString(str);
42977     }
42978
42979     var t = {
42980         kml: function(doc) {
42981
42982             var gj = fc(),
42983                 // styleindex keeps track of hashed styles in order to match features
42984                 styleIndex = {}, styleByHash = {},
42985                 // stylemapindex keeps track of style maps to expose in properties
42986                 styleMapIndex = {},
42987                 // atomic geospatial types supported by KML - MultiGeometry is
42988                 // handled separately
42989                 geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
42990                 // all root placemarks in the file
42991                 placemarks = get(doc, 'Placemark'),
42992                 styles = get(doc, 'Style'),
42993                 styleMaps = get(doc, 'StyleMap');
42994
42995             for (var k = 0; k < styles.length; k++) {
42996                 var hash = okhash(xml2str(styles[k])).toString(16);
42997                 styleIndex['#' + attr(styles[k], 'id')] = hash;
42998                 styleByHash[hash] = styles[k];
42999             }
43000             for (var l = 0; l < styleMaps.length; l++) {
43001                 styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
43002                 var pairs = get(styleMaps[l], 'Pair');
43003                 var pairsMap = {};
43004                 for (var m = 0; m < pairs.length; m++) {
43005                     pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
43006                 }
43007                 styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
43008
43009             }
43010             for (var j = 0; j < placemarks.length; j++) {
43011                 gj.features = gj.features.concat(getPlacemark(placemarks[j]));
43012             }
43013             function kmlColor(v) {
43014                 var color, opacity;
43015                 v = v || '';
43016                 if (v.substr(0, 1) === '#') { v = v.substr(1); }
43017                 if (v.length === 6 || v.length === 3) { color = v; }
43018                 if (v.length === 8) {
43019                     opacity = parseInt(v.substr(0, 2), 16) / 255;
43020                     color = '#' + v.substr(6, 2) +
43021                         v.substr(4, 2) +
43022                         v.substr(2, 2);
43023                 }
43024                 return [color, isNaN(opacity) ? undefined : opacity];
43025             }
43026             function gxCoord(v) { return numarray(v.split(' ')); }
43027             function gxCoords(root) {
43028                 var elems = get(root, 'coord', 'gx'), coords = [], times = [];
43029                 if (elems.length === 0) elems = get(root, 'gx:coord');
43030                 for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
43031                 var timeElems = get(root, 'when');
43032                 for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
43033                 return {
43034                     coords: coords,
43035                     times: times
43036                 };
43037             }
43038             function getGeometry(root) {
43039                 var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
43040                 if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
43041                 if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
43042                 if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
43043                 for (i = 0; i < geotypes.length; i++) {
43044                     geomNodes = get(root, geotypes[i]);
43045                     if (geomNodes) {
43046                         for (j = 0; j < geomNodes.length; j++) {
43047                             geomNode = geomNodes[j];
43048                             if (geotypes[i] === 'Point') {
43049                                 geoms.push({
43050                                     type: 'Point',
43051                                     coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
43052                                 });
43053                             } else if (geotypes[i] === 'LineString') {
43054                                 geoms.push({
43055                                     type: 'LineString',
43056                                     coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
43057                                 });
43058                             } else if (geotypes[i] === 'Polygon') {
43059                                 var rings = get(geomNode, 'LinearRing'),
43060                                     coords = [];
43061                                 for (k = 0; k < rings.length; k++) {
43062                                     coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
43063                                 }
43064                                 geoms.push({
43065                                     type: 'Polygon',
43066                                     coordinates: coords
43067                                 });
43068                             } else if (geotypes[i] === 'Track' ||
43069                                 geotypes[i] === 'gx:Track') {
43070                                 var track = gxCoords(geomNode);
43071                                 geoms.push({
43072                                     type: 'LineString',
43073                                     coordinates: track.coords
43074                                 });
43075                                 if (track.times.length) coordTimes.push(track.times);
43076                             }
43077                         }
43078                     }
43079                 }
43080                 return {
43081                     geoms: geoms,
43082                     coordTimes: coordTimes
43083                 };
43084             }
43085             function getPlacemark(root) {
43086                 var geomsAndTimes = getGeometry(root), i, properties = {},
43087                     name = nodeVal(get1(root, 'name')),
43088                     address = nodeVal(get1(root, 'address')),
43089                     styleUrl = nodeVal(get1(root, 'styleUrl')),
43090                     description = nodeVal(get1(root, 'description')),
43091                     timeSpan = get1(root, 'TimeSpan'),
43092                     timeStamp = get1(root, 'TimeStamp'),
43093                     extendedData = get1(root, 'ExtendedData'),
43094                     lineStyle = get1(root, 'LineStyle'),
43095                     polyStyle = get1(root, 'PolyStyle'),
43096                     visibility = get1(root, 'visibility');
43097
43098                 if (!geomsAndTimes.geoms.length) return [];
43099                 if (name) properties.name = name;
43100                 if (address) properties.address = address;
43101                 if (styleUrl) {
43102                     if (styleUrl[0] !== '#') {
43103                         styleUrl = '#' + styleUrl;
43104                     }
43105
43106                     properties.styleUrl = styleUrl;
43107                     if (styleIndex[styleUrl]) {
43108                         properties.styleHash = styleIndex[styleUrl];
43109                     }
43110                     if (styleMapIndex[styleUrl]) {
43111                         properties.styleMapHash = styleMapIndex[styleUrl];
43112                         properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
43113                     }
43114                     // Try to populate the lineStyle or polyStyle since we got the style hash
43115                     var style = styleByHash[properties.styleHash];
43116                     if (style) {
43117                         if (!lineStyle) lineStyle = get1(style, 'LineStyle');
43118                         if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
43119                     }
43120                 }
43121                 if (description) properties.description = description;
43122                 if (timeSpan) {
43123                     var begin = nodeVal(get1(timeSpan, 'begin'));
43124                     var end = nodeVal(get1(timeSpan, 'end'));
43125                     properties.timespan = { begin: begin, end: end };
43126                 }
43127                 if (timeStamp) {
43128                     properties.timestamp = nodeVal(get1(timeStamp, 'when'));
43129                 }
43130                 if (lineStyle) {
43131                     var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
43132                         color = linestyles[0],
43133                         opacity = linestyles[1],
43134                         width = parseFloat(nodeVal(get1(lineStyle, 'width')));
43135                     if (color) properties.stroke = color;
43136                     if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
43137                     if (!isNaN(width)) properties['stroke-width'] = width;
43138                 }
43139                 if (polyStyle) {
43140                     var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
43141                         pcolor = polystyles[0],
43142                         popacity = polystyles[1],
43143                         fill = nodeVal(get1(polyStyle, 'fill')),
43144                         outline = nodeVal(get1(polyStyle, 'outline'));
43145                     if (pcolor) properties.fill = pcolor;
43146                     if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
43147                     if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
43148                     if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
43149                 }
43150                 if (extendedData) {
43151                     var datas = get(extendedData, 'Data'),
43152                         simpleDatas = get(extendedData, 'SimpleData');
43153
43154                     for (i = 0; i < datas.length; i++) {
43155                         properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
43156                     }
43157                     for (i = 0; i < simpleDatas.length; i++) {
43158                         properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
43159                     }
43160                 }
43161                 if (visibility) {
43162                     properties.visibility = nodeVal(visibility);
43163                 }
43164                 if (geomsAndTimes.coordTimes.length) {
43165                     properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
43166                         geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
43167                 }
43168                 var feature = {
43169                     type: 'Feature',
43170                     geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
43171                         type: 'GeometryCollection',
43172                         geometries: geomsAndTimes.geoms
43173                     },
43174                     properties: properties
43175                 };
43176                 if (attr(root, 'id')) feature.id = attr(root, 'id');
43177                 return [feature];
43178             }
43179             return gj;
43180         },
43181         gpx: function(doc) {
43182             var i,
43183                 tracks = get(doc, 'trk'),
43184                 routes = get(doc, 'rte'),
43185                 waypoints = get(doc, 'wpt'),
43186                 // a feature collection
43187                 gj = fc(),
43188                 feature;
43189             for (i = 0; i < tracks.length; i++) {
43190                 feature = getTrack(tracks[i]);
43191                 if (feature) gj.features.push(feature);
43192             }
43193             for (i = 0; i < routes.length; i++) {
43194                 feature = getRoute(routes[i]);
43195                 if (feature) gj.features.push(feature);
43196             }
43197             for (i = 0; i < waypoints.length; i++) {
43198                 gj.features.push(getPoint(waypoints[i]));
43199             }
43200             function getPoints(node, pointname) {
43201                 var pts = get(node, pointname),
43202                     line = [],
43203                     times = [],
43204                     heartRates = [],
43205                     l = pts.length;
43206                 if (l < 2) return {};  // Invalid line in GeoJSON
43207                 for (var i = 0; i < l; i++) {
43208                     var c = coordPair(pts[i]);
43209                     line.push(c.coordinates);
43210                     if (c.time) times.push(c.time);
43211                     if (c.heartRate) heartRates.push(c.heartRate);
43212                 }
43213                 return {
43214                     line: line,
43215                     times: times,
43216                     heartRates: heartRates
43217                 };
43218             }
43219             function getTrack(node) {
43220                 var segments = get(node, 'trkseg'),
43221                     track = [],
43222                     times = [],
43223                     heartRates = [],
43224                     line;
43225                 for (var i = 0; i < segments.length; i++) {
43226                     line = getPoints(segments[i], 'trkpt');
43227                     if (line) {
43228                         if (line.line) track.push(line.line);
43229                         if (line.times && line.times.length) times.push(line.times);
43230                         if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
43231                     }
43232                 }
43233                 if (track.length === 0) return;
43234                 var properties = getProperties(node);
43235                 extend(properties, getLineStyle(get1(node, 'extensions')));
43236                 if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
43237                 if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
43238                 return {
43239                     type: 'Feature',
43240                     properties: properties,
43241                     geometry: {
43242                         type: track.length === 1 ? 'LineString' : 'MultiLineString',
43243                         coordinates: track.length === 1 ? track[0] : track
43244                     }
43245                 };
43246             }
43247             function getRoute(node) {
43248                 var line = getPoints(node, 'rtept');
43249                 if (!line.line) return;
43250                 var prop = getProperties(node);
43251                 extend(prop, getLineStyle(get1(node, 'extensions')));
43252                 var routeObj = {
43253                     type: 'Feature',
43254                     properties: prop,
43255                     geometry: {
43256                         type: 'LineString',
43257                         coordinates: line.line
43258                     }
43259                 };
43260                 return routeObj;
43261             }
43262             function getPoint(node) {
43263                 var prop = getProperties(node);
43264                 extend(prop, getMulti(node, ['sym']));
43265                 return {
43266                     type: 'Feature',
43267                     properties: prop,
43268                     geometry: {
43269                         type: 'Point',
43270                         coordinates: coordPair(node).coordinates
43271                     }
43272                 };
43273             }
43274             function getLineStyle(extensions) {
43275                 var style = {};
43276                 if (extensions) {
43277                     var lineStyle = get1(extensions, 'line');
43278                     if (lineStyle) {
43279                         var color = nodeVal(get1(lineStyle, 'color')),
43280                             opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
43281                             width = parseFloat(nodeVal(get1(lineStyle, 'width')));
43282                         if (color) style.stroke = color;
43283                         if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
43284                         // GPX width is in mm, convert to px with 96 px per inch
43285                         if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
43286                     }
43287                 }
43288                 return style;
43289             }
43290             function getProperties(node) {
43291                 var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
43292                     links = get(node, 'link');
43293                 if (links.length) prop.links = [];
43294                 for (var i = 0, link; i < links.length; i++) {
43295                     link = { href: attr(links[i], 'href') };
43296                     extend(link, getMulti(links[i], ['text', 'type']));
43297                     prop.links.push(link);
43298                 }
43299                 return prop;
43300             }
43301             return gj;
43302         }
43303     };
43304     return t;
43305 })();
43306
43307 module.exports = toGeoJSON;
43308 });
43309
43310 function svgGpx(projection$$1, context, dispatch) {
43311     var showLabels = true,
43312         detected = utilDetect(),
43313         layer,
43314         src;
43315
43316
43317     function init() {
43318         if (svgGpx.initialized) return;  // run once
43319
43320         svgGpx.geojson = {};
43321         svgGpx.enabled = true;
43322
43323         function over() {
43324             event.stopPropagation();
43325             event.preventDefault();
43326             event.dataTransfer.dropEffect = 'copy';
43327         }
43328
43329         d3_select('body')
43330             .attr('dropzone', 'copy')
43331             .on('drop.localgpx', function() {
43332                 event.stopPropagation();
43333                 event.preventDefault();
43334                 if (!detected.filedrop) return;
43335                 drawGpx.files(event.dataTransfer.files);
43336             })
43337             .on('dragenter.localgpx', over)
43338             .on('dragexit.localgpx', over)
43339             .on('dragover.localgpx', over);
43340
43341         svgGpx.initialized = true;
43342     }
43343
43344
43345     function drawGpx(selection$$1) {
43346         var geojson = svgGpx.geojson,
43347             enabled = svgGpx.enabled;
43348
43349         layer = selection$$1.selectAll('.layer-gpx')
43350             .data(enabled ? [0] : []);
43351
43352         layer.exit()
43353             .remove();
43354
43355         layer = layer.enter()
43356             .append('g')
43357             .attr('class', 'layer-gpx')
43358             .merge(layer);
43359
43360
43361         var paths = layer
43362             .selectAll('path')
43363             .data([geojson]);
43364
43365         paths.exit()
43366             .remove();
43367
43368         paths = paths.enter()
43369             .append('path')
43370             .attr('class', 'gpx')
43371             .merge(paths);
43372
43373
43374         var path = d3_geoPath(projection$$1);
43375
43376         paths
43377             .attr('d', path);
43378
43379
43380         var labels = layer.selectAll('text')
43381             .data(showLabels && geojson.features ? geojson.features : []);
43382
43383         labels.exit()
43384             .remove();
43385
43386         labels = labels.enter()
43387             .append('text')
43388             .attr('class', 'gpx')
43389             .merge(labels);
43390
43391         labels
43392             .text(function(d) {
43393                 return d.properties.desc || d.properties.name;
43394             })
43395             .attr('x', function(d) {
43396                 var centroid = path.centroid(d);
43397                 return centroid[0] + 7;
43398             })
43399             .attr('y', function(d) {
43400                 var centroid = path.centroid(d);
43401                 return centroid[1];
43402             });
43403
43404     }
43405
43406
43407     function toDom(x) {
43408         return (new DOMParser()).parseFromString(x, 'text/xml');
43409     }
43410
43411
43412     function getExtension(fileName) {
43413         if (isUndefined(fileName)) {
43414             return '';
43415         }
43416
43417         var lastDotIndex = fileName.lastIndexOf('.');
43418         if (lastDotIndex < 0) {
43419             return '';
43420         }
43421
43422         return fileName.substr(lastDotIndex);
43423     }
43424
43425
43426     function parseSaveAndZoom(extension, data) {
43427         switch (extension) {
43428             default:
43429                 drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
43430                 break;
43431             case '.kml':
43432                 drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
43433                 break;
43434             case '.geojson':
43435             case '.json':
43436                 drawGpx.geojson(JSON.parse(data)).fitZoom();
43437                 break;
43438         }
43439     }
43440
43441
43442     drawGpx.showLabels = function(_) {
43443         if (!arguments.length) return showLabels;
43444         showLabels = _;
43445         return this;
43446     };
43447
43448
43449     drawGpx.enabled = function(_) {
43450         if (!arguments.length) return svgGpx.enabled;
43451         svgGpx.enabled = _;
43452         dispatch.call('change');
43453         return this;
43454     };
43455
43456
43457     drawGpx.hasGpx = function() {
43458         var geojson = svgGpx.geojson;
43459         return (!(isEmpty(geojson) || isEmpty(geojson.features)));
43460     };
43461
43462
43463     drawGpx.geojson = function(gj) {
43464         if (!arguments.length) return svgGpx.geojson;
43465         if (isEmpty(gj) || isEmpty(gj.features)) return this;
43466         svgGpx.geojson = gj;
43467         dispatch.call('change');
43468         return this;
43469     };
43470
43471
43472     drawGpx.url = function(url) {
43473         d3_text(url, function(err, data) {
43474             if (!err) {
43475                 src = url;
43476
43477                 var extension = getExtension(url);
43478                 parseSaveAndZoom(extension, data);
43479             }
43480         });
43481         return this;
43482     };
43483
43484
43485     drawGpx.files = function(fileList) {
43486         if (!fileList.length) return this;
43487         var f = fileList[0],
43488             reader = new FileReader();
43489
43490         reader.onload = (function(file) {
43491             src = file.name;
43492
43493             var extension = getExtension(file.name);
43494
43495             return function (e) {
43496                 parseSaveAndZoom(extension, e.target.result);
43497             };
43498         })(f);
43499
43500         reader.readAsText(f);
43501         return this;
43502     };
43503
43504     drawGpx.getSrc = function () {
43505       return src;
43506     };
43507
43508     drawGpx.fitZoom = function() {
43509         if (!this.hasGpx()) return this;
43510         var geojson = svgGpx.geojson;
43511
43512         var map = context.map(),
43513             viewport = map.trimmedExtent().polygon(),
43514             coords = reduce(geojson.features, function(coords, feature) {
43515                 var c = feature.geometry.coordinates;
43516
43517                 /* eslint-disable no-fallthrough */
43518                 switch (feature.geometry.type) {
43519                     case 'Point':
43520                         c = [c];
43521                     case 'MultiPoint':
43522                     case 'LineString':
43523                         break;
43524
43525                     case 'MultiPolygon':
43526                         c = flatten(c);
43527                     case 'Polygon':
43528                     case 'MultiLineString':
43529                         c = flatten(c);
43530                         break;
43531                 }
43532                 /* eslint-enable no-fallthrough */
43533
43534                 return union(coords, c);
43535             }, []);
43536
43537         if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
43538             var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
43539             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
43540         }
43541
43542         return this;
43543     };
43544
43545
43546     init();
43547     return drawGpx;
43548 }
43549
43550 function svgIcon(name, svgklass, useklass) {
43551     return function drawIcon(selection) {
43552         selection.selectAll('svg')
43553             .data([0])
43554             .enter()
43555             .append('svg')
43556             .attr('class', 'icon ' + (svgklass || ''))
43557             .append('use')
43558             .attr('xlink:href', name)
43559             .attr('class', useklass);
43560     };
43561 }
43562
43563 function svgLabels(projection$$1, context) {
43564     var path = d3_geoPath(projection$$1),
43565         detected = utilDetect(),
43566         baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge'),
43567         rdrawn = rbush_1(),
43568         rskipped = rbush_1(),
43569         textWidthCache = {},
43570         entitybboxes = {};
43571
43572     // Listed from highest to lowest priority
43573     var labelStack = [
43574         ['line', 'aeroway', '*', 12],
43575         ['line', 'highway', 'motorway', 12],
43576         ['line', 'highway', 'trunk', 12],
43577         ['line', 'highway', 'primary', 12],
43578         ['line', 'highway', 'secondary', 12],
43579         ['line', 'highway', 'tertiary', 12],
43580         ['line', 'highway', '*', 12],
43581         ['line', 'railway', '*', 12],
43582         ['line', 'waterway', '*', 12],
43583         ['area', 'aeroway', '*', 12],
43584         ['area', 'amenity', '*', 12],
43585         ['area', 'building', '*', 12],
43586         ['area', 'historic', '*', 12],
43587         ['area', 'leisure', '*', 12],
43588         ['area', 'man_made', '*', 12],
43589         ['area', 'natural', '*', 12],
43590         ['area', 'shop', '*', 12],
43591         ['area', 'tourism', '*', 12],
43592         ['area', 'camp_site', '*', 12],
43593         ['point', 'aeroway', '*', 10],
43594         ['point', 'amenity', '*', 10],
43595         ['point', 'building', '*', 10],
43596         ['point', 'historic', '*', 10],
43597         ['point', 'leisure', '*', 10],
43598         ['point', 'man_made', '*', 10],
43599         ['point', 'natural', '*', 10],
43600         ['point', 'shop', '*', 10],
43601         ['point', 'tourism', '*', 10],
43602         ['point', 'camp_site', '*', 10],
43603         ['line', 'name', '*', 12],
43604         ['area', 'name', '*', 12],
43605         ['point', 'name', '*', 10]
43606     ];
43607
43608
43609     function blacklisted(preset) {
43610         var noIcons = ['building', 'landuse', 'natural'];
43611         return some(noIcons, function(s) {
43612             return preset.id.indexOf(s) >= 0;
43613         });
43614     }
43615
43616
43617     function get(array, prop) {
43618         return function(d, i) { return array[i][prop]; };
43619     }
43620
43621
43622     function textWidth(text, size, elem) {
43623         var c = textWidthCache[size];
43624         if (!c) c = textWidthCache[size] = {};
43625
43626         if (c[text]) {
43627             return c[text];
43628
43629         } else if (elem) {
43630             c[text] = elem.getComputedTextLength();
43631             return c[text];
43632
43633         } else {
43634             var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
43635             if (str === null) {
43636                 return size / 3 * 2 * text.length;
43637             } else {
43638                 return size / 3 * (2 * text.length + str.length);
43639             }
43640         }
43641     }
43642
43643
43644     function drawLinePaths(selection, entities, filter, classes, labels) {
43645         var paths = selection.selectAll('path')
43646             .filter(filter)
43647             .data(entities, osmEntity$$1.key);
43648
43649         paths.exit()
43650             .remove();
43651
43652         paths.enter()
43653             .append('path')
43654             .style('stroke-width', get(labels, 'font-size'))
43655             .attr('id', function(d) { return 'labelpath-' + d.id; })
43656             .attr('class', classes)
43657             .merge(paths)
43658             .attr('d', get(labels, 'lineString'));
43659     }
43660
43661
43662     function drawLineLabels(selection, entities, filter, classes, labels) {
43663         var texts = selection.selectAll('text.' + classes)
43664             .filter(filter)
43665             .data(entities, osmEntity$$1.key);
43666
43667         texts.exit()
43668             .remove();
43669
43670         texts.enter()
43671             .append('text')
43672             .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
43673             .attr('dy', baselineHack ? '0.35em' : null)
43674             .append('textPath')
43675             .attr('class', 'textpath');
43676
43677         texts = selection.selectAll('text.' + classes);
43678
43679         texts.selectAll('.textpath')
43680             .filter(filter)
43681             .data(entities, osmEntity$$1.key)
43682             .attr('startOffset', '50%')
43683             .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
43684             .text(utilDisplayNameForPath);
43685     }
43686
43687
43688     function drawPointLabels(selection, entities, filter, classes, labels) {
43689         var texts = selection.selectAll('text.' + classes)
43690             .filter(filter)
43691             .data(entities, osmEntity$$1.key);
43692
43693         texts.exit()
43694             .remove();
43695
43696         texts = texts.enter()
43697             .append('text')
43698             .attr('class', function(d, i) {
43699                 return classes + ' ' + labels[i].classes + ' ' + d.id;
43700             })
43701             .merge(texts);
43702
43703         texts
43704             .attr('x', get(labels, 'x'))
43705             .attr('y', get(labels, 'y'))
43706             .style('text-anchor', get(labels, 'textAnchor'))
43707             .text(utilDisplayName)
43708             .each(function(d, i) {
43709                 textWidth(utilDisplayName(d), labels[i].height, this);
43710             });
43711     }
43712
43713
43714     function drawAreaLabels(selection, entities, filter, classes, labels) {
43715         entities = entities.filter(hasText);
43716         labels = labels.filter(hasText);
43717         drawPointLabels(selection, entities, filter, classes, labels);
43718
43719         function hasText(d, i) {
43720             return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
43721         }
43722     }
43723
43724
43725     function drawAreaIcons(selection, entities, filter, classes, labels) {
43726         var icons = selection.selectAll('use.' + classes)
43727             .filter(filter)
43728             .data(entities, osmEntity$$1.key);
43729
43730         icons.exit()
43731             .remove();
43732
43733         icons = icons.enter()
43734             .append('use')
43735             .attr('class', 'icon ' + classes)
43736             .attr('width', '17px')
43737             .attr('height', '17px')
43738             .merge(icons);
43739
43740         icons
43741             .attr('transform', get(labels, 'transform'))
43742             .attr('xlink:href', function(d) {
43743                 var preset = context.presets().match(d, context.graph()),
43744                     picon = preset && preset.icon;
43745
43746                 if (!picon)
43747                     return '';
43748                 else {
43749                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
43750                     return '#' + picon + (isMaki ? '-15' : '');
43751                 }
43752             });
43753     }
43754
43755
43756     function drawCollisionBoxes(selection, rtree, which) {
43757         var showDebug = context.getDebug('collision'),
43758             classes = 'debug ' + which + ' ' +
43759                 (which === 'debug-skipped' ? 'orange' : 'yellow');
43760
43761         var debug = selection.selectAll('.layer-label-debug')
43762                 .data(showDebug ? [true] : []);
43763
43764         debug.exit()
43765             .remove();
43766
43767         debug = debug.enter()
43768             .append('g')
43769             .attr('class', 'layer-label-debug')
43770             .merge(debug);
43771
43772         if (showDebug) {
43773             var gj = rtree.all().map(function(d) {
43774                 return { type: 'Polygon', coordinates: [[
43775                     [d.minX, d.minY],
43776                     [d.maxX, d.minY],
43777                     [d.maxX, d.maxY],
43778                     [d.minX, d.maxY],
43779                     [d.minX, d.minY]
43780                 ]]};
43781             });
43782
43783             var debugboxes = debug.selectAll('.' + which)
43784                 .data(gj);
43785
43786             debugboxes.exit()
43787                 .remove();
43788
43789             debugboxes = debugboxes.enter()
43790                 .append('path')
43791                 .attr('class', classes)
43792                 .merge(debugboxes);
43793
43794             debugboxes
43795                 .attr('d', d3_geoPath());
43796         }
43797     }
43798
43799
43800     function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
43801         var lowZoom = context.surface().classed('low-zoom');
43802
43803         var labelable = [], i, j, k, entity, geometry;
43804         for (i = 0; i < labelStack.length; i++) {
43805             labelable.push([]);
43806         }
43807
43808         if (fullRedraw) {
43809             rdrawn.clear();
43810             rskipped.clear();
43811             entitybboxes = {};
43812         } else {
43813             for (i = 0; i < entities.length; i++) {
43814                 entity = entities[i];
43815                 var toRemove = []
43816                     .concat(entitybboxes[entity.id] || [])
43817                     .concat(entitybboxes[entity.id + 'I'] || []);
43818
43819                 for (j = 0; j < toRemove.length; j++) {
43820                     rdrawn.remove(toRemove[j]);
43821                     rskipped.remove(toRemove[j]);
43822                 }
43823             }
43824         }
43825
43826         // Split entities into groups specified by labelStack
43827         for (i = 0; i < entities.length; i++) {
43828             entity = entities[i];
43829             geometry = entity.geometry(graph);
43830             if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
43831
43832             var preset = geometry === 'area' && context.presets().match(entity, graph),
43833                 icon = preset && !blacklisted(preset) && preset.icon;
43834
43835             if (!icon && !utilDisplayName(entity))
43836                 continue;
43837
43838             for (k = 0; k < labelStack.length; k++) {
43839                 var matchGeom = labelStack[k][0],
43840                     matchKey = labelStack[k][1],
43841                     matchVal = labelStack[k][2],
43842                     hasVal = entity.tags[matchKey];
43843
43844                 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
43845                     labelable[k].push(entity);
43846                     break;
43847                 }
43848             }
43849         }
43850
43851         var positions = {
43852             point: [],
43853             line: [],
43854             area: []
43855         };
43856
43857         var labelled = {
43858             point: [],
43859             line: [],
43860             area: []
43861         };
43862
43863         // Try and find a valid label for labellable entities
43864         for (k = 0; k < labelable.length; k++) {
43865             var fontSize = labelStack[k][3];
43866             for (i = 0; i < labelable[k].length; i++) {
43867                 entity = labelable[k][i];
43868                 geometry = entity.geometry(graph);
43869
43870                 var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName,
43871                     name = getName(entity),
43872                     width = name && textWidth(name, fontSize),
43873                     p;
43874
43875                 if (geometry === 'point') {
43876                     p = getPointLabel(entity, width, fontSize, geometry);
43877                 } else if (geometry === 'vertex' && !lowZoom) {
43878                     // don't label vertices at low zoom because they don't have icons
43879                     p = getPointLabel(entity, width, fontSize, geometry);
43880                 } else if (geometry === 'line') {
43881                     p = getLineLabel(entity, width, fontSize);
43882                 } else if (geometry === 'area') {
43883                     p = getAreaLabel(entity, width, fontSize);
43884                 }
43885
43886                 if (p) {
43887                     if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
43888                     p.classes = geometry + ' tag-' + labelStack[k][1];
43889                     positions[geometry].push(p);
43890                     labelled[geometry].push(entity);
43891                 }
43892             }
43893         }
43894
43895
43896         function getPointLabel(entity, width, height, geometry) {
43897             var y = (geometry === 'point' ? -12 : 0),
43898                 pointOffsets = {
43899                     ltr: [15, y, 'start'],
43900                     rtl: [-15, y, 'end']
43901                 };
43902
43903             var coord = projection$$1(entity.loc),
43904                 margin = 2,
43905                 offset = pointOffsets[textDirection],
43906                 p = {
43907                     height: height,
43908                     width: width,
43909                     x: coord[0] + offset[0],
43910                     y: coord[1] + offset[1],
43911                     textAnchor: offset[2]
43912                 },
43913                 bbox;
43914
43915             if (textDirection === 'rtl') {
43916                 bbox = {
43917                     minX: p.x - width - margin,
43918                     minY: p.y - (height / 2) - margin,
43919                     maxX: p.x + margin,
43920                     maxY: p.y + (height / 2) + margin
43921                 };
43922             } else {
43923                 bbox = {
43924                     minX: p.x - margin,
43925                     minY: p.y - (height / 2) - margin,
43926                     maxX: p.x + width + margin,
43927                     maxY: p.y + (height / 2) + margin
43928                 };
43929             }
43930
43931             if (tryInsert([bbox], entity.id, true)) {
43932                 return p;
43933             }
43934         }
43935
43936
43937         function getLineLabel(entity, width, height) {
43938             var viewport = geoExtent$$1(context.projection.clipExtent()).polygon(),
43939                 nodes = map$4(graph.childNodes(entity), 'loc').map(projection$$1),
43940                 length = geoPathLength(nodes);
43941
43942             if (length < width + 20) return;
43943
43944             // % along the line to attempt to place the label
43945             var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
43946                                25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
43947             var margin = 3;
43948
43949             for (var i = 0; i < lineOffsets.length; i++) {
43950                 var offset = lineOffsets[i],
43951                     middle = offset / 100 * length,
43952                     start = middle - width / 2;
43953
43954                 if (start < 0 || start + width > length) continue;
43955
43956                 // generate subpath and ignore paths that are invalid or don't cross viewport.
43957                 var sub = subpath(nodes, start, start + width);
43958                 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
43959                     continue;
43960                 }
43961
43962                 var isReverse = reverse(sub);
43963                 if (isReverse) {
43964                     sub = sub.reverse();
43965                 }
43966
43967                 var bboxes = [],
43968                     boxsize = (height + 2) / 2;
43969
43970                 for (var j = 0; j < sub.length - 1; j++) {
43971                     var a = sub[j];
43972                     var b = sub[j + 1];
43973                     var num = Math.max(1, Math.floor(geoEuclideanDistance(a, b) / boxsize / 2));
43974
43975                     for (var box = 0; box < num; box++) {
43976                         var p = geoInterp(a, b, box / num);
43977                         var x0 = p[0] - boxsize - margin;
43978                         var y0 = p[1] - boxsize - margin;
43979                         var x1 = p[0] + boxsize + margin;
43980                         var y1 = p[1] + boxsize + margin;
43981
43982                         bboxes.push({
43983                             minX: Math.min(x0, x1),
43984                             minY: Math.min(y0, y1),
43985                             maxX: Math.max(x0, x1),
43986                             maxY: Math.max(y0, y1)
43987                         });
43988                     }
43989                 }
43990
43991                 if (tryInsert(bboxes, entity.id, false)) {
43992                     return {
43993                         'font-size': height + 2,
43994                         lineString: lineString(sub),
43995                         startOffset: offset + '%'
43996                     };
43997                 }
43998             }
43999
44000             function reverse(p) {
44001                 var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
44002                 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
44003             }
44004
44005             function lineString(nodes) {
44006                 return 'M' + nodes.join('L');
44007             }
44008
44009             function subpath(nodes, from, to) {
44010                 var sofar = 0,
44011                     start, end, i0, i1;
44012
44013                 for (var i = 0; i < nodes.length - 1; i++) {
44014                     var a = nodes[i],
44015                         b = nodes[i + 1];
44016                     var current = geoEuclideanDistance(a, b);
44017                     var portion;
44018                     if (!start && sofar + current >= from) {
44019                         portion = (from - sofar) / current;
44020                         start = [
44021                             a[0] + portion * (b[0] - a[0]),
44022                             a[1] + portion * (b[1] - a[1])
44023                         ];
44024                         i0 = i + 1;
44025                     }
44026                     if (!end && sofar + current >= to) {
44027                         portion = (to - sofar) / current;
44028                         end = [
44029                             a[0] + portion * (b[0] - a[0]),
44030                             a[1] + portion * (b[1] - a[1])
44031                         ];
44032                         i1 = i + 1;
44033                     }
44034                     sofar += current;
44035                 }
44036
44037                 var ret = nodes.slice(i0, i1);
44038                 ret.unshift(start);
44039                 ret.push(end);
44040                 return ret;
44041             }
44042         }
44043
44044
44045         function getAreaLabel(entity, width, height) {
44046             var centroid = path.centroid(entity.asGeoJSON(graph, true)),
44047                 extent = entity.extent(graph),
44048                 areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
44049
44050             if (isNaN(centroid[0]) || areaWidth < 20) return;
44051
44052             var preset = context.presets().match(entity, context.graph()),
44053                 picon = preset && preset.icon,
44054                 iconSize = 17,
44055                 margin = 2,
44056                 p = {};
44057
44058             if (picon) {  // icon and label..
44059                 if (addIcon()) {
44060                     addLabel(iconSize + margin);
44061                     return p;
44062                 }
44063             } else {   // label only..
44064                 if (addLabel(0)) {
44065                     return p;
44066                 }
44067             }
44068
44069
44070             function addIcon() {
44071                 var iconX = centroid[0] - (iconSize / 2);
44072                 var iconY = centroid[1] - (iconSize / 2);
44073                 var bbox = {
44074                     minX: iconX,
44075                     minY: iconY,
44076                     maxX: iconX + iconSize,
44077                     maxY: iconY + iconSize
44078                 };
44079
44080                 if (tryInsert([bbox], entity.id + 'I', true)) {
44081                     p.transform = 'translate(' + iconX + ',' + iconY + ')';
44082                     return true;
44083                 }
44084                 return false;
44085             }
44086
44087             function addLabel(yOffset) {
44088                 if (width && areaWidth >= width + 20) {
44089                     var labelX = centroid[0];
44090                     var labelY = centroid[1] + yOffset;
44091                     var bbox = {
44092                         minX: labelX - (width / 2) - margin,
44093                         minY: labelY - (height / 2) - margin,
44094                         maxX: labelX + (width / 2) + margin,
44095                         maxY: labelY + (height / 2) + margin
44096                     };
44097
44098                     if (tryInsert([bbox], entity.id, true)) {
44099                         p.x = labelX;
44100                         p.y = labelY;
44101                         p.textAnchor = 'middle';
44102                         p.height = height;
44103                         return true;
44104                     }
44105                 }
44106                 return false;
44107             }
44108         }
44109
44110
44111         function tryInsert(bboxes, id, saveSkipped) {
44112             var skipped = false,
44113                 bbox;
44114
44115             for (var i = 0; i < bboxes.length; i++) {
44116                 bbox = bboxes[i];
44117                 bbox.id = id;
44118
44119                 // Check that label is visible
44120                 if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
44121                     skipped = true;
44122                     break;
44123                 }
44124                 if (rdrawn.collides(bbox)) {
44125                     skipped = true;
44126                     break;
44127                 }
44128             }
44129
44130             entitybboxes[id] = bboxes;
44131
44132             if (skipped) {
44133                 if (saveSkipped) {
44134                     rskipped.load(bboxes);
44135                 }
44136             } else {
44137                 rdrawn.load(bboxes);
44138             }
44139
44140             return !skipped;
44141         }
44142
44143
44144         var label = selection.selectAll('.layer-label'),
44145             halo = selection.selectAll('.layer-halo');
44146
44147         // points
44148         drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
44149         drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
44150
44151         // lines
44152         drawLinePaths(halo, labelled.line, filter, '', positions.line);
44153         drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
44154         drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
44155
44156         // areas
44157         drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
44158         drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
44159         drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
44160         drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
44161
44162         // debug
44163         drawCollisionBoxes(label, rskipped, 'debug-skipped');
44164         drawCollisionBoxes(label, rdrawn, 'debug-drawn');
44165
44166         selection.call(filterLabels);
44167     }
44168
44169
44170     function filterLabels(selection) {
44171         var layers = selection
44172             .selectAll('.layer-label, .layer-halo');
44173
44174         layers.selectAll('.proximate')
44175             .classed('proximate', false);
44176
44177         var mouse = context.mouse(),
44178             graph = context.graph(),
44179             selectedIDs = context.selectedIDs(),
44180             ids = [],
44181             pad, bbox;
44182
44183         // hide labels near the mouse
44184         if (mouse) {
44185             pad = 20;
44186             bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
44187             ids.push.apply(ids, map$4(rdrawn.search(bbox), 'id'));
44188         }
44189
44190         // hide labels along selected ways, or near selected vertices
44191         for (var i = 0; i < selectedIDs.length; i++) {
44192             var entity = graph.hasEntity(selectedIDs[i]);
44193             if (!entity) continue;
44194             var geometry = entity.geometry(graph);
44195
44196             if (geometry === 'line') {
44197                 ids.push(selectedIDs[i]);
44198             } else if (geometry === 'vertex') {
44199                 var point = context.projection(entity.loc);
44200                 pad = 10;
44201                 bbox = { minX: point[0] - pad, minY: point[1] - pad, maxX: point[0] + pad, maxY: point[1] + pad };
44202                 ids.push.apply(ids, map$4(rdrawn.search(bbox), 'id'));
44203             }
44204         }
44205
44206         layers.selectAll(utilEntitySelector(ids))
44207             .classed('proximate', true);
44208     }
44209
44210
44211     var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
44212
44213
44214     drawLabels.observe = function(selection) {
44215         var listener = function() { throttleFilterLabels(selection); };
44216         selection.on('mousemove.hidelabels', listener);
44217         context.on('enter.hidelabels', listener);
44218     };
44219
44220
44221     drawLabels.off = function(selection) {
44222         throttleFilterLabels.cancel();
44223         selection.on('mousemove.hidelabels', null);
44224         context.on('enter.hidelabels', null);
44225     };
44226
44227
44228     return drawLabels;
44229 }
44230
44231 function svgPointTransform(projection) {
44232     return function(entity) {
44233         // http://jsperf.com/short-array-join
44234         var pt = projection(entity.loc);
44235         return 'translate(' + pt[0] + ',' + pt[1] + ')';
44236     };
44237 }
44238
44239 function svgMapillaryImages(projection$$1, context, dispatch) {
44240     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
44241         minZoom = 12,
44242         minMarkerZoom = 16,
44243         minViewfieldZoom = 18,
44244         layer = d3_select(null),
44245         _mapillary;
44246
44247
44248     function init() {
44249         if (svgMapillaryImages.initialized) return;  // run once
44250         svgMapillaryImages.enabled = false;
44251         svgMapillaryImages.initialized = true;
44252     }
44253
44254
44255     function getService() {
44256         if (services.mapillary && !_mapillary) {
44257             _mapillary = services.mapillary;
44258             _mapillary.event.on('loadedImages', throttledRedraw);
44259         } else if (!services.mapillary && _mapillary) {
44260             _mapillary = null;
44261         }
44262
44263         return _mapillary;
44264     }
44265
44266
44267     function showLayer() {
44268         var service = getService();
44269         if (!service) return;
44270
44271         service.loadViewer(context);
44272         editOn();
44273
44274         layer
44275             .style('opacity', 0)
44276             .transition()
44277             .duration(250)
44278             .style('opacity', 1)
44279             .on('end', function () { dispatch.call('change'); });
44280     }
44281
44282
44283     function hideLayer() {
44284         var service = getService();
44285         if (service) {
44286             service.hideViewer();
44287         }
44288
44289         throttledRedraw.cancel();
44290
44291         layer
44292             .transition()
44293             .duration(250)
44294             .style('opacity', 0)
44295             .on('end', editOff);
44296     }
44297
44298
44299     function editOn() {
44300         layer.style('display', 'block');
44301     }
44302
44303
44304     function editOff() {
44305         layer.selectAll('.viewfield-group').remove();
44306         layer.style('display', 'none');
44307     }
44308
44309
44310     function click(d) {
44311         var service = getService();
44312         if (!service) return;
44313
44314         service
44315             .selectImage(d)
44316             .updateViewer(d.key, context)
44317             .showViewer();
44318
44319         context.map().centerEase(d.loc);
44320     }
44321
44322
44323     function mouseover(d) {
44324         var service = getService();
44325         if (service) service.setStyles(d);
44326     }
44327
44328
44329     function mouseout() {
44330         var service = getService();
44331         if (service) service.setStyles(null);
44332     }
44333
44334
44335     function transform(d) {
44336         var t = svgPointTransform(projection$$1)(d);
44337         if (d.ca) {
44338             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
44339         }
44340         return t;
44341     }
44342
44343
44344     function update() {
44345         var viewer = d3_select('#photoviewer');
44346         var selected = viewer.empty() ? undefined : viewer.datum();
44347
44348         var z = ~~context.map().zoom();
44349         var showMarkers = (z >= minMarkerZoom);
44350         var showViewfields = (z >= minViewfieldZoom);
44351
44352         var service = getService();
44353         var sequences = (service ? service.sequences(projection$$1) : []);
44354         var images = (service && showMarkers ? service.images(projection$$1) : []);
44355
44356         var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
44357         var project = projection$$1.stream;
44358         var makePath = d3_geoPath().projection({ stream: function(output) {
44359             return project(clip(output));
44360         }});
44361
44362         var traces = layer.selectAll('.sequences').selectAll('.sequence')
44363             .data(sequences, function(d) { return d.properties.key; });
44364
44365         traces.exit()
44366             .remove();
44367
44368         traces = traces.enter()
44369             .append('path')
44370             .attr('class', 'sequence')
44371             .merge(traces);
44372
44373         traces
44374             .attr('d', makePath);
44375
44376
44377         var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
44378             .data(images, function(d) { return d.key; });
44379
44380         // exit
44381         groups.exit()
44382             .remove();
44383
44384         // enter
44385         var groupsEnter = groups.enter()
44386             .append('g')
44387             .attr('class', 'viewfield-group')
44388             .on('mouseover', mouseover)
44389             .on('mouseout', mouseout)
44390             .on('click', click);
44391
44392         groupsEnter
44393             .append('g')
44394             .attr('class', 'viewfield-scale');
44395
44396         // update
44397         var markers = groups
44398             .merge(groupsEnter)
44399             .sort(function(a, b) {
44400                 return (a === selected) ? 1
44401                     : (b === selected) ? -1
44402                     : b.loc[1] - a.loc[1];  // sort Y
44403             })
44404             .attr('transform', transform)
44405             .select('.viewfield-scale');
44406
44407
44408         markers.selectAll('circle')
44409             .data([0])
44410             .enter()
44411             .append('circle')
44412             .attr('dx', '0')
44413             .attr('dy', '0')
44414             .attr('r', '6');
44415
44416         var viewfields = markers.selectAll('.viewfield')
44417             .data(showViewfields ? [0] : []);
44418
44419         viewfields.exit()
44420             .remove();
44421
44422         viewfields.enter()               // viewfields may or may not be drawn...
44423             .insert('path', 'circle')    // but if they are, draw below the circles
44424             .attr('class', 'viewfield')
44425             .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
44426             .attr('d', viewfieldPath);
44427
44428         function viewfieldPath() {
44429             var d = this.parentNode.__data__;
44430             if (d.pano) {
44431                 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
44432             } else {
44433                 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
44434             }
44435         }
44436     }
44437
44438
44439     function drawImages(selection$$1) {
44440         var enabled = svgMapillaryImages.enabled,
44441             service = getService();
44442
44443         layer = selection$$1.selectAll('.layer-mapillary-images')
44444             .data(service ? [0] : []);
44445
44446         layer.exit()
44447             .remove();
44448
44449         var layerEnter = layer.enter()
44450             .append('g')
44451             .attr('class', 'layer-mapillary-images')
44452             .style('display', enabled ? 'block' : 'none');
44453
44454         layerEnter
44455             .append('g')
44456             .attr('class', 'sequences');
44457
44458         layerEnter
44459             .append('g')
44460             .attr('class', 'markers');
44461
44462         layer = layerEnter
44463             .merge(layer);
44464
44465         if (enabled) {
44466             if (service && ~~context.map().zoom() >= minZoom) {
44467                 editOn();
44468                 update();
44469                 service.loadImages(projection$$1);
44470             } else {
44471                 editOff();
44472             }
44473         }
44474     }
44475
44476
44477     drawImages.enabled = function(_) {
44478         if (!arguments.length) return svgMapillaryImages.enabled;
44479         svgMapillaryImages.enabled = _;
44480         if (svgMapillaryImages.enabled) {
44481             showLayer();
44482         } else {
44483             hideLayer();
44484         }
44485         dispatch.call('change');
44486         return this;
44487     };
44488
44489
44490     drawImages.supported = function() {
44491         return !!getService();
44492     };
44493
44494
44495     init();
44496     return drawImages;
44497 }
44498
44499 function svgMapillarySigns(projection, context, dispatch) {
44500     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
44501         minZoom = 12,
44502         layer = d3_select(null),
44503         _mapillary;
44504
44505
44506     function init() {
44507         if (svgMapillarySigns.initialized) return;  // run once
44508         svgMapillarySigns.enabled = false;
44509         svgMapillarySigns.initialized = true;
44510     }
44511
44512
44513     function getService() {
44514         if (services.mapillary && !_mapillary) {
44515             _mapillary = services.mapillary;
44516             _mapillary.event.on('loadedSigns', throttledRedraw);
44517         } else if (!services.mapillary && _mapillary) {
44518             _mapillary = null;
44519         }
44520         return _mapillary;
44521     }
44522
44523
44524     function showLayer() {
44525         var service = getService();
44526         if (!service) return;
44527
44528         service.loadViewer(context);
44529         editOn();
44530     }
44531
44532
44533     function hideLayer() {
44534         throttledRedraw.cancel();
44535         editOff();
44536     }
44537
44538
44539     function editOn() {
44540         layer.style('display', 'block');
44541     }
44542
44543
44544     function editOff() {
44545         layer.selectAll('.icon-sign').remove();
44546         layer.style('display', 'none');
44547     }
44548
44549
44550     function click(d) {
44551         var service = getService();
44552         if (!service) return;
44553
44554         context.map().centerEase(d.loc);
44555
44556         var selected = service.getSelectedImage();
44557         var selectedImageKey = selected && selected.key;
44558         var imageKey;
44559
44560         // Pick one of the images the sign was detected in,
44561         // preference given to an image already selected.
44562         d.detections.forEach(function(detection) {
44563             if (!imageKey || selectedImageKey === detection.image_key) {
44564                 imageKey = detection.image_key;
44565             }
44566         });
44567
44568         service
44569             .selectImage(null, imageKey)
44570             .updateViewer(imageKey, context)
44571             .showViewer();
44572     }
44573
44574
44575     function update() {
44576         var service = getService();
44577         var data = (service ? service.signs(projection) : []);
44578         var viewer = d3_select('#photoviewer');
44579         var selected = viewer.empty() ? undefined : viewer.datum();
44580         var selectedImageKey = selected && selected.key;
44581
44582         var signs = layer.selectAll('.icon-sign')
44583             .data(data, function(d) { return d.key; });
44584
44585         signs.exit()
44586             .remove();
44587
44588         var enter = signs.enter()
44589             .append('foreignObject')
44590             .attr('class', 'icon-sign')
44591             .attr('width', '24px')      // for Firefox
44592             .attr('height', '24px')     // for Firefox
44593             .classed('selected', function(d) {
44594                 return some(d.detections, function(detection) {
44595                     return detection.image_key === selectedImageKey;
44596                 });
44597             })
44598             .on('click', click);
44599
44600         enter
44601             .append('xhtml:body')
44602             .attr('class', 'icon-sign-body')
44603             .html(service.signHTML);
44604
44605         signs
44606             .merge(enter)
44607             .attr('x', function(d) { return projection(d.loc)[0] - 12; })   // offset by -12px to
44608             .attr('y', function(d) { return projection(d.loc)[1] - 12; });  // center signs on loc
44609     }
44610
44611
44612     function drawSigns(selection$$1) {
44613         var enabled = svgMapillarySigns.enabled,
44614             service = getService();
44615
44616         layer = selection$$1.selectAll('.layer-mapillary-signs')
44617             .data(service ? [0] : []);
44618
44619         layer.exit()
44620             .remove();
44621
44622         layer = layer.enter()
44623             .append('g')
44624             .attr('class', 'layer-mapillary-signs')
44625             .style('display', enabled ? 'block' : 'none')
44626             .merge(layer);
44627
44628         if (enabled) {
44629             if (service && ~~context.map().zoom() >= minZoom) {
44630                 editOn();
44631                 update();
44632                 service.loadSigns(context, projection);
44633             } else {
44634                 editOff();
44635             }
44636         }
44637     }
44638
44639
44640     drawSigns.enabled = function(_) {
44641         if (!arguments.length) return svgMapillarySigns.enabled;
44642         svgMapillarySigns.enabled = _;
44643         if (svgMapillarySigns.enabled) {
44644             showLayer();
44645         } else {
44646             hideLayer();
44647         }
44648         dispatch.call('change');
44649         return this;
44650     };
44651
44652
44653     drawSigns.supported = function() {
44654         var service = getService();
44655         return (service && service.signsSupported());
44656     };
44657
44658
44659     init();
44660     return drawSigns;
44661 }
44662
44663 function svgOpenstreetcamImages(projection$$1, context, dispatch) {
44664     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
44665         minZoom = 12,
44666         minMarkerZoom = 16,
44667         minViewfieldZoom = 18,
44668         layer = d3_select(null),
44669         _openstreetcam;
44670
44671
44672     function init() {
44673         if (svgOpenstreetcamImages.initialized) return;  // run once
44674         svgOpenstreetcamImages.enabled = false;
44675         svgOpenstreetcamImages.initialized = true;
44676     }
44677
44678
44679     function getService() {
44680         if (services.openstreetcam && !_openstreetcam) {
44681             _openstreetcam = services.openstreetcam;
44682             _openstreetcam.event.on('loadedImages', throttledRedraw);
44683         } else if (!services.openstreetcam && _openstreetcam) {
44684             _openstreetcam = null;
44685         }
44686
44687         return _openstreetcam;
44688     }
44689
44690
44691     function showLayer() {
44692         var service = getService();
44693         if (!service) return;
44694
44695         service.loadViewer(context);
44696         editOn();
44697
44698         layer
44699             .style('opacity', 0)
44700             .transition()
44701             .duration(250)
44702             .style('opacity', 1)
44703             .on('end', function () { dispatch.call('change'); });
44704     }
44705
44706
44707     function hideLayer() {
44708         var service = getService();
44709         if (service) {
44710             service.hideViewer();
44711         }
44712
44713         throttledRedraw.cancel();
44714
44715         layer
44716             .transition()
44717             .duration(250)
44718             .style('opacity', 0)
44719             .on('end', editOff);
44720     }
44721
44722
44723     function editOn() {
44724         layer.style('display', 'block');
44725     }
44726
44727
44728     function editOff() {
44729         layer.selectAll('.viewfield-group').remove();
44730         layer.style('display', 'none');
44731     }
44732
44733
44734     function click(d) {
44735         var service = getService();
44736         if (!service) return;
44737
44738         service
44739             .selectImage(d)
44740             .updateViewer(d)
44741             .showViewer();
44742
44743         context.map().centerEase(d.loc);
44744     }
44745
44746
44747     function mouseover(d) {
44748         var service = getService();
44749         if (service) service.setStyles(d);
44750     }
44751
44752
44753     function mouseout() {
44754         var service = getService();
44755         if (service) service.setStyles(null);
44756     }
44757
44758
44759     function transform(d) {
44760         var t = svgPointTransform(projection$$1)(d);
44761         if (d.ca) {
44762             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
44763         }
44764         return t;
44765     }
44766
44767
44768     function update() {
44769         var viewer = d3_select('#photoviewer');
44770         var selected = viewer.empty() ? undefined : viewer.datum();
44771
44772         var z = ~~context.map().zoom();
44773         var showMarkers = (z >= minMarkerZoom);
44774         var showViewfields = (z >= minViewfieldZoom);
44775
44776         var service = getService();
44777         var sequences = (service ? service.sequences(projection$$1) : []);
44778         var images = (service && showMarkers ? service.images(projection$$1) : []);
44779
44780         var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
44781         var project = projection$$1.stream;
44782         var makePath = d3_geoPath().projection({ stream: function(output) {
44783             return project(clip(output));
44784         }});
44785
44786         var traces = layer.selectAll('.sequences').selectAll('.sequence')
44787             .data(sequences, function(d) { return d.properties.key; });
44788
44789         traces.exit()
44790             .remove();
44791
44792         traces = traces.enter()
44793             .append('path')
44794             .attr('class', 'sequence')
44795             .merge(traces);
44796
44797         traces
44798             .attr('d', makePath);
44799
44800
44801         var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
44802             .data(images, function(d) { return d.key; });
44803
44804         // exit
44805         groups.exit()
44806             .remove();
44807
44808         // enter
44809         var groupsEnter = groups.enter()
44810             .append('g')
44811             .attr('class', 'viewfield-group')
44812             .on('mouseover', mouseover)
44813             .on('mouseout', mouseout)
44814             .on('click', click);
44815
44816         groupsEnter
44817             .append('g')
44818             .attr('class', 'viewfield-scale');
44819
44820         // update
44821         var markers = groups
44822             .merge(groupsEnter)
44823             .sort(function(a, b) {
44824                 return (a === selected) ? 1
44825                     : (b === selected) ? -1
44826                     : b.loc[1] - a.loc[1];  // sort Y
44827             })
44828             .attr('transform', transform)
44829             .select('.viewfield-scale');
44830
44831
44832         markers.selectAll('circle')
44833             .data([0])
44834             .enter()
44835             .append('circle')
44836             .attr('dx', '0')
44837             .attr('dy', '0')
44838             .attr('r', '6');
44839
44840         var viewfields = markers.selectAll('.viewfield')
44841             .data(showViewfields ? [0] : []);
44842
44843         viewfields.exit()
44844             .remove();
44845
44846         viewfields.enter()               // viewfields may or may not be drawn...
44847             .insert('path', 'circle')    // but if they are, draw below the circles
44848             .attr('class', 'viewfield')
44849             .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
44850             .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');
44851     }
44852
44853
44854     function drawImages(selection$$1) {
44855         var enabled = svgOpenstreetcamImages.enabled,
44856             service = getService();
44857
44858         layer = selection$$1.selectAll('.layer-openstreetcam-images')
44859             .data(service ? [0] : []);
44860
44861         layer.exit()
44862             .remove();
44863
44864         var layerEnter = layer.enter()
44865             .append('g')
44866             .attr('class', 'layer-openstreetcam-images')
44867             .style('display', enabled ? 'block' : 'none');
44868
44869         layerEnter
44870             .append('g')
44871             .attr('class', 'sequences');
44872
44873         layerEnter
44874             .append('g')
44875             .attr('class', 'markers');
44876
44877         layer = layerEnter
44878             .merge(layer);
44879
44880         if (enabled) {
44881             if (service && ~~context.map().zoom() >= minZoom) {
44882                 editOn();
44883                 update();
44884                 service.loadImages(projection$$1);
44885             } else {
44886                 editOff();
44887             }
44888         }
44889     }
44890
44891
44892     drawImages.enabled = function(_) {
44893         if (!arguments.length) return svgOpenstreetcamImages.enabled;
44894         svgOpenstreetcamImages.enabled = _;
44895         if (svgOpenstreetcamImages.enabled) {
44896             showLayer();
44897         } else {
44898             hideLayer();
44899         }
44900         dispatch.call('change');
44901         return this;
44902     };
44903
44904
44905     drawImages.supported = function() {
44906         return !!getService();
44907     };
44908
44909
44910     init();
44911     return drawImages;
44912 }
44913
44914 function svgOsm(projection, context, dispatch) {
44915     var enabled = true;
44916
44917
44918     function drawOsm(selection) {
44919         selection.selectAll('.layer-osm')
44920             .data(['areas', 'lines', 'hit', 'halo', 'label'])
44921             .enter()
44922             .append('g')
44923             .attr('class', function(d) { return 'layer-osm layer-' + d; });
44924     }
44925
44926
44927     function showLayer() {
44928         var layer = context.surface().selectAll('.data-layer-osm');
44929         layer.interrupt();
44930
44931         layer
44932             .classed('disabled', false)
44933             .style('opacity', 0)
44934             .transition()
44935             .duration(250)
44936             .style('opacity', 1)
44937             .on('end interrupt', function () {
44938                 dispatch.call('change');
44939             });
44940     }
44941
44942
44943     function hideLayer() {
44944         var layer = context.surface().selectAll('.data-layer-osm');
44945         layer.interrupt();
44946
44947         layer
44948             .transition()
44949             .duration(250)
44950             .style('opacity', 0)
44951             .on('end interrupt', function () {
44952                 layer.classed('disabled', true);
44953                 dispatch.call('change');
44954             });
44955     }
44956
44957
44958     drawOsm.enabled = function(_) {
44959         if (!arguments.length) return enabled;
44960         enabled = _;
44961
44962         if (enabled) {
44963             showLayer();
44964         } else {
44965             hideLayer();
44966         }
44967
44968         dispatch.call('change');
44969         return this;
44970     };
44971
44972
44973     return drawOsm;
44974 }
44975
44976 function svgLayers(projection, context) {
44977     var dispatch$$1 = dispatch('change'),
44978         svg = d3_select(null),
44979         layers = [
44980             { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
44981             { id: 'gpx', layer: svgGpx(projection, context, dispatch$$1) },
44982             { id: 'mapillary-images', layer: svgMapillaryImages(projection, context, dispatch$$1) },
44983             { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$$1) },
44984             { id: 'openstreetcam-images', layer: svgOpenstreetcamImages(projection, context, dispatch$$1) },
44985             { id: 'debug', layer: svgDebug(projection, context, dispatch$$1) }
44986         ];
44987
44988
44989     function drawLayers(selection$$1) {
44990         svg = selection$$1.selectAll('.surface')
44991             .data([0]);
44992
44993         svg = svg.enter()
44994             .append('svg')
44995             .attr('class', 'surface')
44996             .merge(svg);
44997
44998         var defs = svg.selectAll('.surface-defs')
44999             .data([0]);
45000
45001         defs.enter()
45002             .append('defs')
45003             .attr('class', 'surface-defs');
45004
45005         var groups = svg.selectAll('.data-layer')
45006             .data(layers);
45007
45008         groups.exit()
45009             .remove();
45010
45011         groups.enter()
45012             .append('g')
45013             .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
45014             .merge(groups)
45015             .each(function(d) { d3_select(this).call(d.layer); });
45016     }
45017
45018
45019     drawLayers.all = function() {
45020         return layers;
45021     };
45022
45023
45024     drawLayers.layer = function(id) {
45025         var obj = find$1(layers, function(o) {return o.id === id;});
45026         return obj && obj.layer;
45027     };
45028
45029
45030     drawLayers.only = function(what) {
45031         var arr = [].concat(what);
45032         drawLayers.remove(difference(map$4(layers, 'id'), arr));
45033         return this;
45034     };
45035
45036
45037     drawLayers.remove = function(what) {
45038         var arr = [].concat(what);
45039         arr.forEach(function(id) {
45040             layers = reject(layers, function(o) {return o.id === id;});
45041         });
45042         dispatch$$1.call('change');
45043         return this;
45044     };
45045
45046
45047     drawLayers.add = function(what) {
45048         var arr = [].concat(what);
45049         arr.forEach(function(obj) {
45050             if ('id' in obj && 'layer' in obj) {
45051                 layers.push(obj);
45052             }
45053         });
45054         dispatch$$1.call('change');
45055         return this;
45056     };
45057
45058
45059     drawLayers.dimensions = function(_) {
45060         if (!arguments.length) return utilGetDimensions(svg);
45061         utilSetDimensions(svg, _);
45062         return this;
45063     };
45064
45065
45066     return utilRebind(drawLayers, dispatch$$1, 'on');
45067 }
45068
45069 function svgLines$$1(projection, context) {
45070     var detected = utilDetect();
45071
45072     var highway_stack = {
45073         motorway: 0,
45074         motorway_link: 1,
45075         trunk: 2,
45076         trunk_link: 3,
45077         primary: 4,
45078         primary_link: 5,
45079         secondary: 6,
45080         tertiary: 7,
45081         unclassified: 8,
45082         residential: 9,
45083         service: 10,
45084         footway: 11
45085     };
45086
45087
45088     function drawLines(selection, graph, entities, filter$$1) {
45089
45090
45091         function waystack(a, b) {
45092             var selected = context.selectedIDs(),
45093                 scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0,
45094                 scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
45095
45096             if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
45097             if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
45098             return scoreA - scoreB;
45099         }
45100
45101
45102         function drawLineGroup(selection, klass, isSelected) {
45103             var lines = selection
45104                 .selectAll('path')
45105                 .filter(filter$$1)
45106                 .data(getPathData(isSelected), osmEntity$$1.key);
45107
45108             lines.exit()
45109                 .remove();
45110
45111             // Optimization: call simple TagClasses only on enter selection. This
45112             // works because osmEntity.key is defined to include the entity v attribute.
45113             lines.enter()
45114                 .append('path')
45115                 .attr('class', function(d) {
45116                     return 'way line ' + klass + ' ' + d.id + (isSelected ? ' selected' : '') +
45117                         (oldMultiPolygonOuters[d.id] ? ' old-multipolygon' : '');
45118                 })
45119                 .call(svgTagClasses())
45120                 .merge(lines)
45121                 .sort(waystack)
45122                 .attr('d', getPath)
45123                 .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
45124
45125             return selection;
45126         }
45127
45128
45129         function getPathData(isSelected) {
45130             return function() {
45131                 var layer = this.parentNode.__data__;
45132                 var data = pathdata[layer] || [];
45133                 return data.filter(function(d) {
45134                     if (isSelected)
45135                         return context.selectedIDs().indexOf(d.id) !== -1;
45136                     else
45137                         return context.selectedIDs().indexOf(d.id) === -1;
45138                 });
45139             };
45140         }
45141
45142
45143         var getPath = svgPath(projection, graph),
45144             ways = [],
45145             pathdata = {},
45146             onewaydata = {},
45147             oldMultiPolygonOuters = {};
45148
45149         for (var i = 0; i < entities.length; i++) {
45150             var entity = entities[i],
45151                 outer = osmSimpleMultipolygonOuterMember(entity, graph);
45152             if (outer) {
45153                 ways.push(entity.mergeTags(outer.tags));
45154                 oldMultiPolygonOuters[outer.id] = true;
45155             } else if (entity.geometry(graph) === 'line') {
45156                 ways.push(entity);
45157             }
45158         }
45159
45160         ways = ways.filter(getPath);
45161         pathdata = groupBy(ways, function(way) { return way.layer(); });
45162
45163         forOwn(pathdata, function(v, k) {
45164             var arr = filter(v, function(d) { return d.isOneWay(); });
45165             onewaydata[k] = flatten(map$4(arr, svgOneWaySegments(projection, graph, 35)));
45166         });
45167
45168
45169         var layer = selection.selectAll('.layer-lines');
45170
45171         var layergroup = layer
45172             .selectAll('g.layergroup')
45173             .data(d3_range(-10, 11));
45174
45175         layergroup = layergroup.enter()
45176             .append('g')
45177             .attr('class', function(d) { return 'layergroup layer' + String(d); })
45178             .merge(layergroup);
45179
45180         layergroup
45181             .selectAll('g.linegroup')
45182             .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
45183             .enter()
45184             .append('g')
45185             .attr('class', function(d) { return 'linegroup line-' + d; });
45186
45187
45188         layergroup.selectAll('g.line-shadow')
45189             .call(drawLineGroup, 'shadow', false);
45190         layergroup.selectAll('g.line-casing')
45191             .call(drawLineGroup, 'casing', false);
45192         layergroup.selectAll('g.line-stroke')
45193             .call(drawLineGroup, 'stroke', false);
45194
45195         layergroup.selectAll('g.line-shadow-highlighted')
45196             .call(drawLineGroup, 'shadow', true);
45197         layergroup.selectAll('g.line-casing-highlighted')
45198             .call(drawLineGroup, 'casing', true);
45199         layergroup.selectAll('g.line-stroke-highlighted')
45200             .call(drawLineGroup, 'stroke', true);
45201
45202
45203         var onewaygroup = layergroup
45204             .selectAll('g.onewaygroup')
45205             .data(['oneway']);
45206
45207         onewaygroup = onewaygroup.enter()
45208             .append('g')
45209             .attr('class', 'onewaygroup')
45210             .merge(onewaygroup);
45211
45212         var oneways = onewaygroup
45213             .selectAll('path')
45214             .filter(filter$$1)
45215             .data(
45216                 function() { return onewaydata[this.parentNode.__data__] || []; },
45217                 function(d) { return [d.id, d.index]; }
45218             );
45219
45220         oneways.exit()
45221             .remove();
45222
45223         oneways = oneways.enter()
45224             .append('path')
45225             .attr('class', 'oneway')
45226             .attr('marker-mid', 'url(#oneway-marker)')
45227             .merge(oneways)
45228             .attr('d', function(d) { return d.d; });
45229
45230         if (detected.ie) {
45231             oneways.each(function() { this.parentNode.insertBefore(this, this); });
45232         }
45233     }
45234
45235
45236     return drawLines;
45237 }
45238
45239 function svgMidpoints$$1(projection, context) {
45240
45241     return function drawMidpoints(selection, graph, entities, filter, extent) {
45242         var layer = selection.selectAll('.layer-hit');
45243
45244         var mode = context.mode();
45245         if (mode && mode.id !== 'select') {
45246             layer.selectAll('g.midpoint').remove();
45247             return;
45248         }
45249
45250         var poly = extent.polygon(),
45251             midpoints = {};
45252
45253         for (var i = 0; i < entities.length; i++) {
45254             var entity = entities[i];
45255
45256             if (entity.type !== 'way')
45257                 continue;
45258             if (!filter(entity))
45259                 continue;
45260             if (context.selectedIDs().indexOf(entity.id) < 0)
45261                 continue;
45262
45263             var nodes = graph.childNodes(entity);
45264             for (var j = 0; j < nodes.length - 1; j++) {
45265
45266                 var a = nodes[j],
45267                     b = nodes[j + 1],
45268                     id = [a.id, b.id].sort().join('-');
45269
45270                 if (midpoints[id]) {
45271                     midpoints[id].parents.push(entity);
45272                 } else {
45273                     if (geoEuclideanDistance(projection(a.loc), projection(b.loc)) > 40) {
45274                         var point = geoInterp(a.loc, b.loc, 0.5),
45275                             loc = null;
45276
45277                         if (extent.intersects(point)) {
45278                             loc = point;
45279                         } else {
45280                             for (var k = 0; k < 4; k++) {
45281                                 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
45282                                 if (point &&
45283                                     geoEuclideanDistance(projection(a.loc), projection(point)) > 20 &&
45284                                     geoEuclideanDistance(projection(b.loc), projection(point)) > 20)
45285                                 {
45286                                     loc = point;
45287                                     break;
45288                                 }
45289                             }
45290                         }
45291
45292                         if (loc) {
45293                             midpoints[id] = {
45294                                 type: 'midpoint',
45295                                 id: id,
45296                                 loc: loc,
45297                                 edge: [a.id, b.id],
45298                                 parents: [entity]
45299                             };
45300                         }
45301                     }
45302                 }
45303             }
45304         }
45305
45306
45307         function midpointFilter(d) {
45308             if (midpoints[d.id])
45309                 return true;
45310
45311             for (var i = 0; i < d.parents.length; i++) {
45312                 if (filter(d.parents[i])) {
45313                     return true;
45314                 }
45315             }
45316
45317             return false;
45318         }
45319
45320
45321         var groups = layer
45322             .selectAll('g.midpoint')
45323             .filter(midpointFilter)
45324             .data(values$1(midpoints), function(d) { return d.id; });
45325
45326         groups.exit()
45327             .remove();
45328
45329         var enter = groups.enter()
45330             .insert('g', ':first-child')
45331             .attr('class', 'midpoint');
45332
45333         enter.append('polygon')
45334             .attr('points', '-6,8 10,0 -6,-8')
45335             .attr('class', 'shadow');
45336
45337         enter.append('polygon')
45338             .attr('points', '-3,4 5,0 -3,-4')
45339             .attr('class', 'fill');
45340
45341         groups = groups
45342             .merge(enter)
45343             .attr('transform', function(d) {
45344                 var translate = svgPointTransform(projection),
45345                     a = graph.entity(d.edge[0]),
45346                     b = graph.entity(d.edge[1]),
45347                     angleVal = Math.round(geoAngle(a, b, projection) * (180 / Math.PI));
45348                 return translate(d) + ' rotate(' + angleVal + ')';
45349             })
45350             .call(svgTagClasses().tags(
45351                 function(d) { return d.parents[0].tags; }
45352             ));
45353
45354         // Propagate data bindings.
45355         groups.select('polygon.shadow');
45356         groups.select('polygon.fill');
45357
45358     };
45359 }
45360
45361 function svgOneWaySegments(projection$$1, graph, dt) {
45362     return function(entity) {
45363         var a,
45364             b,
45365             i = 0,
45366             offset = dt,
45367             segments = [],
45368             clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream,
45369             coordinates = graph.childNodes(entity).map(function(n) {
45370                 return n.loc;
45371             });
45372
45373         if (entity.tags.oneway === '-1') coordinates.reverse();
45374
45375         d3_geoStream({
45376             type: 'LineString',
45377             coordinates: coordinates
45378         }, projection$$1.stream(clip({
45379             lineStart: function() {},
45380             lineEnd: function() {
45381                 a = null;
45382             },
45383             point: function(x, y) {
45384                 b = [x, y];
45385
45386                 if (a) {
45387                     var span = geoEuclideanDistance(a, b) - offset;
45388
45389                     if (span >= 0) {
45390                         var angle = Math.atan2(b[1] - a[1], b[0] - a[0]),
45391                             dx = dt * Math.cos(angle),
45392                             dy = dt * Math.sin(angle),
45393                             p = [a[0] + offset * Math.cos(angle),
45394                                  a[1] + offset * Math.sin(angle)];
45395
45396                         var segment = 'M' + a[0] + ',' + a[1] +
45397                                       'L' + p[0] + ',' + p[1];
45398
45399                         for (span -= dt; span >= 0; span -= dt) {
45400                             p[0] += dx;
45401                             p[1] += dy;
45402                             segment += 'L' + p[0] + ',' + p[1];
45403                         }
45404
45405                         segment += 'L' + b[0] + ',' + b[1];
45406                         segments.push({id: entity.id, index: i, d: segment});
45407                     }
45408
45409                     offset = -span;
45410                     i++;
45411                 }
45412
45413                 a = b;
45414             }
45415         })));
45416
45417         return segments;
45418     };
45419 }
45420
45421 function svgPath(projection$$1, graph, isArea) {
45422
45423     // Explanation of magic numbers:
45424     // "padding" here allows space for strokes to extend beyond the viewport,
45425     // so that the stroke isn't drawn along the edge of the viewport when
45426     // the shape is clipped.
45427     //
45428     // When drawing lines, pad viewport by 5px.
45429     // When drawing areas, pad viewport by 65px in each direction to allow
45430     // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
45431
45432     var cache = {},
45433         padding = isArea ? 65 : 5,
45434         viewport = projection$$1.clipExtent(),
45435         paddedExtent = [
45436             [viewport[0][0] - padding, viewport[0][1] - padding],
45437             [viewport[1][0] + padding, viewport[1][1] + padding]
45438         ],
45439         clip = d3_geoIdentity().clipExtent(paddedExtent).stream,
45440         project = projection$$1.stream,
45441         path = d3_geoPath()
45442             .projection({stream: function(output) { return project(clip(output)); }});
45443
45444     return function(entity) {
45445         if (entity.id in cache) {
45446             return cache[entity.id];
45447         } else {
45448             return cache[entity.id] = path(entity.asGeoJSON(graph));
45449         }
45450     };
45451 }
45452
45453 function svgPoints$$1(projection, context) {
45454
45455     function markerPath(selection, klass) {
45456         selection
45457             .attr('class', klass)
45458             .attr('transform', 'translate(-8, -23)')
45459             .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');
45460     }
45461
45462     function sortY(a, b) {
45463         return b.loc[1] - a.loc[1];
45464     }
45465
45466
45467     return function drawPoints(selection, graph, entities, filter$$1) {
45468         var wireframe = context.surface().classed('fill-wireframe'),
45469             points = wireframe ? [] : filter(entities, function(e) {
45470                 return e.geometry(graph) === 'point';
45471             });
45472
45473         points.sort(sortY);
45474
45475         var layer = selection.selectAll('.layer-hit');
45476
45477         var groups = layer.selectAll('g.point')
45478             .filter(filter$$1)
45479             .data(points, osmEntity$$1.key);
45480
45481         groups.exit()
45482             .remove();
45483
45484         var enter = groups.enter()
45485             .append('g')
45486             .attr('class', function(d) { return 'node point ' + d.id; })
45487             .order();
45488
45489         enter.append('path')
45490             .call(markerPath, 'shadow');
45491
45492         enter.append('ellipse')
45493             .attr('cx', 0.5)
45494             .attr('cy', 1)
45495             .attr('rx', 6.5)
45496             .attr('ry', 3)
45497             .attr('class', 'stroke');
45498
45499         enter.append('path')
45500             .call(markerPath, 'stroke');
45501
45502         enter.append('use')
45503             .attr('transform', 'translate(-5, -19)')
45504             .attr('class', 'icon')
45505             .attr('width', '11px')
45506             .attr('height', '11px');
45507
45508         groups = groups
45509             .merge(enter)
45510             .attr('transform', svgPointTransform(projection))
45511             .call(svgTagClasses());
45512
45513         // Selecting the following implicitly
45514         // sets the data (point entity) on the element
45515         groups.select('.shadow');
45516         groups.select('.stroke');
45517         groups.select('.icon')
45518             .attr('xlink:href', function(entity) {
45519                 var preset = context.presets().match(entity, graph),
45520                     picon = preset && preset.icon;
45521
45522                 if (!picon)
45523                     return '';
45524                 else {
45525                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
45526                     return '#' + picon + (isMaki ? '-11' : '');
45527                 }
45528             });
45529     };
45530 }
45531
45532 function svgRelationMemberTags(graph) {
45533     return function(entity) {
45534         var tags = entity.tags;
45535         graph.parentRelations(entity).forEach(function(relation) {
45536             var type = relation.tags.type;
45537             if (type === 'multipolygon' || type === 'boundary') {
45538                 tags = assignIn$1({}, relation.tags, tags);
45539             }
45540         });
45541         return tags;
45542     };
45543 }
45544
45545 function svgTagClasses() {
45546     var primaries = [
45547             'building', 'highway', 'railway', 'waterway', 'aeroway',
45548             'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
45549             'leisure', 'military', 'place'
45550         ],
45551         statuses = [
45552             'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
45553             'razed', 'demolished', 'obliterated', 'intermittent'
45554         ],
45555         secondaries = [
45556             'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
45557             'surface', 'tracktype', 'crossing', 'service', 'sport'
45558         ],
45559         tagClassRe = /^tag-/,
45560         tags = function(entity) { return entity.tags; };
45561
45562
45563     var tagClasses = function(selection$$1) {
45564         selection$$1.each(function tagClassesEach(entity) {
45565             var value = this.className,
45566                 classes, primary, status;
45567
45568             if (value.baseVal !== undefined) value = value.baseVal;
45569
45570             classes = value.trim().split(/\s+/).filter(function(name) {
45571                 return name.length && !tagClassRe.test(name);
45572             }).join(' ');
45573
45574             var t = tags(entity), i, k, v;
45575
45576             // pick at most one primary classification tag..
45577             for (i = 0; i < primaries.length; i++) {
45578                 k = primaries[i];
45579                 v = t[k];
45580                 if (!v || v === 'no') continue;
45581
45582                 primary = k;
45583                 if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
45584                     status = v;
45585                     classes += ' tag-' + k;
45586                 } else {
45587                     classes += ' tag-' + k + ' tag-' + k + '-' + v;
45588                 }
45589
45590                 break;
45591             }
45592
45593             // add at most one status tag, only if relates to primary tag..
45594             if (!status) {
45595                 for (i = 0; i < statuses.length; i++) {
45596                     k = statuses[i];
45597                     v = t[k];
45598                     if (!v || v === 'no') continue;
45599
45600                     if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
45601                         status = k;
45602                     }
45603                     else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
45604                         status = k;
45605                     } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
45606                         status = k;
45607                         primary = v;
45608                         classes += ' tag-' + v;
45609                     }  // else ignore e.g.  `highway=path + abandoned=railway`
45610
45611                     if (status) break;
45612                 }
45613             }
45614
45615             if (status) {
45616                 classes += ' tag-status tag-status-' + status;
45617             }
45618
45619             // add any secondary (structure) tags
45620             for (i = 0; i < secondaries.length; i++) {
45621                 k = secondaries[i];
45622                 v = t[k];
45623                 if (!v || v === 'no') continue;
45624                 classes += ' tag-' + k + ' tag-' + k + '-' + v;
45625             }
45626
45627             // For highways, look for surface tagging..
45628             if (primary === 'highway') {
45629                 var paved = (t.highway !== 'track');
45630                 for (k in t) {
45631                     v = t[k];
45632                     if (k in osmPavedTags) {
45633                         paved = !!osmPavedTags[k][v];
45634                         break;
45635                     }
45636                 }
45637                 if (!paved) {
45638                     classes += ' tag-unpaved';
45639                 }
45640             }
45641
45642             classes = classes.trim();
45643
45644             if (classes !== value) {
45645                 d3_select(this).attr('class', classes);
45646             }
45647         });
45648     };
45649
45650
45651     tagClasses.tags = function(_) {
45652         if (!arguments.length) return tags;
45653         tags = _;
45654         return tagClasses;
45655     };
45656
45657     return tagClasses;
45658 }
45659
45660 function svgTurns(projection) {
45661
45662     return function drawTurns(selection, graph, turns) {
45663
45664         function key(turn) {
45665             return [turn.from.node + turn.via.node + turn.to.node].join('-');
45666         }
45667
45668         function icon(turn) {
45669             var u = turn.u ? '-u' : '';
45670             if (!turn.restriction)
45671                 return '#turn-yes' + u;
45672             var restriction = graph.entity(turn.restriction).tags.restriction;
45673             return '#turn-' +
45674                 (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
45675         }
45676
45677         var groups = selection.selectAll('.layer-hit').selectAll('g.turn')
45678             .data(turns, key);
45679
45680         groups.exit()
45681             .remove();
45682
45683
45684         var enter = groups.enter()
45685             .append('g')
45686             .attr('class', 'turn');
45687
45688         var nEnter = enter
45689             .filter(function (turn) { return !turn.u; });
45690
45691         nEnter.append('rect')
45692             .attr('transform', 'translate(-22, -12)')
45693             .attr('width', '44')
45694             .attr('height', '24');
45695
45696         nEnter.append('use')
45697             .attr('transform', 'translate(-22, -12)')
45698             .attr('width', '44')
45699             .attr('height', '24');
45700
45701
45702         var uEnter = enter
45703             .filter(function (turn) { return turn.u; });
45704
45705         uEnter.append('circle')
45706             .attr('r', '16');
45707
45708         uEnter.append('use')
45709             .attr('transform', 'translate(-16, -16)')
45710             .attr('width', '32')
45711             .attr('height', '32');
45712
45713
45714         groups = groups
45715             .merge(enter);
45716
45717         groups
45718             .attr('transform', function (turn) {
45719                 var v = graph.entity(turn.via.node),
45720                     t = graph.entity(turn.to.node),
45721                     a = geoAngle(v, t, projection),
45722                     p = projection(v.loc),
45723                     r = turn.u ? 0 : 60;
45724
45725                 return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' +
45726                     'rotate(' + a * 180 / Math.PI + ')';
45727             });
45728
45729         groups.select('use')
45730             .attr('xlink:href', icon);
45731
45732         groups.select('rect');
45733         groups.select('circle');
45734
45735         return this;
45736     };
45737 }
45738
45739 function svgVertices$$1(projection, context) {
45740     var radiuses = {
45741         //       z16-, z17, z18+, tagged
45742         shadow: [6,    7.5,   7.5,  11.5],
45743         stroke: [2.5,  3.5,   3.5,  7],
45744         fill:   [1,    1.5,   1.5,  1.5]
45745     };
45746
45747     var hover;
45748
45749
45750     function siblingAndChildVertices(ids, graph, extent) {
45751         var vertices = {};
45752
45753         function addChildVertices(entity) {
45754             if (!context.features().isHiddenFeature(entity, graph, entity.geometry(graph))) {
45755                 var i;
45756                 if (entity.type === 'way') {
45757                     for (i = 0; i < entity.nodes.length; i++) {
45758                         addChildVertices(graph.entity(entity.nodes[i]));
45759                     }
45760                 } else if (entity.type === 'relation') {
45761                     for (i = 0; i < entity.members.length; i++) {
45762                         var member = context.hasEntity(entity.members[i].id);
45763                         if (member) {
45764                             addChildVertices(member);
45765                         }
45766                     }
45767                 } else if (entity.intersects(extent, graph)) {
45768                     vertices[entity.id] = entity;
45769                 }
45770             }
45771         }
45772
45773         ids.forEach(function(id) {
45774             var entity = context.hasEntity(id);
45775             if (entity && entity.type === 'node') {
45776                 vertices[entity.id] = entity;
45777                 context.graph().parentWays(entity).forEach(function(entity) {
45778                     addChildVertices(entity);
45779                 });
45780             } else if (entity) {
45781                 addChildVertices(entity);
45782             }
45783         });
45784
45785         return vertices;
45786     }
45787
45788
45789     function draw(selection, vertices, klass, graph, zoom, siblings) {
45790
45791         function icon(entity) {
45792             if (entity.id in icons) return icons[entity.id];
45793             icons[entity.id] =
45794                 entity.hasInterestingTags() &&
45795                 context.presets().match(entity, graph).icon;
45796             return icons[entity.id];
45797         }
45798
45799         function setClass(klass) {
45800             return function(entity) {
45801                 this.setAttribute('class', 'node vertex ' + klass + ' ' + entity.id);
45802             };
45803         }
45804
45805         function setAttributes(selection) {
45806             ['shadow','stroke','fill'].forEach(function(klass) {
45807                 var rads = radiuses[klass];
45808                 selection.selectAll('.' + klass)
45809                     .each(function(entity) {
45810                         var i = z && icon(entity),
45811                             c = i ? 0.5 : 0,
45812                             r = rads[i ? 3 : z];
45813
45814                         // slightly increase the size of unconnected endpoints #3775
45815                         if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
45816                             r += 1.5;
45817                         }
45818
45819                         this.setAttribute('cx', c);
45820                         this.setAttribute('cy', -c);
45821                         this.setAttribute('r', r);
45822                         if (i && klass === 'fill') {
45823                             this.setAttribute('visibility', 'hidden');
45824                         } else {
45825                             this.removeAttribute('visibility');
45826                         }
45827                     });
45828             });
45829
45830             selection.selectAll('use')
45831                 .each(function() {
45832                     if (z) {
45833                         this.removeAttribute('visibility');
45834                     } else {
45835                         this.setAttribute('visibility', 'hidden');
45836                     }
45837                 });
45838         }
45839
45840
45841         siblings = siblings || {};
45842
45843         var icons = {},
45844             z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
45845
45846         var groups = selection
45847             .data(vertices, osmEntity$$1.key);
45848
45849         groups.exit()
45850             .remove();
45851
45852         var enter = groups.enter()
45853             .append('g')
45854             .attr('class', function(d) { return 'node vertex ' + klass + ' ' + d.id; });
45855
45856         enter.append('circle')
45857             .each(setClass('shadow'));
45858
45859         enter.append('circle')
45860             .each(setClass('stroke'));
45861
45862         // Vertices with icons get a `use`.
45863         enter.filter(function(d) { return icon(d); })
45864             .append('use')
45865             .attr('transform', 'translate(-5, -6)')
45866             .attr('xlink:href', function(d) {
45867                 var picon = icon(d),
45868                     isMaki = dataFeatureIcons.indexOf(picon) !== -1;
45869                 return '#' + picon + (isMaki ? '-11' : '');
45870             })
45871             .attr('width', '11px')
45872             .attr('height', '11px')
45873             .each(setClass('icon'));
45874
45875         // Vertices with tags get a fill.
45876         enter.filter(function(d) { return d.hasInterestingTags(); })
45877             .append('circle')
45878             .each(setClass('fill'));
45879
45880         groups
45881             .merge(enter)
45882             .attr('transform', svgPointTransform(projection))
45883             .classed('sibling', function(entity) { return entity.id in siblings; })
45884             .classed('shared', function(entity) { return graph.isShared(entity); })
45885             .classed('endpoint', function(entity) { return entity.isEndpoint(graph); })
45886             .call(setAttributes);
45887     }
45888
45889
45890     function drawVertices(selection, graph, entities, filter, extent, zoom) {
45891         var siblings = siblingAndChildVertices(context.selectedIDs(), graph, extent),
45892             wireframe = context.surface().classed('fill-wireframe'),
45893             vertices = [];
45894
45895         for (var i = 0; i < entities.length; i++) {
45896             var entity = entities[i],
45897                 geometry = entity.geometry(graph);
45898
45899             if (wireframe && geometry === 'point') {
45900                 vertices.push(entity);
45901                 continue;
45902             }
45903
45904             if (geometry !== 'vertex')
45905                 continue;
45906
45907             if (entity.id in siblings ||
45908                 entity.hasInterestingTags() ||
45909                 entity.isEndpoint(graph) ||
45910                 entity.isConnected(graph)) {
45911                 vertices.push(entity);
45912             }
45913         }
45914
45915         var layer = selection.selectAll('.layer-hit');
45916         layer.selectAll('g.vertex.vertex-persistent')
45917             .filter(filter)
45918             .call(draw, vertices, 'vertex-persistent', graph, zoom, siblings);
45919
45920         drawHover(selection, graph, extent, zoom);
45921     }
45922
45923
45924     function drawHover(selection, graph, extent, zoom) {
45925         var hovered = hover ? siblingAndChildVertices([hover.id], graph, extent) : {};
45926         var layer = selection.selectAll('.layer-hit');
45927
45928         layer.selectAll('g.vertex.vertex-hover')
45929             .call(draw, values$1(hovered), 'vertex-hover', graph, zoom);
45930     }
45931
45932
45933     drawVertices.drawHover = function(selection, graph, target, extent, zoom) {
45934         if (target === hover) return;
45935         hover = target;
45936         drawHover(selection, graph, extent, zoom);
45937     };
45938
45939     return drawVertices;
45940 }
45941
45942 function uiAccount(context) {
45943     var osm = context.connection();
45944
45945
45946     function update(selection$$1) {
45947         if (!osm) return;
45948
45949         if (!osm.authenticated()) {
45950             selection$$1.selectAll('#userLink, #logoutLink')
45951                 .classed('hide', true);
45952             return;
45953         }
45954
45955         osm.userDetails(function(err, details) {
45956             var userLink = selection$$1.select('#userLink'),
45957                 logoutLink = selection$$1.select('#logoutLink');
45958
45959             userLink.html('');
45960             logoutLink.html('');
45961
45962             if (err) return;
45963
45964             selection$$1.selectAll('#userLink, #logoutLink')
45965                 .classed('hide', false);
45966
45967             // Link
45968             userLink.append('a')
45969                 .attr('href', osm.userURL(details.display_name))
45970                 .attr('target', '_blank');
45971
45972             // Add thumbnail or dont
45973             if (details.image_url) {
45974                 userLink.append('img')
45975                     .attr('class', 'icon pre-text user-icon')
45976                     .attr('src', details.image_url);
45977             } else {
45978                 userLink
45979                     .call(svgIcon('#icon-avatar', 'pre-text light'));
45980             }
45981
45982             // Add user name
45983             userLink.append('span')
45984                 .attr('class', 'label')
45985                 .text(details.display_name);
45986
45987             logoutLink.append('a')
45988                 .attr('class', 'logout')
45989                 .attr('href', '#')
45990                 .text(t('logout'))
45991                 .on('click.logout', function() {
45992                     event.preventDefault();
45993                     osm.logout();
45994                 });
45995         });
45996     }
45997
45998
45999     return function(selection$$1) {
46000         selection$$1.append('li')
46001             .attr('id', 'logoutLink')
46002             .classed('hide', true);
46003
46004         selection$$1.append('li')
46005             .attr('id', 'userLink')
46006             .classed('hide', true);
46007
46008         if (osm) {
46009             osm.on('change.account', function() { update(selection$$1); });
46010             update(selection$$1);
46011         }
46012     };
46013 }
46014
46015 function uiAttribution(context) {
46016     var selection$$1;
46017
46018
46019     function attribution(data, klass) {
46020         var div = selection$$1.selectAll('.' + klass)
46021             .data([0]);
46022
46023         div = div.enter()
46024             .append('div')
46025             .attr('class', klass)
46026             .merge(div);
46027
46028
46029         var background = div.selectAll('.attribution')
46030             .data(data, function(d) { return d.name(); });
46031
46032         background.exit()
46033             .remove();
46034
46035         background = background.enter()
46036             .append('span')
46037             .attr('class', 'attribution')
46038             .each(function(d) {
46039                 if (d.terms_html) {
46040                     d3_select(this)
46041                         .html(d.terms_html);
46042                     return;
46043                 }
46044
46045                 var selection$$1;
46046                 if (d.terms_url) {
46047                     selection$$1 = d3_select(this)
46048                         .append('a')
46049                         .attr('href', d.terms_url)
46050                         .attr('target', '_blank');
46051                 } else {
46052                     selection$$1 = d3_select(this);
46053                 }
46054
46055
46056                 var id_safe = d.id.replace('.', '<TX_DOT>');
46057                 var terms_text = t('imagery.' + id_safe + '.attribution.text',
46058                     { default: d.terms_text || d.id || d.name() }
46059                 );
46060
46061                 if (d.icon && !d.overlay) {
46062                     selection$$1
46063                         .append('img')
46064                         .attr('class', 'source-image')
46065                         .attr('src', d.icon);
46066                 }
46067
46068                 selection$$1
46069                     .append('span')
46070                     .attr('class', 'attribution-text')
46071                     .text(terms_text);
46072             })
46073             .merge(background);
46074
46075
46076         var copyright = background.selectAll('.copyright-notice')
46077             .data(function(d) {
46078                 var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
46079                 return notice ? [notice] : [];
46080             });
46081
46082         copyright.exit()
46083             .remove();
46084
46085         copyright = copyright.enter()
46086             .append('span')
46087             .attr('class', 'copyright-notice')
46088             .merge(copyright);
46089
46090         copyright
46091             .text(String);
46092     }
46093
46094
46095     function update() {
46096         attribution([context.background().baseLayerSource()], 'base-layer-attribution');
46097         attribution(context.background().overlayLayerSources().filter(function (s) {
46098             return s.validZoom(context.map().zoom());
46099         }), 'overlay-layer-attribution');
46100     }
46101
46102
46103     return function(select) {
46104         selection$$1 = select;
46105
46106         context.background()
46107             .on('change.attribution', update);
46108
46109         context.map()
46110             .on('move.attribution', throttle(update, 400, {leading: false}));
46111
46112         update();
46113     };
46114 }
46115
46116 function localeDateString(s) {
46117     if (!s) return null;
46118     var d = new Date(s);
46119     if (isNaN(d.getTime())) return null;
46120     return d.toLocaleDateString();
46121 }
46122
46123 function vintageRange(vintage) {
46124     var s;
46125     if (vintage.start || vintage.end) {
46126         s = (vintage.start || '?');
46127         if (vintage.start !== vintage.end) {
46128             s += ' - ' + (vintage.end || '?');
46129         }
46130     }
46131     return s;
46132 }
46133
46134
46135 function rendererBackgroundSource(data) {
46136     var source = clone(data),
46137         offset = [0, 0],
46138         name = source.name,
46139         description = source.description,
46140         best = !!source.best,
46141         template = source.template;
46142
46143     source.scaleExtent = data.scaleExtent || [0, 22];
46144     source.overzoom = data.overzoom !== false;
46145
46146
46147     source.offset = function(_) {
46148         if (!arguments.length) return offset;
46149         offset = _;
46150         return source;
46151     };
46152
46153
46154     source.nudge = function(_, zoomlevel) {
46155         offset[0] += _[0] / Math.pow(2, zoomlevel);
46156         offset[1] += _[1] / Math.pow(2, zoomlevel);
46157         return source;
46158     };
46159
46160
46161     source.name = function() {
46162         var id_safe = source.id.replace('.', '<TX_DOT>');
46163         return t('imagery.' + id_safe + '.name', { default: name });
46164     };
46165
46166
46167     source.description = function() {
46168         var id_safe = source.id.replace('.', '<TX_DOT>');
46169         return t('imagery.' + id_safe + '.description', { default: description });
46170     };
46171
46172
46173     source.best = function() {
46174         return best;
46175     };
46176
46177
46178     source.area = function() {
46179         if (!data.polygon) return Number.MAX_VALUE;  // worldwide
46180         var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
46181         return isNaN(area) ? 0 : area;
46182     };
46183
46184
46185     source.imageryUsed = function() {
46186         return name || source.id;
46187     };
46188
46189
46190     source.template = function(_) {
46191         if (!arguments.length) return template;
46192         if (source.id === 'custom') template = _;
46193         return source;
46194     };
46195
46196
46197     source.url = function(coord) {
46198         return template
46199             .replace('{x}', coord[0])
46200             .replace('{y}', coord[1])
46201             // TMS-flipped y coordinate
46202             .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
46203             .replace(/\{z(oom)?\}/, coord[2])
46204             .replace(/\{switch:([^}]+)\}/, function(s, r) {
46205                 var subdomains = r.split(',');
46206                 return subdomains[(coord[0] + coord[1]) % subdomains.length];
46207             })
46208             .replace('{u}', function() {
46209                 var u = '';
46210                 for (var zoom = coord[2]; zoom > 0; zoom--) {
46211                     var b = 0;
46212                     var mask = 1 << (zoom - 1);
46213                     if ((coord[0] & mask) !== 0) b++;
46214                     if ((coord[1] & mask) !== 0) b += 2;
46215                     u += b.toString();
46216                 }
46217                 return u;
46218             });
46219     };
46220
46221
46222     source.intersects = function(extent) {
46223         extent = extent.polygon();
46224         return !data.polygon || data.polygon.some(function(polygon) {
46225             return geoPolygonIntersectsPolygon(polygon, extent, true);
46226         });
46227     };
46228
46229
46230     source.validZoom = function(z) {
46231         return source.scaleExtent[0] <= z &&
46232             (source.overzoom || source.scaleExtent[1] > z);
46233     };
46234
46235
46236     source.isLocatorOverlay = function() {
46237         return source.id === 'mapbox_locator_overlay';
46238     };
46239
46240
46241     /* hides a source from the list, but leaves it available for use */
46242     source.isHidden = function() {
46243         return source.id === 'DigitalGlobe-Premium-vintage' ||
46244             source.id === 'DigitalGlobe-Standard-vintage';
46245     };
46246
46247
46248     source.copyrightNotices = function() {};
46249
46250
46251     source.getMetadata = function(center, tileCoord, callback) {
46252         var vintage = {
46253             start: localeDateString(source.startDate),
46254             end: localeDateString(source.endDate)
46255         };
46256         vintage.range = vintageRange(vintage);
46257
46258         var metadata = { vintage: vintage };
46259         callback(null, metadata);
46260     };
46261
46262
46263     return source;
46264 }
46265
46266
46267 rendererBackgroundSource.Bing = function(data, dispatch) {
46268     // http://msdn.microsoft.com/en-us/library/ff701716.aspx
46269     // http://msdn.microsoft.com/en-us/library/ff701701.aspx
46270
46271     data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
46272
46273     var bing = rendererBackgroundSource(data),
46274         key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
46275         url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
46276             key + '&jsonp={callback}',
46277         cache = {},
46278         inflight = {},
46279         providers = [];
46280
46281     jsonpRequest(url, function(json) {
46282         providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
46283             return {
46284                 attribution: provider.attribution,
46285                 areas: provider.coverageAreas.map(function(area) {
46286                     return {
46287                         zoom: [area.zoomMin, area.zoomMax],
46288                         extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
46289                     };
46290                 })
46291             };
46292         });
46293         dispatch.call('change');
46294     });
46295
46296
46297     bing.copyrightNotices = function(zoom, extent) {
46298         zoom = Math.min(zoom, 21);
46299         return providers.filter(function(provider) {
46300             return some(provider.areas, function(area) {
46301                 return extent.intersects(area.extent) &&
46302                     area.zoom[0] <= zoom &&
46303                     area.zoom[1] >= zoom;
46304             });
46305         }).map(function(provider) {
46306             return provider.attribution;
46307         }).join(', ');
46308     };
46309
46310
46311     bing.getMetadata = function(center, tileCoord, callback) {
46312         var tileId = tileCoord.slice(0, 3).join('/'),
46313             zoom = Math.min(tileCoord[2], 21),
46314             centerPoint = center[1] + ',' + center[0],  // lat,lng
46315             url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
46316                 '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
46317
46318         if (inflight[tileId]) return;
46319
46320         if (!cache[tileId]) {
46321             cache[tileId] = {};
46322         }
46323         if (cache[tileId] && cache[tileId].metadata) {
46324             return callback(null, cache[tileId].metadata);
46325         }
46326
46327         inflight[tileId] = true;
46328         jsonpRequest(url, function(result) {
46329             delete inflight[tileId];
46330
46331             var err = (!result && 'Unknown Error') || result.errorDetails;
46332             if (err) {
46333                 return callback(err);
46334             } else {
46335                 var vintage = {
46336                     start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
46337                     end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
46338                 };
46339                 vintage.range = vintageRange(vintage);
46340
46341                 var metadata = { vintage: vintage };
46342                 cache[tileId].metadata = metadata;
46343                 return callback(null, metadata);
46344             }
46345         });
46346     };
46347
46348
46349     bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
46350
46351
46352     return bing;
46353 };
46354
46355
46356
46357 rendererBackgroundSource.Esri = function(data) {
46358
46359     // don't request blank tiles, instead overzoom real tiles - #4327
46360     // deprecated technique, but it works (for now)
46361     if (data.template.match(/blankTile/) === null) {
46362         data.template = data.template + '?blankTile=false';
46363     }
46364
46365     var esri = rendererBackgroundSource(data),
46366         cache = {},
46367         inflight = {};
46368
46369     esri.getMetadata = function(center, tileCoord, callback) {
46370         var tileId = tileCoord.slice(0, 3).join('/'),
46371             zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
46372             centerPoint = center[0] + ',' + center[1],  // long, lat (as it should be)
46373             unknown = t('info_panels.background.unknown'),
46374             metadataLayer,
46375             vintage = {},
46376             metadata = {};
46377
46378         if (inflight[tileId]) return;
46379
46380         switch (true) {
46381             case zoom >= 19:
46382                 metadataLayer = 3;
46383                 break;
46384             case zoom >= 17:
46385                 metadataLayer = 2;
46386                 break;
46387             case zoom >= 13:
46388                 metadataLayer = 0;
46389                 break;
46390             default:
46391                 metadataLayer = 99;
46392         }
46393
46394         // build up query using the layer appropriate to the current zoom
46395         var url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/' + metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
46396
46397         if (!cache[tileId]) {
46398             cache[tileId] = {};
46399         }
46400         if (cache[tileId] && cache[tileId].metadata) {
46401             return callback(null, cache[tileId].metadata);
46402         }
46403
46404         // accurate metadata is only available >= 13
46405         if (metadataLayer === 99) {
46406             vintage = {
46407                 start: null,
46408                 end: null,
46409                 range: null
46410             };
46411             metadata = {
46412                 vintage: null,
46413                 source: unknown,
46414                 description: unknown,
46415                 resolution: unknown,
46416                 accuracy: unknown
46417             };
46418
46419             callback(null, metadata);
46420
46421         } else {
46422             inflight[tileId] = true;
46423             jsonpRequest(url, function(result) {
46424                 delete inflight[tileId];
46425
46426                 var err;
46427                 if (!result) {
46428                     err = 'Unknown Error';
46429                 } else if (result.features && result.features.length < 1) {
46430                     err = 'No Results';
46431                 } else if (result.error && result.error.message) {
46432                     err = result.error.message;
46433                 }
46434
46435                 if (err) {
46436                     return callback(err);
46437                 } else {
46438                     // pass through the discrete capture date from metadata
46439                     var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
46440                     vintage = {
46441                         start: captureDate,
46442                         end: captureDate,
46443                         range: captureDate
46444                     };
46445                     metadata = {
46446                         vintage: vintage,
46447                         source: clean(result.features[0].attributes.NICE_NAME),
46448                         description: clean(result.features[0].attributes.NICE_DESC),
46449                         resolution: clean(result.features[0].attributes.SRC_RES),
46450                         accuracy: clean(result.features[0].attributes.SRC_ACC)
46451                     };
46452
46453                     // append units - meters
46454                     if (isFinite(metadata.resolution)) {
46455                         metadata.resolution += ' m';
46456                     }
46457                     if (isFinite(metadata.accuracy)) {
46458                         metadata.accuracy += ' m';
46459                     }
46460
46461                     cache[tileId].metadata = metadata;
46462                     return callback(null, metadata);
46463                 }
46464             });
46465         }
46466
46467
46468         function clean(val) {
46469             return String(val).trim() || unknown;
46470         }
46471     };
46472
46473     return esri;
46474 };
46475
46476
46477 rendererBackgroundSource.None = function() {
46478     var source = rendererBackgroundSource({ id: 'none', template: '' });
46479
46480
46481     source.name = function() {
46482         return t('background.none');
46483     };
46484
46485
46486     source.imageryUsed = function() {
46487         return 'None';
46488     };
46489
46490
46491     source.area = function() {
46492         return -1;  // sources in background pane are sorted by area
46493     };
46494
46495
46496     return source;
46497 };
46498
46499
46500 rendererBackgroundSource.Custom = function(template) {
46501     var source = rendererBackgroundSource({ id: 'custom', template: template });
46502
46503
46504     source.name = function() {
46505         return t('background.custom');
46506     };
46507
46508
46509     source.imageryUsed = function() {
46510         return 'Custom (' + source.template() + ')';
46511     };
46512
46513
46514     source.area = function() {
46515         return -2;  // sources in background pane are sorted by area
46516     };
46517
46518
46519     return source;
46520 };
46521
46522 function rendererTileLayer(context) {
46523     var tileSize = 256,
46524         geotile = d3geoTile(),
46525         projection,
46526         cache = {},
46527         tileOrigin,
46528         z,
46529         transformProp = utilPrefixCSSProperty('Transform'),
46530         source;
46531
46532
46533     // blacklist overlay tiles around Null Island..
46534     function nearNullIsland(x, y, z) {
46535         if (z >= 7) {
46536             var center = Math.pow(2, z - 1),
46537                 width = Math.pow(2, z - 6),
46538                 min = center - (width / 2),
46539                 max = center + (width / 2) - 1;
46540             return x >= min && x <= max && y >= min && y <= max;
46541         }
46542         return false;
46543     }
46544
46545
46546     function tileSizeAtZoom(d, z) {
46547         var epsilon = 0.002;
46548         return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + epsilon;
46549     }
46550
46551
46552     function atZoom(t$$1, distance) {
46553         var power = Math.pow(2, distance);
46554         return [
46555             Math.floor(t$$1[0] * power),
46556             Math.floor(t$$1[1] * power),
46557             t$$1[2] + distance
46558         ];
46559     }
46560
46561
46562     function lookUp(d) {
46563         for (var up = -1; up > -d[2]; up--) {
46564             var tile = atZoom(d, up);
46565             if (cache[source.url(tile)] !== false) {
46566                 return tile;
46567             }
46568         }
46569     }
46570
46571
46572     function uniqueBy(a, n) {
46573         var o = [], seen = {};
46574         for (var i = 0; i < a.length; i++) {
46575             if (seen[a[i][n]] === undefined) {
46576                 o.push(a[i]);
46577                 seen[a[i][n]] = true;
46578             }
46579         }
46580         return o;
46581     }
46582
46583
46584     function addSource(d) {
46585         d.push(source.url(d));
46586         return d;
46587     }
46588
46589
46590     // Update tiles based on current state of `projection`.
46591     function background(selection$$1) {
46592         z = Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.log(2) - 8, 0);
46593
46594         var pixelOffset;
46595         if (source) {
46596             pixelOffset = [
46597                 source.offset()[0] * Math.pow(2, z),
46598                 source.offset()[1] * Math.pow(2, z)
46599             ];
46600         } else {
46601             pixelOffset = [0, 0];
46602         }
46603
46604         var translate = [
46605             projection.translate()[0] + pixelOffset[0],
46606             projection.translate()[1] + pixelOffset[1]
46607         ];
46608
46609         geotile
46610             .scale(projection.scale() * 2 * Math.PI)
46611             .translate(translate);
46612
46613         tileOrigin = [
46614             projection.scale() * Math.PI - translate[0],
46615             projection.scale() * Math.PI - translate[1]
46616         ];
46617
46618         render(selection$$1);
46619     }
46620
46621
46622     // Derive the tiles onscreen, remove those offscreen and position them.
46623     // Important that this part not depend on `projection` because it's
46624     // rentered when tiles load/error (see #644).
46625     function render(selection$$1) {
46626         if (!source) return;
46627         var requests = [];
46628         var showDebug = context.getDebug('tile') && !source.overlay;
46629
46630         if (source.validZoom(z)) {
46631             geotile().forEach(function(d) {
46632                 addSource(d);
46633                 if (d[3] === '') return;
46634                 if (typeof d[3] !== 'string') return; // Workaround for #2295
46635                 requests.push(d);
46636                 if (cache[d[3]] === false && lookUp(d)) {
46637                     requests.push(addSource(lookUp(d)));
46638                 }
46639             });
46640
46641             requests = uniqueBy(requests, 3).filter(function(r) {
46642                 if (!!source.overlay && nearNullIsland(r[0], r[1], r[2])) {
46643                     return false;
46644                 }
46645                 // don't re-request tiles which have failed in the past
46646                 return cache[r[3]] !== false;
46647             });
46648         }
46649
46650
46651         function load(d) {
46652             cache[d[3]] = true;
46653             d3_select(this)
46654                 .on('error', null)
46655                 .on('load', null)
46656                 .classed('tile-loaded', true);
46657             render(selection$$1);
46658         }
46659
46660         function error(d) {
46661             cache[d[3]] = false;
46662             d3_select(this)
46663                 .on('error', null)
46664                 .on('load', null)
46665                 .remove();
46666             render(selection$$1);
46667         }
46668
46669         function imageTransform(d) {
46670             var _ts = tileSize * Math.pow(2, z - d[2]);
46671             var scale = tileSizeAtZoom(d, z);
46672             return 'translate(' +
46673                 ((d[0] * _ts) - tileOrigin[0]) + 'px,' +
46674                 ((d[1] * _ts) - tileOrigin[1]) + 'px) ' +
46675                 'scale(' + scale + ',' + scale + ')';
46676         }
46677
46678         function tileCenter(d) {
46679             var _ts = tileSize * Math.pow(2, z - d[2]);
46680             return [
46681                 ((d[0] * _ts) - tileOrigin[0] + (_ts / 2)),
46682                 ((d[1] * _ts) - tileOrigin[1] + (_ts / 2))
46683             ];
46684         }
46685
46686         function debugTransform(d) {
46687             var coord = tileCenter(d);
46688             return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
46689         }
46690
46691
46692         // Pick a representative tile near the center of the viewport
46693         // (This is useful for sampling the imagery vintage)
46694         var dims = geotile.size(),
46695             mapCenter = [dims[0] / 2, dims[1] / 2],
46696             minDist = Math.max(dims[0], dims[1]),
46697             nearCenter;
46698
46699         requests.forEach(function(d) {
46700             var c = tileCenter(d);
46701             var dist = geoEuclideanDistance(c, mapCenter);
46702             if (dist < minDist) {
46703                 minDist = dist;
46704                 nearCenter = d;
46705             }
46706         });
46707
46708
46709         var image = selection$$1.selectAll('img')
46710             .data(requests, function(d) { return d[3]; });
46711
46712         image.exit()
46713             .style(transformProp, imageTransform)
46714             .classed('tile-removing', true)
46715             .classed('tile-center', false)
46716             .each(function() {
46717                 var tile = d3_select(this);
46718                 window.setTimeout(function() {
46719                     if (tile.classed('tile-removing')) {
46720                         tile.remove();
46721                     }
46722                 }, 300);
46723             });
46724
46725         image.enter()
46726           .append('img')
46727             .attr('class', 'tile')
46728             .attr('src', function(d) { return d[3]; })
46729             .on('error', error)
46730             .on('load', load)
46731           .merge(image)
46732             .style(transformProp, imageTransform)
46733             .classed('tile-debug', showDebug)
46734             .classed('tile-removing', false)
46735             .classed('tile-center', function(d) { return d === nearCenter; });
46736
46737
46738
46739         var debug = selection$$1.selectAll('.tile-label-debug')
46740             .data(showDebug ? requests : [], function(d) { return d[3]; });
46741
46742         debug.exit()
46743             .remove();
46744
46745         if (showDebug) {
46746             var debugEnter = debug.enter()
46747                 .append('div')
46748                 .attr('class', 'tile-label-debug');
46749
46750             debugEnter
46751                 .append('div')
46752                 .attr('class', 'tile-label-debug-coord');
46753
46754             debugEnter
46755                 .append('div')
46756                 .attr('class', 'tile-label-debug-vintage');
46757
46758             debug = debug.merge(debugEnter);
46759
46760             debug
46761                 .style(transformProp, debugTransform);
46762
46763             debug
46764                 .selectAll('.tile-label-debug-coord')
46765                 .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
46766
46767             debug
46768                 .selectAll('.tile-label-debug-vintage')
46769                 .each(function(d) {
46770                     var span = d3_select(this);
46771                     var center = context.projection.invert(tileCenter(d));
46772                     source.getMetadata(center, d, function(err, result) {
46773                         span.text((result && result.vintage && result.vintage.range) ||
46774                             t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
46775                         );
46776                     });
46777                 });
46778         }
46779
46780     }
46781
46782
46783     background.projection = function(_) {
46784         if (!arguments.length) return projection;
46785         projection = _;
46786         return background;
46787     };
46788
46789
46790     background.dimensions = function(_) {
46791         if (!arguments.length) return geotile.size();
46792         geotile.size(_);
46793         return background;
46794     };
46795
46796
46797     background.source = function(_) {
46798         if (!arguments.length) return source;
46799         source = _;
46800         cache = {};
46801         geotile.scaleExtent(source.scaleExtent);
46802         return background;
46803     };
46804
46805
46806     return background;
46807 }
46808
46809 function rendererBackground(context) {
46810     var dispatch$$1 = dispatch('change'),
46811         baseLayer = rendererTileLayer(context).projection(context.projection),
46812         overlayLayers = [],
46813         backgroundSources;
46814
46815
46816     function background(selection$$1) {
46817         var base = selection$$1.selectAll('.layer-background')
46818             .data([0]);
46819
46820         base.enter()
46821             .insert('div', '.layer-data')
46822             .attr('class', 'layer layer-background')
46823             .merge(base)
46824             .call(baseLayer);
46825
46826         var overlays = selection$$1.selectAll('.layer-overlay')
46827             .data(overlayLayers, function(d) { return d.source().name(); });
46828
46829         overlays.exit()
46830             .remove();
46831
46832         overlays.enter()
46833             .insert('div', '.layer-data')
46834             .attr('class', 'layer layer-overlay')
46835             .merge(overlays)
46836             .each(function(layer) { d3_select(this).call(layer); });
46837     }
46838
46839
46840     background.updateImagery = function() {
46841         if (context.inIntro()) return;
46842
46843         var b = background.baseLayerSource(),
46844             o = overlayLayers
46845                 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
46846                 .map(function (d) { return d.source().id; })
46847                 .join(','),
46848             meters = geoOffsetToMeters(b.offset()),
46849             epsilon = 0.01,
46850             x = +meters[0].toFixed(2),
46851             y = +meters[1].toFixed(2),
46852             q = utilStringQs(window.location.hash.substring(1));
46853
46854         var id = b.id;
46855         if (id === 'custom') {
46856             id = 'custom:' + b.template();
46857         }
46858
46859         if (id) {
46860             q.background = id;
46861         } else {
46862             delete q.background;
46863         }
46864
46865         if (o) {
46866             q.overlays = o;
46867         } else {
46868             delete q.overlays;
46869         }
46870
46871         if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
46872             q.offset = x + ',' + y;
46873         } else {
46874             delete q.offset;
46875         }
46876
46877         if (!window.mocha) {
46878             window.location.replace('#' + utilQsString(q, true));
46879         }
46880
46881         var imageryUsed = [b.imageryUsed()];
46882
46883         overlayLayers
46884             .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
46885             .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
46886
46887         var gpx = context.layers().layer('gpx');
46888         if (gpx && gpx.enabled() && gpx.hasGpx()) {
46889             imageryUsed.push(gpx.getSrc());
46890         }
46891
46892         var mapillary_images = context.layers().layer('mapillary-images');
46893         if (mapillary_images && mapillary_images.enabled()) {
46894             imageryUsed.push('Mapillary Images');
46895         }
46896
46897         var mapillary_signs = context.layers().layer('mapillary-signs');
46898         if (mapillary_signs && mapillary_signs.enabled()) {
46899             imageryUsed.push('Mapillary Signs');
46900         }
46901
46902         var openstreetcam_images = context.layers().layer('openstreetcam-images');
46903         if (openstreetcam_images && openstreetcam_images.enabled()) {
46904             imageryUsed.push('OpenStreetCam Images');
46905         }
46906
46907         context.history().imageryUsed(imageryUsed);
46908     };
46909
46910
46911     background.sources = function(extent) {
46912         return backgroundSources.filter(function(source) {
46913             return source.intersects(extent);
46914         });
46915     };
46916
46917
46918     background.dimensions = function(_) {
46919         if (!_) return;
46920         baseLayer.dimensions(_);
46921
46922         overlayLayers.forEach(function(layer) {
46923             layer.dimensions(_);
46924         });
46925     };
46926
46927
46928     background.baseLayerSource = function(d) {
46929         if (!arguments.length) return baseLayer.source();
46930
46931         // test source against OSM imagery blacklists..
46932         var osm = context.connection();
46933         if (!osm) return background;
46934
46935         var blacklists = context.connection().imageryBlacklists();
46936
46937         var template = d.template(),
46938             fail = false,
46939             tested = 0,
46940             regex, i;
46941
46942         for (i = 0; i < blacklists.length; i++) {
46943             try {
46944                 regex = new RegExp(blacklists[i]);
46945                 fail = regex.test(template);
46946                 tested++;
46947                 if (fail) break;
46948             } catch (e) {
46949                 /* noop */
46950             }
46951         }
46952
46953         // ensure at least one test was run.
46954         if (!tested) {
46955             regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
46956             fail = regex.test(template);
46957         }
46958
46959         baseLayer.source(!fail ? d : background.findSource('none'));
46960         dispatch$$1.call('change');
46961         background.updateImagery();
46962         return background;
46963     };
46964
46965
46966     background.findSource = function(id) {
46967         return find$1(backgroundSources, function(d) {
46968             return d.id && d.id === id;
46969         });
46970     };
46971
46972
46973     background.bing = function() {
46974         background.baseLayerSource(background.findSource('Bing'));
46975     };
46976
46977
46978     background.showsLayer = function(d) {
46979         return d.id === baseLayer.source().id ||
46980             overlayLayers.some(function(layer) { return d.id === layer.source().id; });
46981     };
46982
46983
46984     background.overlayLayerSources = function() {
46985         return overlayLayers.map(function (l) { return l.source(); });
46986     };
46987
46988
46989     background.toggleOverlayLayer = function(d) {
46990         var layer;
46991
46992         for (var i = 0; i < overlayLayers.length; i++) {
46993             layer = overlayLayers[i];
46994             if (layer.source() === d) {
46995                 overlayLayers.splice(i, 1);
46996                 dispatch$$1.call('change');
46997                 background.updateImagery();
46998                 return;
46999             }
47000         }
47001
47002         layer = rendererTileLayer(context)
47003             .source(d)
47004             .projection(context.projection)
47005             .dimensions(baseLayer.dimensions());
47006
47007         overlayLayers.push(layer);
47008         dispatch$$1.call('change');
47009         background.updateImagery();
47010     };
47011
47012
47013     background.nudge = function(d, zoom) {
47014         baseLayer.source().nudge(d, zoom);
47015         dispatch$$1.call('change');
47016         background.updateImagery();
47017         return background;
47018     };
47019
47020
47021     background.offset = function(d) {
47022         if (!arguments.length) return baseLayer.source().offset();
47023         baseLayer.source().offset(d);
47024         dispatch$$1.call('change');
47025         background.updateImagery();
47026         return background;
47027     };
47028
47029
47030     background.init = function() {
47031         function parseMap(qmap) {
47032             if (!qmap) return false;
47033             var args = qmap.split('/').map(Number);
47034             if (args.length < 3 || args.some(isNaN)) return false;
47035             return geoExtent$$1([args[2], args[1]]);
47036         }
47037
47038         var dataImagery = data.imagery || [],
47039             q = utilStringQs(window.location.hash.substring(1)),
47040             requested = q.background || q.layer,
47041             extent = parseMap(q.map),
47042             first,
47043             best;
47044
47045         // Add all the available imagery sources
47046         backgroundSources = dataImagery.map(function(source) {
47047             if (source.type === 'bing') {
47048                 return rendererBackgroundSource.Bing(source, dispatch$$1);
47049             } else if (source.id === 'EsriWorldImagery') {
47050                 return rendererBackgroundSource.Esri(source);
47051             } else {
47052                 return rendererBackgroundSource(source);
47053             }
47054         });
47055
47056         first = backgroundSources.length && backgroundSources[0];
47057
47058         // Add 'None'
47059         backgroundSources.unshift(rendererBackgroundSource.None());
47060
47061         // Add 'Custom'
47062         var template = context.storage('background-custom-template') || '';
47063         var custom = rendererBackgroundSource.Custom(template);
47064         backgroundSources.unshift(custom);
47065
47066
47067         // Decide which background layer to display
47068         if (!requested && extent) {
47069             best = find$1(this.sources(extent), function(s) { return s.best(); });
47070         }
47071         if (requested && requested.indexOf('custom:') === 0) {
47072             template = requested.replace(/^custom:/, '');
47073             background.baseLayerSource(custom.template(template));
47074             context.storage('background-custom-template', template);
47075         } else {
47076             background.baseLayerSource(
47077                 background.findSource(requested) ||
47078                 best ||
47079                 background.findSource('Bing') ||
47080                 first ||
47081                 background.findSource('none')
47082             );
47083         }
47084
47085         var locator = find$1(backgroundSources, function(d) {
47086             return d.overlay && d.default;
47087         });
47088
47089         if (locator) {
47090             background.toggleOverlayLayer(locator);
47091         }
47092
47093         var overlays = (q.overlays || '').split(',');
47094         overlays.forEach(function(overlay) {
47095             overlay = background.findSource(overlay);
47096             if (overlay) {
47097                 background.toggleOverlayLayer(overlay);
47098             }
47099         });
47100
47101         if (q.gpx) {
47102             var gpx = context.layers().layer('gpx');
47103             if (gpx) {
47104                 gpx.url(q.gpx);
47105             }
47106         }
47107
47108         if (q.offset) {
47109             var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
47110                 return !isNaN(n) && n;
47111             });
47112
47113             if (offset.length === 2) {
47114                 background.offset(geoMetersToOffset(offset));
47115             }
47116         }
47117     };
47118
47119
47120     return utilRebind(background, dispatch$$1, 'on');
47121 }
47122
47123 function rendererFeatures(context) {
47124     var traffic_roads = {
47125         'motorway': true,
47126         'motorway_link': true,
47127         'trunk': true,
47128         'trunk_link': true,
47129         'primary': true,
47130         'primary_link': true,
47131         'secondary': true,
47132         'secondary_link': true,
47133         'tertiary': true,
47134         'tertiary_link': true,
47135         'residential': true,
47136         'unclassified': true,
47137         'living_street': true
47138     };
47139
47140     var service_roads = {
47141         'service': true,
47142         'road': true,
47143         'track': true
47144     };
47145
47146     var paths = {
47147         'path': true,
47148         'footway': true,
47149         'cycleway': true,
47150         'bridleway': true,
47151         'steps': true,
47152         'pedestrian': true,
47153         'corridor': true
47154     };
47155
47156     var past_futures = {
47157         'proposed': true,
47158         'construction': true,
47159         'abandoned': true,
47160         'dismantled': true,
47161         'disused': true,
47162         'razed': true,
47163         'demolished': true,
47164         'obliterated': true
47165     };
47166
47167     var dispatch$$1 = dispatch('change', 'redraw'),
47168         _cullFactor = 1,
47169         _cache = {},
47170         _features = {},
47171         _stats = {},
47172         _keys = [],
47173         _hidden = [];
47174
47175
47176     function update() {
47177         if (!window.mocha) {
47178             var q = utilStringQs(window.location.hash.substring(1));
47179             var disabled = features.disabled();
47180             if (disabled.length) {
47181                 q.disable_features = features.disabled().join(',');
47182             } else {
47183                 delete q.disable_features;
47184             }
47185             window.location.replace('#' + utilQsString(q, true));
47186         }
47187
47188         _hidden = features.hidden();
47189         dispatch$$1.call('change');
47190         dispatch$$1.call('redraw');
47191     }
47192
47193
47194     function defineFeature(k, filter, max) {
47195         var isEnabled = true;
47196
47197         _keys.push(k);
47198         _features[k] = {
47199             filter: filter,
47200             enabled: isEnabled,   // whether the user wants it enabled..
47201             count: 0,
47202             currentMax: (max || Infinity),
47203             defaultMax: (max || Infinity),
47204             enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
47205             disable: function() { this.enabled = false; this.currentMax = 0; },
47206             hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
47207             autoHidden: function() { return this.hidden() && this.currentMax > 0; }
47208         };
47209     }
47210
47211
47212     defineFeature('points', function isPoint(entity, resolver, geometry) {
47213         return geometry === 'point';
47214     }, 200);
47215
47216     defineFeature('traffic_roads', function isTrafficRoad(entity) {
47217         return traffic_roads[entity.tags.highway];
47218     });
47219
47220     defineFeature('service_roads', function isServiceRoad(entity) {
47221         return service_roads[entity.tags.highway];
47222     });
47223
47224     defineFeature('paths', function isPath(entity) {
47225         return paths[entity.tags.highway];
47226     });
47227
47228     defineFeature('buildings', function isBuilding(entity) {
47229         return (
47230             !!entity.tags['building:part'] ||
47231             (!!entity.tags.building && entity.tags.building !== 'no') ||
47232             entity.tags.amenity === 'shelter' ||
47233             entity.tags.parking === 'multi-storey' ||
47234             entity.tags.parking === 'sheds' ||
47235             entity.tags.parking === 'carports' ||
47236             entity.tags.parking === 'garage_boxes'
47237         );
47238     }, 250);
47239
47240     defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
47241         return geometry === 'area' &&
47242             !_features.buildings.filter(entity) &&
47243             !_features.water.filter(entity);
47244     });
47245
47246     defineFeature('boundaries', function isBoundary(entity) {
47247         return !!entity.tags.boundary;
47248     });
47249
47250     defineFeature('water', function isWater(entity) {
47251         return (
47252             !!entity.tags.waterway ||
47253             entity.tags.natural === 'water' ||
47254             entity.tags.natural === 'coastline' ||
47255             entity.tags.natural === 'bay' ||
47256             entity.tags.landuse === 'pond' ||
47257             entity.tags.landuse === 'basin' ||
47258             entity.tags.landuse === 'reservoir' ||
47259             entity.tags.landuse === 'salt_pond'
47260         );
47261     });
47262
47263     defineFeature('rail', function isRail(entity) {
47264         return (
47265             !!entity.tags.railway ||
47266             entity.tags.landuse === 'railway'
47267         ) && !(
47268             traffic_roads[entity.tags.highway] ||
47269             service_roads[entity.tags.highway] ||
47270             paths[entity.tags.highway]
47271         );
47272     });
47273
47274     defineFeature('power', function isPower(entity) {
47275         return !!entity.tags.power;
47276     });
47277
47278     // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
47279     defineFeature('past_future', function isPastFuture(entity) {
47280         if (
47281             traffic_roads[entity.tags.highway] ||
47282             service_roads[entity.tags.highway] ||
47283             paths[entity.tags.highway]
47284         ) { return false; }
47285
47286         var strings = Object.keys(entity.tags);
47287
47288         for (var i = 0; i < strings.length; i++) {
47289             var s = strings[i];
47290             if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
47291         }
47292         return false;
47293     });
47294
47295     // Lines or areas that don't match another feature filter.
47296     // IMPORTANT: The 'others' feature must be the last one defined,
47297     //   so that code in getMatches can skip this test if `hasMatch = true`
47298     defineFeature('others', function isOther(entity, resolver, geometry) {
47299         return (geometry === 'line' || geometry === 'area');
47300     });
47301
47302
47303     function features() {}
47304
47305
47306     features.features = function() {
47307         return _features;
47308     };
47309
47310
47311     features.keys = function() {
47312         return _keys;
47313     };
47314
47315
47316     features.enabled = function(k) {
47317         if (!arguments.length) {
47318             return _keys.filter(function(k) { return _features[k].enabled; });
47319         }
47320         return _features[k] && _features[k].enabled;
47321     };
47322
47323
47324     features.disabled = function(k) {
47325         if (!arguments.length) {
47326             return _keys.filter(function(k) { return !_features[k].enabled; });
47327         }
47328         return _features[k] && !_features[k].enabled;
47329     };
47330
47331
47332     features.hidden = function(k) {
47333         if (!arguments.length) {
47334             return _keys.filter(function(k) { return _features[k].hidden(); });
47335         }
47336         return _features[k] && _features[k].hidden();
47337     };
47338
47339
47340     features.autoHidden = function(k) {
47341         if (!arguments.length) {
47342             return _keys.filter(function(k) { return _features[k].autoHidden(); });
47343         }
47344         return _features[k] && _features[k].autoHidden();
47345     };
47346
47347
47348     features.enable = function(k) {
47349         if (_features[k] && !_features[k].enabled) {
47350             _features[k].enable();
47351             update();
47352         }
47353     };
47354
47355
47356     features.disable = function(k) {
47357         if (_features[k] && _features[k].enabled) {
47358             _features[k].disable();
47359             update();
47360         }
47361     };
47362
47363
47364     features.toggle = function(k) {
47365         if (_features[k]) {
47366             (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
47367             update();
47368         }
47369     };
47370
47371
47372     features.resetStats = function() {
47373         for (var i = 0; i < _keys.length; i++) {
47374             _features[_keys[i]].count = 0;
47375         }
47376         dispatch$$1.call('change');
47377     };
47378
47379
47380     features.gatherStats = function(d, resolver, dimensions) {
47381         var needsRedraw = false,
47382             type = groupBy(d, function(ent) { return ent.type; }),
47383             entities = [].concat(type.relation || [], type.way || [], type.node || []),
47384             currHidden, geometry, matches, i, j;
47385
47386         for (i = 0; i < _keys.length; i++) {
47387             _features[_keys[i]].count = 0;
47388         }
47389
47390         // adjust the threshold for point/building culling based on viewport size..
47391         // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
47392         _cullFactor = dimensions[0] * dimensions[1] / 1000000;
47393
47394         for (i = 0; i < entities.length; i++) {
47395             geometry = entities[i].geometry(resolver);
47396             if (!(geometry === 'vertex' || geometry === 'relation')) {
47397                 matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
47398                 for (j = 0; j < matches.length; j++) {
47399                     _features[matches[j]].count++;
47400                 }
47401             }
47402         }
47403
47404         currHidden = features.hidden();
47405         if (currHidden !== _hidden) {
47406             _hidden = currHidden;
47407             needsRedraw = true;
47408             dispatch$$1.call('change');
47409         }
47410
47411         return needsRedraw;
47412     };
47413
47414
47415     features.stats = function() {
47416         for (var i = 0; i < _keys.length; i++) {
47417             _stats[_keys[i]] = _features[_keys[i]].count;
47418         }
47419
47420         return _stats;
47421     };
47422
47423
47424     features.clear = function(d) {
47425         for (var i = 0; i < d.length; i++) {
47426             features.clearEntity(d[i]);
47427         }
47428     };
47429
47430
47431     features.clearEntity = function(entity) {
47432         delete _cache[osmEntity$$1.key(entity)];
47433     };
47434
47435
47436     features.reset = function() {
47437         _cache = {};
47438     };
47439
47440
47441     features.getMatches = function(entity, resolver, geometry) {
47442         if (geometry === 'vertex' || geometry === 'relation') return {};
47443
47444         var ent = osmEntity$$1.key(entity);
47445         if (!_cache[ent]) {
47446             _cache[ent] = {};
47447         }
47448
47449         if (!_cache[ent].matches) {
47450             var matches = {},
47451                 hasMatch = false;
47452
47453             for (var i = 0; i < _keys.length; i++) {
47454                 if (_keys[i] === 'others') {
47455                     if (hasMatch) continue;
47456
47457                     // Multipolygon members:
47458                     // If an entity...
47459                     //   1. is a way that hasn't matched other 'interesting' feature rules,
47460                     //   2. and it belongs to a single parent multipolygon relation
47461                     // ...then match whatever feature rules the parent multipolygon has matched.
47462                     // see #2548, #2887
47463                     //
47464                     // IMPORTANT:
47465                     // For this to work, getMatches must be called on relations before ways.
47466                     //
47467                     if (entity.type === 'way') {
47468                         var parents = features.getParents(entity, resolver, geometry);
47469                         if (parents.length === 1 && parents[0].isMultipolygon()) {
47470                             var pkey = osmEntity$$1.key(parents[0]);
47471                             if (_cache[pkey] && _cache[pkey].matches) {
47472                                 matches = clone(_cache[pkey].matches);
47473                                 continue;
47474                             }
47475                         }
47476                     }
47477                 }
47478
47479                 if (_features[_keys[i]].filter(entity, resolver, geometry)) {
47480                     matches[_keys[i]] = hasMatch = true;
47481                 }
47482             }
47483             _cache[ent].matches = matches;
47484         }
47485
47486         return _cache[ent].matches;
47487     };
47488
47489
47490     features.getParents = function(entity, resolver, geometry) {
47491         if (geometry === 'point') return [];
47492
47493         var ent = osmEntity$$1.key(entity);
47494         if (!_cache[ent]) {
47495             _cache[ent] = {};
47496         }
47497
47498         if (!_cache[ent].parents) {
47499             var parents = [];
47500             if (geometry === 'vertex') {
47501                 parents = resolver.parentWays(entity);
47502             } else {   // 'line', 'area', 'relation'
47503                 parents = resolver.parentRelations(entity);
47504             }
47505             _cache[ent].parents = parents;
47506         }
47507         return _cache[ent].parents;
47508     };
47509
47510
47511     features.isHiddenFeature = function(entity, resolver, geometry) {
47512         if (!_hidden.length) return false;
47513         if (!entity.version) return false;
47514
47515         var matches = features.getMatches(entity, resolver, geometry);
47516
47517         for (var i = 0; i < _hidden.length; i++) {
47518             if (matches[_hidden[i]]) return true;
47519         }
47520         return false;
47521     };
47522
47523
47524     features.isHiddenChild = function(entity, resolver, geometry) {
47525         if (!_hidden.length) return false;
47526         if (!entity.version || geometry === 'point') return false;
47527
47528         var parents = features.getParents(entity, resolver, geometry);
47529         if (!parents.length) return false;
47530
47531         for (var i = 0; i < parents.length; i++) {
47532             if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
47533                 return false;
47534             }
47535         }
47536         return true;
47537     };
47538
47539
47540     features.hasHiddenConnections = function(entity, resolver) {
47541         if (!_hidden.length) return false;
47542         var childNodes, connections;
47543
47544         if (entity.type === 'midpoint') {
47545             childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
47546             connections = [];
47547         } else {
47548             childNodes = entity.nodes ? resolver.childNodes(entity) : [];
47549             connections = features.getParents(entity, resolver, entity.geometry(resolver));
47550         }
47551
47552         // gather ways connected to child nodes..
47553         connections = reduce(childNodes, function(result, e) {
47554             return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
47555         }, connections);
47556
47557         return connections.length ? some(connections, function(e) {
47558             return features.isHidden(e, resolver, e.geometry(resolver));
47559         }) : false;
47560     };
47561
47562
47563     features.isHidden = function(entity, resolver, geometry) {
47564         if (!_hidden.length) return false;
47565         if (!entity.version) return false;
47566
47567         var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
47568         return fn(entity, resolver, geometry);
47569     };
47570
47571
47572     features.filter = function(d, resolver) {
47573         if (!_hidden.length) return d;
47574
47575         var result = [];
47576         for (var i = 0; i < d.length; i++) {
47577             var entity = d[i];
47578             if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
47579                 result.push(entity);
47580             }
47581         }
47582         return result;
47583     };
47584
47585
47586     features.init = function() {
47587         var q = utilStringQs(window.location.hash.substring(1));
47588
47589         if (q.disable_features) {
47590             var disabled = q.disable_features.replace(/;/g, ',').split(',');
47591             disabled.forEach(features.disable);
47592         }
47593     };
47594
47595     return utilRebind(features, dispatch$$1, 'on');
47596 }
47597
47598 function utilBindOnce(target, type, listener, capture) {
47599     var typeOnce = type + '.once';
47600     function one() {
47601         target.on(typeOnce, null);
47602         listener.apply(this, arguments);
47603     }
47604     target.on(typeOnce, one, capture);
47605     return this;
47606 }
47607
47608 function rendererMap(context) {
47609
47610     var dimensions = [1, 1],
47611         dispatch$$1 = dispatch('move', 'drawn'),
47612         projection = context.projection,
47613         curtainProjection = context.curtainProjection,
47614         dblclickEnabled = true,
47615         redrawEnabled = true,
47616         transformStart = projection.transform(),
47617         transformLast,
47618         transformed = false,
47619         minzoom = 0,
47620         drawLayers = svgLayers(projection, context),
47621         drawPoints = svgPoints$$1(projection, context),
47622         drawVertices = svgVertices$$1(projection, context),
47623         drawLines = svgLines$$1(projection, context),
47624         drawAreas = svgAreas$$1(projection, context),
47625         drawMidpoints = svgMidpoints$$1(projection, context),
47626         drawLabels = svgLabels(projection, context),
47627         supersurface = d3_select(null),
47628         wrapper = d3_select(null),
47629         surface = d3_select(null),
47630         mouse,
47631         mousemove;
47632
47633     var zoom = d3_zoom()
47634             .scaleExtent([ztok(2), ztok(24)])
47635             .interpolate(d3_interpolate)
47636             .filter(zoomEventFilter)
47637             .on('zoom', zoomPan);
47638
47639     var _selection = d3_select(null);
47640     var isRedrawScheduled = false;
47641     var pendingRedrawCall;
47642
47643     function scheduleRedraw() {
47644         // Only schedule the redraw if one has not already been set.
47645         if (isRedrawScheduled) return;
47646         isRedrawScheduled = true;
47647         var that = this;
47648         var args = arguments;
47649         pendingRedrawCall = requestIdleCallback(function () {
47650             // Reset the boolean so future redraws can be set.
47651             isRedrawScheduled = false;
47652             redraw.apply(that, args);
47653         }, { timeout: 1400 });
47654     }
47655
47656     function cancelPendingRedraw() {
47657         isRedrawScheduled = false;
47658         window.cancelIdleCallback(pendingRedrawCall);
47659     }
47660
47661     function map(selection$$1) {
47662
47663         _selection = selection$$1;
47664
47665         context
47666             .on('change.map', immediateRedraw);
47667
47668         var osm = context.connection();
47669         if (osm) {
47670             osm.on('change.map', immediateRedraw);
47671         }
47672
47673         context.history()
47674             .on('change.map', immediateRedraw)
47675             .on('undone.map redone.map', function(stack) {
47676                 var mode = context.mode().id;
47677                 if (mode !== 'browse' && mode !== 'select') return;
47678
47679                 var followSelected = false;
47680                 if (Array.isArray(stack.selectedIDs)) {
47681                     followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
47682                     context.enter(
47683                         modeSelect(context, stack.selectedIDs).follow(followSelected)
47684                     );
47685                 }
47686                 if (!followSelected && stack.transform) {
47687                     map.transformEase(stack.transform);
47688                 }
47689             });
47690
47691         context.background()
47692             .on('change.map', immediateRedraw);
47693
47694         context.features()
47695             .on('redraw.map', immediateRedraw);
47696
47697         drawLayers
47698             .on('change.map', function() {
47699                 context.background().updateImagery();
47700                 immediateRedraw();
47701             });
47702
47703         selection$$1
47704             .on('dblclick.map', dblClick)
47705             .call(zoom)
47706             .call(zoom.transform, projection.transform());
47707
47708         supersurface = selection$$1.append('div')
47709             .attr('id', 'supersurface')
47710             .call(utilSetTransform, 0, 0);
47711
47712         // Need a wrapper div because Opera can't cope with an absolutely positioned
47713         // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
47714         wrapper = supersurface
47715             .append('div')
47716             .attr('class', 'layer layer-data');
47717
47718         map.surface = surface = wrapper
47719             .call(drawLayers)
47720             .selectAll('.surface')
47721             .attr('id', 'surface');
47722
47723         surface
47724             .call(drawLabels.observe)
47725             .on('mousedown.zoom', function() {
47726                 if (event.button === 2) {
47727                     event.stopPropagation();
47728                 }
47729             }, true)
47730             .on('mouseup.zoom', function() {
47731                 if (resetTransform()) immediateRedraw();
47732             })
47733             .on('mousemove.map', function() {
47734                 mousemove = event;
47735             })
47736             .on('mouseover.vertices', function() {
47737                 if (map.editable() && !transformed) {
47738                     var hover = event.target.__data__;
47739                     surface.selectAll('.data-layer-osm')
47740                         .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
47741                     dispatch$$1.call('drawn', this, {full: false});
47742                 }
47743             })
47744             .on('mouseout.vertices', function() {
47745                 if (map.editable() && !transformed) {
47746                     var hover = event.relatedTarget && event.relatedTarget.__data__;
47747                     surface.selectAll('.data-layer-osm')
47748                         .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
47749                     dispatch$$1.call('drawn', this, {full: false});
47750                 }
47751             });
47752
47753         supersurface
47754             .call(context.background());
47755
47756         context.on('enter.map', function() {
47757             if (map.editable() && !transformed) {
47758                 var all = context.intersects(map.extent()),
47759                     filter = utilFunctor(true),
47760                     graph = context.graph();
47761
47762                 all = context.features().filter(all, graph);
47763                 surface.selectAll('.data-layer-osm')
47764                     .call(drawVertices, graph, all, filter, map.extent(), map.zoom())
47765                     .call(drawMidpoints, graph, all, filter, map.trimmedExtent());
47766                 dispatch$$1.call('drawn', this, {full: false});
47767             }
47768         });
47769
47770         map.dimensions(utilGetDimensions(selection$$1));
47771     }
47772
47773
47774     function zoomEventFilter() {
47775         // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
47776         // Intercept `mousedown` and check if there is an orphaned zoom gesture.
47777         // This can happen if a previous `mousedown` occurred without a `mouseup`.
47778         // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
47779         // so that d3-zoom won't stop propagation of new `mousedown` events.
47780         if (event.type === 'mousedown') {
47781             var hasOrphan = false;
47782             var listeners = window.__on;
47783             for (var i = 0; i < listeners.length; i++) {
47784                 var listener = listeners[i];
47785                 if (listener.name === 'zoom' && listener.type === 'mouseup') {
47786                     hasOrphan = true;
47787                     break;
47788                 }
47789             }
47790             if (hasOrphan) {
47791                 var event$$1 = window.CustomEvent;
47792                 if (event$$1) {
47793                     event$$1 = new event$$1('mouseup');
47794                 } else {
47795                     event$$1 = window.document.createEvent('Event');
47796                     event$$1.initEvent('mouseup', false, false);
47797                 }
47798                 // Event needs to be dispatched with an event.view property.
47799                 event$$1.view = window;
47800                 window.dispatchEvent(event$$1);
47801             }
47802         }
47803
47804         return event.button !== 2;   // ignore right clicks
47805     }
47806
47807
47808     function ztok(z) {
47809         return 256 * Math.pow(2, z);
47810     }
47811
47812     function ktoz(k) {
47813         return Math.max(Math.log(k) / Math.LN2 - 8, 0);
47814     }
47815
47816     function pxCenter() {
47817         return [dimensions[0] / 2, dimensions[1] / 2];
47818     }
47819
47820
47821     function drawVector(difference, extent) {
47822         var graph = context.graph(),
47823             features = context.features(),
47824             all = context.intersects(map.extent()),
47825             data, filter;
47826
47827         if (difference) {
47828             var complete = difference.complete(map.extent());
47829             data = compact(values$1(complete));
47830             filter = function(d) { return d.id in complete; };
47831             features.clear(data);
47832
47833         } else {
47834             // force a full redraw if gatherStats detects that a feature
47835             // should be auto-hidden (e.g. points or buildings)..
47836             if (features.gatherStats(all, graph, dimensions)) {
47837                 extent = undefined;
47838             }
47839
47840             if (extent) {
47841                 data = context.intersects(map.extent().intersection(extent));
47842                 var set = set$2(map$4(data, 'id'));
47843                 filter = function(d) { return set.has(d.id); };
47844
47845             } else {
47846                 data = all;
47847                 filter = utilFunctor(true);
47848             }
47849         }
47850
47851         data = features.filter(data, graph);
47852
47853         surface.selectAll('.data-layer-osm')
47854             .call(drawVertices, graph, data, filter, map.extent(), map.zoom())
47855             .call(drawLines, graph, data, filter)
47856             .call(drawAreas, graph, data, filter)
47857             .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
47858             .call(drawLabels, graph, data, filter, dimensions, !difference && !extent)
47859             .call(drawPoints, graph, data, filter);
47860
47861         dispatch$$1.call('drawn', this, {full: true});
47862     }
47863
47864
47865     function editOff() {
47866         context.features().resetStats();
47867         surface.selectAll('.layer-osm *').remove();
47868         context.enter(modeBrowse(context));
47869         dispatch$$1.call('drawn', this, {full: true});
47870     }
47871
47872
47873     function dblClick() {
47874         if (!dblclickEnabled) {
47875             event.preventDefault();
47876             event.stopImmediatePropagation();
47877         }
47878     }
47879
47880
47881     function zoomPan(manualEvent) {
47882         var event$$1 = (manualEvent || event),
47883             source = event$$1.sourceEvent,
47884             eventTransform = event$$1.transform;
47885
47886         if (transformStart.x === eventTransform.x &&
47887             transformStart.y === eventTransform.y &&
47888             transformStart.k === eventTransform.k) {
47889             return;  // no change
47890         }
47891
47892         // Normalize mousewheel - #3029
47893         // If wheel delta is provided in LINE units, recalculate it in PIXEL units
47894         // We are essentially redoing the calculations that occur here:
47895         //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
47896         // See this for more info:
47897         //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
47898         if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
47899             // pick sensible scroll amount if user scrolling fast or slow..
47900             var lines = Math.abs(source.deltaY),
47901                 scroll = lines > 2 ? 40 : lines * 10;
47902
47903             var t0 = transformed ? transformLast : transformStart,
47904                 p0 = mouse(source),
47905                 p1 = t0.invert(p0),
47906                 k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500),
47907                 x2 = p0[0] - p1[0] * k2,
47908                 y2 = p0[1] - p1[1] * k2;
47909
47910             eventTransform = identity$7.translate(x2,y2).scale(k2);
47911             _selection.node().__zoom = eventTransform;
47912         }
47913
47914         if (ktoz(eventTransform.k * 2 * Math.PI) < minzoom) {
47915             surface.interrupt();
47916             uiFlash().text(t('cannot_zoom'));
47917             setZoom(context.minEditableZoom(), true);
47918             scheduleRedraw();
47919             dispatch$$1.call('move', this, map);
47920             return;
47921         }
47922
47923         projection.transform(eventTransform);
47924
47925         var scale = eventTransform.k / transformStart.k,
47926             tX = (eventTransform.x / scale - transformStart.x) * scale,
47927             tY = (eventTransform.y / scale - transformStart.y) * scale;
47928
47929         if (context.inIntro()) {
47930             curtainProjection.transform({
47931                 x: eventTransform.x - tX,
47932                 y: eventTransform.y - tY,
47933                 k: eventTransform.k
47934             });
47935         }
47936
47937         mousemove = event$$1;
47938         transformed = true;
47939         transformLast = eventTransform;
47940         utilSetTransform(supersurface, tX, tY, scale);
47941         scheduleRedraw();
47942
47943         dispatch$$1.call('move', this, map);
47944     }
47945
47946
47947     function resetTransform() {
47948         if (!transformed) return false;
47949
47950         // deprecation warning - Radial Menu to be removed in iD v3
47951         surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
47952         utilSetTransform(supersurface, 0, 0);
47953         transformed = false;
47954         if (context.inIntro()) {
47955             curtainProjection.transform(projection.transform());
47956         }
47957         return true;
47958     }
47959
47960
47961     function redraw(difference, extent) {
47962         if (surface.empty() || !redrawEnabled) return;
47963
47964         // If we are in the middle of a zoom/pan, we can't do differenced redraws.
47965         // It would result in artifacts where differenced entities are redrawn with
47966         // one transform and unchanged entities with another.
47967         if (resetTransform()) {
47968             difference = extent = undefined;
47969         }
47970
47971         var z = String(~~map.zoom());
47972         if (surface.attr('data-zoom') !== z) {
47973             surface.attr('data-zoom', z)
47974                 .classed('low-zoom', z <= 16);
47975         }
47976
47977         if (!difference) {
47978             supersurface.call(context.background());
47979         }
47980
47981         wrapper
47982             .call(drawLayers);
47983
47984         // OSM
47985         if (map.editable()) {
47986             context.loadTiles(projection, dimensions);
47987             drawVector(difference, extent);
47988         } else {
47989             editOff();
47990         }
47991
47992         transformStart = projection.transform();
47993
47994         return map;
47995     }
47996
47997
47998
47999     var immediateRedraw = function(difference, extent) {
48000         if (!difference && !extent) cancelPendingRedraw();
48001         redraw(difference, extent);
48002     };
48003
48004
48005     function pointLocation(p) {
48006         var translate = projection.translate(),
48007             scale = projection.scale() * 2 * Math.PI;
48008         return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
48009     }
48010
48011
48012     function locationPoint(l) {
48013         var translate = projection.translate(),
48014             scale = projection.scale() * 2 * Math.PI;
48015         return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
48016     }
48017
48018
48019     map.mouse = function() {
48020         var event$$1 = mousemove || event;
48021         if (event$$1) {
48022             var s;
48023             while ((s = event$$1.sourceEvent)) { event$$1 = s; }
48024             return mouse(event$$1);
48025         }
48026         return null;
48027     };
48028
48029
48030     map.mouseCoordinates = function() {
48031         return projection.invert(map.mouse());
48032     };
48033
48034
48035     map.dblclickEnable = function(_) {
48036         if (!arguments.length) return dblclickEnabled;
48037         dblclickEnabled = _;
48038         return map;
48039     };
48040
48041
48042     map.redrawEnable = function(_) {
48043         if (!arguments.length) return redrawEnabled;
48044         redrawEnabled = _;
48045         return map;
48046     };
48047
48048
48049     function setTransform(t2, duration, force) {
48050         var t$$1 = projection.transform();
48051         if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
48052             return false;
48053         }
48054
48055         if (duration) {
48056             _selection
48057                 .transition()
48058                 .duration(duration)
48059                 .on('start', function() { map.startEase(); })
48060                 .call(zoom.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
48061         } else {
48062             projection.transform(t2);
48063             transformStart = t2;
48064             _selection.call(zoom.transform, transformStart);
48065         }
48066     }
48067
48068
48069     function setZoom(z2, force, duration) {
48070         if (z2 === map.zoom() && !force) {
48071             return false;
48072         }
48073
48074         var k = projection.scale(),
48075             k2 = Math.max(ztok(2), Math.min(ztok(24), ztok(z2))) / (2 * Math.PI),
48076             center = pxCenter(),
48077             l = pointLocation(center);
48078
48079         projection.scale(k2);
48080
48081         var t$$1 = projection.translate();
48082         l = locationPoint(l);
48083
48084         t$$1[0] += center[0] - l[0];
48085         t$$1[1] += center[1] - l[1];
48086
48087         if (duration) {
48088             projection.scale(k);  // reset scale
48089             _selection
48090                 .transition()
48091                 .duration(duration)
48092                 .on('start', function() { map.startEase(); })
48093                 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
48094         } else {
48095             projection.translate(t$$1);
48096             transformStart = projection.transform();
48097             _selection.call(zoom.transform, transformStart);
48098         }
48099
48100         return true;
48101     }
48102
48103
48104     function setCenter(loc2, duration) {
48105         var c = map.center();
48106         if (loc2[0] === c[0] && loc2[1] === c[1]) {
48107             return false;
48108         }
48109
48110         var t$$1 = projection.translate(),
48111             k = projection.scale(),
48112             pxC = pxCenter(),
48113             ll = projection(loc2);
48114
48115         t$$1[0] = t$$1[0] - ll[0] + pxC[0];
48116         t$$1[1] = t$$1[1] - ll[1] + pxC[1];
48117
48118         if (duration) {
48119             _selection
48120                 .transition()
48121                 .duration(duration)
48122                 .on('start', function() { map.startEase(); })
48123                 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
48124         } else {
48125             projection.translate(t$$1);
48126             transformStart = projection.transform();
48127             _selection.call(zoom.transform, transformStart);
48128         }
48129
48130         return true;
48131     }
48132
48133
48134     map.pan = function(delta, duration) {
48135         var t$$1 = projection.translate(),
48136             k = projection.scale();
48137
48138         t$$1[0] += delta[0];
48139         t$$1[1] += delta[1];
48140
48141         if (duration) {
48142             _selection
48143                 .transition()
48144                 .duration(duration)
48145                 .on('start', function() { map.startEase(); })
48146                 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
48147         } else {
48148             projection.translate(t$$1);
48149             transformStart = projection.transform();
48150             _selection.call(zoom.transform, transformStart);
48151             dispatch$$1.call('move', this, map);
48152             immediateRedraw();
48153         }
48154
48155         return map;
48156     };
48157
48158
48159     map.dimensions = function(_) {
48160         if (!arguments.length) return dimensions;
48161         var center = map.center();
48162         dimensions = _;
48163         drawLayers.dimensions(dimensions);
48164         context.background().dimensions(dimensions);
48165         projection.clipExtent([[0, 0], dimensions]);
48166         mouse = utilFastMouse(supersurface.node());
48167         setCenter(center);
48168
48169         scheduleRedraw();
48170         return map;
48171     };
48172
48173
48174     function zoomIn(delta) {
48175         setZoom(~~map.zoom() + delta, true, 250);
48176     }
48177
48178     function zoomOut(delta) {
48179         setZoom(~~map.zoom() - delta, true, 250);
48180     }
48181
48182     map.zoomIn = function() { zoomIn(1); };
48183     map.zoomInFurther = function() { zoomIn(4); };
48184
48185     map.zoomOut = function() { zoomOut(1); };
48186     map.zoomOutFurther = function() { zoomOut(4); };
48187
48188
48189     map.center = function(loc2) {
48190         if (!arguments.length) {
48191             return projection.invert(pxCenter());
48192         }
48193
48194         if (setCenter(loc2)) {
48195             dispatch$$1.call('move', this, map);
48196         }
48197
48198         scheduleRedraw();
48199         return map;
48200     };
48201
48202
48203     map.zoom = function(z2) {
48204         if (!arguments.length) {
48205             return Math.max(ktoz(projection.scale() * 2 * Math.PI), 0);
48206         }
48207
48208         if (z2 < minzoom) {
48209             surface.interrupt();
48210             uiFlash().text(t('cannot_zoom'));
48211             z2 = context.minEditableZoom();
48212         }
48213
48214         if (setZoom(z2)) {
48215             dispatch$$1.call('move', this, map);
48216         }
48217
48218         scheduleRedraw();
48219         return map;
48220     };
48221
48222
48223     map.zoomTo = function(entity, zoomLimits) {
48224         var extent = entity.extent(context.graph());
48225         if (!isFinite(extent.area())) return;
48226
48227         var z2 = map.trimmedExtentZoom(extent);
48228         zoomLimits = zoomLimits || [context.minEditableZoom(), 20];
48229         map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
48230     };
48231
48232
48233     map.centerZoom = function(loc2, z2) {
48234         var centered = setCenter(loc2),
48235             zoomed   = setZoom(z2);
48236
48237         if (centered || zoomed) {
48238             dispatch$$1.call('move', this, map);
48239         }
48240
48241         scheduleRedraw();
48242         return map;
48243     };
48244
48245
48246     map.centerEase = function(loc2, duration) {
48247         duration = duration || 250;
48248         setCenter(loc2, duration);
48249         return map;
48250     };
48251
48252
48253     map.zoomEase = function(z2, duration) {
48254         duration = duration || 250;
48255         setZoom(z2, false, duration);
48256         return map;
48257     };
48258
48259
48260     map.transformEase = function(t2, duration) {
48261         duration = duration || 250;
48262         setTransform(t2, duration, false);
48263         return map;
48264     };
48265
48266
48267     map.startEase = function() {
48268         utilBindOnce(surface, 'mousedown.ease', function() {
48269             map.cancelEase();
48270         });
48271         return map;
48272     };
48273
48274
48275     map.cancelEase = function() {
48276         _selection.interrupt();
48277         return map;
48278     };
48279
48280
48281     map.extent = function(_) {
48282         if (!arguments.length) {
48283             return new geoExtent$$1(projection.invert([0, dimensions[1]]),
48284                                  projection.invert([dimensions[0], 0]));
48285         } else {
48286             var extent = geoExtent$$1(_);
48287             map.centerZoom(extent.center(), map.extentZoom(extent));
48288         }
48289     };
48290
48291
48292     map.trimmedExtent = function(_) {
48293         if (!arguments.length) {
48294             var headerY = 60, footerY = 30, pad = 10;
48295             return new geoExtent$$1(projection.invert([pad, dimensions[1] - footerY - pad]),
48296                                  projection.invert([dimensions[0] - pad, headerY + pad]));
48297         } else {
48298             var extent = geoExtent$$1(_);
48299             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
48300         }
48301     };
48302
48303
48304     function calcZoom(extent, dim) {
48305         var tl = projection([extent[0][0], extent[1][1]]),
48306             br = projection([extent[1][0], extent[0][1]]);
48307
48308         // Calculate maximum zoom that fits extent
48309         var hFactor = (br[0] - tl[0]) / dim[0],
48310             vFactor = (br[1] - tl[1]) / dim[1],
48311             hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
48312             vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
48313             newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
48314
48315         return newZoom;
48316     }
48317
48318
48319     map.extentZoom = function(_) {
48320         return calcZoom(geoExtent$$1(_), dimensions);
48321     };
48322
48323
48324     map.trimmedExtentZoom = function(_) {
48325         var trimY = 120, trimX = 40,
48326             trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
48327         return calcZoom(geoExtent$$1(_), trimmed);
48328     };
48329
48330
48331     map.editable = function() {
48332         var osmLayer = surface.selectAll('.data-layer-osm');
48333         if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
48334
48335         return map.zoom() >= context.minEditableZoom();
48336     };
48337
48338
48339     map.minzoom = function(_) {
48340         if (!arguments.length) return minzoom;
48341         minzoom = _;
48342         return map;
48343     };
48344
48345
48346     map.layers = drawLayers;
48347
48348
48349     return utilRebind(map, dispatch$$1, 'on');
48350 }
48351
48352 var TAU = 2 * Math.PI;
48353 function ztok(z) { return 256 * Math.pow(2, z) / TAU; }
48354 function ktoz(k) { return Math.log(k * TAU) / Math.LN2 - 8; }
48355 function vecSub(a, b) { return [ a[0] - b[0], a[1] - b[1] ]; }
48356 function vecScale(a, b) { return [ a[0] * b, a[1] * b ]; }
48357
48358
48359 function uiMapInMap(context) {
48360
48361
48362     function map_in_map(selection$$1) {
48363         var backgroundLayer = rendererTileLayer(context),
48364             overlayLayers = {},
48365             projection$$1 = geoRawMercator(),
48366             gpxLayer = svgGpx(projection$$1, context).showLabels(false),
48367             debugLayer = svgDebug(projection$$1, context),
48368             zoom = d3_zoom()
48369                 .scaleExtent([ztok(0.5), ztok(24)])
48370                 .on('start', zoomStarted)
48371                 .on('zoom', zoomed)
48372                 .on('end', zoomEnded),
48373             isTransformed = false,
48374             isHidden = true,
48375             skipEvents = false,
48376             gesture = null,
48377             zDiff = 6,    // by default, minimap renders at (main zoom - 6)
48378             wrap = d3_select(null),
48379             tiles = d3_select(null),
48380             viewport = d3_select(null),
48381             tStart,  // transform at start of gesture
48382             tCurr,   // transform at most recent event
48383             timeoutId;
48384
48385
48386         function zoomStarted() {
48387             if (skipEvents) return;
48388             tStart = tCurr = projection$$1.transform();
48389             gesture = null;
48390         }
48391
48392
48393         function zoomed() {
48394             if (skipEvents) return;
48395
48396             var x = event.transform.x,
48397                 y = event.transform.y,
48398                 k = event.transform.k,
48399                 isZooming = (k !== tStart.k),
48400                 isPanning = (x !== tStart.x || y !== tStart.y);
48401
48402             if (!isZooming && !isPanning) {
48403                 return;  // no change
48404             }
48405
48406             // lock in either zooming or panning, don't allow both in minimap.
48407             if (!gesture) {
48408                 gesture = isZooming ? 'zoom' : 'pan';
48409             }
48410
48411             var tMini = projection$$1.transform(),
48412                 tX, tY, scale;
48413
48414             if (gesture === 'zoom') {
48415                 var dMini = utilGetDimensions(wrap),
48416                     cMini = vecScale(dMini, 0.5);
48417                 scale = k / tMini.k;
48418                 tX = (cMini[0] / scale - cMini[0]) * scale;
48419                 tY = (cMini[1] / scale - cMini[1]) * scale;
48420             } else {
48421                 k = tMini.k;
48422                 scale = 1;
48423                 tX = x - tMini.x;
48424                 tY = y - tMini.y;
48425             }
48426
48427             utilSetTransform(tiles, tX, tY, scale);
48428             utilSetTransform(viewport, 0, 0, scale);
48429             isTransformed = true;
48430             tCurr = identity$7.translate(x, y).scale(k);
48431
48432             var zMain = ktoz(context.projection.scale()),
48433                 zMini = ktoz(k);
48434
48435             zDiff = zMain - zMini;
48436
48437             queueRedraw();
48438         }
48439
48440
48441         function zoomEnded() {
48442             if (skipEvents) return;
48443             if (gesture !== 'pan') return;
48444
48445             updateProjection();
48446             gesture = null;
48447             var dMini = utilGetDimensions(wrap),
48448                 cMini = vecScale(dMini, 0.5);
48449             context.map().center(projection$$1.invert(cMini));   // recenter main map..
48450         }
48451
48452
48453         function updateProjection() {
48454             var loc = context.map().center(),
48455                 dMini = utilGetDimensions(wrap),
48456                 cMini = vecScale(dMini, 0.5),
48457                 tMain = context.projection.transform(),
48458                 zMain = ktoz(tMain.k),
48459                 zMini = Math.max(zMain - zDiff, 0.5),
48460                 kMini = ztok(zMini);
48461
48462             projection$$1
48463                 .translate([tMain.x, tMain.y])
48464                 .scale(kMini);
48465
48466             var point = projection$$1(loc),
48467                 mouse = (gesture === 'pan') ? vecSub([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0],
48468                 xMini = cMini[0] - point[0] + tMain.x + mouse[0],
48469                 yMini = cMini[1] - point[1] + tMain.y + mouse[1];
48470
48471             projection$$1
48472                 .translate([xMini, yMini])
48473                 .clipExtent([[0, 0], dMini]);
48474
48475             tCurr = projection$$1.transform();
48476
48477             if (isTransformed) {
48478                 utilSetTransform(tiles, 0, 0);
48479                 utilSetTransform(viewport, 0, 0);
48480                 isTransformed = false;
48481             }
48482
48483             zoom
48484                 .scaleExtent([ztok(0.5), ztok(zMain - 3)]);
48485
48486             skipEvents = true;
48487             wrap.call(zoom.transform, tCurr);
48488             skipEvents = false;
48489         }
48490
48491
48492         function redraw() {
48493             clearTimeout(timeoutId);
48494             if (isHidden) return;
48495
48496             updateProjection();
48497
48498             var dMini = utilGetDimensions(wrap),
48499                 zMini = ktoz(projection$$1.scale());
48500
48501             // setup tile container
48502             tiles = wrap
48503                 .selectAll('.map-in-map-tiles')
48504                 .data([0]);
48505
48506             tiles = tiles.enter()
48507                 .append('div')
48508                 .attr('class', 'map-in-map-tiles')
48509                 .merge(tiles);
48510
48511             // redraw background
48512             backgroundLayer
48513                 .source(context.background().baseLayerSource())
48514                 .projection(projection$$1)
48515                 .dimensions(dMini);
48516
48517             var background = tiles
48518                 .selectAll('.map-in-map-background')
48519                 .data([0]);
48520
48521             background.enter()
48522                 .append('div')
48523                 .attr('class', 'map-in-map-background')
48524                 .merge(background)
48525                 .call(backgroundLayer);
48526
48527
48528             // redraw overlay
48529             var overlaySources = context.background().overlayLayerSources();
48530             var activeOverlayLayers = [];
48531             for (var i = 0; i < overlaySources.length; i++) {
48532                 if (overlaySources[i].validZoom(zMini)) {
48533                     if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
48534                     activeOverlayLayers.push(overlayLayers[i]
48535                         .source(overlaySources[i])
48536                         .projection(projection$$1)
48537                         .dimensions(dMini));
48538                 }
48539             }
48540
48541             var overlay = tiles
48542                 .selectAll('.map-in-map-overlay')
48543                 .data([0]);
48544
48545             overlay = overlay.enter()
48546                 .append('div')
48547                 .attr('class', 'map-in-map-overlay')
48548                 .merge(overlay);
48549
48550
48551             var overlays = overlay
48552                 .selectAll('div')
48553                 .data(activeOverlayLayers, function(d) { return d.source().name(); });
48554
48555             overlays.exit()
48556                 .remove();
48557
48558             overlays = overlays.enter()
48559                 .append('div')
48560                 .merge(overlays)
48561                 .each(function(layer) { d3_select(this).call(layer); });
48562
48563
48564             var dataLayers = tiles
48565                 .selectAll('.map-in-map-data')
48566                 .data([0]);
48567
48568             dataLayers.exit()
48569                 .remove();
48570
48571             dataLayers = dataLayers.enter()
48572                 .append('svg')
48573                 .attr('class', 'map-in-map-data')
48574                 .merge(dataLayers)
48575                 .call(gpxLayer)
48576                 .call(debugLayer);
48577
48578
48579             // redraw viewport bounding box
48580             if (gesture !== 'pan') {
48581                 var getPath = d3_geoPath(projection$$1),
48582                     bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
48583
48584                 viewport = wrap.selectAll('.map-in-map-viewport')
48585                     .data([0]);
48586
48587                 viewport = viewport.enter()
48588                     .append('svg')
48589                     .attr('class', 'map-in-map-viewport')
48590                     .merge(viewport);
48591
48592
48593                 var path = viewport.selectAll('.map-in-map-bbox')
48594                     .data([bbox]);
48595
48596                 path.enter()
48597                     .append('path')
48598                     .attr('class', 'map-in-map-bbox')
48599                     .merge(path)
48600                     .attr('d', getPath)
48601                     .classed('thick', function(d) { return getPath.area(d) < 30; });
48602             }
48603         }
48604
48605
48606         function queueRedraw() {
48607             clearTimeout(timeoutId);
48608             timeoutId = setTimeout(function() { redraw(); }, 750);
48609         }
48610
48611
48612         function toggle() {
48613             if (event) event.preventDefault();
48614
48615             isHidden = !isHidden;
48616
48617             var label = d3_select('.minimap-toggle');
48618             label.classed('active', !isHidden)
48619                 .select('input').property('checked', !isHidden);
48620
48621             if (isHidden) {
48622                 wrap
48623                     .style('display', 'block')
48624                     .style('opacity', '1')
48625                     .transition()
48626                     .duration(200)
48627                     .style('opacity', '0')
48628                     .on('end', function() {
48629                         selection$$1.selectAll('.map-in-map')
48630                             .style('display', 'none');
48631                     });
48632             } else {
48633                 wrap
48634                     .style('display', 'block')
48635                     .style('opacity', '0')
48636                     .transition()
48637                     .duration(200)
48638                     .style('opacity', '1')
48639                     .on('end', function() {
48640                         redraw();
48641                     });
48642             }
48643         }
48644
48645
48646         uiMapInMap.toggle = toggle;
48647
48648         wrap = selection$$1.selectAll('.map-in-map')
48649             .data([0]);
48650
48651         wrap = wrap.enter()
48652             .append('div')
48653             .attr('class', 'map-in-map')
48654             .style('display', (isHidden ? 'none' : 'block'))
48655             .call(zoom)
48656             .on('dblclick.zoom', null)
48657             .merge(wrap);
48658
48659         context.map()
48660             .on('drawn.map-in-map', function(drawn) {
48661                 if (drawn.full === true) {
48662                     redraw();
48663                 }
48664             });
48665
48666         redraw();
48667
48668         var keybinding = d3keybinding('map-in-map')
48669             .on(t('background.minimap.key'), toggle);
48670
48671         d3_select(document)
48672             .call(keybinding);
48673     }
48674
48675     return map_in_map;
48676 }
48677
48678 function uiTooltipHtml(text, key, heading) {
48679     var s = '';
48680
48681     if (heading) {
48682         s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
48683     }
48684     if (text) {
48685         s += '<div class="tooltip-text"><span>' + text + '</span></div>';
48686     }
48687     if (key) {
48688         s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
48689             '<span class="keyhint">' + key + '</span></div>';
48690     }
48691
48692     return s;
48693 }
48694
48695 function uiBackground(context) {
48696     var key = t('background.key'),
48697         detected = utilDetect(),
48698         opacities = [1, 0.75, 0.5, 0.25],
48699         directions = [
48700             ['right', [0.5, 0]],
48701             ['top', [0, -0.5]],
48702             ['left', [-0.5, 0]],
48703             ['bottom', [0, 0.5]]],
48704         opacityDefault = (context.storage('background-opacity') !== null) ?
48705             (+context.storage('background-opacity')) : 1.0,
48706         customSource = context.background().findSource('custom'),
48707         previous;
48708
48709     // Can be 0 from <1.3.0 use or due to issue #1923.
48710     if (opacityDefault === 0) opacityDefault = 1.0;
48711
48712
48713     function background(selection$$1) {
48714
48715         function sortSources(a, b) {
48716             return a.best() && !b.best() ? -1
48717                 : b.best() && !a.best() ? 1
48718                 : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
48719         }
48720
48721
48722         function setOpacity(d) {
48723             var bg = context.container().selectAll('.layer-background')
48724                 .transition()
48725                 .style('opacity', d)
48726                 .attr('data-opacity', d);
48727
48728             if (!detected.opera) {
48729                 utilSetTransform(bg, 0, 0);
48730             }
48731
48732             opacityList.selectAll('li')
48733                 .classed('active', function(_) { return _ === d; });
48734
48735             context.storage('background-opacity', d);
48736         }
48737
48738
48739         function setTooltips(selection$$1) {
48740             selection$$1.each(function(d, i, nodes) {
48741                 var item = d3_select(this).select('label'),
48742                     span = item.select('span'),
48743                     placement = (i < nodes.length / 2) ? 'bottom' : 'top',
48744                     description = d.description(),
48745                     isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
48746
48747                 if (d === previous) {
48748                     item.call(tooltip()
48749                         .placement(placement)
48750                         .html(true)
48751                         .title(function() {
48752                             var tip = '<div>' + t('background.switch') + '</div>';
48753                             return uiTooltipHtml(tip, uiCmd('⌘' + key));
48754                         })
48755                     );
48756                 } else if (description || isOverflowing) {
48757                     item.call(tooltip()
48758                         .placement(placement)
48759                         .title(description || d.name())
48760                     );
48761                 } else {
48762                     item.call(tooltip().destroy);
48763                 }
48764             });
48765         }
48766
48767
48768         function selectLayer() {
48769             function active(d) {
48770                 return context.background().showsLayer(d);
48771             }
48772
48773             content.selectAll('.layer')
48774                 .classed('active', active)
48775                 .classed('switch', function(d) { return d === previous; })
48776                 .call(setTooltips)
48777                 .selectAll('input')
48778                 .property('checked', active);
48779         }
48780
48781
48782         function clickSetSource(d) {
48783             if (d.id === 'custom' && !d.template()) {
48784                 return editCustom();
48785             }
48786
48787             event.preventDefault();
48788             previous = context.background().baseLayerSource();
48789             context.background().baseLayerSource(d);
48790             selectLayer();
48791             document.activeElement.blur();
48792         }
48793
48794
48795         function editCustom() {
48796             event.preventDefault();
48797             var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
48798             var template = window.prompt(
48799                 t('background.custom_prompt', { example: example }),
48800                 customSource.template() || example
48801             );
48802
48803             if (template) {
48804                 context.storage('background-custom-template', template);
48805                 customSource.template(template);
48806                 clickSetSource(customSource);
48807             } else {
48808                 selectLayer();
48809             }
48810         }
48811
48812
48813         function clickSetOverlay(d) {
48814             event.preventDefault();
48815             context.background().toggleOverlayLayer(d);
48816             selectLayer();
48817             document.activeElement.blur();
48818         }
48819
48820
48821         function drawList(layerList, type, change, filter) {
48822             var sources = context.background()
48823                 .sources(context.map().extent())
48824                 .filter(filter);
48825
48826             var layerLinks = layerList.selectAll('li.layer')
48827                 .data(sources, function(d) { return d.name(); });
48828
48829             layerLinks.exit()
48830                 .remove();
48831
48832             var enter = layerLinks.enter()
48833                 .append('li')
48834                 .attr('class', 'layer')
48835                 .classed('layer-custom', function(d) { return d.id === 'custom'; })
48836                 .classed('best', function(d) { return d.best(); });
48837
48838             enter.filter(function(d) { return d.id === 'custom'; })
48839                 .append('button')
48840                 .attr('class', 'layer-browse')
48841                 .call(tooltip()
48842                     .title(t('background.custom_button'))
48843                     .placement((textDirection === 'rtl') ? 'right' : 'left'))
48844                 .on('click', editCustom)
48845                 .call(svgIcon('#icon-search'));
48846
48847             enter.filter(function(d) { return d.best(); })
48848                 .append('div')
48849                 .attr('class', 'best')
48850                 .call(tooltip()
48851                     .title(t('background.best_imagery'))
48852                     .placement((textDirection === 'rtl') ? 'right' : 'left'))
48853                 .append('span')
48854                 .html('&#9733;');
48855
48856             var label = enter
48857                 .append('label');
48858
48859             label
48860                 .append('input')
48861                 .attr('type', type)
48862                 .attr('name', 'layers')
48863                 .on('change', change);
48864
48865             label
48866                 .append('span')
48867                 .text(function(d) { return d.name(); });
48868
48869
48870             layerList.selectAll('li.layer')
48871                 .sort(sortSources)
48872                 .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
48873         }
48874
48875
48876         function update() {
48877             backgroundList.call(drawList, 'radio', clickSetSource, function(d) { return !d.isHidden() && !d.overlay; });
48878             overlayList.call(drawList, 'checkbox', clickSetOverlay, function(d) { return !d.isHidden() && d.overlay; });
48879
48880             selectLayer();
48881             updateOffsetVal();
48882         }
48883
48884
48885         function updateOffsetVal() {
48886             var meters = geoOffsetToMeters(context.background().offset()),
48887                 x = +meters[0].toFixed(2),
48888                 y = +meters[1].toFixed(2);
48889
48890             d3_selectAll('.nudge-inner-rect')
48891                 .select('input')
48892                 .classed('error', false)
48893                 .property('value', x + ', ' + y);
48894
48895             d3_selectAll('.nudge-reset')
48896                 .classed('disabled', function() {
48897                     return (x === 0 && y === 0);
48898                 });
48899         }
48900
48901
48902         function resetOffset() {
48903             if (event.button !== 0) return;
48904             context.background().offset([0, 0]);
48905             updateOffsetVal();
48906         }
48907
48908
48909         function nudge(d) {
48910             context.background().nudge(d, context.map().zoom());
48911             updateOffsetVal();
48912         }
48913
48914
48915         function buttonOffset(d) {
48916             if (event.button !== 0) return;
48917             var timeout = window.setTimeout(function() {
48918                     interval = window.setInterval(nudge.bind(null, d), 100);
48919                 }, 500),
48920                 interval;
48921
48922             function doneNudge() {
48923                 window.clearTimeout(timeout);
48924                 window.clearInterval(interval);
48925                 d3_select(window)
48926                     .on('mouseup.buttonoffset', null, true)
48927                     .on('mousedown.buttonoffset', null, true);
48928             }
48929
48930             d3_select(window)
48931                 .on('mouseup.buttonoffset', doneNudge, true)
48932                 .on('mousedown.buttonoffset', doneNudge, true);
48933
48934             nudge(d);
48935         }
48936
48937
48938         function inputOffset() {
48939             if (event.button !== 0) return;
48940             var input = d3_select(this);
48941             var d = input.node().value;
48942
48943             if (d === '') return resetOffset();
48944
48945             d = d.replace(/;/g, ',').split(',').map(function(n) {
48946                 // if n is NaN, it will always get mapped to false.
48947                 return !isNaN(n) && n;
48948             });
48949
48950             if (d.length !== 2 || !d[0] || !d[1]) {
48951                 input.classed('error', true);
48952                 return;
48953             }
48954
48955             context.background().offset(geoMetersToOffset(d));
48956             updateOffsetVal();
48957         }
48958
48959
48960         function dragOffset() {
48961             if (event.button !== 0) return;
48962             var origin = [event.clientX, event.clientY];
48963
48964             context.container()
48965                 .append('div')
48966                 .attr('class', 'nudge-surface');
48967
48968             d3_select(window)
48969                 .on('mousemove.offset', function() {
48970                     var latest = [event.clientX, event.clientY];
48971                     var d = [
48972                         -(origin[0] - latest[0]) / 4,
48973                         -(origin[1] - latest[1]) / 4
48974                     ];
48975
48976                     origin = latest;
48977                     nudge(d);
48978                 })
48979                 .on('mouseup.offset', function() {
48980                     if (event.button !== 0) return;
48981                     d3_selectAll('.nudge-surface')
48982                         .remove();
48983
48984                     d3_select(window)
48985                         .on('mousemove.offset', null)
48986                         .on('mouseup.offset', null);
48987                 });
48988
48989             event.preventDefault();
48990         }
48991
48992
48993         function hide() {
48994             setVisible(false);
48995         }
48996
48997
48998         function toggle() {
48999             if (event) {
49000                 event.preventDefault();
49001             }
49002             tooltipBehavior.hide(button);
49003             setVisible(!button.classed('active'));
49004         }
49005
49006
49007         function quickSwitch() {
49008             if (event) {
49009                 event.stopImmediatePropagation();
49010                 event.preventDefault();
49011             }
49012             if (previous) {
49013                 clickSetSource(previous);
49014             }
49015         }
49016
49017
49018         function setVisible(show) {
49019             if (show !== shown) {
49020                 button.classed('active', show);
49021                 shown = show;
49022
49023                 if (show) {
49024                     selection$$1
49025                         .on('mousedown.background-inside', function() {
49026                             event.stopPropagation();
49027                         });
49028
49029                     content
49030                         .style('display', 'block')
49031                         .style('right', '-300px')
49032                         .transition()
49033                         .duration(200)
49034                         .style('right', '0px');
49035
49036                     content.selectAll('.layer')
49037                         .call(setTooltips);
49038
49039                 } else {
49040                     content
49041                         .style('display', 'block')
49042                         .style('right', '0px')
49043                         .transition()
49044                         .duration(200)
49045                         .style('right', '-300px')
49046                         .on('end', function() {
49047                             d3_select(this).style('display', 'none');
49048                         });
49049
49050                     selection$$1
49051                         .on('mousedown.background-inside', null);
49052                 }
49053             }
49054         }
49055
49056
49057         var content = selection$$1
49058                 .append('div')
49059                 .attr('class', 'fillL map-overlay col3 content hide'),
49060             tooltipBehavior = tooltip()
49061                 .placement((textDirection === 'rtl') ? 'right' : 'left')
49062                 .html(true)
49063                 .title(uiTooltipHtml(t('background.description'), key)),
49064             button = selection$$1
49065                 .append('button')
49066                 .attr('tabindex', -1)
49067                 .on('click', toggle)
49068                 .call(svgIcon('#icon-layers', 'light'))
49069                 .call(tooltipBehavior),
49070             shown = false;
49071
49072
49073         /* opacity switcher */
49074
49075         var opawrap = content
49076                 .append('div')
49077                 .attr('class', 'opacity-options-wrapper');
49078
49079         opawrap
49080             .append('h4')
49081             .text(t('background.title'));
49082
49083         var opacityList = opawrap
49084             .append('ul')
49085             .attr('class', 'opacity-options');
49086
49087         opacityList.selectAll('div.opacity')
49088             .data(opacities)
49089             .enter()
49090             .append('li')
49091             .attr('data-original-title', function(d) {
49092                 return t('background.percent_brightness', { opacity: (d * 100) });
49093             })
49094             .on('click.set-opacity', setOpacity)
49095             .html('<div class="select-box"></div>')
49096             .call(tooltip()
49097                 .placement((textDirection === 'rtl') ? 'right' : 'left'))
49098             .append('div')
49099             .attr('class', 'opacity')
49100             .style('opacity', function(d) { return 1.25 - d; });
49101
49102
49103         /* background list */
49104
49105         var backgroundList = content
49106             .append('ul')
49107             .attr('class', 'layer-list')
49108             .attr('dir', 'auto');
49109
49110         content
49111             .append('div')
49112             .attr('class', 'imagery-faq')
49113             .append('a')
49114             .attr('target', '_blank')
49115             .attr('tabindex', -1)
49116             .call(svgIcon('#icon-out-link', 'inline'))
49117             .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
49118             .append('span')
49119             .text(t('background.imagery_source_faq'));
49120
49121
49122         /* overlay list */
49123
49124         var overlayList = content
49125             .append('ul')
49126             .attr('class', 'layer-list');
49127
49128         var controls = content
49129             .append('div')
49130             .attr('class', 'controls-list');
49131
49132
49133         /* minimap toggle */
49134
49135         var minimapLabel = controls
49136             .append('label')
49137             .call(tooltip()
49138                 .html(true)
49139                 .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
49140                 .placement('top')
49141             );
49142
49143         minimapLabel
49144             .classed('minimap-toggle', true)
49145             .append('input')
49146             .attr('type', 'checkbox')
49147             .on('change', function() {
49148                 uiMapInMap.toggle();
49149                 event.preventDefault();
49150             });
49151
49152         minimapLabel
49153             .append('span')
49154             .text(t('background.minimap.description'));
49155
49156
49157         /* imagery offset controls */
49158
49159         var adjustments = content
49160             .append('div')
49161             .attr('class', 'adjustments');
49162
49163         adjustments
49164             .append('a')
49165             .text(t('background.fix_misalignment'))
49166             .attr('href', '#')
49167             .classed('hide-toggle', true)
49168             .classed('expanded', false)
49169             .on('click', function() {
49170                 if (event.button !== 0) return;
49171                 var exp = d3_select(this).classed('expanded');
49172                 nudgeContainer.style('display', exp ? 'none' : 'block');
49173                 d3_select(this).classed('expanded', !exp);
49174                 event.preventDefault();
49175             });
49176
49177         var nudgeContainer = adjustments
49178             .append('div')
49179             .attr('class', 'nudge-container cf')
49180             .style('display', 'none');
49181
49182         nudgeContainer
49183             .append('div')
49184             .attr('class', 'nudge-instructions')
49185             .text(t('background.offset'));
49186
49187         var nudgeRect = nudgeContainer
49188             .append('div')
49189             .attr('class', 'nudge-outer-rect')
49190             .on('mousedown', dragOffset);
49191
49192         nudgeRect
49193             .append('div')
49194             .attr('class', 'nudge-inner-rect')
49195             .append('input')
49196             .on('change', inputOffset)
49197             .on('mousedown', function() {
49198                 if (event.button !== 0) return;
49199                 event.stopPropagation();
49200             });
49201
49202         nudgeContainer
49203             .append('div')
49204             .selectAll('button')
49205             .data(directions).enter()
49206             .append('button')
49207             .attr('class', function(d) { return d[0] + ' nudge'; })
49208             .on('mousedown', function(d) {
49209                 if (event.button !== 0) return;
49210                 buttonOffset(d[1]);
49211             });
49212
49213         nudgeContainer
49214             .append('button')
49215             .attr('title', t('background.reset'))
49216             .attr('class', 'nudge-reset disabled')
49217             .on('click', resetOffset)
49218             .call(
49219                 (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
49220             );
49221
49222         context.map()
49223             .on('move.background-update', debounce$1(utilCallWhenIdle(update), 1000));
49224
49225         context.background()
49226             .on('change.background-update', update);
49227
49228
49229         update();
49230         setOpacity(opacityDefault);
49231
49232         var keybinding = d3keybinding('background')
49233             .on(key, toggle)
49234             .on(uiCmd('⌘' + key), quickSwitch)
49235             .on([t('map_data.key'), t('help.key')], hide);
49236
49237         d3_select(document)
49238             .call(keybinding);
49239
49240         context.surface().on('mousedown.background-outside', hide);
49241         context.container().on('mousedown.background-outside', hide);
49242     }
49243
49244     return background;
49245 }
49246
49247 function uiContributors(context) {
49248     var osm = context.connection(),
49249         debouncedUpdate = debounce$1(function() { update(); }, 1000),
49250         limit = 4,
49251         hidden = false,
49252         wrap = d3_select(null);
49253
49254
49255     function update() {
49256         if (!osm) return;
49257
49258         var users = {},
49259             entities = context.intersects(context.map().extent());
49260
49261         entities.forEach(function(entity) {
49262             if (entity && entity.user) users[entity.user] = true;
49263         });
49264
49265         var u = Object.keys(users),
49266             subset = u.slice(0, u.length > limit ? limit - 1 : limit);
49267
49268         wrap.html('')
49269             .call(svgIcon('#icon-nearby', 'pre-text light'));
49270
49271         var userList = d3_select(document.createElement('span'));
49272
49273         userList.selectAll()
49274             .data(subset)
49275             .enter()
49276             .append('a')
49277             .attr('class', 'user-link')
49278             .attr('href', function(d) { return osm.userURL(d); })
49279             .attr('target', '_blank')
49280             .attr('tabindex', -1)
49281             .text(String);
49282
49283         if (u.length > limit) {
49284             var count = d3_select(document.createElement('span'));
49285
49286             count.append('a')
49287                 .attr('target', '_blank')
49288                 .attr('tabindex', -1)
49289                 .attr('href', function() {
49290                     return osm.changesetsURL(context.map().center(), context.map().zoom());
49291                 })
49292                 .text(u.length - limit + 1);
49293
49294             wrap.append('span')
49295                 .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
49296
49297         } else {
49298             wrap.append('span')
49299                 .html(t('contributors.list', { users: userList.html() }));
49300         }
49301
49302         if (!u.length) {
49303             hidden = true;
49304             wrap
49305                 .transition()
49306                 .style('opacity', 0);
49307
49308         } else if (hidden) {
49309             wrap
49310                 .transition()
49311                 .style('opacity', 1);
49312         }
49313     }
49314
49315
49316     return function(selection$$1) {
49317         if (!osm) return;
49318         wrap = selection$$1;
49319         update();
49320
49321         osm.on('loaded.contributors', debouncedUpdate);
49322         context.map().on('move.contributors', debouncedUpdate);
49323     };
49324 }
49325
49326 function uiFeatureInfo(context) {
49327     function update(selection$$1) {
49328         var features = context.features(),
49329             stats = features.stats(),
49330             count = 0,
49331             hiddenList = compact(map$4(features.hidden(), function(k) {
49332                 if (stats[k]) {
49333                     count += stats[k];
49334                     return String(stats[k]) + ' ' + t('feature.' + k + '.description');
49335                 }
49336             }));
49337
49338         selection$$1.html('');
49339
49340         if (hiddenList.length) {
49341             var tooltipBehavior = tooltip()
49342                 .placement('top')
49343                 .html(true)
49344                 .title(function() {
49345                     return uiTooltipHtml(hiddenList.join('<br/>'));
49346                 });
49347
49348             var warning = selection$$1.append('a')
49349                 .attr('href', '#')
49350                 .attr('tabindex', -1)
49351                 .html(t('feature_info.hidden_warning', { count: count }))
49352                 .call(tooltipBehavior)
49353                 .on('click', function() {
49354                     tooltipBehavior.hide(warning);
49355                     // open map data panel?
49356                     event.preventDefault();
49357                 });
49358         }
49359
49360         selection$$1
49361             .classed('hide', !hiddenList.length);
49362     }
49363
49364
49365     return function(selection$$1) {
49366         update(selection$$1);
49367
49368         context.features().on('change.feature_info', function() {
49369             update(selection$$1);
49370         });
49371     };
49372 }
49373
49374 function uiFullScreen(context) {
49375     var element = context.container().node(),
49376         keybinding = d3keybinding('full-screen');
49377         // button;
49378
49379
49380     function getFullScreenFn() {
49381         if (element.requestFullscreen) {
49382             return element.requestFullscreen;
49383         } else if (element.msRequestFullscreen) {
49384             return element.msRequestFullscreen;
49385         } else if (element.mozRequestFullScreen) {
49386             return element.mozRequestFullScreen;
49387         } else if (element.webkitRequestFullscreen) {
49388             return element.webkitRequestFullscreen;
49389         }
49390     }
49391
49392
49393     function getExitFullScreenFn() {
49394         if (document.exitFullscreen) {
49395             return document.exitFullscreen;
49396         } else if (document.msExitFullscreen) {
49397             return document.msExitFullscreen;
49398         } else if (document.mozCancelFullScreen) {
49399             return document.mozCancelFullScreen;
49400         } else if (document.webkitExitFullscreen) {
49401             return document.webkitExitFullscreen;
49402         }
49403     }
49404
49405
49406     function isFullScreen() {
49407         return document.fullscreenElement ||
49408             document.mozFullScreenElement ||
49409             document.webkitFullscreenElement ||
49410             document.msFullscreenElement;
49411     }
49412
49413
49414     function isSupported() {
49415         return !!getFullScreenFn();
49416     }
49417
49418
49419     function fullScreen() {
49420         event.preventDefault();
49421         if (!isFullScreen()) {
49422             // button.classed('active', true);
49423             getFullScreenFn().apply(element);
49424         } else {
49425             // button.classed('active', false);
49426             getExitFullScreenFn().apply(document);
49427         }
49428     }
49429
49430
49431     return function() { // selection) {
49432         if (!isSupported())
49433             return;
49434
49435         // button = selection.append('button')
49436         //     .attr('title', t('full_screen'))
49437         //     .attr('tabindex', -1)
49438         //     .on('click', fullScreen)
49439         //     .call(tooltip);
49440
49441         // button.append('span')
49442         //     .attr('class', 'icon full-screen');
49443
49444         var detected = utilDetect();
49445         var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
49446         keybinding.on(keys, fullScreen);
49447
49448         d3_select(document)
49449             .call(keybinding);
49450     };
49451 }
49452
49453 function uiModal(selection$$1, blocking) {
49454     var keybinding = d3keybinding('modal');
49455     var previous = selection$$1.select('div.modal');
49456     var animate = previous.empty();
49457
49458     previous.transition()
49459         .duration(200)
49460         .style('opacity', 0)
49461         .remove();
49462
49463     var shaded = selection$$1
49464         .append('div')
49465         .attr('class', 'shaded')
49466         .style('opacity', 0);
49467
49468     shaded.close = function() {
49469         shaded
49470             .transition()
49471             .duration(200)
49472             .style('opacity',0)
49473             .remove();
49474
49475         modal
49476             .transition()
49477             .duration(200)
49478             .style('top','0px');
49479
49480         keybinding.off();
49481     };
49482
49483
49484     var modal = shaded
49485         .append('div')
49486         .attr('class', 'modal fillL col6');
49487
49488     if (!blocking) {
49489         shaded.on('click.remove-modal', function() {
49490             if (event.target === this) {
49491                 shaded.close();
49492             }
49493         });
49494
49495         modal.append('button')
49496             .attr('class', 'close')
49497             .on('click', shaded.close)
49498             .call(svgIcon('#icon-close'));
49499
49500         keybinding
49501             .on('⌫', shaded.close)
49502             .on('⎋', shaded.close);
49503
49504         d3_select(document)
49505             .call(keybinding);
49506     }
49507
49508     modal
49509         .append('div')
49510         .attr('class', 'content');
49511
49512     if (animate) {
49513         shaded.transition().style('opacity', 1);
49514     } else {
49515         shaded.style('opacity', 1);
49516     }
49517
49518
49519     return shaded;
49520 }
49521
49522 function uiLoading(context) {
49523     var message = '',
49524         blocking = false,
49525         modalSelection;
49526
49527
49528     var loading = function(selection) {
49529         modalSelection = uiModal(selection, blocking);
49530
49531         var loadertext = modalSelection.select('.content')
49532             .classed('loading-modal', true)
49533             .append('div')
49534             .attr('class', 'modal-section fillL');
49535
49536         loadertext
49537             .append('img')
49538             .attr('class', 'loader')
49539             .attr('src', context.imagePath('loader-white.gif'));
49540
49541         loadertext
49542             .append('h3')
49543             .text(message);
49544
49545         modalSelection.select('button.close')
49546             .attr('class', 'hide');
49547
49548         return loading;
49549     };
49550
49551
49552     loading.message = function(_) {
49553         if (!arguments.length) return message;
49554         message = _;
49555         return loading;
49556     };
49557
49558
49559     loading.blocking = function(_) {
49560         if (!arguments.length) return blocking;
49561         blocking = _;
49562         return loading;
49563     };
49564
49565
49566     loading.close = function() {
49567         modalSelection.remove();
49568     };
49569
49570
49571     return loading;
49572 }
49573
49574 function uiGeolocate(context) {
49575     var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
49576         locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
49577         timeoutId;
49578
49579
49580     function click() {
49581         if (context.inIntro()) return;
49582         context.enter(modeBrowse(context));
49583         context.container().call(locating);
49584         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
49585
49586         // This timeout ensures that we still call finish() even if
49587         // the user declines to share their location in Firefox
49588         timeoutId = setTimeout(finish, 10000 /* 10sec */ );
49589     }
49590
49591
49592     function success(position) {
49593         var map = context.map(),
49594             extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
49595                 .padByMeters(position.coords.accuracy);
49596
49597         map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
49598         finish();
49599     }
49600
49601
49602     function error() {
49603         finish();
49604     }
49605
49606
49607     function finish() {
49608         locating.close();  // unblock ui
49609         if (timeoutId) { clearTimeout(timeoutId); }
49610         timeoutId = undefined;
49611     }
49612
49613
49614     return function(selection) {
49615         if (!navigator.geolocation) return;
49616
49617         selection
49618             .append('button')
49619             .attr('tabindex', -1)
49620             .attr('title', t('geolocate.title'))
49621             .on('click', click)
49622             .call(svgIcon('#icon-geolocate', 'light'))
49623             .call(tooltip()
49624                 .placement((textDirection === 'rtl') ? 'right' : 'left'));
49625     };
49626 }
49627
49628 var marked = createCommonjsModule(function (module, exports) {
49629 /**
49630  * marked - a markdown parser
49631  * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
49632  * https://github.com/chjj/marked
49633  */
49634
49635 (function() {
49636
49637 /**
49638  * Block-Level Grammar
49639  */
49640
49641 var block = {
49642   newline: /^\n+/,
49643   code: /^( {4}[^\n]+\n*)+/,
49644   fences: noop,
49645   hr: /^( *[-*_]){3,} *(?:\n+|$)/,
49646   heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
49647   nptable: noop,
49648   lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
49649   blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,
49650   list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
49651   html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
49652   def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
49653   table: noop,
49654   paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
49655   text: /^[^\n]+/
49656 };
49657
49658 block.bullet = /(?:[*+-]|\d+\.)/;
49659 block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
49660 block.item = replace(block.item, 'gm')
49661   (/bull/g, block.bullet)
49662   ();
49663
49664 block.list = replace(block.list)
49665   (/bull/g, block.bullet)
49666   ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
49667   ('def', '\\n+(?=' + block.def.source + ')')
49668   ();
49669
49670 block.blockquote = replace(block.blockquote)
49671   ('def', block.def)
49672   ();
49673
49674 block._tag = '(?!(?:'
49675   + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
49676   + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
49677   + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';
49678
49679 block.html = replace(block.html)
49680   ('comment', /<!--[\s\S]*?-->/)
49681   ('closed', /<(tag)[\s\S]+?<\/\1>/)
49682   ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
49683   (/tag/g, block._tag)
49684   ();
49685
49686 block.paragraph = replace(block.paragraph)
49687   ('hr', block.hr)
49688   ('heading', block.heading)
49689   ('lheading', block.lheading)
49690   ('blockquote', block.blockquote)
49691   ('tag', '<' + block._tag)
49692   ('def', block.def)
49693   ();
49694
49695 /**
49696  * Normal Block Grammar
49697  */
49698
49699 block.normal = merge({}, block);
49700
49701 /**
49702  * GFM Block Grammar
49703  */
49704
49705 block.gfm = merge({}, block.normal, {
49706   fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,
49707   paragraph: /^/,
49708   heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
49709 });
49710
49711 block.gfm.paragraph = replace(block.paragraph)
49712   ('(?!', '(?!'
49713     + block.gfm.fences.source.replace('\\1', '\\2') + '|'
49714     + block.list.source.replace('\\1', '\\3') + '|')
49715   ();
49716
49717 /**
49718  * GFM + Tables Block Grammar
49719  */
49720
49721 block.tables = merge({}, block.gfm, {
49722   nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
49723   table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
49724 });
49725
49726 /**
49727  * Block Lexer
49728  */
49729
49730 function Lexer(options) {
49731   this.tokens = [];
49732   this.tokens.links = {};
49733   this.options = options || marked.defaults;
49734   this.rules = block.normal;
49735
49736   if (this.options.gfm) {
49737     if (this.options.tables) {
49738       this.rules = block.tables;
49739     } else {
49740       this.rules = block.gfm;
49741     }
49742   }
49743 }
49744
49745 /**
49746  * Expose Block Rules
49747  */
49748
49749 Lexer.rules = block;
49750
49751 /**
49752  * Static Lex Method
49753  */
49754
49755 Lexer.lex = function(src, options) {
49756   var lexer = new Lexer(options);
49757   return lexer.lex(src);
49758 };
49759
49760 /**
49761  * Preprocessing
49762  */
49763
49764 Lexer.prototype.lex = function(src) {
49765   src = src
49766     .replace(/\r\n|\r/g, '\n')
49767     .replace(/\t/g, '    ')
49768     .replace(/\u00a0/g, ' ')
49769     .replace(/\u2424/g, '\n');
49770
49771   return this.token(src, true);
49772 };
49773
49774 /**
49775  * Lexing
49776  */
49777
49778 Lexer.prototype.token = function(src, top, bq) {
49779   var src = src.replace(/^ +$/gm, '')
49780     , next
49781     , loose
49782     , cap
49783     , bull
49784     , b
49785     , item
49786     , space
49787     , i
49788     , l;
49789
49790   while (src) {
49791     // newline
49792     if (cap = this.rules.newline.exec(src)) {
49793       src = src.substring(cap[0].length);
49794       if (cap[0].length > 1) {
49795         this.tokens.push({
49796           type: 'space'
49797         });
49798       }
49799     }
49800
49801     // code
49802     if (cap = this.rules.code.exec(src)) {
49803       src = src.substring(cap[0].length);
49804       cap = cap[0].replace(/^ {4}/gm, '');
49805       this.tokens.push({
49806         type: 'code',
49807         text: !this.options.pedantic
49808           ? cap.replace(/\n+$/, '')
49809           : cap
49810       });
49811       continue;
49812     }
49813
49814     // fences (gfm)
49815     if (cap = this.rules.fences.exec(src)) {
49816       src = src.substring(cap[0].length);
49817       this.tokens.push({
49818         type: 'code',
49819         lang: cap[2],
49820         text: cap[3] || ''
49821       });
49822       continue;
49823     }
49824
49825     // heading
49826     if (cap = this.rules.heading.exec(src)) {
49827       src = src.substring(cap[0].length);
49828       this.tokens.push({
49829         type: 'heading',
49830         depth: cap[1].length,
49831         text: cap[2]
49832       });
49833       continue;
49834     }
49835
49836     // table no leading pipe (gfm)
49837     if (top && (cap = this.rules.nptable.exec(src))) {
49838       src = src.substring(cap[0].length);
49839
49840       item = {
49841         type: 'table',
49842         header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
49843         align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
49844         cells: cap[3].replace(/\n$/, '').split('\n')
49845       };
49846
49847       for (i = 0; i < item.align.length; i++) {
49848         if (/^ *-+: *$/.test(item.align[i])) {
49849           item.align[i] = 'right';
49850         } else if (/^ *:-+: *$/.test(item.align[i])) {
49851           item.align[i] = 'center';
49852         } else if (/^ *:-+ *$/.test(item.align[i])) {
49853           item.align[i] = 'left';
49854         } else {
49855           item.align[i] = null;
49856         }
49857       }
49858
49859       for (i = 0; i < item.cells.length; i++) {
49860         item.cells[i] = item.cells[i].split(/ *\| */);
49861       }
49862
49863       this.tokens.push(item);
49864
49865       continue;
49866     }
49867
49868     // lheading
49869     if (cap = this.rules.lheading.exec(src)) {
49870       src = src.substring(cap[0].length);
49871       this.tokens.push({
49872         type: 'heading',
49873         depth: cap[2] === '=' ? 1 : 2,
49874         text: cap[1]
49875       });
49876       continue;
49877     }
49878
49879     // hr
49880     if (cap = this.rules.hr.exec(src)) {
49881       src = src.substring(cap[0].length);
49882       this.tokens.push({
49883         type: 'hr'
49884       });
49885       continue;
49886     }
49887
49888     // blockquote
49889     if (cap = this.rules.blockquote.exec(src)) {
49890       src = src.substring(cap[0].length);
49891
49892       this.tokens.push({
49893         type: 'blockquote_start'
49894       });
49895
49896       cap = cap[0].replace(/^ *> ?/gm, '');
49897
49898       // Pass `top` to keep the current
49899       // "toplevel" state. This is exactly
49900       // how markdown.pl works.
49901       this.token(cap, top, true);
49902
49903       this.tokens.push({
49904         type: 'blockquote_end'
49905       });
49906
49907       continue;
49908     }
49909
49910     // list
49911     if (cap = this.rules.list.exec(src)) {
49912       src = src.substring(cap[0].length);
49913       bull = cap[2];
49914
49915       this.tokens.push({
49916         type: 'list_start',
49917         ordered: bull.length > 1
49918       });
49919
49920       // Get each top-level item.
49921       cap = cap[0].match(this.rules.item);
49922
49923       next = false;
49924       l = cap.length;
49925       i = 0;
49926
49927       for (; i < l; i++) {
49928         item = cap[i];
49929
49930         // Remove the list item's bullet
49931         // so it is seen as the next token.
49932         space = item.length;
49933         item = item.replace(/^ *([*+-]|\d+\.) +/, '');
49934
49935         // Outdent whatever the
49936         // list item contains. Hacky.
49937         if (~item.indexOf('\n ')) {
49938           space -= item.length;
49939           item = !this.options.pedantic
49940             ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
49941             : item.replace(/^ {1,4}/gm, '');
49942         }
49943
49944         // Determine whether the next list item belongs here.
49945         // Backpedal if it does not belong in this list.
49946         if (this.options.smartLists && i !== l - 1) {
49947           b = block.bullet.exec(cap[i + 1])[0];
49948           if (bull !== b && !(bull.length > 1 && b.length > 1)) {
49949             src = cap.slice(i + 1).join('\n') + src;
49950             i = l - 1;
49951           }
49952         }
49953
49954         // Determine whether item is loose or not.
49955         // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
49956         // for discount behavior.
49957         loose = next || /\n\n(?!\s*$)/.test(item);
49958         if (i !== l - 1) {
49959           next = item.charAt(item.length - 1) === '\n';
49960           if (!loose) loose = next;
49961         }
49962
49963         this.tokens.push({
49964           type: loose
49965             ? 'loose_item_start'
49966             : 'list_item_start'
49967         });
49968
49969         // Recurse.
49970         this.token(item, false, bq);
49971
49972         this.tokens.push({
49973           type: 'list_item_end'
49974         });
49975       }
49976
49977       this.tokens.push({
49978         type: 'list_end'
49979       });
49980
49981       continue;
49982     }
49983
49984     // html
49985     if (cap = this.rules.html.exec(src)) {
49986       src = src.substring(cap[0].length);
49987       this.tokens.push({
49988         type: this.options.sanitize
49989           ? 'paragraph'
49990           : 'html',
49991         pre: !this.options.sanitizer
49992           && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
49993         text: cap[0]
49994       });
49995       continue;
49996     }
49997
49998     // def
49999     if ((!bq && top) && (cap = this.rules.def.exec(src))) {
50000       src = src.substring(cap[0].length);
50001       this.tokens.links[cap[1].toLowerCase()] = {
50002         href: cap[2],
50003         title: cap[3]
50004       };
50005       continue;
50006     }
50007
50008     // table (gfm)
50009     if (top && (cap = this.rules.table.exec(src))) {
50010       src = src.substring(cap[0].length);
50011
50012       item = {
50013         type: 'table',
50014         header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
50015         align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
50016         cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
50017       };
50018
50019       for (i = 0; i < item.align.length; i++) {
50020         if (/^ *-+: *$/.test(item.align[i])) {
50021           item.align[i] = 'right';
50022         } else if (/^ *:-+: *$/.test(item.align[i])) {
50023           item.align[i] = 'center';
50024         } else if (/^ *:-+ *$/.test(item.align[i])) {
50025           item.align[i] = 'left';
50026         } else {
50027           item.align[i] = null;
50028         }
50029       }
50030
50031       for (i = 0; i < item.cells.length; i++) {
50032         item.cells[i] = item.cells[i]
50033           .replace(/^ *\| *| *\| *$/g, '')
50034           .split(/ *\| */);
50035       }
50036
50037       this.tokens.push(item);
50038
50039       continue;
50040     }
50041
50042     // top-level paragraph
50043     if (top && (cap = this.rules.paragraph.exec(src))) {
50044       src = src.substring(cap[0].length);
50045       this.tokens.push({
50046         type: 'paragraph',
50047         text: cap[1].charAt(cap[1].length - 1) === '\n'
50048           ? cap[1].slice(0, -1)
50049           : cap[1]
50050       });
50051       continue;
50052     }
50053
50054     // text
50055     if (cap = this.rules.text.exec(src)) {
50056       // Top-level should never reach here.
50057       src = src.substring(cap[0].length);
50058       this.tokens.push({
50059         type: 'text',
50060         text: cap[0]
50061       });
50062       continue;
50063     }
50064
50065     if (src) {
50066       throw new
50067         Error('Infinite loop on byte: ' + src.charCodeAt(0));
50068     }
50069   }
50070
50071   return this.tokens;
50072 };
50073
50074 /**
50075  * Inline-Level Grammar
50076  */
50077
50078 var inline = {
50079   escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
50080   autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
50081   url: noop,
50082   tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
50083   link: /^!?\[(inside)\]\(href\)/,
50084   reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
50085   nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
50086   strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
50087   em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
50088   code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
50089   br: /^ {2,}\n(?!\s*$)/,
50090   del: noop,
50091   text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
50092 };
50093
50094 inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;
50095 inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
50096
50097 inline.link = replace(inline.link)
50098   ('inside', inline._inside)
50099   ('href', inline._href)
50100   ();
50101
50102 inline.reflink = replace(inline.reflink)
50103   ('inside', inline._inside)
50104   ();
50105
50106 /**
50107  * Normal Inline Grammar
50108  */
50109
50110 inline.normal = merge({}, inline);
50111
50112 /**
50113  * Pedantic Inline Grammar
50114  */
50115
50116 inline.pedantic = merge({}, inline.normal, {
50117   strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
50118   em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
50119 });
50120
50121 /**
50122  * GFM Inline Grammar
50123  */
50124
50125 inline.gfm = merge({}, inline.normal, {
50126   escape: replace(inline.escape)('])', '~|])')(),
50127   url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
50128   del: /^~~(?=\S)([\s\S]*?\S)~~/,
50129   text: replace(inline.text)
50130     (']|', '~]|')
50131     ('|', '|https?://|')
50132     ()
50133 });
50134
50135 /**
50136  * GFM + Line Breaks Inline Grammar
50137  */
50138
50139 inline.breaks = merge({}, inline.gfm, {
50140   br: replace(inline.br)('{2,}', '*')(),
50141   text: replace(inline.gfm.text)('{2,}', '*')()
50142 });
50143
50144 /**
50145  * Inline Lexer & Compiler
50146  */
50147
50148 function InlineLexer(links, options) {
50149   this.options = options || marked.defaults;
50150   this.links = links;
50151   this.rules = inline.normal;
50152   this.renderer = this.options.renderer || new Renderer;
50153   this.renderer.options = this.options;
50154
50155   if (!this.links) {
50156     throw new
50157       Error('Tokens array requires a `links` property.');
50158   }
50159
50160   if (this.options.gfm) {
50161     if (this.options.breaks) {
50162       this.rules = inline.breaks;
50163     } else {
50164       this.rules = inline.gfm;
50165     }
50166   } else if (this.options.pedantic) {
50167     this.rules = inline.pedantic;
50168   }
50169 }
50170
50171 /**
50172  * Expose Inline Rules
50173  */
50174
50175 InlineLexer.rules = inline;
50176
50177 /**
50178  * Static Lexing/Compiling Method
50179  */
50180
50181 InlineLexer.output = function(src, links, options) {
50182   var inline = new InlineLexer(links, options);
50183   return inline.output(src);
50184 };
50185
50186 /**
50187  * Lexing/Compiling
50188  */
50189
50190 InlineLexer.prototype.output = function(src) {
50191   var out = ''
50192     , link
50193     , text
50194     , href
50195     , cap;
50196
50197   while (src) {
50198     // escape
50199     if (cap = this.rules.escape.exec(src)) {
50200       src = src.substring(cap[0].length);
50201       out += cap[1];
50202       continue;
50203     }
50204
50205     // autolink
50206     if (cap = this.rules.autolink.exec(src)) {
50207       src = src.substring(cap[0].length);
50208       if (cap[2] === '@') {
50209         text = cap[1].charAt(6) === ':'
50210           ? this.mangle(cap[1].substring(7))
50211           : this.mangle(cap[1]);
50212         href = this.mangle('mailto:') + text;
50213       } else {
50214         text = escape(cap[1]);
50215         href = text;
50216       }
50217       out += this.renderer.link(href, null, text);
50218       continue;
50219     }
50220
50221     // url (gfm)
50222     if (!this.inLink && (cap = this.rules.url.exec(src))) {
50223       src = src.substring(cap[0].length);
50224       text = escape(cap[1]);
50225       href = text;
50226       out += this.renderer.link(href, null, text);
50227       continue;
50228     }
50229
50230     // tag
50231     if (cap = this.rules.tag.exec(src)) {
50232       if (!this.inLink && /^<a /i.test(cap[0])) {
50233         this.inLink = true;
50234       } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
50235         this.inLink = false;
50236       }
50237       src = src.substring(cap[0].length);
50238       out += this.options.sanitize
50239         ? this.options.sanitizer
50240           ? this.options.sanitizer(cap[0])
50241           : escape(cap[0])
50242         : cap[0];
50243       continue;
50244     }
50245
50246     // link
50247     if (cap = this.rules.link.exec(src)) {
50248       src = src.substring(cap[0].length);
50249       this.inLink = true;
50250       out += this.outputLink(cap, {
50251         href: cap[2],
50252         title: cap[3]
50253       });
50254       this.inLink = false;
50255       continue;
50256     }
50257
50258     // reflink, nolink
50259     if ((cap = this.rules.reflink.exec(src))
50260         || (cap = this.rules.nolink.exec(src))) {
50261       src = src.substring(cap[0].length);
50262       link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
50263       link = this.links[link.toLowerCase()];
50264       if (!link || !link.href) {
50265         out += cap[0].charAt(0);
50266         src = cap[0].substring(1) + src;
50267         continue;
50268       }
50269       this.inLink = true;
50270       out += this.outputLink(cap, link);
50271       this.inLink = false;
50272       continue;
50273     }
50274
50275     // strong
50276     if (cap = this.rules.strong.exec(src)) {
50277       src = src.substring(cap[0].length);
50278       out += this.renderer.strong(this.output(cap[2] || cap[1]));
50279       continue;
50280     }
50281
50282     // em
50283     if (cap = this.rules.em.exec(src)) {
50284       src = src.substring(cap[0].length);
50285       out += this.renderer.em(this.output(cap[2] || cap[1]));
50286       continue;
50287     }
50288
50289     // code
50290     if (cap = this.rules.code.exec(src)) {
50291       src = src.substring(cap[0].length);
50292       out += this.renderer.codespan(escape(cap[2], true));
50293       continue;
50294     }
50295
50296     // br
50297     if (cap = this.rules.br.exec(src)) {
50298       src = src.substring(cap[0].length);
50299       out += this.renderer.br();
50300       continue;
50301     }
50302
50303     // del (gfm)
50304     if (cap = this.rules.del.exec(src)) {
50305       src = src.substring(cap[0].length);
50306       out += this.renderer.del(this.output(cap[1]));
50307       continue;
50308     }
50309
50310     // text
50311     if (cap = this.rules.text.exec(src)) {
50312       src = src.substring(cap[0].length);
50313       out += this.renderer.text(escape(this.smartypants(cap[0])));
50314       continue;
50315     }
50316
50317     if (src) {
50318       throw new
50319         Error('Infinite loop on byte: ' + src.charCodeAt(0));
50320     }
50321   }
50322
50323   return out;
50324 };
50325
50326 /**
50327  * Compile Link
50328  */
50329
50330 InlineLexer.prototype.outputLink = function(cap, link) {
50331   var href = escape(link.href)
50332     , title = link.title ? escape(link.title) : null;
50333
50334   return cap[0].charAt(0) !== '!'
50335     ? this.renderer.link(href, title, this.output(cap[1]))
50336     : this.renderer.image(href, title, escape(cap[1]));
50337 };
50338
50339 /**
50340  * Smartypants Transformations
50341  */
50342
50343 InlineLexer.prototype.smartypants = function(text) {
50344   if (!this.options.smartypants) return text;
50345   return text
50346     // em-dashes
50347     .replace(/---/g, '\u2014')
50348     // en-dashes
50349     .replace(/--/g, '\u2013')
50350     // opening singles
50351     .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
50352     // closing singles & apostrophes
50353     .replace(/'/g, '\u2019')
50354     // opening doubles
50355     .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
50356     // closing doubles
50357     .replace(/"/g, '\u201d')
50358     // ellipses
50359     .replace(/\.{3}/g, '\u2026');
50360 };
50361
50362 /**
50363  * Mangle Links
50364  */
50365
50366 InlineLexer.prototype.mangle = function(text) {
50367   if (!this.options.mangle) return text;
50368   var out = ''
50369     , l = text.length
50370     , i = 0
50371     , ch;
50372
50373   for (; i < l; i++) {
50374     ch = text.charCodeAt(i);
50375     if (Math.random() > 0.5) {
50376       ch = 'x' + ch.toString(16);
50377     }
50378     out += '&#' + ch + ';';
50379   }
50380
50381   return out;
50382 };
50383
50384 /**
50385  * Renderer
50386  */
50387
50388 function Renderer(options) {
50389   this.options = options || {};
50390 }
50391
50392 Renderer.prototype.code = function(code, lang, escaped) {
50393   if (this.options.highlight) {
50394     var out = this.options.highlight(code, lang);
50395     if (out != null && out !== code) {
50396       escaped = true;
50397       code = out;
50398     }
50399   }
50400
50401   if (!lang) {
50402     return '<pre><code>'
50403       + (escaped ? code : escape(code, true))
50404       + '\n</code></pre>';
50405   }
50406
50407   return '<pre><code class="'
50408     + this.options.langPrefix
50409     + escape(lang, true)
50410     + '">'
50411     + (escaped ? code : escape(code, true))
50412     + '\n</code></pre>\n';
50413 };
50414
50415 Renderer.prototype.blockquote = function(quote) {
50416   return '<blockquote>\n' + quote + '</blockquote>\n';
50417 };
50418
50419 Renderer.prototype.html = function(html) {
50420   return html;
50421 };
50422
50423 Renderer.prototype.heading = function(text, level, raw) {
50424   return '<h'
50425     + level
50426     + ' id="'
50427     + this.options.headerPrefix
50428     + raw.toLowerCase().replace(/[^\w]+/g, '-')
50429     + '">'
50430     + text
50431     + '</h'
50432     + level
50433     + '>\n';
50434 };
50435
50436 Renderer.prototype.hr = function() {
50437   return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
50438 };
50439
50440 Renderer.prototype.list = function(body, ordered) {
50441   var type = ordered ? 'ol' : 'ul';
50442   return '<' + type + '>\n' + body + '</' + type + '>\n';
50443 };
50444
50445 Renderer.prototype.listitem = function(text) {
50446   return '<li>' + text + '</li>\n';
50447 };
50448
50449 Renderer.prototype.paragraph = function(text) {
50450   return '<p>' + text + '</p>\n';
50451 };
50452
50453 Renderer.prototype.table = function(header, body) {
50454   return '<table>\n'
50455     + '<thead>\n'
50456     + header
50457     + '</thead>\n'
50458     + '<tbody>\n'
50459     + body
50460     + '</tbody>\n'
50461     + '</table>\n';
50462 };
50463
50464 Renderer.prototype.tablerow = function(content) {
50465   return '<tr>\n' + content + '</tr>\n';
50466 };
50467
50468 Renderer.prototype.tablecell = function(content, flags) {
50469   var type = flags.header ? 'th' : 'td';
50470   var tag = flags.align
50471     ? '<' + type + ' style="text-align:' + flags.align + '">'
50472     : '<' + type + '>';
50473   return tag + content + '</' + type + '>\n';
50474 };
50475
50476 // span level renderer
50477 Renderer.prototype.strong = function(text) {
50478   return '<strong>' + text + '</strong>';
50479 };
50480
50481 Renderer.prototype.em = function(text) {
50482   return '<em>' + text + '</em>';
50483 };
50484
50485 Renderer.prototype.codespan = function(text) {
50486   return '<code>' + text + '</code>';
50487 };
50488
50489 Renderer.prototype.br = function() {
50490   return this.options.xhtml ? '<br/>' : '<br>';
50491 };
50492
50493 Renderer.prototype.del = function(text) {
50494   return '<del>' + text + '</del>';
50495 };
50496
50497 Renderer.prototype.link = function(href, title, text) {
50498   if (this.options.sanitize) {
50499     try {
50500       var prot = decodeURIComponent(unescape(href))
50501         .replace(/[^\w:]/g, '')
50502         .toLowerCase();
50503     } catch (e) {
50504       return '';
50505     }
50506     if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {
50507       return '';
50508     }
50509   }
50510   var out = '<a href="' + href + '"';
50511   if (title) {
50512     out += ' title="' + title + '"';
50513   }
50514   out += '>' + text + '</a>';
50515   return out;
50516 };
50517
50518 Renderer.prototype.image = function(href, title, text) {
50519   var out = '<img src="' + href + '" alt="' + text + '"';
50520   if (title) {
50521     out += ' title="' + title + '"';
50522   }
50523   out += this.options.xhtml ? '/>' : '>';
50524   return out;
50525 };
50526
50527 Renderer.prototype.text = function(text) {
50528   return text;
50529 };
50530
50531 /**
50532  * Parsing & Compiling
50533  */
50534
50535 function Parser(options) {
50536   this.tokens = [];
50537   this.token = null;
50538   this.options = options || marked.defaults;
50539   this.options.renderer = this.options.renderer || new Renderer;
50540   this.renderer = this.options.renderer;
50541   this.renderer.options = this.options;
50542 }
50543
50544 /**
50545  * Static Parse Method
50546  */
50547
50548 Parser.parse = function(src, options, renderer) {
50549   var parser = new Parser(options, renderer);
50550   return parser.parse(src);
50551 };
50552
50553 /**
50554  * Parse Loop
50555  */
50556
50557 Parser.prototype.parse = function(src) {
50558   this.inline = new InlineLexer(src.links, this.options, this.renderer);
50559   this.tokens = src.reverse();
50560
50561   var out = '';
50562   while (this.next()) {
50563     out += this.tok();
50564   }
50565
50566   return out;
50567 };
50568
50569 /**
50570  * Next Token
50571  */
50572
50573 Parser.prototype.next = function() {
50574   return this.token = this.tokens.pop();
50575 };
50576
50577 /**
50578  * Preview Next Token
50579  */
50580
50581 Parser.prototype.peek = function() {
50582   return this.tokens[this.tokens.length - 1] || 0;
50583 };
50584
50585 /**
50586  * Parse Text Tokens
50587  */
50588
50589 Parser.prototype.parseText = function() {
50590   var body = this.token.text;
50591
50592   while (this.peek().type === 'text') {
50593     body += '\n' + this.next().text;
50594   }
50595
50596   return this.inline.output(body);
50597 };
50598
50599 /**
50600  * Parse Current Token
50601  */
50602
50603 Parser.prototype.tok = function() {
50604   switch (this.token.type) {
50605     case 'space': {
50606       return '';
50607     }
50608     case 'hr': {
50609       return this.renderer.hr();
50610     }
50611     case 'heading': {
50612       return this.renderer.heading(
50613         this.inline.output(this.token.text),
50614         this.token.depth,
50615         this.token.text);
50616     }
50617     case 'code': {
50618       return this.renderer.code(this.token.text,
50619         this.token.lang,
50620         this.token.escaped);
50621     }
50622     case 'table': {
50623       var header = ''
50624         , body = ''
50625         , i
50626         , row
50627         , cell
50628         , flags
50629         , j;
50630
50631       // header
50632       cell = '';
50633       for (i = 0; i < this.token.header.length; i++) {
50634         flags = { header: true, align: this.token.align[i] };
50635         cell += this.renderer.tablecell(
50636           this.inline.output(this.token.header[i]),
50637           { header: true, align: this.token.align[i] }
50638         );
50639       }
50640       header += this.renderer.tablerow(cell);
50641
50642       for (i = 0; i < this.token.cells.length; i++) {
50643         row = this.token.cells[i];
50644
50645         cell = '';
50646         for (j = 0; j < row.length; j++) {
50647           cell += this.renderer.tablecell(
50648             this.inline.output(row[j]),
50649             { header: false, align: this.token.align[j] }
50650           );
50651         }
50652
50653         body += this.renderer.tablerow(cell);
50654       }
50655       return this.renderer.table(header, body);
50656     }
50657     case 'blockquote_start': {
50658       var body = '';
50659
50660       while (this.next().type !== 'blockquote_end') {
50661         body += this.tok();
50662       }
50663
50664       return this.renderer.blockquote(body);
50665     }
50666     case 'list_start': {
50667       var body = ''
50668         , ordered = this.token.ordered;
50669
50670       while (this.next().type !== 'list_end') {
50671         body += this.tok();
50672       }
50673
50674       return this.renderer.list(body, ordered);
50675     }
50676     case 'list_item_start': {
50677       var body = '';
50678
50679       while (this.next().type !== 'list_item_end') {
50680         body += this.token.type === 'text'
50681           ? this.parseText()
50682           : this.tok();
50683       }
50684
50685       return this.renderer.listitem(body);
50686     }
50687     case 'loose_item_start': {
50688       var body = '';
50689
50690       while (this.next().type !== 'list_item_end') {
50691         body += this.tok();
50692       }
50693
50694       return this.renderer.listitem(body);
50695     }
50696     case 'html': {
50697       var html = !this.token.pre && !this.options.pedantic
50698         ? this.inline.output(this.token.text)
50699         : this.token.text;
50700       return this.renderer.html(html);
50701     }
50702     case 'paragraph': {
50703       return this.renderer.paragraph(this.inline.output(this.token.text));
50704     }
50705     case 'text': {
50706       return this.renderer.paragraph(this.parseText());
50707     }
50708   }
50709 };
50710
50711 /**
50712  * Helpers
50713  */
50714
50715 function escape(html, encode) {
50716   return html
50717     .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
50718     .replace(/</g, '&lt;')
50719     .replace(/>/g, '&gt;')
50720     .replace(/"/g, '&quot;')
50721     .replace(/'/g, '&#39;');
50722 }
50723
50724 function unescape(html) {
50725         // explicitly match decimal, hex, and named HTML entities 
50726   return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) {
50727     n = n.toLowerCase();
50728     if (n === 'colon') return ':';
50729     if (n.charAt(0) === '#') {
50730       return n.charAt(1) === 'x'
50731         ? String.fromCharCode(parseInt(n.substring(2), 16))
50732         : String.fromCharCode(+n.substring(1));
50733     }
50734     return '';
50735   });
50736 }
50737
50738 function replace(regex, opt) {
50739   regex = regex.source;
50740   opt = opt || '';
50741   return function self(name, val) {
50742     if (!name) return new RegExp(regex, opt);
50743     val = val.source || val;
50744     val = val.replace(/(^|[^\[])\^/g, '$1');
50745     regex = regex.replace(name, val);
50746     return self;
50747   };
50748 }
50749
50750 function noop() {}
50751 noop.exec = noop;
50752
50753 function merge(obj) {
50754   var i = 1
50755     , target
50756     , key;
50757
50758   for (; i < arguments.length; i++) {
50759     target = arguments[i];
50760     for (key in target) {
50761       if (Object.prototype.hasOwnProperty.call(target, key)) {
50762         obj[key] = target[key];
50763       }
50764     }
50765   }
50766
50767   return obj;
50768 }
50769
50770
50771 /**
50772  * Marked
50773  */
50774
50775 function marked(src, opt, callback) {
50776   if (callback || typeof opt === 'function') {
50777     if (!callback) {
50778       callback = opt;
50779       opt = null;
50780     }
50781
50782     opt = merge({}, marked.defaults, opt || {});
50783
50784     var highlight = opt.highlight
50785       , tokens
50786       , pending
50787       , i = 0;
50788
50789     try {
50790       tokens = Lexer.lex(src, opt);
50791     } catch (e) {
50792       return callback(e);
50793     }
50794
50795     pending = tokens.length;
50796
50797     var done = function(err) {
50798       if (err) {
50799         opt.highlight = highlight;
50800         return callback(err);
50801       }
50802
50803       var out;
50804
50805       try {
50806         out = Parser.parse(tokens, opt);
50807       } catch (e) {
50808         err = e;
50809       }
50810
50811       opt.highlight = highlight;
50812
50813       return err
50814         ? callback(err)
50815         : callback(null, out);
50816     };
50817
50818     if (!highlight || highlight.length < 3) {
50819       return done();
50820     }
50821
50822     delete opt.highlight;
50823
50824     if (!pending) return done();
50825
50826     for (; i < tokens.length; i++) {
50827       (function(token) {
50828         if (token.type !== 'code') {
50829           return --pending || done();
50830         }
50831         return highlight(token.text, token.lang, function(err, code) {
50832           if (err) return done(err);
50833           if (code == null || code === token.text) {
50834             return --pending || done();
50835           }
50836           token.text = code;
50837           token.escaped = true;
50838           --pending || done();
50839         });
50840       })(tokens[i]);
50841     }
50842
50843     return;
50844   }
50845   try {
50846     if (opt) opt = merge({}, marked.defaults, opt);
50847     return Parser.parse(Lexer.lex(src, opt), opt);
50848   } catch (e) {
50849     e.message += '\nPlease report this to https://github.com/chjj/marked.';
50850     if ((opt || marked.defaults).silent) {
50851       return '<p>An error occured:</p><pre>'
50852         + escape(e.message + '', true)
50853         + '</pre>';
50854     }
50855     throw e;
50856   }
50857 }
50858
50859 /**
50860  * Options
50861  */
50862
50863 marked.options =
50864 marked.setOptions = function(opt) {
50865   merge(marked.defaults, opt);
50866   return marked;
50867 };
50868
50869 marked.defaults = {
50870   gfm: true,
50871   tables: true,
50872   breaks: false,
50873   pedantic: false,
50874   sanitize: false,
50875   sanitizer: null,
50876   mangle: true,
50877   smartLists: false,
50878   silent: false,
50879   highlight: null,
50880   langPrefix: 'lang-',
50881   smartypants: false,
50882   headerPrefix: '',
50883   renderer: new Renderer,
50884   xhtml: false
50885 };
50886
50887 /**
50888  * Expose
50889  */
50890
50891 marked.Parser = Parser;
50892 marked.parser = Parser.parse;
50893
50894 marked.Renderer = Renderer;
50895
50896 marked.Lexer = Lexer;
50897 marked.lexer = Lexer.lex;
50898
50899 marked.InlineLexer = InlineLexer;
50900 marked.inlineLexer = InlineLexer.output;
50901
50902 marked.parse = marked;
50903
50904 {
50905   module.exports = marked;
50906 }
50907
50908 }).call(function() {
50909   return this || (typeof window !== 'undefined' ? window : commonjsGlobal);
50910 }());
50911 });
50912
50913 function pointBox(loc, context) {
50914     var rect = context.surfaceRect();
50915     var point = context.curtainProjection(loc);
50916     return {
50917         left: point[0] + rect.left - 40,
50918         top: point[1] + rect.top - 60,
50919         width: 80,
50920         height: 90
50921     };
50922 }
50923
50924
50925 function pad$1(locOrBox, padding, context) {
50926     var box;
50927     if (locOrBox instanceof Array) {
50928         var rect = context.surfaceRect();
50929         var point = context.curtainProjection(locOrBox);
50930         box = {
50931             left: point[0] + rect.left,
50932             top: point[1] + rect.top
50933         };
50934     } else {
50935         box = locOrBox;
50936     }
50937
50938     return {
50939         left: box.left - padding,
50940         top: box.top - padding,
50941         width: (box.width || 0) + 2 * padding,
50942         height: (box.width || 0) + 2 * padding
50943     };
50944 }
50945
50946
50947 function icon(name, svgklass) {
50948     return '<svg class="icon ' + (svgklass || '') + '">' +
50949          '<use xlink:href="' + name + '"></use></svg>';
50950 }
50951
50952
50953 function slugify(text) {
50954     return text.toString().toLowerCase()
50955         .replace(/\s+/g, '-')           // Replace spaces with -
50956         .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
50957         .replace(/\-\-+/g, '-')         // Replace multiple - with single -
50958         .replace(/^-+/, '')             // Trim - from start of text
50959         .replace(/-+$/, '');            // Trim - from end of text
50960 }
50961
50962
50963 // console warning for missing walkthrough names
50964 var missingStrings = {};
50965 function checkKey(key, text) {
50966     if (t(key, { default: undefined}) === undefined) {
50967         if (missingStrings.hasOwnProperty(key)) return;  // warn once
50968         missingStrings[key] = text;
50969         var missing = key + ': ' + text;
50970         if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
50971     }
50972 }
50973
50974
50975 function localize(obj) {
50976     var key;
50977
50978     // Assign name if entity has one..
50979     var name = obj.tags && obj.tags.name;
50980     if (name) {
50981         key = 'intro.graph.name.' + slugify(name);
50982         obj.tags.name = t(key, { default: name });
50983         checkKey(key, name);
50984     }
50985
50986     // Assign street name if entity has one..
50987     var street = obj.tags && obj.tags['addr:street'];
50988     if (street) {
50989         key = 'intro.graph.name.' + slugify(street);
50990         obj.tags['addr:street'] = t(key, { default: street });
50991         checkKey(key, street);
50992
50993         // Add address details common across walkthrough..
50994         var addrTags = [
50995             'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
50996             'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
50997         ];
50998         addrTags.forEach(function(k) {
50999             var key = 'intro.graph.' + k,
51000                 tag = 'addr:' + k,
51001                 val = obj.tags && obj.tags[tag],
51002                 str = t(key, { default: val });
51003
51004             if (str) {
51005                 if (str.match(/^<.*>$/) !== null) {
51006                     delete obj.tags[tag];
51007                 } else {
51008                     obj.tags[tag] = str;
51009                 }
51010             }
51011         });
51012     }
51013
51014     return obj;
51015 }
51016
51017
51018 // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
51019 function isMostlySquare(points) {
51020     // note: uses 15 here instead of the 12 from actionOrthogonalize because
51021     // actionOrthogonalize can actually straighten some larger angles as it iterates
51022     var threshold = 15, // degrees within right or straight
51023         lowerBound = Math.cos((90 - threshold) * Math.PI / 180),  // near right
51024         upperBound = Math.cos(threshold * Math.PI / 180),         // near straight
51025         mag;
51026
51027     for (var i = 0; i < points.length; i++) {
51028         mag = Math.abs(normalizedDotProduct(i, points));
51029         if (mag > lowerBound && mag < upperBound) {
51030             return false;
51031         }
51032     }
51033
51034     return true;
51035
51036
51037     function normalizedDotProduct(i, points) {
51038         var a = points[(i - 1 + points.length) % points.length],
51039             b = points[i],
51040             c = points[(i + 1) % points.length],
51041             p = subtractPoints(a, b),
51042             q = subtractPoints(c, b);
51043
51044         p = normalizePoint(p);
51045         q = normalizePoint(q);
51046
51047         return p[0] * q[0] + p[1] * q[1];
51048
51049
51050         function subtractPoints(a, b) {
51051             return [a[0] - b[0], a[1] - b[1]];
51052         }
51053
51054         function normalizePoint(point) {
51055             var vector = [0, 0];
51056             var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
51057             if (length !== 0) {
51058                 vector[0] = point[0] / length;
51059                 vector[1] = point[1] / length;
51060             }
51061             return vector;
51062         }
51063     }
51064 }
51065
51066
51067 function selectMenuItem(operation) {
51068     var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
51069         ', .radial-menu .radial-menu-item-' + operation;
51070     return d3_select(selector$$1);
51071 }
51072
51073
51074 function transitionTime(point1, point2) {
51075     var distance = geoSphericalDistance(point1, point2);
51076     if (distance === 0)
51077         return 0;
51078     else if (distance < 80)
51079         return 500;
51080     else
51081         return 1000;
51082 }
51083
51084 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"}},"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"}},"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"}},"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.616755,41.952231]},"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.616572,41.951992]},"n3867":{"id":"n3867","loc":[-85.616583,41.952076]},"n3868":{"id":"n3868","loc":[-85.616636,41.952145]},"n3869":{"id":"n3869","loc":[-85.616916,41.952279]},"n387":{"id":"n387","loc":[-85.632524,41.943912]},"n3870":{"id":"n3870","loc":[-85.617088,41.952254]},"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.616494,41.951959]},"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"}},"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"}},"n4501":{"id":"n4501","loc":[-85.627921,41.954783],"tags":{"highway":"stop","stop":"all"}},"n4502":{"id":"n4502","loc":[-85.62775,41.954696],"tags":{"highway":"stop","stop":"all"}},"n4503":{"id":"n4503","loc":[-85.628046,41.954591],"tags":{"highway":"stop","stop":"all"}},"n4504":{"id":"n4504","loc":[-85.631074,41.957428],"tags":{"highway":"stop"}},"n4505":{"id":"n4505","loc":[-85.630768,41.957429],"tags":{"highway":"stop"}},"n4506":{"id":"n4506","loc":[-85.629888,41.957432],"tags":{"highway":"stop"}},"n4507":{"id":"n4507","loc":[-85.629565,41.957433],"tags":{"highway":"stop"}},"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"}},"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"}},"n4536":{"id":"n4536","loc":[-85.630881,41.954806],"tags":{"highway":"stop"}},"n4537":{"id":"n4537","loc":[-85.630879,41.954564],"tags":{"highway":"stop"}},"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"}},"n4544":{"id":"n4544","loc":[-85.632071,41.959029],"tags":{"highway":"stop"}},"n4545":{"id":"n4545","loc":[-85.632257,41.959027],"tags":{"highway":"stop"}},"n4546":{"id":"n4546","loc":[-85.631966,41.957427],"tags":{"highway":"stop"}},"n4547":{"id":"n4547","loc":[-85.632297,41.957426],"tags":{"highway":"stop"}},"n4548":{"id":"n4548","loc":[-85.631976,41.955911],"tags":{"highway":"give_way"}},"n4549":{"id":"n4549","loc":[-85.632272,41.955911],"tags":{"highway":"give_way"}},"n455":{"id":"n455","loc":[-85.635224,41.943869]},"n4550":{"id":"n4550","loc":[-85.632097,41.954805],"tags":{"highway":"stop"}},"n4551":{"id":"n4551","loc":[-85.632094,41.954566],"tags":{"highway":"stop"}},"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"}},"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"}},"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"}},"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"}},"n4587":{"id":"n4587","loc":[-85.620485,41.951948],"tags":{"emergency":"fire_hydrant"}},"n4588":{"id":"n4588","loc":[-85.620316,41.950999],"tags":{"highway":"stop"}},"n4589":{"id":"n4589","loc":[-85.620311,41.950131],"tags":{"highway":"stop"}},"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"}},"n4592":{"id":"n4592","loc":[-85.620278,41.947443],"tags":{"highway":"stop"}},"n4593":{"id":"n4593","loc":[-85.619844,41.947444],"tags":{"highway":"stop"}},"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"}},"n4597":{"id":"n4597","loc":[-85.622739,41.947316],"tags":{"highway":"stop"}},"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"}},"n4602":{"id":"n4602","loc":[-85.622769,41.949325],"tags":{"highway":"stop"}},"n4603":{"id":"n4603","loc":[-85.622837,41.949329],"tags":{"emergency":"fire_hydrant"}},"n4604":{"id":"n4604","loc":[-85.622614,41.950113],"tags":{"highway":"give_way"}},"n4605":{"id":"n4605","loc":[-85.624777,41.949219],"tags":{"highway":"stop"}},"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"}},"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.61823,41.9499]},"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"}},"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"}},"n4685":{"id":"n4685","loc":[-85.635961,41.940125],"tags":{"highway":"stop"}},"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"}},"n4695":{"id":"n4695","loc":[-85.637174,41.941354],"tags":{"highway":"stop"}},"n4696":{"id":"n4696","loc":[-85.637091,41.941273],"tags":{"emergency":"fire_hydrant"}},"n4697":{"id":"n4697","loc":[-85.638058,41.941346],"tags":{"highway":"give_way"}},"n4698":{"id":"n4698","loc":[-85.638359,41.941344],"tags":{"highway":"give_way"}},"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"}},"n4702":{"id":"n4702","loc":[-85.639548,41.941334],"tags":{"highway":"give_way"}},"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"}},"n4706":{"id":"n4706","loc":[-85.640803,41.941324],"tags":{"highway":"stop"}},"n4707":{"id":"n4707","loc":[-85.641717,41.941317],"tags":{"highway":"stop"}},"n4708":{"id":"n4708","loc":[-85.641846,41.941415],"tags":{"highway":"stop"}},"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"}},"n4711":{"id":"n4711","loc":[-85.641854,41.942455],"tags":{"highway":"stop"}},"n4712":{"id":"n4712","loc":[-85.641859,41.942739],"tags":{"highway":"stop"}},"n4713":{"id":"n4713","loc":[-85.640754,41.942707],"tags":{"emergency":"fire_hydrant"}},"n4714":{"id":"n4714","loc":[-85.640669,41.942716],"tags":{"highway":"stop"}},"n4715":{"id":"n4715","loc":[-85.640664,41.942478],"tags":{"highway":"stop"}},"n4716":{"id":"n4716","loc":[-85.63964,41.94274],"tags":{"man_made":"flagpole"}},"n4717":{"id":"n4717","loc":[-85.639455,41.942731],"tags":{"highway":"stop"}},"n4718":{"id":"n4718","loc":[-85.63945,41.942492],"tags":{"highway":"stop"}},"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"}},"n4721":{"id":"n4721","loc":[-85.638233,41.942511],"tags":{"highway":"stop"}},"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"}},"n4726":{"id":"n4726","loc":[-85.633467,41.943818],"tags":{"highway":"stop"}},"n4727":{"id":"n4727","loc":[-85.633987,41.943531],"tags":{"highway":"stop"}},"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"}},"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"}},"n4746":{"id":"n4746","loc":[-85.639635,41.94387],"tags":{"highway":"stop"}},"n4747":{"id":"n4747","loc":[-85.639549,41.943756],"tags":{"emergency":"fire_hydrant"}},"n4748":{"id":"n4748","loc":[-85.64055,41.943862],"tags":{"highway":"stop"}},"n4749":{"id":"n4749","loc":[-85.640864,41.943859],"tags":{"highway":"stop"}},"n475":{"id":"n475","loc":[-85.633906,41.943535]},"n4750":{"id":"n4750","loc":[-85.640718,41.945022],"tags":{"highway":"stop"}},"n4751":{"id":"n4751","loc":[-85.640664,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4752":{"id":"n4752","loc":[-85.641913,41.94502],"tags":{"highway":"stop"}},"n4753":{"id":"n4753","loc":[-85.641838,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4754":{"id":"n4754","loc":[-85.642045,41.94385],"tags":{"highway":"give_way"}},"n4755":{"id":"n4755","loc":[-85.641738,41.943852],"tags":{"highway":"give_way"}},"n4756":{"id":"n4756","loc":[-85.642928,41.943843],"tags":{"highway":"stop"}},"n4757":{"id":"n4757","loc":[-85.64305,41.943902],"tags":{"emergency":"fire_hydrant"}},"n4758":{"id":"n4758","loc":[-85.642986,41.945105],"tags":{"highway":"stop"}},"n4759":{"id":"n4759","loc":[-85.643136,41.94502],"tags":{"highway":"stop"}},"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","n3866","n3867","n3868","n3858","n3869","n3870","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","n3950","n3951","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"}}};
51085
51086 // toggles the visibility of ui elements, using a combination of the
51087 // hide class, which sets display=none, and a d3 transition for opacity.
51088 // this will cause blinking when called repeatedly, so check that the
51089 // value actually changes between calls.
51090 function uiToggle(show, callback) {
51091     return function(selection$$1) {
51092         selection$$1
51093             .style('opacity', show ? 0 : 1)
51094             .classed('hide', false)
51095             .transition()
51096             .style('opacity', show ? 1 : 0)
51097             .on('end', function() {
51098                 d3_select(this)
51099                     .classed('hide', !show)
51100                     .style('opacity', null);
51101                 if (callback) callback.apply(this);
51102             });
51103     };
51104 }
51105
51106 // Tooltips and svg mask used to highlight certain features
51107 function uiCurtain() {
51108
51109     var surface = d3_select(null),
51110         tooltip = d3_select(null),
51111         darkness = d3_select(null);
51112
51113     function curtain(selection$$1) {
51114         surface = selection$$1
51115             .append('svg')
51116             .attr('id', 'curtain')
51117             .style('z-index', 1000)
51118             .style('pointer-events', 'none')
51119             .style('position', 'absolute')
51120             .style('top', 0)
51121             .style('left', 0);
51122
51123         darkness = surface.append('path')
51124             .attr('x', 0)
51125             .attr('y', 0)
51126             .attr('class', 'curtain-darkness');
51127
51128         d3_select(window).on('resize.curtain', resize);
51129
51130         tooltip = selection$$1.append('div')
51131             .attr('class', 'tooltip')
51132             .style('z-index', 1002);
51133
51134         tooltip
51135             .append('div')
51136             .attr('class', 'tooltip-arrow');
51137
51138         tooltip
51139             .append('div')
51140             .attr('class', 'tooltip-inner');
51141
51142         resize();
51143
51144
51145         function resize() {
51146             surface
51147                 .attr('width', window.innerWidth)
51148                 .attr('height', window.innerHeight);
51149             curtain.cut(darkness.datum());
51150         }
51151     }
51152
51153
51154     /**
51155      * Reveal cuts the curtain to highlight the given box,
51156      * and shows a tooltip with instructions next to the box.
51157      *
51158      * @param  {String|ClientRect} [box]   box used to cut the curtain
51159      * @param  {String}    [text]          text for a tooltip
51160      * @param  {Object}    [options]
51161      * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
51162      * @param  {integer}   [options.duration]        transition time in milliseconds
51163      * @param  {string}    [options.buttonText]      if set, create a button with this text label
51164      * @param  {function}  [options.buttonCallback]  if set, the callback for the button
51165      * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
51166      */
51167     curtain.reveal = function(box, text, options) {
51168         if (typeof box === 'string') {
51169             box = d3_select(box).node();
51170         }
51171         if (box && box.getBoundingClientRect) {
51172             box = copyBox(box.getBoundingClientRect());
51173         }
51174
51175         options = options || {};
51176
51177         var tooltipBox;
51178         if (options.tooltipBox) {
51179             tooltipBox = options.tooltipBox;
51180             if (typeof tooltipBox === 'string') {
51181                 tooltipBox = d3_select(tooltipBox).node();
51182             }
51183             if (tooltipBox && tooltipBox.getBoundingClientRect) {
51184                 tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
51185             }
51186         } else {
51187             tooltipBox = box;
51188         }
51189
51190         if (tooltipBox && text) {
51191             // pseudo markdown bold text for the instruction section..
51192             var parts = text.split('**');
51193             var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
51194             if (parts[1]) {
51195                 html += '<span class="instruction">' + parts[1] + '</span>';
51196             }
51197
51198             html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
51199             html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
51200
51201             if (options.buttonText && options.buttonCallback) {
51202                 html += '<div class="button-section">' +
51203                     '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
51204             }
51205
51206             var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
51207             tooltip
51208                 .classed(classes, true)
51209                 .selectAll('.tooltip-inner')
51210                 .html(html);
51211
51212             if (options.buttonText && options.buttonCallback) {
51213                 var button = tooltip.selectAll('.button-section .button.action');
51214                 button
51215                     .on('click', function() {
51216                         event.preventDefault();
51217                         options.buttonCallback();
51218                     });
51219             }
51220
51221             var tip = copyBox(tooltip.node().getBoundingClientRect()),
51222                 w = window.innerWidth,
51223                 h = window.innerHeight,
51224                 tooltipWidth = 200,
51225                 tooltipArrow = 5,
51226                 side, pos;
51227
51228
51229             // hack: this will have bottom placement,
51230             // so need to reserve extra space for the tooltip illustration.
51231             if (options.tooltipClass === 'intro-mouse') {
51232                 tip.height += 80;
51233             }
51234
51235             // trim box dimensions to just the portion that fits in the window..
51236             if (tooltipBox.top + tooltipBox.height > h) {
51237                 tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
51238             }
51239             if (tooltipBox.left + tooltipBox.width > w) {
51240                 tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
51241             }
51242
51243             // determine tooltip placement..
51244
51245             if (tooltipBox.top + tooltipBox.height < 100) {
51246                 // tooltip below box..
51247                 side = 'bottom';
51248                 pos = [
51249                     tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
51250                     tooltipBox.top + tooltipBox.height
51251                 ];
51252
51253             } else if (tooltipBox.top > h - 140) {
51254                 // tooltip above box..
51255                 side = 'top';
51256                 pos = [
51257                     tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
51258                     tooltipBox.top - tip.height
51259                 ];
51260
51261             } else {
51262                 // tooltip to the side of the tooltipBox..
51263                 var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
51264
51265                 if (textDirection === 'rtl') {
51266                     if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
51267                         side = 'right';
51268                         pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
51269
51270                     } else {
51271                         side = 'left';
51272                         pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
51273                     }
51274
51275                 } else {
51276                     if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
51277                         side = 'left';
51278                         pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
51279                     }
51280                     else {
51281                         side = 'right';
51282                         pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
51283                     }
51284                 }
51285             }
51286
51287             if (options.duration !== 0 || !tooltip.classed(side)) {
51288                 tooltip.call(uiToggle(true));
51289             }
51290
51291             tooltip
51292                 .style('top', pos[1] + 'px')
51293                 .style('left', pos[0] + 'px')
51294                 .attr('class', classes + ' ' + side);
51295
51296
51297             // shift tooltip-inner if it is very close to the top or bottom edge
51298             // (doesn't affect the placement of the tooltip-arrow)
51299             var shiftY = 0;
51300             if (side === 'left' || side === 'right') {
51301                 if (pos[1] < 60) {
51302                     shiftY = 60 - pos[1];
51303                 }
51304                 else if (pos[1] + tip.height > h - 100) {
51305                     shiftY = h - pos[1] - tip.height - 100;
51306                 }
51307             }
51308             tooltip.selectAll('.tooltip-inner')
51309                 .style('top', shiftY + 'px');
51310
51311         } else {
51312             tooltip
51313                 .classed('in', false)
51314                 .call(uiToggle(false));
51315         }
51316
51317         curtain.cut(box, options.duration);
51318
51319         return tooltip;
51320     };
51321
51322
51323     curtain.cut = function(datum, duration) {
51324         darkness.datum(datum)
51325             .interrupt();
51326
51327         var selection$$1;
51328         if (duration === 0) {
51329             selection$$1 = darkness;
51330         } else {
51331             selection$$1 = darkness
51332                 .transition()
51333                 .duration(duration || 600)
51334                 .ease(linear$1);
51335         }
51336
51337         selection$$1
51338             .attr('d', function(d) {
51339                 var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
51340                     window.innerWidth + ',' + window.innerHeight + 'L' +
51341                     window.innerWidth + ',0 Z';
51342
51343                 if (!d) return string;
51344                 return string + 'M' +
51345                     d.left + ',' + d.top + 'L' +
51346                     d.left + ',' + (d.top + d.height) + 'L' +
51347                     (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
51348                     (d.left + d.width) + ',' + (d.top) + 'Z';
51349
51350             });
51351     };
51352
51353
51354     curtain.remove = function() {
51355         surface.remove();
51356         tooltip.remove();
51357         d3_select(window).on('resize.curtain', null);
51358     };
51359
51360
51361     // ClientRects are immutable, so copy them to an object,
51362     // in case we need to trim the height/width.
51363     function copyBox(src) {
51364         return {
51365             top: src.top,
51366             right: src.right,
51367             bottom: src.bottom,
51368             left: src.left,
51369             width: src.width,
51370             height: src.height
51371         };
51372     }
51373
51374
51375     return curtain;
51376 }
51377
51378 function uiIntroWelcome(context, reveal) {
51379     var dispatch$$1 = dispatch('done'),
51380         listener = clickListener();
51381
51382     var chapter = {
51383         title: 'intro.welcome.title'
51384     };
51385
51386
51387     function welcome() {
51388         context.map().centerZoom([-85.63591, 41.94285], 19);
51389         reveal('.intro-nav-wrap .chapter-welcome',
51390             t('intro.welcome.welcome'),
51391             { buttonText: t('intro.ok'), buttonCallback: practice }
51392         );
51393     }
51394
51395     function practice() {
51396         reveal('.intro-nav-wrap .chapter-welcome',
51397             t('intro.welcome.practice'),
51398             { buttonText: t('intro.ok'), buttonCallback: words }
51399         );
51400     }
51401
51402     function words() {
51403         reveal('.intro-nav-wrap .chapter-welcome',
51404             t('intro.welcome.words'),
51405             { buttonText: t('intro.ok'), buttonCallback: mouse }
51406         );
51407     }
51408
51409
51410     function mouse() {
51411         reveal('.intro-nav-wrap .chapter-welcome',
51412             t('intro.welcome.mouse'),
51413             { buttonText: t('intro.ok'), buttonCallback: leftClick }
51414         );
51415     }
51416
51417
51418     function leftClick() {
51419         var counter = 0,
51420             times = 5;
51421
51422         var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
51423             t('intro.welcome.leftclick', { num: times }),
51424             { tooltipClass: 'intro-mouse' }
51425         );
51426
51427         tooltip.selectAll('.tooltip-inner')
51428             .insert('svg', 'span')
51429             .attr('class', 'tooltip-illustration')
51430             .append('use')
51431             .attr('xlink:href', '#walkthrough-mouse');
51432
51433         tooltip
51434             .append('div')
51435             .attr('class', 'counter');
51436
51437         tooltip.call(listener);
51438
51439         listener.on('click', function(which) {
51440             if (which === 'left') {
51441                 d3_select('.curtain-tooltip.intro-mouse .counter')
51442                     .text(String(++counter));
51443
51444                 if (counter === times) {
51445                     window.setTimeout(function() { continueTo(rightClick); }, 1000);
51446                 }
51447             }
51448         });
51449
51450         function continueTo(nextStep) {
51451             listener.on('click', null);
51452             tooltip.call(listener.off);
51453             tooltip.select('.counter').remove();
51454             nextStep();
51455         }
51456     }
51457
51458
51459     function rightClick() {
51460         var counter = 0,
51461             times = 5;
51462
51463         var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
51464             t('intro.welcome.rightclick', { num: times }),
51465             { tooltipClass: 'intro-mouse' }
51466         );
51467
51468         tooltip.selectAll('.tooltip-inner')
51469             .insert('svg', 'span')
51470             .attr('class', 'tooltip-illustration')
51471             .append('use')
51472             .attr('xlink:href', '#walkthrough-mouse');
51473
51474         tooltip
51475             .append('div')
51476             .attr('class', 'counter');
51477
51478         tooltip.call(listener);
51479
51480         listener.on('click', function(which) {
51481             if (which === 'right') {
51482                 d3_select('.curtain-tooltip.intro-mouse .counter')
51483                     .text(String(++counter));
51484
51485                 if (counter === times) {
51486                     window.setTimeout(function() { continueTo(chapters); }, 1000);
51487                 }
51488             }
51489         });
51490
51491         function continueTo(nextStep) {
51492             listener.on('click', null);
51493             tooltip.call(listener.off);
51494             tooltip.select('.counter').remove();
51495             nextStep();
51496         }
51497     }
51498
51499
51500     function chapters() {
51501         dispatch$$1.call('done');
51502         reveal('.intro-nav-wrap .chapter-navigation',
51503             t('intro.welcome.chapters', { next: t('intro.navigation.title') })
51504         );
51505     }
51506
51507
51508     chapter.enter = function() {
51509         welcome();
51510     };
51511
51512
51513     chapter.exit = function() {
51514         listener.off();
51515     };
51516
51517
51518     chapter.restart = function() {
51519         chapter.exit();
51520         chapter.enter();
51521     };
51522
51523
51524     return utilRebind(chapter, dispatch$$1, 'on');
51525 }
51526
51527
51528
51529 function clickListener() {
51530     var dispatch$$1 = dispatch('click'),
51531         minTime = 120,
51532         tooltip = d3_select(null),
51533         down = {};
51534
51535     // `down` keeps track of which buttons/keys are down.
51536     // Setting a property in `down` happens immediately.
51537     // Unsetting a property in `down` is delayed because
51538     //   on Windows a contextmenu event happens after keyup/mouseup
51539
51540     function keydown() {
51541         if (event.keyCode === 93)  {   // context menu
51542             event.preventDefault();
51543             event.stopPropagation();
51544             down.menu = event.timeStamp;
51545             tooltip.classed('rightclick', true);
51546         }
51547     }
51548
51549
51550     function keyup() {
51551         if (event.keyCode === 93)  {   // context menu
51552             event.preventDefault();
51553             event.stopPropagation();
51554             var endTime = event.timeStamp,
51555                 startTime = down.menu || endTime,
51556                 delay = (endTime - startTime < minTime) ? minTime : 0;
51557
51558             window.setTimeout(function() {
51559                 tooltip.classed('rightclick', false);
51560                 down.menu = undefined;  // delayed, for Windows
51561             }, delay);
51562
51563             dispatch$$1.call('click', this, 'right');
51564         }
51565     }
51566
51567
51568     function mousedown() {
51569         var button = event.button;
51570         if (button === 0 && !event.ctrlKey) {
51571             tooltip.classed('leftclick', true);
51572         } else if (button === 2) {
51573             tooltip.classed('rightclick', true);
51574         }
51575         down[button] = event.timeStamp;
51576     }
51577
51578
51579     function mouseup() {
51580         var button = event.button,
51581             endTime = event.timeStamp,
51582             startTime = down[button] || endTime,
51583             delay = (endTime - startTime < minTime) ? minTime : 0;
51584
51585         if (button === 0 && !event.ctrlKey) {
51586             window.setTimeout(function() {
51587                 tooltip.classed('leftclick', false);
51588                 down[button] = undefined;  // delayed, for Windows
51589             }, delay);
51590
51591             dispatch$$1.call('click', this, 'left');
51592
51593         } else if (button === 2) {
51594             window.setTimeout(function() {
51595                 tooltip.classed('rightclick', false);
51596                 down[button] = undefined;  // delayed, for Windows
51597             }, delay);
51598
51599             dispatch$$1.call('click', this, 'right');
51600
51601         } else {
51602             window.setTimeout(function() {
51603                 down[button] = undefined;  // delayed, for Windows
51604             }, delay);
51605         }
51606     }
51607
51608
51609     function contextmenu() {
51610         event.preventDefault();
51611         event.stopPropagation();
51612         if (!down[2] && !down.menu) {
51613             tooltip.classed('rightclick', true);
51614             window.setTimeout(function() {
51615                 tooltip.classed('rightclick', false);
51616             }, minTime);
51617             dispatch$$1.call('click', this, 'right');
51618         }
51619     }
51620
51621
51622     var behavior = function(selection$$1) {
51623         tooltip = selection$$1;
51624         down = {};
51625
51626         d3_select(window)
51627             .on('keydown.intro', keydown)
51628             .on('keyup.intro', keyup)
51629             .on('mousedown.intro', mousedown)
51630             .on('mouseup.intro', mouseup)
51631             .on('contextmenu.intro', contextmenu);
51632     };
51633
51634
51635     behavior.off = function() {
51636         d3_select(window)
51637             .on('keydown.intro', null)
51638             .on('keyup.intro', null)
51639             .on('mousedown.intro', null)
51640             .on('mouseup.intro', null)
51641             .on('contextmenu.intro', null);
51642
51643         tooltip
51644             .classed('leftclick', false)
51645             .classed('rightclick', false);
51646     };
51647
51648     return utilRebind(behavior, dispatch$$1, 'on');
51649 }
51650
51651 function uiIntroNavigation(context, reveal) {
51652     var dispatch$$1 = dispatch('done'),
51653         timeouts = [],
51654         hallId = 'n2061',
51655         townHall = [-85.63591, 41.94285],
51656         springStreetId = 'w397',
51657         springStreetEndId = 'n1834',
51658         springStreet = [-85.63582, 41.94255],
51659         onewayField = context.presets().field('oneway'),
51660         maxspeedField = context.presets().field('maxspeed');
51661
51662
51663     var chapter = {
51664         title: 'intro.navigation.title'
51665     };
51666
51667
51668     function timeout(f, t$$1) {
51669         timeouts.push(window.setTimeout(f, t$$1));
51670     }
51671
51672
51673     function eventCancel() {
51674         event.stopPropagation();
51675         event.preventDefault();
51676     }
51677
51678
51679     function isTownHallSelected() {
51680         var ids = context.selectedIDs();
51681         return ids.length === 1 && ids[0] === hallId;
51682     }
51683
51684
51685     function dragMap() {
51686         context.enter(modeBrowse(context));
51687         context.history().reset('initial');
51688
51689         var msec = transitionTime(townHall, context.map().center());
51690         if (msec) { reveal(null, null, { duration: 0 }); }
51691         context.map().zoom(19).centerEase(townHall, msec);
51692
51693         timeout(function() {
51694             var centerStart = context.map().center();
51695
51696             reveal('#surface', t('intro.navigation.drag'));
51697             context.map().on('drawn.intro', function() {
51698                 reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
51699             });
51700
51701             context.map().on('move.intro', function() {
51702                 var centerNow = context.map().center();
51703                 if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
51704                     context.map().on('move.intro', null);
51705                     timeout(function() { continueTo(zoomMap); }, 3000);
51706                 }
51707             });
51708
51709         }, msec + 100);
51710
51711         function continueTo(nextStep) {
51712             context.map().on('move.intro drawn.intro', null);
51713             nextStep();
51714         }
51715     }
51716
51717
51718     function zoomMap() {
51719         var zoomStart = context.map().zoom();
51720
51721         reveal('#surface',
51722             t('intro.navigation.zoom', {
51723                 plus: icon('#icon-plus', 'pre-text'),
51724                 minus: icon('#icon-minus', 'pre-text')
51725             })
51726         );
51727
51728         context.map().on('drawn.intro', function() {
51729             reveal('#surface',
51730                 t('intro.navigation.zoom', {
51731                     plus: icon('#icon-plus', 'pre-text'),
51732                     minus: icon('#icon-minus', 'pre-text')
51733                 }), { duration: 0 }
51734             );
51735         });
51736
51737         context.map().on('move.intro', function() {
51738             if (context.map().zoom() !== zoomStart) {
51739                 context.map().on('move.intro', null);
51740                 timeout(function() { continueTo(features); }, 3000);
51741             }
51742         });
51743
51744         function continueTo(nextStep) {
51745             context.map().on('move.intro drawn.intro', null);
51746             nextStep();
51747         }
51748     }
51749
51750
51751     function features() {
51752         var onClick = function() { continueTo(pointsLinesAreas); };
51753
51754         reveal('#surface', t('intro.navigation.features'),
51755             { buttonText: t('intro.ok'), buttonCallback: onClick }
51756         );
51757
51758         context.map().on('drawn.intro', function() {
51759             reveal('#surface', t('intro.navigation.features'),
51760                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
51761             );
51762         });
51763
51764         function continueTo(nextStep) {
51765             context.map().on('drawn.intro', null);
51766             nextStep();
51767         }
51768     }
51769
51770     function pointsLinesAreas() {
51771         var onClick = function() { continueTo(nodesWays); };
51772
51773         reveal('#surface', t('intro.navigation.points_lines_areas'),
51774             { buttonText: t('intro.ok'), buttonCallback: onClick }
51775         );
51776
51777         context.map().on('drawn.intro', function() {
51778             reveal('#surface', t('intro.navigation.points_lines_areas'),
51779                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
51780             );
51781         });
51782
51783         function continueTo(nextStep) {
51784             context.map().on('drawn.intro', null);
51785             nextStep();
51786         }
51787     }
51788
51789     function nodesWays() {
51790         var onClick = function() { continueTo(clickTownHall); };
51791
51792         reveal('#surface', t('intro.navigation.nodes_ways'),
51793             { buttonText: t('intro.ok'), buttonCallback: onClick }
51794         );
51795
51796         context.map().on('drawn.intro', function() {
51797             reveal('#surface', t('intro.navigation.nodes_ways'),
51798                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
51799             );
51800         });
51801
51802         function continueTo(nextStep) {
51803             context.map().on('drawn.intro', null);
51804             nextStep();
51805         }
51806     }
51807
51808     function clickTownHall() {
51809         context.enter(modeBrowse(context));
51810         context.history().reset('initial');
51811
51812         reveal(null, null, { duration: 0 });
51813         context.map().zoomEase(19, 500);
51814
51815         timeout(function() {
51816             var entity = context.hasEntity(hallId);
51817             if (!entity) return;
51818             context.map().centerEase(entity.loc, 500);
51819
51820             timeout(function() {
51821                 var entity = context.hasEntity(hallId);
51822                 if (!entity) return;
51823                 var box = pointBox(entity.loc, context);
51824                 reveal(box, t('intro.navigation.click_townhall'));
51825
51826                 context.map().on('move.intro drawn.intro', function() {
51827                     var entity = context.hasEntity(hallId);
51828                     if (!entity) return;
51829                     var box = pointBox(entity.loc, context);
51830                     reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
51831                 });
51832
51833                 context.on('enter.intro', function() {
51834                     if (isTownHallSelected()) continueTo(selectedTownHall);
51835                 });
51836
51837             }, 550);  // after centerEase
51838
51839         }, 550); // after zoomEase
51840
51841         context.history().on('change.intro', function() {
51842             if (!context.hasEntity(hallId)) {
51843                 continueTo(clickTownHall);
51844             }
51845         });
51846
51847         function continueTo(nextStep) {
51848             context.on('enter.intro', null);
51849             context.map().on('move.intro drawn.intro', null);
51850             context.history().on('change.intro', null);
51851             nextStep();
51852         }
51853     }
51854
51855
51856     function selectedTownHall() {
51857         if (!isTownHallSelected()) return clickTownHall();
51858
51859         var entity = context.hasEntity(hallId);
51860         if (!entity) return clickTownHall();
51861
51862         var box = pointBox(entity.loc, context);
51863         var onClick = function() { continueTo(editorTownHall); };
51864
51865         reveal(box, t('intro.navigation.selected_townhall'),
51866             { buttonText: t('intro.ok'), buttonCallback: onClick }
51867         );
51868
51869         context.map().on('move.intro drawn.intro', function() {
51870             var entity = context.hasEntity(hallId);
51871             if (!entity) return;
51872             var box = pointBox(entity.loc, context);
51873             reveal(box, t('intro.navigation.selected_townhall'),
51874                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
51875             );
51876         });
51877
51878         context.history().on('change.intro', function() {
51879             if (!context.hasEntity(hallId)) {
51880                 continueTo(clickTownHall);
51881             }
51882         });
51883
51884         function continueTo(nextStep) {
51885             context.map().on('move.intro drawn.intro', null);
51886             context.history().on('change.intro', null);
51887             nextStep();
51888         }
51889     }
51890
51891
51892     function editorTownHall() {
51893         if (!isTownHallSelected()) return clickTownHall();
51894
51895         // disallow scrolling
51896         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51897
51898         var onClick = function() { continueTo(presetTownHall); };
51899
51900         reveal('.entity-editor-pane',
51901             t('intro.navigation.editor_townhall'),
51902             { buttonText: t('intro.ok'), buttonCallback: onClick }
51903         );
51904
51905         context.on('exit.intro', function() {
51906             continueTo(clickTownHall);
51907         });
51908
51909         context.history().on('change.intro', function() {
51910             if (!context.hasEntity(hallId)) {
51911                 continueTo(clickTownHall);
51912             }
51913         });
51914
51915         function continueTo(nextStep) {
51916             context.on('exit.intro', null);
51917             context.history().on('change.intro', null);
51918             d3_select('.inspector-wrap').on('wheel.intro', null);
51919             nextStep();
51920         }
51921     }
51922
51923
51924     function presetTownHall() {
51925         if (!isTownHallSelected()) return clickTownHall();
51926
51927         // reset pane, in case user happened to change it..
51928         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51929         // disallow scrolling
51930         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51931
51932         // preset match, in case the user happened to change it.
51933         var entity = context.entity(context.selectedIDs()[0]);
51934         var preset = context.presets().match(entity, context.graph());
51935
51936         var onClick = function() { continueTo(fieldsTownHall); };
51937
51938         context.on('exit.intro', function() {
51939             continueTo(clickTownHall);
51940         });
51941
51942         context.history().on('change.intro', function() {
51943             if (!context.hasEntity(hallId)) {
51944                 continueTo(clickTownHall);
51945             }
51946         });
51947
51948         reveal('.inspector-body .preset-list-item.inspector-inner',
51949             t('intro.navigation.preset_townhall', { preset: preset.name() }),
51950             { buttonText: t('intro.ok'), buttonCallback: onClick }
51951         );
51952
51953         function continueTo(nextStep) {
51954             context.on('exit.intro', null);
51955             context.history().on('change.intro', null);
51956             d3_select('.inspector-wrap').on('wheel.intro', null);
51957             nextStep();
51958         }
51959     }
51960
51961
51962     function fieldsTownHall() {
51963         if (!isTownHallSelected()) return clickTownHall();
51964
51965         // reset pane, in case user happened to change it..
51966         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51967         // disallow scrolling
51968         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51969
51970         var onClick = function() { continueTo(closeTownHall); };
51971
51972         reveal('.inspector-body .preset-editor',
51973             t('intro.navigation.fields_townhall'),
51974             { buttonText: t('intro.ok'), buttonCallback: onClick }
51975         );
51976
51977         context.on('exit.intro', function() {
51978             continueTo(clickTownHall);
51979         });
51980
51981         context.history().on('change.intro', function() {
51982             if (!context.hasEntity(hallId)) {
51983                 continueTo(clickTownHall);
51984             }
51985         });
51986
51987         function continueTo(nextStep) {
51988             context.on('exit.intro', null);
51989             context.history().on('change.intro', null);
51990             d3_select('.inspector-wrap').on('wheel.intro', null);
51991             nextStep();
51992         }
51993     }
51994
51995
51996     function closeTownHall() {
51997         if (!isTownHallSelected()) return clickTownHall();
51998
51999         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
52000         var href = d3_select(selector$$1).attr('href') || '#icon-close';
52001
52002         reveal('.entity-editor-pane',
52003             t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
52004         );
52005
52006         context.on('exit.intro', function() {
52007             continueTo(searchStreet);
52008         });
52009
52010         context.history().on('change.intro', function() {
52011             // update the close icon in the tooltip if the user edits something.
52012             var selector$$1 = '.entity-editor-pane button.preset-close svg use';
52013             var href = d3_select(selector$$1).attr('href') || '#icon-close';
52014
52015             reveal('.entity-editor-pane',
52016                 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
52017                 { duration: 0 }
52018             );
52019         });
52020
52021         function continueTo(nextStep) {
52022             context.on('exit.intro', null);
52023             context.history().on('change.intro', null);
52024             nextStep();
52025         }
52026     }
52027
52028
52029     function searchStreet() {
52030         context.enter(modeBrowse(context));
52031         context.history().reset('initial');  // ensure spring street exists
52032
52033         var msec = transitionTime(springStreet, context.map().center());
52034         if (msec) { reveal(null, null, { duration: 0 }); }
52035         context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
52036
52037         timeout(function() {
52038             reveal('.search-header input',
52039                 t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
52040             );
52041
52042             d3_select('.search-header input')
52043                 .on('keyup.intro', checkSearchResult);
52044         }, msec + 100);
52045     }
52046
52047
52048     function checkSearchResult() {
52049         var first = d3_select('.feature-list-item:nth-child(0n+2)'),  // skip "No Results" item
52050             firstName = first.select('.entity-name'),
52051             name = t('intro.graph.name.spring-street');
52052
52053         if (!firstName.empty() && firstName.text() === name) {
52054             reveal(first.node(),
52055                 t('intro.navigation.choose_street', { name: name }),
52056                 { duration: 300 }
52057             );
52058
52059             context.on('exit.intro', function() {
52060                 continueTo(selectedStreet);
52061             });
52062
52063             d3_select('.search-header input')
52064                 .on('keydown.intro', eventCancel, true)
52065                 .on('keyup.intro', null);
52066         }
52067
52068         function continueTo(nextStep) {
52069             context.on('exit.intro', null);
52070             d3_select('.search-header input')
52071                 .on('keydown.intro', null)
52072                 .on('keyup.intro', null);
52073             nextStep();
52074         }
52075     }
52076
52077
52078     function selectedStreet() {
52079         if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
52080             return searchStreet();
52081         }
52082
52083         var onClick = function() { continueTo(editorStreet); };
52084         var entity = context.entity(springStreetEndId);
52085         var box = pointBox(entity.loc, context);
52086         box.height = 500;
52087
52088         reveal(box,
52089             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
52090             { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
52091         );
52092
52093         timeout(function() {
52094             context.map().on('move.intro drawn.intro', function() {
52095                 var entity = context.hasEntity(springStreetEndId);
52096                 if (!entity) return;
52097                 var box = pointBox(entity.loc, context);
52098                 box.height = 500;
52099                 reveal(box,
52100                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
52101                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
52102                 );
52103             });
52104         }, 600);  // after reveal.
52105
52106         context.on('enter.intro', function(mode) {
52107             if (!context.hasEntity(springStreetId)) {
52108                 return continueTo(searchStreet);
52109             }
52110             var ids = context.selectedIDs();
52111             if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
52112                 // keep Spring Street selected..
52113                 context.enter(modeSelect(context, [springStreetId]));
52114             }
52115         });
52116
52117         context.history().on('change.intro', function() {
52118             if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
52119                 timeout(function() {
52120                     continueTo(searchStreet);
52121                 }, 300);  // after any transition (e.g. if user deleted intersection)
52122             }
52123         });
52124
52125         function continueTo(nextStep) {
52126             context.map().on('move.intro drawn.intro', null);
52127             context.on('enter.intro', null);
52128             context.history().on('change.intro', null);
52129             nextStep();
52130         }
52131     }
52132
52133
52134     function editorStreet() {
52135         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
52136         var href = d3_select(selector$$1).attr('href') || '#icon-close';
52137
52138         reveal('.entity-editor-pane',
52139             t('intro.navigation.editor_street', {
52140                 button: icon(href, 'pre-text'),
52141                 field1: onewayField.label(),
52142                 field2: maxspeedField.label()
52143             })
52144         );
52145
52146         context.on('exit.intro', function() {
52147             continueTo(play);
52148         });
52149
52150         context.history().on('change.intro', function() {
52151             // update the close icon in the tooltip if the user edits something.
52152             var selector$$1 = '.entity-editor-pane button.preset-close svg use';
52153             var href = d3_select(selector$$1).attr('href') || '#icon-close';
52154
52155             reveal('.entity-editor-pane',
52156                 t('intro.navigation.editor_street', {
52157                     button: icon(href, 'pre-text'),
52158                     field1: onewayField.label().toLowerCase(),
52159                     field2: maxspeedField.label().toLowerCase()
52160                 }), { duration: 0 }
52161             );
52162         });
52163
52164         function continueTo(nextStep) {
52165             context.on('exit.intro', null);
52166             context.history().on('change.intro', null);
52167             nextStep();
52168         }
52169     }
52170
52171
52172     function play() {
52173         dispatch$$1.call('done');
52174         reveal('#id-container',
52175             t('intro.navigation.play', { next: t('intro.points.title') }), {
52176                 tooltipBox: '.intro-nav-wrap .chapter-point',
52177                 buttonText: t('intro.ok'),
52178                 buttonCallback: function() { reveal('#id-container'); }
52179             }
52180         );
52181     }
52182
52183
52184     chapter.enter = function() {
52185         dragMap();
52186     };
52187
52188
52189     chapter.exit = function() {
52190         timeouts.forEach(window.clearTimeout);
52191         context.on('enter.intro exit.intro', null);
52192         context.map().on('move.intro drawn.intro', null);
52193         context.history().on('change.intro', null);
52194         d3_select('.inspector-wrap').on('wheel.intro', null);
52195         d3_select('.search-header input').on('keydown.intro keyup.intro', null);
52196     };
52197
52198
52199     chapter.restart = function() {
52200         chapter.exit();
52201         chapter.enter();
52202     };
52203
52204
52205     return utilRebind(chapter, dispatch$$1, 'on');
52206 }
52207
52208 function uiIntroPoint(context, reveal) {
52209     var dispatch$$1 = dispatch('done'),
52210         timeouts = [],
52211         intersection = [-85.63279, 41.94394],
52212         building = [-85.632422, 41.944045],
52213         cafePreset = context.presets().item('amenity/cafe'),
52214         pointId = null;
52215
52216
52217     var chapter = {
52218         title: 'intro.points.title'
52219     };
52220
52221
52222     function timeout(f, t$$1) {
52223         timeouts.push(window.setTimeout(f, t$$1));
52224     }
52225
52226
52227     function revealEditMenu(loc, text, options) {
52228         var rect = context.surfaceRect();
52229         var point = context.curtainProjection(loc);
52230         var pad = 40;
52231         var width = 250 + (2 * pad);
52232         var height = 250;
52233         var startX = rect.left + point[0];
52234         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
52235         var box = {
52236             left: left,
52237             top: point[1] + rect.top - 60,
52238             width: width,
52239             height: height
52240         };
52241         reveal(box, text, options);
52242     }
52243
52244
52245     function eventCancel() {
52246         event.stopPropagation();
52247         event.preventDefault();
52248     }
52249
52250
52251     function addPoint() {
52252         context.enter(modeBrowse(context));
52253         context.history().reset('initial');
52254
52255         var msec = transitionTime(intersection, context.map().center());
52256         if (msec) { reveal(null, null, { duration: 0 }); }
52257         context.map().zoom(19).centerEase(intersection, msec);
52258
52259         timeout(function() {
52260             var tooltip = reveal('button.add-point',
52261                 t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
52262
52263             pointId = null;
52264
52265             tooltip.selectAll('.tooltip-inner')
52266                 .insert('svg', 'span')
52267                 .attr('class', 'tooltip-illustration')
52268                 .append('use')
52269                 .attr('xlink:href', '#poi-images');
52270
52271             context.on('enter.intro', function(mode) {
52272                 if (mode.id !== 'add-point') return;
52273                 continueTo(placePoint);
52274             });
52275         }, msec + 100);
52276
52277         function continueTo(nextStep) {
52278             context.on('enter.intro', null);
52279             nextStep();
52280         }
52281     }
52282
52283
52284     function placePoint() {
52285         if (context.mode().id !== 'add-point') {
52286             return chapter.restart();
52287         }
52288
52289         var pointBox$$1 = pad$1(building, 150, context);
52290         reveal(pointBox$$1, t('intro.points.place_point'));
52291
52292         context.map().on('move.intro drawn.intro', function() {
52293             pointBox$$1 = pad$1(building, 150, context);
52294             reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
52295         });
52296
52297         context.on('enter.intro', function(mode) {
52298             if (mode.id !== 'select') return chapter.restart();
52299             pointId = context.mode().selectedIDs()[0];
52300             continueTo(searchPreset);
52301         });
52302
52303         function continueTo(nextStep) {
52304             context.map().on('move.intro drawn.intro', null);
52305             context.on('enter.intro', null);
52306             nextStep();
52307         }
52308     }
52309
52310
52311     function searchPreset() {
52312         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
52313             return addPoint();
52314         }
52315
52316         // disallow scrolling
52317         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52318
52319         d3_select('.preset-search-input')
52320             .on('keydown.intro', null)
52321             .on('keyup.intro', checkPresetSearch);
52322
52323         reveal('.preset-search-input',
52324             t('intro.points.search_cafe', { preset: cafePreset.name() })
52325         );
52326
52327         context.on('enter.intro', function(mode) {
52328             if (!pointId || !context.hasEntity(pointId)) {
52329                 return continueTo(addPoint);
52330             }
52331
52332             var ids = context.selectedIDs();
52333             if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
52334                 // keep the user's point selected..
52335                 context.enter(modeSelect(context, [pointId]));
52336
52337                 // disallow scrolling
52338                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52339
52340                 d3_select('.preset-search-input')
52341                     .on('keydown.intro', null)
52342                     .on('keyup.intro', checkPresetSearch);
52343
52344                 reveal('.preset-search-input',
52345                     t('intro.points.search_cafe', { preset: cafePreset.name() })
52346                 );
52347
52348                 context.history().on('change.intro', null);
52349             }
52350         });
52351
52352
52353         function checkPresetSearch() {
52354             var first = d3_select('.preset-list-item:first-child');
52355
52356             if (first.classed('preset-amenity-cafe')) {
52357                 d3_select('.preset-search-input')
52358                     .on('keydown.intro', eventCancel, true)
52359                     .on('keyup.intro', null);
52360
52361                 reveal(first.select('.preset-list-button').node(),
52362                     t('intro.points.choose_cafe', { preset: cafePreset.name() }),
52363                     { duration: 300 }
52364                 );
52365
52366                 context.history().on('change.intro', function() {
52367                     continueTo(aboutFeatureEditor);
52368                 });
52369             }
52370         }
52371
52372         function continueTo(nextStep) {
52373             context.on('enter.intro', null);
52374             context.history().on('change.intro', null);
52375             d3_select('.inspector-wrap').on('wheel.intro', null);
52376             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
52377             nextStep();
52378         }
52379     }
52380
52381
52382     function aboutFeatureEditor() {
52383         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
52384             return addPoint();
52385         }
52386
52387         timeout(function() {
52388             reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
52389                 tooltipClass: 'intro-points-describe',
52390                 buttonText: t('intro.ok'),
52391                 buttonCallback: function() { continueTo(addName); }
52392             });
52393         }, 400);
52394
52395         context.on('exit.intro', function() {
52396             // if user leaves select mode here, just continue with the tutorial.
52397             continueTo(reselectPoint);
52398         });
52399
52400         function continueTo(nextStep) {
52401             context.on('exit.intro', null);
52402             nextStep();
52403         }
52404     }
52405
52406
52407     function addName() {
52408         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
52409             return addPoint();
52410         }
52411
52412         // reset pane, in case user happened to change it..
52413         d3_select('.inspector-wrap .panewrap').style('right', '0%');
52414
52415         timeout(function() {
52416             // It's possible for the user to add a name in a previous step..
52417             // If so, don't tell them to add the name in this step.
52418             // Give them an OK button instead.
52419             var entity = context.entity(pointId);
52420             if (entity.tags.name) {
52421                 var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
52422                     tooltipClass: 'intro-points-describe',
52423                     buttonText: t('intro.ok'),
52424                     buttonCallback: function() { continueTo(addCloseEditor); }
52425                 });
52426                 tooltip.select('.instruction').style('display', 'none');
52427
52428             } else {
52429                 reveal('.entity-editor-pane', t('intro.points.add_name'),
52430                     { tooltipClass: 'intro-points-describe' }
52431                 );
52432             }
52433         }, 400);
52434
52435         context.history().on('change.intro', function() {
52436             continueTo(addCloseEditor);
52437         });
52438
52439         context.on('exit.intro', function() {
52440             // if user leaves select mode here, just continue with the tutorial.
52441             continueTo(reselectPoint);
52442         });
52443
52444         function continueTo(nextStep) {
52445             context.on('exit.intro', null);
52446             context.history().on('change.intro', null);
52447             nextStep();
52448         }
52449     }
52450
52451
52452     function addCloseEditor() {
52453         // reset pane, in case user happened to change it..
52454         d3_select('.inspector-wrap .panewrap').style('right', '0%');
52455
52456         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
52457         var href = d3_select(selector$$1).attr('href') || '#icon-close';
52458
52459         context.on('exit.intro', function() {
52460             continueTo(reselectPoint);
52461         });
52462
52463         reveal('.entity-editor-pane',
52464             t('intro.points.add_close', { button: icon(href, 'pre-text') })
52465         );
52466
52467         function continueTo(nextStep) {
52468             context.on('exit.intro', null);
52469             nextStep();
52470         }
52471     }
52472
52473
52474     function reselectPoint() {
52475         if (!pointId) return chapter.restart();
52476         var entity = context.hasEntity(pointId);
52477         if (!entity) return chapter.restart();
52478
52479         // make sure it's still a cafe, in case user somehow changed it..
52480         var oldPreset = context.presets().match(entity, context.graph());
52481         context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
52482
52483         context.enter(modeBrowse(context));
52484
52485         var msec = transitionTime(entity.loc, context.map().center());
52486         if (msec) { reveal(null, null, { duration: 0 }); }
52487         context.map().centerEase(entity.loc, msec);
52488
52489         timeout(function() {
52490             var box = pointBox(entity.loc, context);
52491             reveal(box, t('intro.points.reselect'), { duration: 600 });
52492
52493             timeout(function() {
52494                 context.map().on('move.intro drawn.intro', function() {
52495                     var entity = context.hasEntity(pointId);
52496                     if (!entity) return chapter.restart();
52497                     var box = pointBox(entity.loc, context);
52498                     reveal(box, t('intro.points.reselect'), { duration: 0 });
52499                 });
52500             }, 600); // after reveal..
52501
52502             context.on('enter.intro', function(mode) {
52503                 if (mode.id !== 'select') return;
52504                 continueTo(updatePoint);
52505             });
52506
52507         }, msec + 100);
52508
52509         function continueTo(nextStep) {
52510             context.map().on('move.intro drawn.intro', null);
52511             context.on('enter.intro', null);
52512             nextStep();
52513         }
52514     }
52515
52516
52517     function updatePoint() {
52518         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
52519             return continueTo(reselectPoint);
52520         }
52521
52522         // reset pane, in case user happened to untag the point..
52523         d3_select('.inspector-wrap .panewrap').style('right', '0%');
52524
52525         context.on('exit.intro', function() {
52526             continueTo(reselectPoint);
52527         });
52528
52529         context.history().on('change.intro', function() {
52530             continueTo(updateCloseEditor);
52531         });
52532
52533         timeout(function() {
52534             reveal('.entity-editor-pane', t('intro.points.update'),
52535                 { tooltipClass: 'intro-points-describe' }
52536             );
52537         }, 400);
52538
52539         function continueTo(nextStep) {
52540             context.on('exit.intro', null);
52541             context.history().on('change.intro', null);
52542             nextStep();
52543         }
52544     }
52545
52546
52547     function updateCloseEditor() {
52548         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
52549             return continueTo(reselectPoint);
52550         }
52551
52552         // reset pane, in case user happened to change it..
52553         d3_select('.inspector-wrap .panewrap').style('right', '0%');
52554
52555         context.on('exit.intro', function() {
52556             continueTo(rightClickPoint);
52557         });
52558
52559         timeout(function() {
52560             reveal('.entity-editor-pane',
52561                 t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
52562             );
52563         }, 500);
52564
52565         function continueTo(nextStep) {
52566             context.on('exit.intro', null);
52567             nextStep();
52568         }
52569     }
52570
52571
52572     function rightClickPoint() {
52573         if (!pointId) return chapter.restart();
52574         var entity = context.hasEntity(pointId);
52575         if (!entity) return chapter.restart();
52576
52577         context.enter(modeBrowse(context));
52578
52579         var box = pointBox(entity.loc, context);
52580         reveal(box, t('intro.points.rightclick'), { duration: 600 });
52581
52582         timeout(function() {
52583             context.map().on('move.intro drawn.intro', function() {
52584                 var entity = context.hasEntity(pointId);
52585                 if (!entity) return chapter.restart();
52586                 var box = pointBox(entity.loc, context);
52587                 reveal(box, t('intro.points.rightclick'), { duration: 0 });
52588             });
52589         }, 600); // after reveal
52590
52591         context.on('enter.intro', function(mode) {
52592             if (mode.id !== 'select') return;
52593             var ids = context.selectedIDs();
52594             if (ids.length !== 1 || ids[0] !== pointId) return;
52595
52596             timeout(function() {
52597                 var node = selectMenuItem('delete').node();
52598                 if (!node) return;
52599                 continueTo(enterDelete);
52600             }, 300);  // after menu visible
52601         });
52602
52603         function continueTo(nextStep) {
52604             context.on('enter.intro', null);
52605             context.map().on('move.intro drawn.intro', null);
52606             nextStep();
52607         }
52608     }
52609
52610
52611     function enterDelete() {
52612         if (!pointId) return chapter.restart();
52613         var entity = context.hasEntity(pointId);
52614         if (!entity) return chapter.restart();
52615
52616         var node = selectMenuItem('delete').node();
52617         if (!node) { return continueTo(rightClickPoint); }
52618
52619         revealEditMenu(entity.loc,
52620             t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
52621         );
52622
52623         timeout(function() {
52624             context.map().on('move.intro drawn.intro', function() {
52625                 revealEditMenu(entity.loc,
52626                     t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
52627                     { duration: 0}
52628                 );
52629             });
52630         }, 300); // after menu visible
52631
52632         context.on('exit.intro', function() {
52633             if (!pointId) return chapter.restart();
52634             var entity = context.hasEntity(pointId);
52635             if (entity) return continueTo(rightClickPoint);  // point still exists
52636         });
52637
52638         context.history().on('change.intro', function(changed) {
52639             if (changed.deleted().length) {
52640                 continueTo(undo);
52641             }
52642         });
52643
52644         function continueTo(nextStep) {
52645             context.map().on('move.intro drawn.intro', null);
52646             context.history().on('change.intro', null);
52647             context.on('exit.intro', null);
52648             nextStep();
52649         }
52650     }
52651
52652
52653     function undo() {
52654         context.history().on('change.intro', function() {
52655             continueTo(play);
52656         });
52657
52658         var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
52659         reveal('#bar button.undo-button',
52660             t('intro.points.undo', { button: icon(iconName, 'pre-text') })
52661         );
52662
52663         function continueTo(nextStep) {
52664             context.history().on('change.intro', null);
52665             nextStep();
52666         }
52667     }
52668
52669
52670     function play() {
52671         dispatch$$1.call('done');
52672         reveal('#id-container',
52673             t('intro.points.play', { next: t('intro.areas.title') }), {
52674                 tooltipBox: '.intro-nav-wrap .chapter-area',
52675                 buttonText: t('intro.ok'),
52676                 buttonCallback: function() { reveal('#id-container'); }
52677             }
52678         );
52679     }
52680
52681
52682     chapter.enter = function() {
52683         addPoint();
52684     };
52685
52686
52687     chapter.exit = function() {
52688         timeouts.forEach(window.clearTimeout);
52689         context.on('enter.intro exit.intro', null);
52690         context.map().on('move.intro drawn.intro', null);
52691         context.history().on('change.intro', null);
52692         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52693         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
52694     };
52695
52696
52697     chapter.restart = function() {
52698         chapter.exit();
52699         chapter.enter();
52700     };
52701
52702
52703     return utilRebind(chapter, dispatch$$1, 'on');
52704 }
52705
52706 function uiIntroArea(context, reveal) {
52707     var dispatch$$1 = dispatch('done'),
52708         playground = [-85.63552, 41.94159],
52709         playgroundPreset = context.presets().item('leisure/playground'),
52710         descriptionField = context.presets().field('description'),
52711         timeouts = [],
52712         areaId;
52713
52714
52715     var chapter = {
52716         title: 'intro.areas.title'
52717     };
52718
52719
52720     function timeout(f, t$$1) {
52721         timeouts.push(window.setTimeout(f, t$$1));
52722     }
52723
52724
52725     function eventCancel() {
52726         event.stopPropagation();
52727         event.preventDefault();
52728     }
52729
52730
52731     function revealPlayground(center, text, options) {
52732         var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
52733         var box = pad$1(center, padding, context);
52734         reveal(box, text, options);
52735     }
52736
52737
52738     function addArea() {
52739         context.enter(modeBrowse(context));
52740         context.history().reset('initial');
52741         areaId = null;
52742
52743         var msec = transitionTime(playground, context.map().center());
52744         if (msec) { reveal(null, null, { duration: 0 }); }
52745         context.map().zoom(19).centerEase(playground, msec);
52746
52747         timeout(function() {
52748             var tooltip = reveal('button.add-area',
52749                 t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
52750
52751             tooltip.selectAll('.tooltip-inner')
52752                 .insert('svg', 'span')
52753                 .attr('class', 'tooltip-illustration')
52754                 .append('use')
52755                 .attr('xlink:href', '#landuse-images');
52756
52757             context.on('enter.intro', function(mode) {
52758                 if (mode.id !== 'add-area') return;
52759                 continueTo(startPlayground);
52760             });
52761         }, msec + 100);
52762
52763         function continueTo(nextStep) {
52764             context.on('enter.intro', null);
52765             nextStep();
52766         }
52767     }
52768
52769
52770     function startPlayground() {
52771         if (context.mode().id !== 'add-area') {
52772             return chapter.restart();
52773         }
52774
52775         areaId = null;
52776         context.map().zoomEase(19.5, 500);
52777
52778         timeout(function() {
52779             revealPlayground(playground,
52780                 t('intro.areas.start_playground'), { duration: 250 }
52781             );
52782
52783             timeout(function() {
52784                 context.map().on('move.intro drawn.intro', function() {
52785                     revealPlayground(playground,
52786                         t('intro.areas.start_playground'), { duration: 0 }
52787                     );
52788                 });
52789                 context.on('enter.intro', function(mode) {
52790                     if (mode.id !== 'draw-area') return chapter.restart();
52791                     continueTo(continuePlayground);
52792                 });
52793             }, 250);  // after reveal
52794
52795         }, 550);  // after easing
52796
52797         function continueTo(nextStep) {
52798             context.map().on('move.intro drawn.intro', null);
52799             context.on('enter.intro', null);
52800             nextStep();
52801         }
52802     }
52803
52804
52805     function continuePlayground() {
52806         if (context.mode().id !== 'draw-area') {
52807             return chapter.restart();
52808         }
52809
52810         areaId = null;
52811         revealPlayground(playground,
52812             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
52813             { duration: 250 }
52814         );
52815
52816         timeout(function() {
52817             context.map().on('move.intro drawn.intro', function() {
52818                 revealPlayground(playground,
52819                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
52820                     { duration: 0 }
52821                 );
52822             });
52823         }, 250);  // after reveal
52824
52825         context.on('enter.intro', function(mode) {
52826             if (mode.id === 'draw-area') {
52827                 var entity = context.hasEntity(context.selectedIDs()[0]);
52828                 if (entity && entity.nodes.length >= 6) {
52829                     return continueTo(finishPlayground);
52830                 } else {
52831                     return;
52832                 }
52833             } else if (mode.id === 'select') {
52834                 areaId = context.selectedIDs()[0];
52835                 return continueTo(searchPresets);
52836             } else {
52837                 return chapter.restart();
52838             }
52839         });
52840
52841         function continueTo(nextStep) {
52842             context.map().on('move.intro drawn.intro', null);
52843             context.on('enter.intro', null);
52844             nextStep();
52845         }
52846     }
52847
52848
52849     function finishPlayground() {
52850         if (context.mode().id !== 'draw-area') {
52851             return chapter.restart();
52852         }
52853
52854         areaId = null;
52855         revealPlayground(playground,
52856             t('intro.areas.finish_playground'), { duration: 250 }
52857         );
52858
52859         timeout(function() {
52860             context.map().on('move.intro drawn.intro', function() {
52861                 revealPlayground(playground,
52862                     t('intro.areas.finish_playground'), { duration: 0 }
52863                 );
52864             });
52865         }, 250);  // after reveal
52866
52867         context.on('enter.intro', function(mode) {
52868             if (mode.id === 'draw-area') {
52869                 return;
52870             } else if (mode.id === 'select') {
52871                 areaId = context.selectedIDs()[0];
52872                 return continueTo(searchPresets);
52873             } else {
52874                 return chapter.restart();
52875             }
52876         });
52877
52878         function continueTo(nextStep) {
52879             context.map().on('move.intro drawn.intro', null);
52880             context.on('enter.intro', null);
52881             nextStep();
52882         }
52883     }
52884
52885
52886     function searchPresets() {
52887         if (!areaId || !context.hasEntity(areaId)) {
52888             return addArea();
52889         }
52890         var ids = context.selectedIDs();
52891         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
52892             context.enter(modeSelect(context, [areaId]));
52893         }
52894
52895         // disallow scrolling
52896         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52897
52898         timeout(function() {
52899             // reset pane, in case user somehow happened to change it..
52900             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52901
52902             d3_select('.preset-search-input')
52903                 .on('keydown.intro', null)
52904                 .on('keyup.intro', checkPresetSearch);
52905
52906             reveal('.preset-search-input',
52907                 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
52908             );
52909         }, 400);  // after preset list pane visible..
52910
52911         context.on('enter.intro', function(mode) {
52912             if (!areaId || !context.hasEntity(areaId)) {
52913                 return continueTo(addArea);
52914             }
52915
52916             var ids = context.selectedIDs();
52917             if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
52918                 // keep the user's area selected..
52919                 context.enter(modeSelect(context, [areaId]));
52920
52921                 // reset pane, in case user somehow happened to change it..
52922                 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52923                 // disallow scrolling
52924                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52925
52926                 d3_select('.preset-search-input')
52927                     .on('keydown.intro', null)
52928                     .on('keyup.intro', checkPresetSearch);
52929
52930                 reveal('.preset-search-input',
52931                     t('intro.areas.search_playground', { preset: playgroundPreset.name() })
52932                 );
52933
52934                 context.history().on('change.intro', null);
52935             }
52936         });
52937
52938         function checkPresetSearch() {
52939             var first = d3_select('.preset-list-item:first-child');
52940
52941             if (first.classed('preset-leisure-playground')) {
52942                 reveal(first.select('.preset-list-button').node(),
52943                     t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
52944                     { duration: 300 }
52945                 );
52946
52947                 d3_select('.preset-search-input')
52948                     .on('keydown.intro', eventCancel, true)
52949                     .on('keyup.intro', null);
52950
52951                 context.history().on('change.intro', function() {
52952                     continueTo(clickAddField);
52953                 });
52954             }
52955         }
52956
52957         function continueTo(nextStep) {
52958             d3_select('.inspector-wrap').on('wheel.intro', null);
52959             context.on('enter.intro', null);
52960             context.history().on('change.intro', null);
52961             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
52962             nextStep();
52963         }
52964     }
52965
52966
52967     function clickAddField() {
52968         if (!areaId || !context.hasEntity(areaId)) {
52969             return addArea();
52970         }
52971         var ids = context.selectedIDs();
52972         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
52973             return searchPresets();
52974         }
52975
52976         if (!d3_select('.form-field-description').empty()) {
52977             return continueTo(describePlayground);
52978         }
52979
52980         // disallow scrolling
52981         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52982
52983         timeout(function() {
52984             // reset pane, in case user somehow happened to change it..
52985             d3_select('.inspector-wrap .panewrap').style('right', '0%');
52986
52987             // It's possible for the user to add a description in a previous step..
52988             // If they did this already, just continue to next step.
52989             var entity = context.entity(areaId);
52990             if (entity.tags.description) {
52991                 return continueTo(play);
52992             }
52993
52994             // scroll "Add field" into view
52995             var box = d3_select('.more-fields').node().getBoundingClientRect();
52996             if (box.top > 300) {
52997                 var pane = d3_select('.entity-editor-pane .inspector-body');
52998                 var start = pane.node().scrollTop;
52999                 var end = start + (box.top - 300);
53000
53001                 pane
53002                     .transition()
53003                     .duration(250)
53004                     .tween('scroll.inspector', function() {
53005                         var node = this;
53006                         var i = d3_interpolateNumber(start, end);
53007                         return function(t$$1) {
53008                             node.scrollTop = i(t$$1);
53009                         };
53010                     });
53011             }
53012
53013             timeout(function() {
53014                 reveal('.more-fields .combobox-input',
53015                     t('intro.areas.add_field'),
53016                     { duration: 300 }
53017                 );
53018
53019                 d3_select('.more-fields .combobox-input')
53020                     .on('click.intro', function() {
53021                         continueTo(chooseDescriptionField);
53022                     });
53023             }, 300);  // after "Add Field" visible
53024
53025         }, 400);  // after editor pane visible
53026
53027         context.on('exit.intro', function() {
53028             return continueTo(searchPresets);
53029         });
53030
53031         function continueTo(nextStep) {
53032             d3_select('.inspector-wrap').on('wheel.intro', null);
53033             d3_select('.more-fields .combobox-input').on('click.intro', null);
53034             context.on('exit.intro', null);
53035             nextStep();
53036         }
53037     }
53038
53039
53040     function chooseDescriptionField() {
53041         if (!areaId || !context.hasEntity(areaId)) {
53042             return addArea();
53043         }
53044         var ids = context.selectedIDs();
53045         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
53046             return searchPresets();
53047         }
53048
53049         if (!d3_select('.form-field-description').empty()) {
53050             return continueTo(describePlayground);
53051         }
53052
53053         // Make sure combobox is ready..
53054         if (d3_select('div.combobox').empty()) {
53055             return continueTo(clickAddField);
53056         }
53057         // Watch for the combobox to go away..
53058         var watcher;
53059         watcher = window.setInterval(function() {
53060             if (d3_select('div.combobox').empty()) {
53061                 window.clearInterval(watcher);
53062                 timeout(function() {
53063                     if (d3_select('.form-field-description').empty()) {
53064                         continueTo(retryChooseDescription);
53065                     } else {
53066                         continueTo(describePlayground);
53067                     }
53068                 }, 300);  // after description field added.
53069             }
53070         }, 300);
53071
53072         reveal('div.combobox',
53073             t('intro.areas.choose_field', { field: descriptionField.label() }),
53074             { duration: 300 }
53075         );
53076
53077         context.on('exit.intro', function() {
53078             return continueTo(searchPresets);
53079         });
53080
53081         function continueTo(nextStep) {
53082             if (watcher) window.clearInterval(watcher);
53083             context.on('exit.intro', null);
53084             nextStep();
53085         }
53086     }
53087
53088
53089     function describePlayground() {
53090         if (!areaId || !context.hasEntity(areaId)) {
53091             return addArea();
53092         }
53093         var ids = context.selectedIDs();
53094         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
53095             return searchPresets();
53096         }
53097
53098         // reset pane, in case user happened to change it..
53099         d3_select('.inspector-wrap .panewrap').style('right', '0%');
53100
53101         if (d3_select('.form-field-description').empty()) {
53102             return continueTo(retryChooseDescription);
53103         }
53104
53105         context.on('exit.intro', function() {
53106             continueTo(play);
53107         });
53108
53109         reveal('.entity-editor-pane',
53110             t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
53111             { duration: 300 }
53112         );
53113
53114         function continueTo(nextStep) {
53115             context.on('exit.intro', null);
53116             nextStep();
53117         }
53118     }
53119
53120
53121     function retryChooseDescription() {
53122         if (!areaId || !context.hasEntity(areaId)) {
53123             return addArea();
53124         }
53125         var ids = context.selectedIDs();
53126         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
53127             return searchPresets();
53128         }
53129
53130         // reset pane, in case user happened to change it..
53131         d3_select('.inspector-wrap .panewrap').style('right', '0%');
53132
53133         reveal('.entity-editor-pane',
53134             t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
53135             buttonText: t('intro.ok'),
53136             buttonCallback: function() { continueTo(clickAddField); }
53137         });
53138
53139         context.on('exit.intro', function() {
53140             return continueTo(searchPresets);
53141         });
53142
53143         function continueTo(nextStep) {
53144             context.on('exit.intro', null);
53145             nextStep();
53146         }
53147     }
53148
53149
53150     function play() {
53151         dispatch$$1.call('done');
53152         reveal('#id-container',
53153             t('intro.areas.play', { next: t('intro.lines.title') }), {
53154                 tooltipBox: '.intro-nav-wrap .chapter-line',
53155                 buttonText: t('intro.ok'),
53156                 buttonCallback: function() { reveal('#id-container'); }
53157             }
53158         );
53159     }
53160
53161
53162     chapter.enter = function() {
53163         addArea();
53164     };
53165
53166
53167     chapter.exit = function() {
53168         timeouts.forEach(window.clearTimeout);
53169         context.on('enter.intro exit.intro', null);
53170         context.map().on('move.intro drawn.intro', null);
53171         context.history().on('change.intro', null);
53172         d3_select('.inspector-wrap').on('wheel.intro', null);
53173         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53174         d3_select('.more-fields .combobox-input').on('click.intro', null);
53175     };
53176
53177
53178     chapter.restart = function() {
53179         chapter.exit();
53180         chapter.enter();
53181     };
53182
53183
53184     return utilRebind(chapter, dispatch$$1, 'on');
53185 }
53186
53187 function uiIntroLine(context, reveal) {
53188     var dispatch$$1 = dispatch('done'),
53189         timeouts = [],
53190         tulipRoadId = null,
53191         flowerRoadId = 'w646',
53192         tulipRoadStart = [-85.6297754121684, 41.95805253325314],
53193         tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
53194         tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
53195         roadCategory = context.presets().item('category-road'),
53196         residentialPreset = context.presets().item('highway/residential'),
53197         woodRoadId = 'w525',
53198         woodRoadEndId = 'n2862',
53199         woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
53200         woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
53201         woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
53202         washingtonStreetId = 'w522',
53203         twelfthAvenueId = 'w1',
53204         eleventhAvenueEndId = 'n3550',
53205         twelfthAvenueEndId = 'n5',
53206         washingtonSegmentId = null,
53207         eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
53208         twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
53209         deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
53210         twelfthAvenue = [-85.62219310052491, 41.952505413152956];
53211
53212
53213     var chapter = {
53214         title: 'intro.lines.title'
53215     };
53216
53217
53218     function timeout(f, t$$1) {
53219         timeouts.push(window.setTimeout(f, t$$1));
53220     }
53221
53222
53223     function eventCancel() {
53224         event.stopPropagation();
53225         event.preventDefault();
53226     }
53227
53228
53229     function revealEditMenu(loc, text, options) {
53230         var rect = context.surfaceRect();
53231         var point = context.curtainProjection(loc);
53232         var pad = 40;
53233         var width = 250 + (2 * pad);
53234         var height = 350;
53235         var startX = rect.left + point[0];
53236         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
53237         var box = {
53238             left: left,
53239             top: point[1] + rect.top - 60,
53240             width: width,
53241             height: height
53242         };
53243         reveal(box, text, options);
53244     }
53245
53246
53247     function addLine() {
53248         context.enter(modeBrowse(context));
53249         context.history().reset('initial');
53250
53251         var msec = transitionTime(tulipRoadStart, context.map().center());
53252         if (msec) { reveal(null, null, { duration: 0 }); }
53253         context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
53254
53255         timeout(function() {
53256             var tooltip = reveal('button.add-line',
53257                 t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
53258
53259             tooltip.selectAll('.tooltip-inner')
53260                 .insert('svg', 'span')
53261                 .attr('class', 'tooltip-illustration')
53262                 .append('use')
53263                 .attr('xlink:href', '#feature-images');
53264
53265             context.on('enter.intro', function(mode) {
53266                 if (mode.id !== 'add-line') return;
53267                 continueTo(startLine);
53268             });
53269         }, msec + 100);
53270
53271         function continueTo(nextStep) {
53272             context.on('enter.intro', null);
53273             nextStep();
53274         }
53275     }
53276
53277
53278     function startLine() {
53279         if (context.mode().id !== 'add-line') {
53280             return chapter.restart();
53281         }
53282
53283         tulipRoadId = null;
53284
53285         var padding = 70 * Math.pow(2, context.map().zoom() - 18);
53286         var box = pad$1(tulipRoadStart, padding, context);
53287         box.height = box.height + 100;
53288         reveal(box, t('intro.lines.start_line'));
53289
53290         context.map().on('move.intro drawn.intro', function() {
53291             padding = 70 * Math.pow(2, context.map().zoom() - 18);
53292             box = pad$1(tulipRoadStart, padding, context);
53293             box.height = box.height + 100;
53294             reveal(box, t('intro.lines.start_line'), { duration: 0 });
53295         });
53296
53297         context.on('enter.intro', function(mode) {
53298             if (mode.id !== 'draw-line') return chapter.restart();
53299             continueTo(drawLine);
53300         });
53301
53302         function continueTo(nextStep) {
53303             context.map().on('move.intro drawn.intro', null);
53304             context.on('enter.intro', null);
53305             nextStep();
53306         }
53307     }
53308
53309
53310     function drawLine() {
53311         if (context.mode().id !== 'draw-line') {
53312             return chapter.restart();
53313         }
53314
53315         tulipRoadId = context.mode().selectedIDs()[0];
53316         context.map().centerEase(tulipRoadMidpoint, 500);
53317
53318         timeout(function() {
53319             var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
53320             var box = pad$1(tulipRoadMidpoint, padding, context);
53321             box.height = box.height * 2;
53322             reveal(box,
53323                 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
53324             );
53325
53326             context.map().on('move.intro drawn.intro', function() {
53327                 padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
53328                 box = pad$1(tulipRoadMidpoint, padding, context);
53329                 box.height = box.height * 2;
53330                 reveal(box,
53331                     t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
53332                     { duration: 0 }
53333                 );
53334             });
53335         }, 550);  // after easing..
53336
53337         context.history().on('change.intro', function() {
53338             var entity = tulipRoadId && context.hasEntity(tulipRoadId);
53339             if (!entity) return chapter.restart();
53340
53341             if (isLineConnected()) {
53342                 continueTo(continueLine);
53343             }
53344         });
53345
53346         context.on('enter.intro', function(mode) {
53347             if (mode.id === 'draw-line')
53348                 return;
53349             else if (mode.id === 'select') {
53350                 continueTo(retryIntersect);
53351                 return;
53352             }
53353             else
53354                 return chapter.restart();
53355         });
53356
53357         function continueTo(nextStep) {
53358             context.map().on('move.intro drawn.intro', null);
53359             context.history().on('change.intro', null);
53360             context.on('enter.intro', null);
53361             nextStep();
53362         }
53363     }
53364
53365
53366     function isLineConnected() {
53367         var entity = tulipRoadId && context.hasEntity(tulipRoadId);
53368         if (!entity) return false;
53369
53370         var drawNodes = context.graph().childNodes(entity);
53371         return some(drawNodes, function(node) {
53372             return some(context.graph().parentWays(node), function(parent) {
53373                 return parent.id === flowerRoadId;
53374             });
53375         });
53376     }
53377
53378
53379     function retryIntersect() {
53380         d3_select(window).on('mousedown.intro', eventCancel, true);
53381
53382         var box = pad$1(tulipRoadIntersection, 80, context);
53383         reveal(box,
53384             t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
53385         );
53386
53387         timeout(chapter.restart, 3000);
53388     }
53389
53390
53391     function continueLine() {
53392         if (context.mode().id !== 'draw-line') return chapter.restart();
53393         var entity = tulipRoadId && context.hasEntity(tulipRoadId);
53394         if (!entity) return chapter.restart();
53395
53396         context.map().centerEase(tulipRoadIntersection, 500);
53397
53398         reveal('#surface', t('intro.lines.continue_line'));
53399
53400         context.on('enter.intro', function(mode) {
53401             if (mode.id === 'draw-line')
53402                 return;
53403             else if (mode.id === 'select')
53404                 return continueTo(chooseCategoryRoad);
53405             else
53406                 return chapter.restart();
53407         });
53408
53409         function continueTo(nextStep) {
53410             context.on('enter.intro', null);
53411             nextStep();
53412         }
53413     }
53414
53415
53416     function chooseCategoryRoad() {
53417         if (context.mode().id !== 'select') {
53418             return chapter.restart();
53419         }
53420
53421         context.on('exit.intro', function() {
53422             return chapter.restart();
53423         });
53424
53425         var button = d3_select('.preset-category-road .preset-list-button');
53426         if (button.empty()) return chapter.restart();
53427
53428         // disallow scrolling
53429         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53430
53431         timeout(function() {
53432             // reset pane, in case user somehow happened to change it..
53433             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53434
53435             reveal(button.node(),
53436                 t('intro.lines.choose_category_road', { category: roadCategory.name() })
53437             );
53438
53439             button.on('click.intro', function() {
53440                 continueTo(choosePresetResidential);
53441             });
53442
53443         }, 400);  // after editor pane visible
53444
53445         function continueTo(nextStep) {
53446             d3_select('.inspector-wrap').on('wheel.intro', null);
53447             d3_select('.preset-list-button').on('click.intro', null);
53448             context.on('exit.intro', null);
53449             nextStep();
53450         }
53451     }
53452
53453
53454     function choosePresetResidential() {
53455         if (context.mode().id !== 'select') {
53456             return chapter.restart();
53457         }
53458
53459         context.on('exit.intro', function() {
53460             return chapter.restart();
53461         });
53462
53463         var subgrid = d3_select('.preset-category-road .subgrid');
53464         if (subgrid.empty()) return chapter.restart();
53465
53466         subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
53467             .on('click.intro', function() {
53468                 continueTo(retryPresetResidential);
53469             });
53470
53471         subgrid.selectAll('.preset-highway-residential .preset-list-button')
53472             .on('click.intro', function() {
53473                 continueTo(nameRoad);
53474             });
53475
53476         timeout(function() {
53477             reveal(subgrid.node(),
53478                 t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
53479                 { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
53480             );
53481         }, 300);
53482
53483         function continueTo(nextStep) {
53484             d3_select('.preset-list-button').on('click.intro', null);
53485             context.on('exit.intro', null);
53486             nextStep();
53487         }
53488     }
53489
53490
53491     // selected wrong road type
53492     function retryPresetResidential() {
53493         if (context.mode().id !== 'select') {
53494             return chapter.restart();
53495         }
53496
53497         context.on('exit.intro', function() {
53498             return chapter.restart();
53499         });
53500
53501         // disallow scrolling
53502         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53503
53504         timeout(function() {
53505             var button = d3_select('.entity-editor-pane .preset-list-button');
53506
53507             reveal(button.node(),
53508                 t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
53509             );
53510
53511             button.on('click.intro', function() {
53512                 continueTo(chooseCategoryRoad);
53513             });
53514
53515         }, 500);
53516
53517         function continueTo(nextStep) {
53518             d3_select('.inspector-wrap').on('wheel.intro', null);
53519             d3_select('.preset-list-button').on('click.intro', null);
53520             context.on('exit.intro', null);
53521             nextStep();
53522         }
53523     }
53524
53525
53526     function nameRoad() {
53527         context.on('exit.intro', function() {
53528             continueTo(didNameRoad);
53529         });
53530
53531         timeout(function() {
53532             reveal('.entity-editor-pane',
53533                 t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
53534                 { tooltipClass: 'intro-lines-name_road' }
53535             );
53536         }, 500);
53537
53538         function continueTo(nextStep) {
53539             context.on('exit.intro', null);
53540             nextStep();
53541         }
53542     }
53543
53544
53545     function didNameRoad() {
53546         context.history().checkpoint('doneAddLine');
53547
53548         timeout(function() {
53549             reveal('#surface', t('intro.lines.did_name_road'), {
53550                 buttonText: t('intro.ok'),
53551                 buttonCallback: function() { continueTo(updateLine); }
53552             });
53553         }, 500);
53554
53555         function continueTo(nextStep) {
53556             nextStep();
53557         }
53558     }
53559
53560
53561     function updateLine() {
53562         context.history().reset('doneAddLine');
53563         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53564             return chapter.restart();
53565         }
53566
53567         var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
53568         if (msec) { reveal(null, null, { duration: 0 }); }
53569         context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
53570
53571         timeout(function() {
53572             var padding = 250 * Math.pow(2, context.map().zoom() - 19);
53573             var box = pad$1(woodRoadDragMidpoint, padding, context);
53574             var advance = function() { continueTo(addNode); };
53575
53576             reveal(box, t('intro.lines.update_line'),
53577                 { buttonText: t('intro.ok'), buttonCallback: advance }
53578             );
53579
53580             context.map().on('move.intro drawn.intro', function() {
53581                 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
53582                 var box = pad$1(woodRoadDragMidpoint, padding, context);
53583                 reveal(box, t('intro.lines.update_line'),
53584                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
53585                 );
53586             });
53587         }, msec + 100);
53588
53589         function continueTo(nextStep) {
53590             context.map().on('move.intro drawn.intro', null);
53591             nextStep();
53592         }
53593     }
53594
53595
53596     function addNode() {
53597         context.history().reset('doneAddLine');
53598         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53599             return chapter.restart();
53600         }
53601
53602         var padding = 40 * Math.pow(2, context.map().zoom() - 19);
53603         var box = pad$1(woodRoadAddNode, padding, context);
53604         reveal(box, t('intro.lines.add_node'));
53605
53606         context.map().on('move.intro drawn.intro', function() {
53607             var padding = 40 * Math.pow(2, context.map().zoom() - 19);
53608             var box = pad$1(woodRoadAddNode, padding, context);
53609             reveal(box, t('intro.lines.add_node'), { duration: 0 });
53610         });
53611
53612         context.history().on('change.intro', function(changed) {
53613             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53614                 return continueTo(updateLine);
53615             }
53616             if (changed.created().length === 1) {
53617                 timeout(function() { continueTo(startDragEndpoint); }, 500);
53618             }
53619         });
53620
53621         context.on('enter.intro', function(mode) {
53622             if (mode.id !== 'select') {
53623                 continueTo(updateLine);
53624             }
53625         });
53626
53627         function continueTo(nextStep) {
53628             context.map().on('move.intro drawn.intro', null);
53629             context.history().on('change.intro', null);
53630             context.on('enter.intro', null);
53631             nextStep();
53632         }
53633     }
53634
53635
53636     function startDragEndpoint() {
53637         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53638             return continueTo(updateLine);
53639         }
53640         if (context.selectedIDs().indexOf(woodRoadId) === -1) {
53641             context.enter(modeSelect(context, [woodRoadId]));
53642         }
53643
53644         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
53645         var box = pad$1(woodRoadDragEndpoint, padding, context);
53646         reveal(box, t('intro.lines.start_drag_endpoint'));
53647
53648         context.map().on('move.intro drawn.intro', function() {
53649             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53650                 return continueTo(updateLine);
53651             }
53652             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
53653             var box = pad$1(woodRoadDragEndpoint, padding, context);
53654             reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
53655
53656             var entity = context.entity(woodRoadEndId);
53657             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
53658                 continueTo(finishDragEndpoint);
53659             }
53660         });
53661
53662         context.on('enter.intro', function(mode) {
53663             if (mode.id !== 'select') {
53664                 // keep Wood Road selected so endpoint stays draggable..
53665                 context.enter(modeSelect(context, [woodRoadId]));
53666             }
53667         });
53668
53669         function continueTo(nextStep) {
53670             context.map().on('move.intro drawn.intro', null);
53671             context.on('enter.intro', null);
53672             nextStep();
53673         }
53674     }
53675
53676
53677     function finishDragEndpoint() {
53678         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53679             return continueTo(updateLine);
53680         }
53681
53682         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
53683         var box = pad$1(woodRoadDragEndpoint, padding, context);
53684         reveal(box, t('intro.lines.finish_drag_endpoint'));
53685
53686         context.map().on('move.intro drawn.intro', function() {
53687             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53688                 return continueTo(updateLine);
53689             }
53690             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
53691             var box = pad$1(woodRoadDragEndpoint, padding, context);
53692             reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
53693
53694             var entity = context.entity(woodRoadEndId);
53695             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
53696                 continueTo(startDragEndpoint);
53697             }
53698         });
53699
53700         context.on('enter.intro', function() {
53701             continueTo(startDragMidpoint);
53702         });
53703
53704         function continueTo(nextStep) {
53705             context.map().on('move.intro drawn.intro', null);
53706             context.on('enter.intro', null);
53707             nextStep();
53708         }
53709     }
53710
53711
53712     function startDragMidpoint() {
53713         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53714             return continueTo(updateLine);
53715         }
53716         if (context.selectedIDs().indexOf(woodRoadId) === -1) {
53717             context.enter(modeSelect(context, [woodRoadId]));
53718         }
53719
53720         var padding = 80 * Math.pow(2, context.map().zoom() - 19);
53721         var box = pad$1(woodRoadDragMidpoint, padding, context);
53722         reveal(box, t('intro.lines.start_drag_midpoint'));
53723
53724         context.map().on('move.intro drawn.intro', function() {
53725             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53726                 return continueTo(updateLine);
53727             }
53728             var padding = 80 * Math.pow(2, context.map().zoom() - 19);
53729             var box = pad$1(woodRoadDragMidpoint, padding, context);
53730             reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
53731         });
53732
53733         context.history().on('change.intro', function(changed) {
53734             if (changed.created().length === 1) {
53735                 continueTo(continueDragMidpoint);
53736             }
53737         });
53738
53739         context.on('enter.intro', function(mode) {
53740             if (mode.id !== 'select') {
53741                 // keep Wood Road selected so midpoint triangles are drawn..
53742                 context.enter(modeSelect(context, [woodRoadId]));
53743             }
53744         });
53745
53746         function continueTo(nextStep) {
53747             context.map().on('move.intro drawn.intro', null);
53748             context.history().on('change.intro', null);
53749             context.on('enter.intro', null);
53750             nextStep();
53751         }
53752     }
53753
53754
53755     function continueDragMidpoint() {
53756         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53757             return continueTo(updateLine);
53758         }
53759
53760         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
53761         var box = pad$1(woodRoadDragEndpoint, padding, context);
53762         box.height += 400;
53763
53764         var advance = function() {
53765             context.history().checkpoint('doneUpdateLine');
53766             continueTo(deleteLines);
53767         };
53768
53769         reveal(box, t('intro.lines.continue_drag_midpoint'),
53770             { buttonText: t('intro.ok'), buttonCallback: advance }
53771         );
53772
53773         context.map().on('move.intro drawn.intro', function() {
53774             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
53775                 return continueTo(updateLine);
53776             }
53777             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
53778             var box = pad$1(woodRoadDragEndpoint, padding, context);
53779             box.height += 400;
53780             reveal(box, t('intro.lines.continue_drag_midpoint'),
53781                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
53782             );
53783         });
53784
53785         function continueTo(nextStep) {
53786             context.map().on('move.intro drawn.intro', null);
53787             nextStep();
53788         }
53789     }
53790
53791
53792     function deleteLines() {
53793         context.history().reset('doneUpdateLine');
53794         context.enter(modeBrowse(context));
53795
53796         if (!context.hasEntity(washingtonStreetId) ||
53797             !context.hasEntity(twelfthAvenueId) ||
53798             !context.hasEntity(eleventhAvenueEndId)) {
53799             return chapter.restart();
53800         }
53801
53802         var msec = transitionTime(deleteLinesLoc, context.map().center());
53803         if (msec) { reveal(null, null, { duration: 0 }); }
53804         context.map().zoom(18).centerEase(deleteLinesLoc, msec);
53805
53806         timeout(function() {
53807             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53808             var box = pad$1(deleteLinesLoc, padding, context);
53809             box.top -= 200;
53810             box.height += 400;
53811             var advance = function() { continueTo(rightClickIntersection); };
53812
53813             reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
53814                 { buttonText: t('intro.ok'), buttonCallback: advance }
53815             );
53816
53817             context.map().on('move.intro drawn.intro', function() {
53818                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53819                 var box = pad$1(deleteLinesLoc, padding, context);
53820                 box.top -= 200;
53821                 box.height += 400;
53822                 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
53823                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
53824                 );
53825             });
53826
53827             context.history().on('change.intro', function() {
53828                 timeout(function() {
53829                     continueTo(deleteLines);
53830                 }, 500);  // after any transition (e.g. if user deleted intersection)
53831             });
53832
53833         }, msec + 100);
53834
53835         function continueTo(nextStep) {
53836             context.map().on('move.intro drawn.intro', null);
53837             context.history().on('change.intro', null);
53838             nextStep();
53839         }
53840     }
53841
53842
53843     function rightClickIntersection() {
53844         context.history().reset('doneUpdateLine');
53845         context.enter(modeBrowse(context));
53846
53847         context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
53848
53849         timeout(function() {
53850             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
53851             var box = pad$1(eleventhAvenueEnd, padding, context);
53852             reveal(box, t('intro.lines.rightclick_intersection',
53853                 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
53854             );
53855
53856             context.map().on('move.intro drawn.intro', function() {
53857                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
53858                 var box = pad$1(eleventhAvenueEnd, padding, context);
53859                 reveal(box, t('intro.lines.rightclick_intersection',
53860                     { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
53861                     { duration: 0 }
53862                 );
53863             });
53864
53865             context.on('enter.intro', function(mode) {
53866                 if (mode.id !== 'select') return;
53867                 var ids = context.selectedIDs();
53868                 if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
53869
53870                 timeout(function() {
53871                     var node = selectMenuItem('split').node();
53872                     if (!node) return;
53873                     continueTo(splitIntersection);
53874                 }, 300);  // after menu visible
53875             });
53876
53877             context.history().on('change.intro', function() {
53878                 timeout(function() {
53879                     continueTo(deleteLines);
53880                 }, 300);  // after any transition (e.g. if user deleted intersection)
53881             });
53882
53883         }, 600);
53884
53885         function continueTo(nextStep) {
53886             context.map().on('move.intro drawn.intro', null);
53887             context.on('enter.intro', null);
53888             context.history().on('change.intro', null);
53889             nextStep();
53890         }
53891     }
53892
53893
53894     function splitIntersection() {
53895         if (!context.hasEntity(washingtonStreetId) ||
53896             !context.hasEntity(twelfthAvenueId) ||
53897             !context.hasEntity(eleventhAvenueEndId)) {
53898             return continueTo(deleteLines);
53899         }
53900
53901         var node = selectMenuItem('split').node();
53902         if (!node) { return continueTo(rightClickIntersection); }
53903
53904         var wasChanged = false;
53905         var menuCoords = context.map().mouseCoordinates();
53906         washingtonSegmentId = null;
53907
53908         revealEditMenu(menuCoords, t('intro.lines.split_intersection',
53909             { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
53910         );
53911
53912         context.map().on('move.intro drawn.intro', function() {
53913             var node = selectMenuItem('split').node();
53914             if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
53915
53916             revealEditMenu(menuCoords, t('intro.lines.split_intersection',
53917                 { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
53918                 { duration: 0 }
53919             );
53920         });
53921
53922         context.history().on('change.intro', function(changed) {
53923             wasChanged = true;
53924             timeout(function() {
53925                 if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
53926                     washingtonSegmentId = changed.created()[0].id;
53927                     continueTo(didSplit);
53928                 } else {
53929                     washingtonSegmentId = null;
53930                     continueTo(retrySplit);
53931                 }
53932             }, 300);  // after any transition (e.g. if user deleted intersection)
53933         });
53934
53935         function continueTo(nextStep) {
53936             context.map().on('move.intro drawn.intro', null);
53937             context.history().on('change.intro', null);
53938             nextStep();
53939         }
53940     }
53941
53942
53943     function retrySplit() {
53944         context.enter(modeBrowse(context));
53945         context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
53946         var advance = function() { continueTo(rightClickIntersection); };
53947
53948         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
53949         var box = pad$1(eleventhAvenueEnd, padding, context);
53950         reveal(box, t('intro.lines.retry_split'),
53951             { buttonText: t('intro.ok'), buttonCallback: advance }
53952         );
53953
53954         context.map().on('move.intro drawn.intro', function() {
53955             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
53956             var box = pad$1(eleventhAvenueEnd, padding, context);
53957             reveal(box, t('intro.lines.retry_split'),
53958                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
53959             );
53960         });
53961
53962         function continueTo(nextStep) {
53963             context.map().on('move.intro drawn.intro', null);
53964             nextStep();
53965         }
53966     }
53967
53968
53969     function didSplit() {
53970         if (!washingtonSegmentId ||
53971             !context.hasEntity(washingtonSegmentId) ||
53972             !context.hasEntity(washingtonStreetId) ||
53973             !context.hasEntity(twelfthAvenueId) ||
53974             !context.hasEntity(eleventhAvenueEndId)) {
53975             return continueTo(rightClickIntersection);
53976         }
53977
53978         var ids = context.selectedIDs();
53979         var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
53980         var street = t('intro.graph.name.washington-street');
53981
53982         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53983         var box = pad$1(twelfthAvenue, padding, context);
53984         box.width = box.width / 2;
53985         reveal(box, t(string, { street1: street, street2: street }),
53986             { duration: 500 }
53987         );
53988
53989         timeout(function() {
53990             context.map().zoom(18).centerEase(twelfthAvenue, 500);
53991
53992             context.map().on('move.intro drawn.intro', function() {
53993                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53994                 var box = pad$1(twelfthAvenue, padding, context);
53995                 box.width = box.width / 2;
53996                 reveal(box, t(string, { street1: street, street2: street }),
53997                     { duration: 0 }
53998                 );
53999             });
54000         }, 600);  // after initial reveal and curtain cut
54001
54002         context.on('enter.intro', function() {
54003             var ids = context.selectedIDs();
54004             if (ids.length === 1 && ids[0] === washingtonSegmentId) {
54005                 continueTo(multiSelect);
54006             }
54007         });
54008
54009         context.history().on('change.intro', function() {
54010             if (!washingtonSegmentId ||
54011                 !context.hasEntity(washingtonSegmentId) ||
54012                 !context.hasEntity(washingtonStreetId) ||
54013                 !context.hasEntity(twelfthAvenueId) ||
54014                 !context.hasEntity(eleventhAvenueEndId)) {
54015                 return continueTo(rightClickIntersection);
54016             }
54017         });
54018
54019         function continueTo(nextStep) {
54020             context.map().on('move.intro drawn.intro', null);
54021             context.on('enter.intro', null);
54022             context.history().on('change.intro', null);
54023             nextStep();
54024         }
54025     }
54026
54027
54028     function multiSelect() {
54029         if (!washingtonSegmentId ||
54030             !context.hasEntity(washingtonSegmentId) ||
54031             !context.hasEntity(washingtonStreetId) ||
54032             !context.hasEntity(twelfthAvenueId) ||
54033             !context.hasEntity(eleventhAvenueEndId)) {
54034             return continueTo(rightClickIntersection);
54035         }
54036
54037         var ids = context.selectedIDs();
54038         var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
54039         var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
54040
54041         if (hasWashington && hasTwelfth) {
54042             return continueTo(multiRightClick);
54043         } else if (!hasWashington && !hasTwelfth) {
54044             return continueTo(didSplit);
54045         }
54046
54047         context.map().zoom(18).centerEase(twelfthAvenue, 500);
54048
54049         timeout(function() {
54050             var selected, other, padding, box;
54051             if (hasWashington) {
54052                 selected = t('intro.graph.name.washington-street');
54053                 other = t('intro.graph.name.12th-avenue');
54054                 padding = 60 * Math.pow(2, context.map().zoom() - 18);
54055                 box = pad$1(twelfthAvenueEnd, padding, context);
54056                 box.width *= 3;
54057             } else {
54058                 selected = t('intro.graph.name.12th-avenue');
54059                 other = t('intro.graph.name.washington-street');
54060                 padding = 200 * Math.pow(2, context.map().zoom() - 18);
54061                 box = pad$1(twelfthAvenue, padding, context);
54062                 box.width /= 2;
54063             }
54064
54065             reveal(box,
54066                 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
54067             );
54068
54069             context.map().on('move.intro drawn.intro', function() {
54070                 if (hasWashington) {
54071                     selected = t('intro.graph.name.washington-street');
54072                     other = t('intro.graph.name.12th-avenue');
54073                     padding = 60 * Math.pow(2, context.map().zoom() - 18);
54074                     box = pad$1(twelfthAvenueEnd, padding, context);
54075                     box.width *= 3;
54076                 } else {
54077                     selected = t('intro.graph.name.12th-avenue');
54078                     other = t('intro.graph.name.washington-street');
54079                     padding = 200 * Math.pow(2, context.map().zoom() - 18);
54080                     box = pad$1(twelfthAvenue, padding, context);
54081                     box.width /= 2;
54082                 }
54083
54084                 reveal(box,
54085                     t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
54086                     { duration: 0 }
54087                 );
54088             });
54089
54090             context.on('enter.intro', function() {
54091                 continueTo(multiSelect);
54092             });
54093
54094             context.history().on('change.intro', function() {
54095                 if (!washingtonSegmentId ||
54096                     !context.hasEntity(washingtonSegmentId) ||
54097                     !context.hasEntity(washingtonStreetId) ||
54098                     !context.hasEntity(twelfthAvenueId) ||
54099                     !context.hasEntity(eleventhAvenueEndId)) {
54100                     return continueTo(rightClickIntersection);
54101                 }
54102             });
54103         }, 600);
54104
54105         function continueTo(nextStep) {
54106             context.map().on('move.intro drawn.intro', null);
54107             context.on('enter.intro', null);
54108             context.history().on('change.intro', null);
54109             nextStep();
54110         }
54111     }
54112
54113
54114     function multiRightClick() {
54115         if (!washingtonSegmentId ||
54116             !context.hasEntity(washingtonSegmentId) ||
54117             !context.hasEntity(washingtonStreetId) ||
54118             !context.hasEntity(twelfthAvenueId) ||
54119             !context.hasEntity(eleventhAvenueEndId)) {
54120             return continueTo(rightClickIntersection);
54121         }
54122
54123         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
54124         var box = pad$1(twelfthAvenue, padding, context);
54125         reveal(box, t('intro.lines.multi_rightclick'));
54126
54127         context.map().on('move.intro drawn.intro', function() {
54128             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
54129             var box = pad$1(twelfthAvenue, padding, context);
54130             reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
54131         });
54132
54133         d3_select(window).on('click.intro contextmenu.intro', function() {
54134             timeout(function() {
54135                 var ids = context.selectedIDs();
54136                 if (ids.length === 2 &&
54137                     ids.indexOf(twelfthAvenueId) !== -1 &&
54138                     ids.indexOf(washingtonSegmentId) !== -1) {
54139                         var node = selectMenuItem('delete').node();
54140                         if (!node) return;
54141                         continueTo(multiDelete);
54142                 } else if (ids.length === 1 &&
54143                     ids.indexOf(washingtonSegmentId) !== -1) {
54144                     return continueTo(multiSelect);
54145                 } else {
54146                     return continueTo(didSplit);
54147                 }
54148             }, 300);  // after edit menu visible
54149         }, true);
54150
54151         context.history().on('change.intro', function() {
54152             if (!washingtonSegmentId ||
54153                 !context.hasEntity(washingtonSegmentId) ||
54154                 !context.hasEntity(washingtonStreetId) ||
54155                 !context.hasEntity(twelfthAvenueId) ||
54156                 !context.hasEntity(eleventhAvenueEndId)) {
54157                 return continueTo(rightClickIntersection);
54158             }
54159         });
54160
54161         function continueTo(nextStep) {
54162             context.map().on('move.intro drawn.intro', null);
54163             d3_select(window).on('click.intro contextmenu.intro', null, true);
54164             context.history().on('change.intro', null);
54165             nextStep();
54166         }
54167     }
54168
54169
54170     function multiDelete() {
54171         if (!washingtonSegmentId ||
54172             !context.hasEntity(washingtonSegmentId) ||
54173             !context.hasEntity(washingtonStreetId) ||
54174             !context.hasEntity(twelfthAvenueId) ||
54175             !context.hasEntity(eleventhAvenueEndId)) {
54176             return continueTo(rightClickIntersection);
54177         }
54178
54179         var node = selectMenuItem('delete').node();
54180         if (!node) return continueTo(multiRightClick);
54181
54182         var menuCoords = context.map().mouseCoordinates();
54183         revealEditMenu(menuCoords,
54184             t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
54185         );
54186
54187         context.map().on('move.intro drawn.intro', function() {
54188             revealEditMenu(menuCoords,
54189                 t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
54190                 { duration: 0 }
54191             );
54192         });
54193
54194         context.on('exit.intro', function() {
54195             if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
54196                 return continueTo(multiSelect);  // left select mode but roads still exist
54197             }
54198         });
54199
54200         context.history().on('change.intro', function() {
54201             if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
54202                 continueTo(retryDelete);         // changed something but roads still exist
54203             } else {
54204                 continueTo(play);
54205             }
54206         });
54207
54208         function continueTo(nextStep) {
54209             context.map().on('move.intro drawn.intro', null);
54210             context.on('exit.intro', null);
54211             context.history().on('change.intro', null);
54212             nextStep();
54213         }
54214     }
54215
54216
54217     function retryDelete() {
54218         context.enter(modeBrowse(context));
54219
54220         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
54221         var box = pad$1(twelfthAvenue, padding, context);
54222         reveal(box, t('intro.lines.retry_delete'), {
54223             buttonText: t('intro.ok'),
54224             buttonCallback: function() { continueTo(multiSelect); }
54225         });
54226
54227         function continueTo(nextStep) {
54228             nextStep();
54229         }
54230     }
54231
54232
54233     function play() {
54234         dispatch$$1.call('done');
54235         reveal('#id-container',
54236             t('intro.lines.play', { next: t('intro.buildings.title') }), {
54237                 tooltipBox: '.intro-nav-wrap .chapter-building',
54238                 buttonText: t('intro.ok'),
54239                 buttonCallback: function() { reveal('#id-container'); }
54240             }
54241         );
54242    }
54243
54244
54245     chapter.enter = function() {
54246         addLine();
54247     };
54248
54249
54250     chapter.exit = function() {
54251         timeouts.forEach(window.clearTimeout);
54252         d3_select(window).on('mousedown.intro', null, true);
54253         context.on('enter.intro exit.intro', null);
54254         context.map().on('move.intro drawn.intro', null);
54255         context.history().on('change.intro', null);
54256         d3_select('.inspector-wrap').on('wheel.intro', null);
54257         d3_select('.preset-list-button').on('click.intro', null);
54258     };
54259
54260
54261     chapter.restart = function() {
54262         chapter.exit();
54263         chapter.enter();
54264     };
54265
54266
54267     return utilRebind(chapter, dispatch$$1, 'on');
54268 }
54269
54270 function uiIntroBuilding(context, reveal) {
54271     var dispatch$$1 = dispatch('done'),
54272         house = [-85.62815, 41.95638],
54273         tank = [-85.62732, 41.95347],
54274         buildingCatetory = context.presets().item('category-building'),
54275         housePreset = context.presets().item('building/house'),
54276         tankPreset = context.presets().item('man_made/storage_tank'),
54277         timeouts = [],
54278         houseId = null,
54279         tankId = null;
54280
54281
54282     var chapter = {
54283         title: 'intro.buildings.title'
54284     };
54285
54286
54287     function timeout(f, t$$1) {
54288         timeouts.push(window.setTimeout(f, t$$1));
54289     }
54290
54291
54292     function eventCancel() {
54293         event.stopPropagation();
54294         event.preventDefault();
54295     }
54296
54297
54298     function revealHouse(center, text, options) {
54299         var padding = 160 * Math.pow(2, context.map().zoom() - 20);
54300         var box = pad$1(center, padding, context);
54301         reveal(box, text, options);
54302     }
54303
54304
54305     function revealTank(center, text, options) {
54306         var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
54307         var box = pad$1(center, padding, context);
54308         reveal(box, text, options);
54309     }
54310
54311
54312     function revealEditMenu(loc, text, options) {
54313         var rect = context.surfaceRect();
54314         var point = context.curtainProjection(loc);
54315         var pad = 40;
54316         var width = 250 + (2 * pad);
54317         var height = 350;
54318         var startX = rect.left + point[0];
54319         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
54320         var box = {
54321             left: left,
54322             top: point[1] + rect.top - 60,
54323             width: width,
54324             height: height
54325         };
54326         reveal(box, text, options);
54327     }
54328
54329
54330     function addHouse() {
54331         context.enter(modeBrowse(context));
54332         context.history().reset('initial');
54333         houseId = null;
54334
54335         var msec = transitionTime(house, context.map().center());
54336         if (msec) { reveal(null, null, { duration: 0 }); }
54337         context.map().zoom(19).centerEase(house, msec);
54338
54339         timeout(function() {
54340             var tooltip = reveal('button.add-area',
54341                 t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
54342
54343             tooltip.selectAll('.tooltip-inner')
54344                 .insert('svg', 'span')
54345                 .attr('class', 'tooltip-illustration')
54346                 .append('use')
54347                 .attr('xlink:href', '#building-images');
54348
54349             context.on('enter.intro', function(mode) {
54350                 if (mode.id !== 'add-area') return;
54351                 continueTo(startHouse);
54352             });
54353         }, msec + 100);
54354
54355         function continueTo(nextStep) {
54356             context.on('enter.intro', null);
54357             nextStep();
54358         }
54359     }
54360
54361
54362     function startHouse() {
54363         if (context.mode().id !== 'add-area') {
54364             return continueTo(addHouse);
54365         }
54366
54367         houseId = null;
54368         context.map().zoomEase(20, 500);
54369
54370         timeout(function() {
54371             revealHouse(house, t('intro.buildings.start_building'));
54372
54373             context.map().on('move.intro drawn.intro', function() {
54374                 revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
54375             });
54376
54377             context.on('enter.intro', function(mode) {
54378                 if (mode.id !== 'draw-area') return chapter.restart();
54379                 continueTo(continueHouse);
54380             });
54381
54382         }, 550);  // after easing
54383
54384         function continueTo(nextStep) {
54385             context.map().on('move.intro drawn.intro', null);
54386             context.on('enter.intro', null);
54387             nextStep();
54388         }
54389     }
54390
54391
54392     function continueHouse() {
54393         if (context.mode().id !== 'draw-area') {
54394             return continueTo(addHouse);
54395         }
54396
54397         houseId = null;
54398
54399         revealHouse(house, t('intro.buildings.continue_building'));
54400
54401         context.map().on('move.intro drawn.intro', function() {
54402             revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
54403         });
54404
54405         context.on('enter.intro', function(mode) {
54406             if (mode.id === 'draw-area') {
54407                 return;
54408             } else if (mode.id === 'select') {
54409                 var graph = context.graph(),
54410                     way = context.entity(context.selectedIDs()[0]),
54411                     nodes = graph.childNodes(way),
54412                     points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
54413
54414                 if (isMostlySquare(points)) {
54415                     houseId = way.id;
54416                     return continueTo(chooseCategoryBuilding);
54417                 } else {
54418                     return continueTo(retryHouse);
54419                 }
54420
54421             } else {
54422                 return chapter.restart();
54423             }
54424         });
54425
54426         function continueTo(nextStep) {
54427             context.map().on('move.intro drawn.intro', null);
54428             context.on('enter.intro', null);
54429             nextStep();
54430         }
54431     }
54432
54433
54434     function retryHouse() {
54435         var onClick = function() { continueTo(addHouse); };
54436
54437         revealHouse(house, t('intro.buildings.retry_building'),
54438             { buttonText: t('intro.ok'), buttonCallback: onClick }
54439         );
54440
54441         context.map().on('move.intro drawn.intro', function() {
54442             revealHouse(house, t('intro.buildings.retry_building'),
54443                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
54444             );
54445         });
54446
54447         function continueTo(nextStep) {
54448             context.map().on('move.intro drawn.intro', null);
54449             nextStep();
54450         }
54451     }
54452
54453
54454     function chooseCategoryBuilding() {
54455         if (!houseId || !context.hasEntity(houseId)) {
54456             return addHouse();
54457         }
54458         var ids = context.selectedIDs();
54459         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
54460             context.enter(modeSelect(context, [houseId]));
54461         }
54462
54463         // disallow scrolling
54464         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
54465
54466         timeout(function() {
54467             // reset pane, in case user somehow happened to change it..
54468             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
54469
54470             var button = d3_select('.preset-category-building .preset-list-button');
54471
54472             reveal(button.node(),
54473                 t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
54474             );
54475
54476             button.on('click.intro', function() {
54477                 button.on('click.intro', null);
54478                 continueTo(choosePresetHouse);
54479             });
54480
54481         }, 400);  // after preset list pane visible..
54482
54483
54484         context.on('enter.intro', function(mode) {
54485             if (!houseId || !context.hasEntity(houseId)) {
54486                 return continueTo(addHouse);
54487             }
54488             var ids = context.selectedIDs();
54489             if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
54490                 return continueTo(chooseCategoryBuilding);
54491             }
54492         });
54493
54494         function continueTo(nextStep) {
54495             d3_select('.inspector-wrap').on('wheel.intro', null);
54496             d3_select('.preset-list-button').on('click.intro', null);
54497             context.on('enter.intro', null);
54498             nextStep();
54499         }
54500     }
54501
54502
54503     function choosePresetHouse() {
54504         if (!houseId || !context.hasEntity(houseId)) {
54505             return addHouse();
54506         }
54507         var ids = context.selectedIDs();
54508         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
54509             context.enter(modeSelect(context, [houseId]));
54510         }
54511
54512         // disallow scrolling
54513         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
54514
54515         timeout(function() {
54516             // reset pane, in case user somehow happened to change it..
54517             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
54518
54519             var button = d3_select('.preset-building-house .preset-list-button');
54520
54521             reveal(button.node(),
54522                 t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
54523                 { duration: 300 }
54524             );
54525
54526             button.on('click.intro', function() {
54527                 button.on('click.intro', null);
54528                 continueTo(closeEditorHouse);
54529             });
54530
54531
54532         }, 400);  // after preset list pane visible..
54533
54534         context.on('enter.intro', function(mode) {
54535             if (!houseId || !context.hasEntity(houseId)) {
54536                 return continueTo(addHouse);
54537             }
54538             var ids = context.selectedIDs();
54539             if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
54540                 return continueTo(chooseCategoryBuilding);
54541             }
54542         });
54543
54544         function continueTo(nextStep) {
54545             d3_select('.inspector-wrap').on('wheel.intro', null);
54546             d3_select('.preset-list-button').on('click.intro', null);
54547             context.on('enter.intro', null);
54548             nextStep();
54549         }
54550     }
54551
54552
54553     function closeEditorHouse() {
54554         if (!houseId || !context.hasEntity(houseId)) {
54555             return addHouse();
54556         }
54557         var ids = context.selectedIDs();
54558         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
54559             context.enter(modeSelect(context, [houseId]));
54560         }
54561
54562         context.history().checkpoint('hasHouse');
54563
54564         context.on('exit.intro', function() {
54565             continueTo(rightClickHouse);
54566         });
54567
54568         timeout(function() {
54569             reveal('.entity-editor-pane',
54570                 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
54571             );
54572         }, 500);
54573
54574         function continueTo(nextStep) {
54575             context.on('exit.intro', null);
54576             nextStep();
54577         }
54578     }
54579
54580
54581     function rightClickHouse() {
54582         if (!houseId) return chapter.restart();
54583
54584         context.enter(modeBrowse(context));
54585         context.history().reset('hasHouse');
54586         context.map().centerEase(house, 500);
54587
54588         timeout(function() {
54589             if (context.map().zoom() < 20) {
54590                 context.map().zoomEase(20, 500);
54591             }
54592         }, 520);
54593
54594         context.on('enter.intro', function(mode) {
54595             if (mode.id !== 'select') return;
54596             var ids = context.selectedIDs();
54597             if (ids.length !== 1 || ids[0] !== houseId) return;
54598
54599             timeout(function() {
54600                 var node = selectMenuItem('orthogonalize').node();
54601                 if (!node) return;
54602                 continueTo(clickSquare);
54603             }, 300);  // after menu visible
54604         });
54605
54606         context.map().on('move.intro drawn.intro', function() {
54607             revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
54608         });
54609
54610         context.history().on('change.intro', function() {
54611             continueTo(rightClickHouse);
54612         });
54613
54614         function continueTo(nextStep) {
54615             context.on('enter.intro', null);
54616             context.map().on('move.intro drawn.intro', null);
54617             context.history().on('change.intro', null);
54618             nextStep();
54619         }
54620     }
54621
54622
54623     function clickSquare() {
54624         if (!houseId) return chapter.restart();
54625         var entity = context.hasEntity(houseId);
54626         if (!entity) return continueTo(rightClickHouse);
54627
54628         var node = selectMenuItem('orthogonalize').node();
54629         if (!node) { return continueTo(rightClickHouse); }
54630
54631         var wasChanged = false;
54632         var menuCoords = context.map().mouseCoordinates();
54633
54634         revealEditMenu(menuCoords,
54635             t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
54636         );
54637
54638         context.on('enter.intro', function(mode) {
54639             if (mode.id === 'browse') {
54640                 continueTo(rightClickHouse);
54641             } else if (mode.id === 'move' || mode.id === 'rotate') {
54642                 continueTo(retryClickSquare);
54643             }
54644         });
54645
54646         context.map().on('move.intro drawn.intro', function() {
54647             var node = selectMenuItem('orthogonalize').node();
54648             if (!wasChanged && !node) { return continueTo(rightClickHouse); }
54649
54650             revealEditMenu(menuCoords,
54651                 t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
54652                 { duration: 0 }
54653             );
54654         });
54655
54656         context.history().on('change.intro', function() {
54657             wasChanged = true;
54658             context.history().on('change.intro', null);
54659
54660             // Something changed.  Wait for transition to complete and check undo annotation.
54661             timeout(function() {
54662                 if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
54663                     continueTo(doneSquare);
54664                 } else {
54665                     continueTo(retryClickSquare);
54666                 }
54667             }, 500);  // after transitioned actions
54668         });
54669
54670         function continueTo(nextStep) {
54671             context.on('enter.intro', null);
54672             context.map().on('move.intro drawn.intro', null);
54673             context.history().on('change.intro', null);
54674             nextStep();
54675         }
54676     }
54677
54678
54679     function retryClickSquare() {
54680         context.enter(modeBrowse(context));
54681
54682         revealHouse(house, t('intro.buildings.retry_square'), {
54683             buttonText: t('intro.ok'),
54684             buttonCallback: function() { continueTo(rightClickHouse); }
54685         });
54686
54687         function continueTo(nextStep) {
54688             nextStep();
54689         }
54690     }
54691
54692
54693     function doneSquare() {
54694         context.history().checkpoint('doneSquare');
54695
54696         revealHouse(house, t('intro.buildings.done_square'), {
54697             buttonText: t('intro.ok'),
54698             buttonCallback: function() { continueTo(addTank); }
54699         });
54700
54701         function continueTo(nextStep) {
54702             nextStep();
54703         }
54704     }
54705
54706
54707     function addTank() {
54708         context.enter(modeBrowse(context));
54709         context.history().reset('doneSquare');
54710         tankId = null;
54711
54712         var msec = transitionTime(tank, context.map().center());
54713         if (msec) { reveal(null, null, { duration: 0 }); }
54714         context.map().zoom(19.5).centerEase(tank, msec);
54715
54716         timeout(function() {
54717             reveal('button.add-area',
54718                 t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
54719             );
54720
54721             context.on('enter.intro', function(mode) {
54722                 if (mode.id !== 'add-area') return;
54723                 continueTo(startTank);
54724             });
54725         }, msec + 100);
54726
54727         function continueTo(nextStep) {
54728             context.on('enter.intro', null);
54729             nextStep();
54730         }
54731     }
54732
54733
54734     function startTank() {
54735         if (context.mode().id !== 'add-area') {
54736             return continueTo(addTank);
54737         }
54738
54739         tankId = null;
54740
54741         timeout(function() {
54742             revealTank(tank, t('intro.buildings.start_tank'));
54743
54744             context.map().on('move.intro drawn.intro', function() {
54745                 revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
54746             });
54747
54748             context.on('enter.intro', function(mode) {
54749                 if (mode.id !== 'draw-area') return chapter.restart();
54750                 continueTo(continueTank);
54751             });
54752
54753         }, 550);  // after easing
54754
54755         function continueTo(nextStep) {
54756             context.map().on('move.intro drawn.intro', null);
54757             context.on('enter.intro', null);
54758             nextStep();
54759         }
54760     }
54761
54762
54763     function continueTank() {
54764         if (context.mode().id !== 'draw-area') {
54765             return continueTo(addTank);
54766         }
54767
54768         tankId = null;
54769
54770         revealTank(tank, t('intro.buildings.continue_tank'));
54771
54772         context.map().on('move.intro drawn.intro', function() {
54773             revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
54774         });
54775
54776         context.on('enter.intro', function(mode) {
54777             if (mode.id === 'draw-area') {
54778                 return;
54779             } else if (mode.id === 'select') {
54780                 tankId = context.selectedIDs()[0];
54781                 return continueTo(searchPresetTank);
54782             } else {
54783                 return continueTo(addTank);
54784             }
54785         });
54786
54787         function continueTo(nextStep) {
54788             context.map().on('move.intro drawn.intro', null);
54789             context.on('enter.intro', null);
54790             nextStep();
54791         }
54792     }
54793
54794
54795     function searchPresetTank() {
54796         if (!tankId || !context.hasEntity(tankId)) {
54797             return addTank();
54798         }
54799         var ids = context.selectedIDs();
54800         if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
54801             context.enter(modeSelect(context, [tankId]));
54802         }
54803
54804         // disallow scrolling
54805         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
54806
54807         timeout(function() {
54808             // reset pane, in case user somehow happened to change it..
54809             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
54810
54811             d3_select('.preset-search-input')
54812                 .on('keydown.intro', null)
54813                 .on('keyup.intro', checkPresetSearch);
54814
54815             reveal('.preset-search-input',
54816                 t('intro.buildings.search_tank', { preset: tankPreset.name() })
54817             );
54818         }, 400);  // after preset list pane visible..
54819
54820         context.on('enter.intro', function(mode) {
54821             if (!tankId || !context.hasEntity(tankId)) {
54822                 return continueTo(addTank);
54823             }
54824
54825             var ids = context.selectedIDs();
54826             if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
54827                 // keep the user's area selected..
54828                 context.enter(modeSelect(context, [tankId]));
54829
54830                 // reset pane, in case user somehow happened to change it..
54831                 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
54832                 // disallow scrolling
54833                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
54834
54835                 d3_select('.preset-search-input')
54836                     .on('keydown.intro', null)
54837                     .on('keyup.intro', checkPresetSearch);
54838
54839                 reveal('.preset-search-input',
54840                     t('intro.buildings.search_tank', { preset: tankPreset.name() })
54841                 );
54842
54843                 context.history().on('change.intro', null);
54844             }
54845         });
54846
54847         function checkPresetSearch() {
54848             var first = d3_select('.preset-list-item:first-child');
54849
54850             if (first.classed('preset-man_made-storage_tank')) {
54851                 reveal(first.select('.preset-list-button').node(),
54852                     t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
54853                     { duration: 300 }
54854                 );
54855
54856                 d3_select('.preset-search-input')
54857                     .on('keydown.intro', eventCancel, true)
54858                     .on('keyup.intro', null);
54859
54860                 context.history().on('change.intro', function() {
54861                     continueTo(closeEditorTank);
54862                 });
54863             }
54864         }
54865
54866         function continueTo(nextStep) {
54867             d3_select('.inspector-wrap').on('wheel.intro', null);
54868             context.on('enter.intro', null);
54869             context.history().on('change.intro', null);
54870             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
54871             nextStep();
54872         }
54873     }
54874
54875
54876     function closeEditorTank() {
54877         if (!tankId || !context.hasEntity(tankId)) {
54878             return addTank();
54879         }
54880         var ids = context.selectedIDs();
54881         if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
54882             context.enter(modeSelect(context, [tankId]));
54883         }
54884
54885         context.history().checkpoint('hasTank');
54886
54887         context.on('exit.intro', function() {
54888             continueTo(rightClickTank);
54889         });
54890
54891         timeout(function() {
54892             reveal('.entity-editor-pane',
54893                 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
54894             );
54895         }, 500);
54896
54897         function continueTo(nextStep) {
54898             context.on('exit.intro', null);
54899             nextStep();
54900         }
54901     }
54902
54903
54904     function rightClickTank() {
54905         if (!tankId) return continueTo(addTank);
54906
54907         context.enter(modeBrowse(context));
54908         context.history().reset('hasTank');
54909         context.map().centerEase(tank, 500);
54910
54911         timeout(function() {
54912             context.on('enter.intro', function(mode) {
54913                 if (mode.id !== 'select') return;
54914                 var ids = context.selectedIDs();
54915                 if (ids.length !== 1 || ids[0] !== tankId) return;
54916
54917                 timeout(function() {
54918                     var node = selectMenuItem('circularize').node();
54919                     if (!node) return;
54920                     continueTo(clickCircle);
54921                 }, 300);  // after menu visible
54922             });
54923
54924             revealTank(tank, t('intro.buildings.rightclick_tank'));
54925
54926             context.map().on('move.intro drawn.intro', function() {
54927                 revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
54928             });
54929
54930             context.history().on('change.intro', function() {
54931                 continueTo(rightClickTank);
54932             });
54933
54934         }, 600);
54935
54936         function continueTo(nextStep) {
54937             context.on('enter.intro', null);
54938             context.map().on('move.intro drawn.intro', null);
54939             context.history().on('change.intro', null);
54940             nextStep();
54941         }
54942     }
54943
54944
54945     function clickCircle() {
54946         if (!tankId) return chapter.restart();
54947         var entity = context.hasEntity(tankId);
54948         if (!entity) return continueTo(rightClickTank);
54949
54950         var node = selectMenuItem('circularize').node();
54951         if (!node) { return continueTo(rightClickTank); }
54952
54953         var wasChanged = false;
54954         var menuCoords = context.map().mouseCoordinates();
54955
54956         revealEditMenu(menuCoords,
54957             t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
54958         );
54959
54960         context.on('enter.intro', function(mode) {
54961             if (mode.id === 'browse') {
54962                 continueTo(rightClickTank);
54963             } else if (mode.id === 'move' || mode.id === 'rotate') {
54964                 continueTo(retryClickCircle);
54965             }
54966         });
54967
54968         context.map().on('move.intro drawn.intro', function() {
54969             var node = selectMenuItem('circularize').node();
54970             if (!wasChanged && !node) { return continueTo(rightClickTank); }
54971
54972             revealEditMenu(menuCoords,
54973                 t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
54974                 { duration: 0 }
54975             );
54976         });
54977
54978         context.history().on('change.intro', function() {
54979             wasChanged = true;
54980             context.history().on('change.intro', null);
54981
54982             // Something changed.  Wait for transition to complete and check undo annotation.
54983             timeout(function() {
54984                 if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
54985                     continueTo(play);
54986                 } else {
54987                     continueTo(retryClickCircle);
54988                 }
54989             }, 500);  // after transitioned actions
54990         });
54991
54992         function continueTo(nextStep) {
54993             context.on('enter.intro', null);
54994             context.map().on('move.intro drawn.intro', null);
54995             context.history().on('change.intro', null);
54996             nextStep();
54997         }
54998     }
54999
55000
55001     function retryClickCircle() {
55002         context.enter(modeBrowse(context));
55003
55004         revealTank(tank, t('intro.buildings.retry_circle'), {
55005             buttonText: t('intro.ok'),
55006             buttonCallback: function() { continueTo(rightClickTank); }
55007         });
55008
55009         function continueTo(nextStep) {
55010             nextStep();
55011         }
55012     }
55013
55014
55015     function play() {
55016         dispatch$$1.call('done');
55017         reveal('#id-container',
55018             t('intro.buildings.play', { next: t('intro.startediting.title') }), {
55019                 tooltipBox: '.intro-nav-wrap .chapter-startEditing',
55020                 buttonText: t('intro.ok'),
55021                 buttonCallback: function() { reveal('#id-container'); }
55022             }
55023         );
55024     }
55025
55026
55027     chapter.enter = function() {
55028         addHouse();
55029     };
55030
55031
55032     chapter.exit = function() {
55033         timeouts.forEach(window.clearTimeout);
55034         context.on('enter.intro exit.intro', null);
55035         context.map().on('move.intro drawn.intro', null);
55036         context.history().on('change.intro', null);
55037         d3_select('.inspector-wrap').on('wheel.intro', null);
55038         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
55039         d3_select('.more-fields .combobox-input').on('click.intro', null);
55040     };
55041
55042
55043     chapter.restart = function() {
55044         chapter.exit();
55045         chapter.enter();
55046     };
55047
55048
55049     return utilRebind(chapter, dispatch$$1, 'on');
55050 }
55051
55052 function uiIntroStartEditing(context, reveal) {
55053     var dispatch$$1 = dispatch('done', 'startEditing'),
55054         modalSelection = d3_select(null);
55055
55056
55057     var chapter = {
55058         title: 'intro.startediting.title'
55059     };
55060
55061     function showHelp() {
55062         reveal('.map-control.help-control',
55063             t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
55064                 buttonText: t('intro.ok'),
55065                 buttonCallback: function() { shortcuts(); }
55066             }
55067         );
55068     }
55069
55070     function shortcuts() {
55071         reveal('.map-control.help-control',
55072             t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
55073                 buttonText: t('intro.ok'),
55074                 buttonCallback: function() { showSave(); }
55075             }
55076         );
55077     }
55078
55079     function showSave() {
55080         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
55081         reveal('#bar button.save',
55082             t('intro.startediting.save'), {
55083                 buttonText: t('intro.ok'),
55084                 buttonCallback: function() { showStart(); }
55085             }
55086         );
55087     }
55088
55089     function showStart() {
55090         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
55091
55092         modalSelection = uiModal(context.container());
55093
55094         modalSelection.select('.modal')
55095             .attr('class', 'modal-splash modal col6');
55096
55097         modalSelection.selectAll('.close').remove();
55098
55099         var startbutton = modalSelection.select('.content')
55100             .attr('class', 'fillL')
55101             .append('button')
55102                 .attr('class', 'modal-section huge-modal-button')
55103                 .on('click', function() {
55104                     modalSelection.remove();
55105                 });
55106
55107             startbutton
55108                 .append('svg')
55109                 .attr('class', 'illustration')
55110                 .append('use')
55111                 .attr('xlink:href', '#logo-walkthrough');
55112
55113             startbutton
55114                 .append('h2')
55115                 .text(t('intro.startediting.start'));
55116
55117         dispatch$$1.call('startEditing');
55118     }
55119
55120
55121     chapter.enter = function() {
55122         showHelp();
55123     };
55124
55125
55126     chapter.exit = function() {
55127         modalSelection.remove();
55128         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
55129     };
55130
55131
55132     return utilRebind(chapter, dispatch$$1, 'on');
55133 }
55134
55135 var chapterUi = {
55136     welcome: uiIntroWelcome,
55137     navigation: uiIntroNavigation,
55138     point: uiIntroPoint,
55139     area: uiIntroArea,
55140     line: uiIntroLine,
55141     building: uiIntroBuilding,
55142     startEditing: uiIntroStartEditing
55143 };
55144
55145 var chapterFlow = [
55146     'welcome',
55147     'navigation',
55148     'point',
55149     'area',
55150     'line',
55151     'building',
55152     'startEditing'
55153 ];
55154
55155
55156 function uiIntro(context) {
55157     var introGraph = {},
55158         currChapter;
55159
55160
55161     // create entities for intro graph and localize names
55162     for (var id in dataIntroGraph) {
55163         introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
55164     }
55165
55166
55167     function intro(selection$$1) {
55168         context.enter(modeBrowse(context));
55169
55170         // Save current map state
55171         var osm = context.connection(),
55172             history = context.history().toJSON(),
55173             hash = window.location.hash,
55174             center = context.map().center(),
55175             zoom = context.map().zoom(),
55176             background = context.background().baseLayerSource(),
55177             overlays = context.background().overlayLayerSources(),
55178             opacity = d3_selectAll('#map .layer-background').style('opacity'),
55179             loadedTiles = osm && osm.loadedTiles(),
55180             baseEntities = context.history().graph().base().entities,
55181             countryCode = services.geocoder.countryCode;
55182
55183         // Block saving
55184         context.inIntro(true);
55185
55186         // Load semi-real data used in intro
55187         if (osm) { osm.toggle(false).reset(); }
55188         context.history().reset();
55189         context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
55190         context.history().checkpoint('initial');
55191
55192         var esri = context.background().findSource('EsriWorldImagery');
55193         if (esri) {
55194             context.background().baseLayerSource(esri);
55195         } else {
55196             context.background().bing();
55197         }
55198         overlays.forEach(function (d) {
55199             context.background().toggleOverlayLayer(d);
55200         });
55201
55202         // Mock geocoder
55203         services.geocoder.countryCode = function(location, callback) {
55204             callback(null, t('intro.graph.countrycode'));
55205         };
55206
55207         d3_selectAll('#map .layer-background').style('opacity', 1);
55208
55209         var curtain = uiCurtain();
55210         selection$$1.call(curtain);
55211
55212         // store that the user started the walkthrough..
55213         context.storage('walkthrough_started', 'yes');
55214
55215         // restore previous walkthrough progress..
55216         var storedProgress = context.storage('walkthrough_progress') || '';
55217         var progress = storedProgress.split(';').filter(Boolean);
55218
55219         var chapters = chapterFlow.map(function(chapter, i) {
55220             var s = chapterUi[chapter](context, curtain.reveal)
55221                 .on('done', function() {
55222                     context.presets().init();  // clear away "recent" presets
55223
55224                     buttons.filter(function(d) {
55225                         return d.title === s.title;
55226                     }).classed('finished', true);
55227
55228                     if (i < chapterFlow.length - 1) {
55229                         var next = chapterFlow[i + 1];
55230                         d3_select('button.chapter-' + next)
55231                             .classed('next', true);
55232                     }
55233
55234                     // store walkthrough progress..
55235                     progress.push(chapter);
55236                     context.storage('walkthrough_progress', uniq(progress).join(';'));
55237                 });
55238             return s;
55239         });
55240
55241         chapters[chapters.length - 1].on('startEditing', function() {
55242             // store walkthrough progress..
55243             progress.push('startEditing');
55244             context.storage('walkthrough_progress', uniq(progress).join(';'));
55245
55246             // store if walkthrough is completed..
55247             var incomplete = difference(chapterFlow, progress);
55248             if (!incomplete.length) {
55249                 context.storage('walkthrough_completed', 'yes');
55250             }
55251
55252             curtain.remove();
55253             navwrap.remove();
55254             d3_selectAll('#map .layer-background').style('opacity', opacity);
55255             if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
55256             context.history().reset().merge(values$1(baseEntities));
55257             context.background().baseLayerSource(background);
55258             overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
55259             if (history) { context.history().fromJSON(history, false); }
55260             context.map().centerZoom(center, zoom);
55261             window.location.replace(hash);
55262             services.geocoder.countryCode = countryCode;
55263             context.inIntro(false);
55264         });
55265
55266         var navwrap = selection$$1
55267             .append('div')
55268             .attr('class', 'intro-nav-wrap fillD');
55269
55270         navwrap
55271             .append('svg')
55272             .attr('class', 'intro-nav-wrap-logo')
55273             .append('use')
55274             .attr('xlink:href', '#logo-walkthrough');
55275
55276         var buttonwrap = navwrap
55277             .append('div')
55278             .attr('class', 'joined')
55279             .selectAll('button.chapter');
55280
55281         var buttons = buttonwrap
55282             .data(chapters)
55283             .enter()
55284             .append('button')
55285             .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
55286             .on('click', enterChapter);
55287
55288         buttons
55289             .append('span')
55290             .text(function(d) { return t(d.title); });
55291
55292         buttons
55293             .append('span')
55294             .attr('class', 'status')
55295             .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
55296
55297         enterChapter(chapters[0]);
55298
55299
55300         function enterChapter(newChapter) {
55301             if (currChapter) { currChapter.exit(); }
55302             context.enter(modeBrowse(context));
55303
55304             currChapter = newChapter;
55305             currChapter.enter();
55306
55307             buttons
55308                 .classed('next', false)
55309                 .classed('active', function(d) {
55310                     return d.title === currChapter.title;
55311                 });
55312         }
55313     }
55314
55315
55316     return intro;
55317 }
55318
55319 function uiShortcuts() {
55320     var detected = utilDetect();
55321     var activeTab = 0;
55322     var modalSelection;
55323     var savedSelection;
55324
55325
55326     var keybinding = d3keybinding('shortcuts')
55327         .on(t('shortcuts.toggle.key'), function () {
55328             if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
55329                 if (modalSelection) {
55330                     modalSelection.close();
55331                     modalSelection = null;
55332                 }
55333             } else {
55334                 modalSelection = uiModal(savedSelection);
55335                 shortcutsModal(modalSelection);
55336             }
55337         });
55338
55339     d3_select(document)
55340         .call(keybinding);
55341
55342
55343
55344     function shortcutsModal(modalSelection) {
55345         modalSelection.select('.modal')
55346             .classed('modal-shortcuts', true);
55347
55348         var shortcutsModal = modalSelection.select('.content');
55349
55350         shortcutsModal
55351             .append('div')
55352             .attr('class', 'modal-section')
55353             .append('h3')
55354             .text(t('shortcuts.title'));
55355
55356         shortcutsModal
55357             .call(render);
55358     }
55359
55360
55361     function render(selection$$1) {
55362         var wrapper = selection$$1
55363             .selectAll('.wrapper')
55364             .data([0]);
55365
55366         var wrapperEnter = wrapper
55367             .enter()
55368             .append('div')
55369             .attr('class', 'wrapper modal-section');
55370
55371         var tabsBar = wrapperEnter
55372             .append('div')
55373             .attr('class', 'tabs-bar');
55374
55375         var shortcutsList = wrapperEnter
55376             .append('div')
55377             .attr('class', 'shortcuts-list');
55378
55379         wrapper = wrapper.merge(wrapperEnter);
55380
55381         var tabs = tabsBar
55382             .selectAll('.tab')
55383             .data(dataShortcuts);
55384
55385         var tabsEnter = tabs
55386             .enter()
55387             .append('div')
55388             .attr('class', 'tab')
55389             .on('click', function (d, i) {
55390                 activeTab = i;
55391                 render(selection$$1);
55392             });
55393
55394         tabsEnter
55395             .append('span')
55396             .text(function (d) { return t(d.text); });
55397
55398         tabs = tabs
55399             .merge(tabsEnter);
55400
55401         // Update
55402         wrapper.selectAll('.tab')
55403             .classed('active', function (d, i) {
55404                 return i === activeTab;
55405             });
55406
55407
55408         var shortcuts = shortcutsList
55409             .selectAll('.shortcut-tab')
55410             .data(dataShortcuts);
55411
55412         var shortcutsEnter = shortcuts
55413             .enter()
55414             .append('div')
55415             .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
55416
55417         var columnsEnter = shortcutsEnter
55418             .selectAll('.shortcut-column')
55419             .data(function (d) { return d.columns; })
55420             .enter()
55421             .append('table')
55422             .attr('class', 'shortcut-column');
55423
55424         var rowsEnter = columnsEnter
55425             .selectAll('.shortcut-row')
55426             .data(function (d) { return d.rows; })
55427             .enter()
55428             .append('tr')
55429             .attr('class', 'shortcut-row');
55430
55431
55432         var sectionRows = rowsEnter
55433             .filter(function (d) { return !d.shortcuts; });
55434
55435         sectionRows
55436             .append('td');
55437
55438         sectionRows
55439             .append('td')
55440             .attr('class', 'shortcut-section')
55441             .append('h3')
55442             .text(function (d) { return t(d.text); });
55443
55444
55445         var shortcutRows = rowsEnter
55446             .filter(function (d) { return d.shortcuts; });
55447
55448         var shortcutKeys = shortcutRows
55449             .append('td')
55450             .attr('class', 'shortcut-keys');
55451
55452         var modifierKeys = shortcutKeys
55453             .filter(function (d) { return d.modifiers; });
55454
55455         modifierKeys
55456             .selectAll('kbd.modifier')
55457             .data(function (d) {
55458                 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
55459                     return ['⌘'];
55460                 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
55461                     return [];
55462                 } else {
55463                     return d.modifiers;
55464                 }
55465             })
55466             .enter()
55467             .each(function () {
55468                 var selection$$1 = d3_select(this);
55469
55470                 selection$$1
55471                     .append('kbd')
55472                     .attr('class', 'modifier')
55473                     .text(function (d) { return uiCmd.display(d); });
55474
55475                 selection$$1
55476                     .append('span')
55477                     .text('+');
55478             });
55479
55480
55481         shortcutKeys
55482             .selectAll('kbd.shortcut')
55483             .data(function (d) {
55484                 var arr = d.shortcuts;
55485                 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
55486                     arr = ['Y'];
55487                 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
55488                     arr = ['F11'];
55489                 }
55490
55491                 return arr.map(function(s) {
55492                     return {
55493                         shortcut: s,
55494                         separator: d.separator
55495                     };
55496                 });
55497             })
55498             .enter()
55499             .each(function (d, i, nodes) {
55500                 var selection$$1 = d3_select(this);
55501                 var click = d.shortcut.toLowerCase().match(/(.*).click/);
55502
55503                 if (click && click[1]) {
55504                     selection$$1
55505                         .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
55506                 } else {
55507                     selection$$1
55508                         .append('kbd')
55509                         .attr('class', 'shortcut')
55510                         .text(function (d) {
55511                             var key = d.shortcut;
55512                             return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
55513                         });
55514                 }
55515
55516                 if (i < nodes.length - 1) {
55517                     selection$$1
55518                         .append('span')
55519                         .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
55520                 }
55521             });
55522
55523
55524         shortcutKeys
55525             .filter(function(d) { return d.gesture; })
55526             .each(function () {
55527                 var selection$$1 = d3_select(this);
55528
55529                 selection$$1
55530                     .append('span')
55531                     .text('+');
55532
55533                 selection$$1
55534                     .append('span')
55535                     .attr('class', 'gesture')
55536                     .text(function (d) { return t(d.gesture); });
55537             });
55538
55539
55540         shortcutRows
55541             .append('td')
55542             .attr('class', 'shortcut-desc')
55543             .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
55544
55545
55546         shortcuts = shortcuts
55547             .merge(shortcutsEnter);
55548
55549         // Update
55550         wrapper.selectAll('.shortcut-tab')
55551             .style('display', function (d, i) {
55552                 return i === activeTab ? 'flex' : 'none';
55553             });
55554     }
55555
55556
55557     return function(selection$$1, show) {
55558         savedSelection = selection$$1;
55559         if (show) {
55560             modalSelection = uiModal(selection$$1);
55561             shortcutsModal(modalSelection);
55562         }
55563     };
55564 }
55565
55566 function uiHelp(context) {
55567     var key = t('help.key');
55568
55569     var docKeys = [
55570         'help.help',
55571         'help.editing_saving',
55572         'help.roads',
55573         'help.gps',
55574         'help.imagery',
55575         'help.addresses',
55576         'help.inspector',
55577         'help.buildings',
55578         'help.relations'];
55579
55580     var docs = docKeys.map(function(key) {
55581         var text = t(key);
55582         return {
55583             title: text.split('\n')[0].replace('#', '').trim(),
55584             html: marked(text.split('\n').slice(1).join('\n'))
55585         };
55586     });
55587
55588
55589     function help(selection$$1) {
55590
55591         function hide() {
55592             setVisible(false);
55593         }
55594
55595
55596         function toggle() {
55597             if (event) event.preventDefault();
55598             tooltipBehavior.hide(button);
55599             setVisible(!button.classed('active'));
55600         }
55601
55602
55603         function setVisible(show) {
55604             if (show !== shown) {
55605                 button.classed('active', show);
55606                 shown = show;
55607
55608                 if (show) {
55609                     selection$$1.on('mousedown.help-inside', function() {
55610                         return event.stopPropagation();
55611                     });
55612                     pane.style('display', 'block')
55613                         .style('right', '-500px')
55614                         .transition()
55615                         .duration(200)
55616                         .style('right', '0px');
55617                 } else {
55618                     pane.style('right', '0px')
55619                         .transition()
55620                         .duration(200)
55621                         .style('right', '-500px')
55622                         .on('end', function() {
55623                             d3_select(this).style('display', 'none');
55624                         });
55625                     selection$$1.on('mousedown.help-inside', null);
55626                 }
55627             }
55628         }
55629
55630
55631         function clickHelp(d, i) {
55632             var rtl = (textDirection === 'rtl');
55633             pane.property('scrollTop', 0);
55634             doctitle.html(d.title);
55635
55636             body.html(d.html);
55637             body.selectAll('a')
55638                 .attr('target', '_blank');
55639             menuItems.classed('selected', function(m) {
55640                 return m.title === d.title;
55641             });
55642
55643             nav.html('');
55644             if (rtl) {
55645                 nav.call(drawNext).call(drawPrevious);
55646             } else {
55647                 nav.call(drawPrevious).call(drawNext);
55648             }
55649
55650
55651             function drawNext(selection$$1) {
55652                 if (i < docs.length - 1) {
55653                     var nextLink = selection$$1
55654                         .append('a')
55655                         .attr('class', 'next')
55656                         .on('click', function() {
55657                             clickHelp(docs[i + 1], i + 1);
55658                         });
55659
55660                     nextLink
55661                         .append('span')
55662                         .text(docs[i + 1].title)
55663                         .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
55664                 }
55665             }
55666
55667
55668             function drawPrevious(selection$$1) {
55669                 if (i > 0) {
55670                     var prevLink = selection$$1
55671                         .append('a')
55672                         .attr('class', 'previous')
55673                         .on('click', function() {
55674                             clickHelp(docs[i - 1], i - 1);
55675                         });
55676
55677                     prevLink
55678                         .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
55679                         .append('span')
55680                         .text(docs[i - 1].title);
55681                 }
55682             }
55683         }
55684
55685
55686         function clickWalkthrough() {
55687             if (context.inIntro()) return;
55688             context.container().call(uiIntro(context));
55689             setVisible(false);
55690         }
55691
55692
55693         function clickShortcuts() {
55694             context.container().call(uiShortcuts(context), true);
55695         }
55696
55697
55698         var pane = selection$$1.append('div')
55699                 .attr('class', 'help-wrap map-overlay fillL col5 content hide'),
55700             tooltipBehavior = tooltip()
55701                 .placement((textDirection === 'rtl') ? 'right' : 'left')
55702                 .html(true)
55703                 .title(uiTooltipHtml(t('help.title'), key)),
55704             button = selection$$1.append('button')
55705                 .attr('tabindex', -1)
55706                 .on('click', toggle)
55707                 .call(svgIcon('#icon-help', 'light'))
55708                 .call(tooltipBehavior),
55709             shown = false;
55710
55711
55712         var toc = pane.append('ul')
55713             .attr('class', 'toc');
55714
55715         var menuItems = toc.selectAll('li')
55716             .data(docs)
55717             .enter()
55718             .append('li')
55719             .append('a')
55720             .html(function(d) { return d.title; })
55721             .on('click', clickHelp);
55722
55723         var shortcuts = toc
55724             .append('li')
55725             .attr('class', 'shortcuts')
55726             .call(tooltip()
55727                 .html(true)
55728                 .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
55729                 .placement('top')
55730             )
55731             .append('a')
55732             .on('click', clickShortcuts);
55733
55734         shortcuts
55735             .append('div')
55736             .text(t('shortcuts.title'));
55737
55738         var walkthrough = toc
55739             .append('li')
55740             .attr('class', 'walkthrough')
55741             .append('a')
55742             .on('click', clickWalkthrough);
55743
55744         walkthrough
55745             .append('svg')
55746             .attr('class', 'logo logo-walkthrough')
55747             .append('use')
55748             .attr('xlink:href', '#logo-walkthrough');
55749
55750         walkthrough
55751             .append('div')
55752             .text(t('splash.walkthrough'));
55753
55754
55755         var content = pane.append('div')
55756             .attr('class', 'left-content');
55757
55758         var doctitle = content.append('h2')
55759             .text(t('help.title'));
55760
55761         var body = content.append('div')
55762             .attr('class', 'body');
55763
55764         var nav = content.append('div')
55765             .attr('class', 'nav');
55766
55767         clickHelp(docs[0], 0);
55768
55769         var keybinding = d3keybinding('help')
55770             .on(key, toggle)
55771             .on([t('background.key'), t('map_data.key')], hide);
55772
55773         d3_select(document)
55774             .call(keybinding);
55775
55776         context.surface().on('mousedown.help-outside', hide);
55777         context.container().on('mousedown.help-outside', hide);
55778     }
55779
55780     return help;
55781 }
55782
55783 function uiPanelBackground(context) {
55784     var background = context.background();
55785     var currSourceName = null;
55786     var metadata = {};
55787     var metadataKeys = [
55788         'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
55789     ];
55790
55791     var debouncedRedraw = debounce$1(redraw, 250);
55792
55793     function redraw(selection$$1) {
55794         var source = background.baseLayerSource(),
55795             isDG = (source.id.match(/^DigitalGlobe/i) !== null);
55796
55797         if (currSourceName !== source.name()) {
55798             currSourceName = source.name();
55799             metadata = {};
55800         }
55801
55802         selection$$1.html('');
55803
55804         var list = selection$$1
55805             .append('ul')
55806             .attr('class', 'background-info');
55807
55808         list
55809             .append('li')
55810             .text(currSourceName);
55811
55812         metadataKeys.forEach(function(k) {
55813             // DigitalGlobe vintage is available in raster layers for now.
55814             if (isDG && k === 'vintage') return;
55815
55816             list
55817                 .append('li')
55818                 .attr('class', 'background-info-list-' + k)
55819                 .classed('hide', !metadata[k])
55820                 .text(t('info_panels.background.' + k) + ': ')
55821                 .append('span')
55822                 .attr('class', 'background-info-span-' + k)
55823                 .text(metadata[k]);
55824         });
55825
55826         debouncedGetMetadata(selection$$1);
55827
55828         var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
55829
55830         selection$$1
55831             .append('a')
55832             .text(t('info_panels.background.' + toggleTiles))
55833             .attr('href', '#')
55834             .attr('class', 'button button-toggle-tiles')
55835             .on('click', function() {
55836                 event.preventDefault();
55837                 context.setDebug('tile', !context.getDebug('tile'));
55838                 selection$$1.call(redraw);
55839             });
55840
55841         if (isDG) {
55842             var key = source.id + '-vintage';
55843             var sourceVintage = context.background().findSource(key);
55844             var showsVintage = context.background().showsLayer(sourceVintage);
55845             var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
55846             selection$$1
55847                 .append('a')
55848                 .text(t('info_panels.background.' + toggleVintage))
55849                 .attr('href', '#')
55850                 .attr('class', 'button button-toggle-vintage')
55851                 .on('click', function() {
55852                     event.preventDefault();
55853                     context.background().toggleOverlayLayer(sourceVintage);
55854                     selection$$1.call(redraw);
55855                 });
55856         }
55857
55858         // disable if necessary
55859         ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
55860             if (source.id !== layerId) {
55861                 var key = layerId + '-vintage';
55862                 var sourceVintage = context.background().findSource(key);
55863                 if (context.background().showsLayer(sourceVintage)) {
55864                     context.background().toggleOverlayLayer(sourceVintage);
55865                 }
55866             }
55867         });
55868     }
55869
55870
55871     var debouncedGetMetadata = debounce$1(getMetadata, 250);
55872
55873     function getMetadata(selection$$1) {
55874         var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
55875         if (tile.empty()) return;
55876
55877         var sourceName = currSourceName,
55878             d = tile.datum(),
55879             zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
55880             center = context.map().center();
55881
55882         // update zoom
55883         metadata.zoom = String(zoom);
55884         selection$$1.selectAll('.background-info-list-zoom')
55885             .classed('hide', false)
55886             .selectAll('.background-info-span-zoom')
55887             .text(metadata.zoom);
55888
55889         if (!d || !d.length >= 3) return;
55890
55891         background.baseLayerSource().getMetadata(center, d, function(err, result) {
55892             if (err || currSourceName !== sourceName) return;
55893
55894             // update vintage
55895             var vintage = result.vintage;
55896             metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
55897             selection$$1.selectAll('.background-info-list-vintage')
55898                 .classed('hide', false)
55899                 .selectAll('.background-info-span-vintage')
55900                 .text(metadata.vintage);
55901
55902             // update other metdata
55903             without(metadataKeys, 'zoom', 'vintage')
55904                 .forEach(function(k) {
55905                     var val = result[k];
55906                     metadata[k] = val;
55907                     selection$$1.selectAll('.background-info-list-' + k)
55908                         .classed('hide', !val)
55909                         .selectAll('.background-info-span-' + k)
55910                         .text(val);
55911                 });
55912         });
55913     }
55914
55915
55916     var panel = function(selection$$1) {
55917         selection$$1.call(redraw);
55918
55919         context.map()
55920             .on('drawn.info-background', function() {
55921                 selection$$1.call(debouncedRedraw);
55922             })
55923             .on('move.info-background', function() {
55924                 selection$$1.call(debouncedGetMetadata);
55925             });
55926
55927     };
55928
55929     panel.off = function() {
55930         context.map()
55931             .on('drawn.info-background', null)
55932             .on('move.info-background', null);
55933     };
55934
55935     panel.id = 'background';
55936     panel.title = t('info_panels.background.title');
55937     panel.key = t('info_panels.background.key');
55938
55939
55940     return panel;
55941 }
55942
55943 function uiPanelHistory(context) {
55944     var osm;
55945
55946     function displayTimestamp(entity) {
55947         if (!entity.timestamp) return t('info_panels.history.unknown');
55948
55949         var d = new Date(entity.timestamp);
55950         if (isNaN(d.getTime())) return t('info_panels.history.unknown');
55951
55952         return d.toLocaleString();
55953     }
55954
55955
55956     function displayUser(selection, entity) {
55957         if (!entity.user) {
55958             selection
55959                 .append('span')
55960                 .text(t('info_panels.history.unknown'));
55961             return;
55962         }
55963
55964         selection
55965             .append('span')
55966             .attr('class', 'user-name')
55967             .text(entity.user);
55968
55969         var links = selection
55970             .append('div')
55971             .attr('class', 'links');
55972
55973         if (osm) {
55974             links
55975                 .append('a')
55976                 .attr('class', 'user-osm-link')
55977                 .attr('href', osm.userURL(entity.user))
55978                 .attr('target', '_blank')
55979                 .attr('tabindex', -1)
55980                 .text('OSM');
55981         }
55982
55983         links
55984             .append('a')
55985             .attr('class', 'user-hdyc-link')
55986             .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
55987             .attr('target', '_blank')
55988             .attr('tabindex', -1)
55989             .text('HDYC');
55990     }
55991
55992
55993     function displayChangeset(selection, entity) {
55994         if (!entity.changeset) {
55995             selection
55996                 .append('span')
55997                 .text(t('info_panels.history.unknown'));
55998             return;
55999         }
56000
56001         selection
56002             .append('span')
56003             .attr('class', 'changeset-id')
56004             .text(entity.changeset);
56005
56006         var links = selection
56007             .append('div')
56008             .attr('class', 'links');
56009
56010         if (osm) {
56011             links
56012                 .append('a')
56013                 .attr('class', 'changeset-osm-link')
56014                 .attr('href', osm.changesetURL(entity.changeset))
56015                 .attr('target', '_blank')
56016                 .attr('tabindex', -1)
56017                 .text('OSM');
56018         }
56019
56020         links
56021             .append('a')
56022             .attr('class', 'changeset-osmcha-link')
56023             .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
56024             .attr('target', '_blank')
56025             .attr('tabindex', -1)
56026             .text('OSMCha');
56027     }
56028
56029
56030     function redraw(selection) {
56031         var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
56032             singular = selected.length === 1 ? selected[0] : null;
56033
56034         osm = context.connection();
56035
56036         selection.html('');
56037
56038         selection
56039             .append('h4')
56040             .attr('class', 'history-heading')
56041             .text(singular || t('info_panels.history.selected', { n: selected.length }));
56042
56043         if (!singular) return;
56044
56045         var entity = context.entity(singular);
56046
56047         var list = selection
56048             .append('ul');
56049
56050         list
56051             .append('li')
56052             .text(t('info_panels.history.version') + ': ' + entity.version);
56053
56054         list
56055             .append('li')
56056             .text(t('info_panels.history.last_edit') + ': ' + displayTimestamp(entity));
56057
56058         list
56059             .append('li')
56060             .text(t('info_panels.history.edited_by') + ': ')
56061             .call(displayUser, entity);
56062
56063         list
56064             .append('li')
56065             .text(t('info_panels.history.changeset') + ': ')
56066             .call(displayChangeset, entity);
56067
56068         if (osm) {
56069             selection
56070                 .append('a')
56071                 .attr('class', 'view-history-on-osm')
56072                 .attr('target', '_blank')
56073                 .attr('tabindex', -1)
56074                 .attr('href', osm.historyURL(entity))
56075                 .call(svgIcon('#icon-out-link', 'inline'))
56076                 .append('span')
56077                 .text(t('info_panels.history.link_text'));
56078         }
56079     }
56080
56081
56082     var panel = function(selection) {
56083         selection.call(redraw);
56084
56085         context.map()
56086             .on('drawn.info-history', function() {
56087                 selection.call(redraw);
56088             });
56089     };
56090
56091     panel.off = function() {
56092         context.map()
56093             .on('drawn.info-history', null);
56094     };
56095
56096     panel.id = 'history';
56097     panel.title = t('info_panels.history.title');
56098     panel.key = t('info_panels.history.key');
56099
56100
56101     return panel;
56102 }
56103
56104 function uiPanelLocation(context) {
56105     var currLocation = '';
56106     var OSM_PRECISION = 7;
56107
56108
56109     function wrap(x, min, max) {
56110         var d = max - min;
56111         return ((x - min) % d + d) % d + min;
56112     }
56113
56114
56115     function clamp(x, min, max) {
56116         return Math.max(min, Math.min(x, max));
56117     }
56118
56119
56120     function redraw(selection) {
56121         selection.html('');
56122
56123         var list = selection
56124             .append('ul');
56125
56126         // Mouse coordinates
56127         var coord = context.map().mouseCoordinates();
56128         if (coord.some(isNaN)) {
56129             coord = context.map().center();
56130         }
56131
56132         var coordStr =
56133             clamp(coord[1], -90, 90).toFixed(OSM_PRECISION) + ', ' +
56134             wrap(coord[0], -180, 180).toFixed(OSM_PRECISION);
56135
56136         list
56137             .append('li')
56138             .text(coordStr);
56139
56140         // Location Info
56141         selection
56142             .append('div')
56143             .attr('class', 'location-info')
56144             .text(currLocation || ' ');
56145
56146         debouncedGetLocation(selection, coord);
56147     }
56148
56149
56150     var debouncedGetLocation = debounce$1(getLocation, 250);
56151     function getLocation(selection, coord) {
56152         if (!services.geocoder) {
56153             currLocation = t('info_panels.location.unknown_location');
56154             selection.selectAll('.location-info')
56155                 .text(currLocation);
56156         } else {
56157             services.geocoder.reverse(coord, function(err, result) {
56158                 currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
56159                 selection.selectAll('.location-info')
56160                     .text(currLocation);
56161             });
56162         }
56163     }
56164
56165
56166     var panel = function(selection) {
56167         selection.call(redraw);
56168
56169         context.surface()
56170             .on('mousemove.info-location', function() {
56171                 selection.call(redraw);
56172             });
56173     };
56174
56175     panel.off = function() {
56176         context.surface()
56177             .on('mousemove.info-location', null);
56178     };
56179
56180     panel.id = 'location';
56181     panel.title = t('info_panels.location.title');
56182     panel.key = t('info_panels.location.key');
56183
56184
56185     return panel;
56186 }
56187
56188 function uiPanelMeasurement(context) {
56189     var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
56190     var OSM_PRECISION = 7;
56191
56192
56193     function radiansToMeters(r) {
56194         // using WGS84 authalic radius (6371007.1809 m)
56195         return r * 6371007.1809;
56196     }
56197
56198     function steradiansToSqmeters(r) {
56199         // http://gis.stackexchange.com/a/124857/40446
56200         return r / (4 * Math.PI) * 510065621724000;
56201     }
56202
56203
56204     function toLineString(feature) {
56205         if (feature.type === 'LineString') return feature;
56206
56207         var result = { type: 'LineString', coordinates: [] };
56208         if (feature.type === 'Polygon') {
56209             result.coordinates = feature.coordinates[0];
56210         } else if (feature.type === 'MultiPolygon') {
56211             result.coordinates = feature.coordinates[0][0];
56212         }
56213
56214         return result;
56215     }
56216
56217
56218     function displayLength(m) {
56219         var d = m * (isImperial ? 3.28084 : 1),
56220             p, unit;
56221
56222         if (isImperial) {
56223             if (d >= 5280) {
56224                 d /= 5280;
56225                 unit = 'mi';
56226             } else {
56227                 unit = 'ft';
56228             }
56229         } else {
56230             if (d >= 1000) {
56231                 d /= 1000;
56232                 unit = 'km';
56233             } else {
56234                 unit = 'm';
56235             }
56236         }
56237
56238         // drop unnecessary precision
56239         p = d > 1000 ? 0 : d > 100 ? 1 : 2;
56240
56241         return String(d.toFixed(p)) + ' ' + unit;
56242     }
56243
56244
56245     function displayArea(m2) {
56246         var d = m2 * (isImperial ? 10.7639111056 : 1),
56247             d1, d2, p1, p2, unit1, unit2;
56248
56249         if (isImperial) {
56250             if (d >= 6969600) {     // > 0.25mi² show mi²
56251                 d1 = d / 27878400;
56252                 unit1 = 'mi²';
56253             } else {
56254                 d1 = d;
56255                 unit1 = 'ft²';
56256             }
56257
56258             if (d > 4356 && d < 43560000) {   // 0.1 - 1000 acres
56259                 d2 = d / 43560;
56260                 unit2 = 'ac';
56261             }
56262
56263         } else {
56264             if (d >= 250000) {    // > 0.25km² show km²
56265                 d1 = d / 1000000;
56266                 unit1 = 'km²';
56267             } else {
56268                 d1 = d;
56269                 unit1 = 'm²';
56270             }
56271
56272             if (d > 1000 && d < 10000000) {   // 0.1 - 1000 hectares
56273                 d2 = d / 10000;
56274                 unit2 = 'ha';
56275             }
56276         }
56277
56278         // drop unnecessary precision
56279         p1 = d1 > 1000 ? 0 : d1 > 100 ? 1 : 2;
56280         p2 = d2 > 1000 ? 0 : d2 > 100 ? 1 : 2;
56281
56282         return String(d1.toFixed(p1)) + ' ' + unit1 +
56283             (d2 ? ' (' + String(d2.toFixed(p2)) + ' ' + unit2 + ')' : '');
56284     }
56285
56286
56287     function redraw(selection$$1) {
56288         var resolver = context.graph(),
56289             selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
56290             singular = selected.length === 1 ? selected[0] : null,
56291             extent = geoExtent$$1(),
56292             entity;
56293
56294         selection$$1.html('');
56295
56296         selection$$1
56297             .append('h4')
56298             .attr('class', 'measurement-heading')
56299             .text(singular || t('info_panels.measurement.selected', { n: selected.length }));
56300
56301         if (!selected.length) return;
56302
56303         var center;
56304         for (var i = 0; i < selected.length; i++) {
56305             entity = context.entity(selected[i]);
56306             extent._extend(entity.extent(resolver));
56307         }
56308         center = extent.center();
56309
56310
56311         var list = selection$$1
56312             .append('ul');
56313
56314         // multiple features, just display extent center..
56315         if (!singular) {
56316             list
56317                 .append('li')
56318                 .text(t('info_panels.measurement.center') + ': ' +
56319                     center[1].toFixed(OSM_PRECISION) + ', ' + center[0].toFixed(OSM_PRECISION)
56320                 );
56321             return;
56322         }
56323
56324         // single feature, display details..
56325         if (!entity) return;
56326         var geometry = entity.geometry(resolver);
56327
56328         if (geometry === 'line' || geometry === 'area') {
56329             var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
56330                 feature = entity.asGeoJSON(resolver),
56331                 length = radiansToMeters(d3_geoLength(toLineString(feature))),
56332                 lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')),
56333                 centroid = d3_geoCentroid(feature);
56334
56335             list
56336                 .append('li')
56337                 .text(t('info_panels.measurement.geometry') + ': ' +
56338                     (closed ? t('info_panels.measurement.closed') + ' ' : '') + t('geometry.' + geometry) );
56339
56340             if (closed) {
56341                 var area = steradiansToSqmeters(entity.area(resolver));
56342                 list
56343                     .append('li')
56344                     .text(t('info_panels.measurement.area') + ': ' + displayArea(area));
56345             }
56346
56347             list
56348                 .append('li')
56349                 .text(lengthLabel + ': ' + displayLength(length));
56350
56351             list
56352                 .append('li')
56353                 .text(t('info_panels.measurement.centroid') + ': ' +
56354                     centroid[1].toFixed(OSM_PRECISION) + ', ' + centroid[0].toFixed(OSM_PRECISION)
56355                 );
56356
56357
56358             var toggle  = isImperial ? 'imperial' : 'metric';
56359
56360             selection$$1
56361                 .append('a')
56362                 .text(t('info_panels.measurement.' + toggle))
56363                 .attr('href', '#')
56364                 .attr('class', 'button button-toggle-units')
56365                 .on('click', function() {
56366                     event.preventDefault();
56367                     isImperial = !isImperial;
56368                     selection$$1.call(redraw);
56369                 });
56370
56371         } else {
56372             var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
56373
56374             list
56375                 .append('li')
56376                 .text(t('info_panels.measurement.geometry') + ': ' + t('geometry.' + geometry));
56377
56378             list
56379                 .append('li')
56380                 .text(centerLabel + ': ' +
56381                     center[1].toFixed(OSM_PRECISION) + ', ' + center[0].toFixed(OSM_PRECISION)
56382                 );
56383         }
56384     }
56385
56386
56387     var panel = function(selection$$1) {
56388         selection$$1.call(redraw);
56389
56390         context.map()
56391             .on('drawn.info-measurement', function() {
56392                 selection$$1.call(redraw);
56393             });
56394     };
56395
56396     panel.off = function() {
56397         context.map()
56398             .on('drawn.info-measurement', null);
56399     };
56400
56401     panel.id = 'measurement';
56402     panel.title = t('info_panels.measurement.title');
56403     panel.key = t('info_panels.measurement.key');
56404
56405
56406     return panel;
56407 }
56408
56409 var uiInfoPanels = {
56410     background: uiPanelBackground,
56411     history: uiPanelHistory,
56412     location: uiPanelLocation,
56413     measurement: uiPanelMeasurement,
56414 };
56415
56416 function uiInfo(context) {
56417     var ids = Object.keys(uiInfoPanels),
56418         wasActive = ['measurement'],
56419         panels = {},
56420         active = {};
56421
56422     // create panels
56423     ids.forEach(function(k) {
56424         if (!panels[k]) {
56425             panels[k] = uiInfoPanels[k](context);
56426             active[k] = false;
56427         }
56428     });
56429
56430
56431     function info(selection$$1) {
56432
56433         function redraw() {
56434             var activeids = ids.filter(function(k) { return active[k]; }).sort();
56435
56436             var containers = infoPanels.selectAll('.panel-container')
56437                 .data(activeids, function(k) { return k; });
56438
56439             containers.exit()
56440                 .style('opacity', 1)
56441                 .transition()
56442                 .duration(200)
56443                 .style('opacity', 0)
56444                 .on('end', function(d) {
56445                     d3_select(this)
56446                         .call(panels[d].off)
56447                         .remove();
56448                 });
56449
56450             var enter = containers.enter()
56451                 .append('div')
56452                 .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
56453
56454             enter
56455                 .style('opacity', 0)
56456                 .transition()
56457                 .duration(200)
56458                 .style('opacity', 1);
56459
56460             var title = enter
56461                 .append('div')
56462                 .attr('class', 'panel-title fillD2');
56463
56464             title
56465                 .append('h3')
56466                 .text(function(d) { return panels[d].title; });
56467
56468             title
56469                 .append('button')
56470                 .attr('class', 'close')
56471                 .on('click', function (d) { toggle(d); })
56472                 .call(svgIcon('#icon-close'));
56473
56474             enter
56475                 .append('div')
56476                 .attr('class', function(d) { return 'panel-content panel-content-' + d; });
56477
56478
56479             // redraw the panels
56480             infoPanels.selectAll('.panel-content')
56481                 .each(function(d) {
56482                     d3_select(this).call(panels[d]);
56483                 });
56484         }
56485
56486
56487         function toggle(which) {
56488             if (event) {
56489                 event.stopImmediatePropagation();
56490                 event.preventDefault();
56491             }
56492
56493             var activeids = ids.filter(function(k) { return active[k]; });
56494
56495             if (which) {  // toggle one
56496                 active[which] = !active[which];
56497                 if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
56498                     wasActive = [which];
56499                 }
56500             } else {      // toggle all
56501                 if (activeids.length) {
56502                     wasActive = activeids;
56503                     activeids.forEach(function(k) { active[k] = false; });
56504                 } else {
56505                     wasActive.forEach(function(k) { active[k] = true; });
56506                 }
56507             }
56508
56509             redraw();
56510         }
56511
56512
56513         var infoPanels = selection$$1.selectAll('.info-panels')
56514             .data([0]);
56515
56516         infoPanels = infoPanels.enter()
56517             .append('div')
56518             .attr('class', 'info-panels')
56519             .merge(infoPanels);
56520
56521         redraw();
56522
56523         var keybinding = d3keybinding('info')
56524             .on(uiCmd('⌘' + t('info_panels.key')), toggle);
56525
56526         ids.forEach(function(k) {
56527             var key = t('info_panels.' + k + '.key', { default: null });
56528             if (!key) return;
56529             keybinding
56530                 .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
56531         });
56532
56533         d3_select(document)
56534             .call(keybinding);
56535     }
56536
56537     return info;
56538 }
56539
56540 function uiMapData(context) {
56541     var key = t('map_data.key'),
56542         features = context.features().keys(),
56543         layers = context.layers(),
56544         fills = ['wireframe', 'partial', 'full'],
56545         fillDefault = context.storage('area-fill') || 'partial',
56546         fillSelected = fillDefault;
56547
56548
56549     function map_data(selection$$1) {
56550
56551         function showsFeature(d) {
56552             return context.features().enabled(d);
56553         }
56554
56555
56556         function autoHiddenFeature(d) {
56557             return context.features().autoHidden(d);
56558         }
56559
56560
56561         function clickFeature(d) {
56562             context.features().toggle(d);
56563             update();
56564         }
56565
56566
56567         function showsFill(d) {
56568             return fillSelected === d;
56569         }
56570
56571
56572         function setFill(d) {
56573             fills.forEach(function(opt) {
56574                 context.surface().classed('fill-' + opt, Boolean(opt === d));
56575             });
56576
56577             fillSelected = d;
56578             if (d !== 'wireframe') {
56579                 fillDefault = d;
56580                 context.storage('area-fill', d);
56581             }
56582             update();
56583         }
56584
56585
56586         function showsLayer(which) {
56587             var layer = layers.layer(which);
56588             if (layer) {
56589                 return layer.enabled();
56590             }
56591             return false;
56592         }
56593
56594
56595         function setLayer(which, enabled) {
56596             var layer = layers.layer(which);
56597             if (layer) {
56598                 layer.enabled(enabled);
56599                 update();
56600             }
56601         }
56602
56603
56604         function toggleLayer(which) {
56605             setLayer(which, !showsLayer(which));
56606         }
56607
56608
56609         function drawPhotoItems(selection$$1) {
56610             var photoKeys = ['mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
56611             var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
56612             var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
56613
56614             function layerSupported(d) {
56615                 return d.layer && d.layer.supported();
56616             }
56617             function layerEnabled(d) {
56618                 return layerSupported(d) && d.layer.enabled();
56619             }
56620
56621             var ul = selection$$1
56622                 .selectAll('.layer-list-photos')
56623                 .data([0]);
56624
56625             ul = ul.enter()
56626                 .append('ul')
56627                 .attr('class', 'layer-list layer-list-photos')
56628                 .merge(ul);
56629
56630             var li = ul.selectAll('.list-item-photos')
56631                 .data(data);
56632
56633             li.exit()
56634                 .remove();
56635
56636             var liEnter = li.enter()
56637                 .append('li')
56638                 .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
56639
56640             var labelEnter = liEnter
56641                 .append('label')
56642                 .each(function(d) {
56643                     d3_select(this)
56644                         .call(tooltip()
56645                             .title(t(d.id.replace('-', '_') + '.tooltip'))
56646                             .placement('top')
56647                         );
56648                 });
56649
56650             labelEnter
56651                 .append('input')
56652                 .attr('type', 'checkbox')
56653                 .on('change', function(d) { toggleLayer(d.id); });
56654
56655             labelEnter
56656                 .append('span')
56657                 .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
56658
56659
56660             // Update
56661             li = li
56662                 .merge(liEnter);
56663
56664             li
56665                 .classed('active', layerEnabled)
56666                 .selectAll('input')
56667                 .property('checked', layerEnabled);
56668         }
56669
56670
56671         function drawOsmItem(selection$$1) {
56672             var osm = layers.layer('osm'),
56673                 showsOsm = osm.enabled();
56674
56675             var ul = selection$$1
56676                 .selectAll('.layer-list-osm')
56677                 .data(osm ? [0] : []);
56678
56679             // Exit
56680             ul.exit()
56681                 .remove();
56682
56683             // Enter
56684             var ulEnter = ul.enter()
56685                 .append('ul')
56686                 .attr('class', 'layer-list layer-list-osm');
56687
56688             var liEnter = ulEnter
56689                 .append('li')
56690                 .attr('class', 'list-item-osm');
56691
56692             var labelEnter = liEnter
56693                 .append('label')
56694                 .call(tooltip()
56695                     .title(t('map_data.layers.osm.tooltip'))
56696                     .placement('top')
56697                 );
56698
56699             labelEnter
56700                 .append('input')
56701                 .attr('type', 'checkbox')
56702                 .on('change', function() { toggleLayer('osm'); });
56703
56704             labelEnter
56705                 .append('span')
56706                 .text(t('map_data.layers.osm.title'));
56707
56708             // Update
56709             ul = ul
56710                 .merge(ulEnter);
56711
56712             ul.selectAll('.list-item-osm')
56713                 .classed('active', showsOsm)
56714                 .selectAll('input')
56715                 .property('checked', showsOsm);
56716         }
56717
56718
56719         function drawGpxItem(selection$$1) {
56720             var gpx = layers.layer('gpx'),
56721                 hasGpx = gpx && gpx.hasGpx(),
56722                 showsGpx = hasGpx && gpx.enabled();
56723
56724             var ul = selection$$1
56725                 .selectAll('.layer-list-gpx')
56726                 .data(gpx ? [0] : []);
56727
56728             // Exit
56729             ul.exit()
56730                 .remove();
56731
56732             // Enter
56733             var ulEnter = ul.enter()
56734                 .append('ul')
56735                 .attr('class', 'layer-list layer-list-gpx');
56736
56737             var liEnter = ulEnter
56738                 .append('li')
56739                 .attr('class', 'list-item-gpx');
56740
56741             liEnter
56742                 .append('button')
56743                 .attr('class', 'list-item-gpx-extent')
56744                 .call(tooltip()
56745                     .title(t('gpx.zoom'))
56746                     .placement((textDirection === 'rtl') ? 'right' : 'left'))
56747                 .on('click', function() {
56748                     event.preventDefault();
56749                     event.stopPropagation();
56750                     gpx.fitZoom();
56751                 })
56752                 .call(svgIcon('#icon-search'));
56753
56754             liEnter
56755                 .append('button')
56756                 .attr('class', 'list-item-gpx-browse')
56757                 .call(tooltip()
56758                     .title(t('gpx.browse'))
56759                     .placement((textDirection === 'rtl') ? 'right' : 'left')
56760                 )
56761                 .on('click', function() {
56762                     d3_select(document.createElement('input'))
56763                         .attr('type', 'file')
56764                         .on('change', function() {
56765                             gpx.files(event.target.files);
56766                         })
56767                         .node().click();
56768                 })
56769                 .call(svgIcon('#icon-geolocate'));
56770
56771             var labelEnter = liEnter
56772                 .append('label')
56773                 .call(tooltip()
56774                     .title(t('gpx.drag_drop'))
56775                     .placement('top')
56776                 );
56777
56778             labelEnter
56779                 .append('input')
56780                 .attr('type', 'checkbox')
56781                 .on('change', function() { toggleLayer('gpx'); });
56782
56783             labelEnter
56784                 .append('span')
56785                 .text(t('gpx.local_layer'));
56786
56787             // Update
56788             ul = ul
56789                 .merge(ulEnter);
56790
56791             ul.selectAll('.list-item-gpx')
56792                 .classed('active', showsGpx)
56793                 .selectAll('label')
56794                 .classed('deemphasize', !hasGpx)
56795                 .selectAll('input')
56796                 .property('disabled', !hasGpx)
56797                 .property('checked', showsGpx);
56798         }
56799
56800
56801         function drawList(selection$$1, data, type, name, change, active) {
56802             var items = selection$$1.selectAll('li')
56803                 .data(data);
56804
56805             // Exit
56806             items.exit()
56807                 .remove();
56808
56809             // Enter
56810             var enter = items.enter()
56811                 .append('li')
56812                 .attr('class', 'layer')
56813                 .call(tooltip()
56814                     .html(true)
56815                     .title(function(d) {
56816                         var tip = t(name + '.' + d + '.tooltip'),
56817                             key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
56818
56819                         if (name === 'feature' && autoHiddenFeature(d)) {
56820                             var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
56821                             tip += '<div>' + msg + '</div>';
56822                         }
56823                         return uiTooltipHtml(tip, key);
56824                     })
56825                     .placement('top')
56826                 );
56827
56828             var label = enter
56829                 .append('label');
56830
56831             label
56832                 .append('input')
56833                 .attr('type', type)
56834                 .attr('name', name)
56835                 .on('change', change);
56836
56837             label
56838                 .append('span')
56839                 .text(function(d) { return t(name + '.' + d + '.description'); });
56840
56841             // Update
56842             items = items
56843                 .merge(enter);
56844
56845             items
56846                 .classed('active', active)
56847                 .selectAll('input')
56848                 .property('checked', active)
56849                 .property('indeterminate', function(d) {
56850                     return (name === 'feature' && autoHiddenFeature(d));
56851                 });
56852         }
56853
56854
56855         function update() {
56856             dataLayerContainer
56857                 .call(drawOsmItem)
56858                 .call(drawPhotoItems)
56859                 .call(drawGpxItem);
56860
56861             fillList
56862                 .call(drawList, fills, 'radio', 'area_fill', setFill, showsFill);
56863
56864             featureList
56865                 .call(drawList, features, 'checkbox', 'feature', clickFeature, showsFeature);
56866         }
56867
56868
56869         function hidePanel() {
56870             setVisible(false);
56871         }
56872
56873
56874         function togglePanel() {
56875             if (event) event.preventDefault();
56876             tooltipBehavior.hide(button);
56877             setVisible(!button.classed('active'));
56878         }
56879
56880
56881         function toggleWireframe() {
56882             if (event) {
56883                 event.preventDefault();
56884                 event.stopPropagation();
56885             }
56886             setFill((fillSelected === 'wireframe' ? fillDefault : 'wireframe'));
56887             context.map().pan([0,0]);  // trigger a redraw
56888         }
56889
56890
56891         function setVisible(show) {
56892             if (show !== shown) {
56893                 button.classed('active', show);
56894                 shown = show;
56895
56896                 if (show) {
56897                     update();
56898                     selection$$1.on('mousedown.map_data-inside', function() {
56899                         return event.stopPropagation();
56900                     });
56901                     content.style('display', 'block')
56902                         .style('right', '-300px')
56903                         .transition()
56904                         .duration(200)
56905                         .style('right', '0px');
56906                 } else {
56907                     content.style('display', 'block')
56908                         .style('right', '0px')
56909                         .transition()
56910                         .duration(200)
56911                         .style('right', '-300px')
56912                         .on('end', function() {
56913                             d3_select(this).style('display', 'none');
56914                         });
56915                     selection$$1.on('mousedown.map_data-inside', null);
56916                 }
56917             }
56918         }
56919
56920
56921         var content = selection$$1
56922                 .append('div')
56923                 .attr('class', 'fillL map-overlay col3 content hide'),
56924             tooltipBehavior = tooltip()
56925                 .placement((textDirection === 'rtl') ? 'right' : 'left')
56926                 .html(true)
56927                 .title(uiTooltipHtml(t('map_data.description'), key)),
56928             button = selection$$1
56929                 .append('button')
56930                 .attr('tabindex', -1)
56931                 .on('click', togglePanel)
56932                 .call(svgIcon('#icon-data', 'light'))
56933                 .call(tooltipBehavior),
56934             shown = false;
56935
56936         content
56937             .append('h4')
56938             .text(t('map_data.title'));
56939
56940
56941         // data layers
56942         content
56943             .append('a')
56944             .text(t('map_data.data_layers'))
56945             .attr('href', '#')
56946             .classed('hide-toggle', true)
56947             .classed('expanded', true)
56948             .on('click', function() {
56949                 var exp = d3_select(this).classed('expanded');
56950                 dataLayerContainer.style('display', exp ? 'none' : 'block');
56951                 d3_select(this).classed('expanded', !exp);
56952                 event.preventDefault();
56953             });
56954
56955         var dataLayerContainer = content
56956             .append('div')
56957             .attr('class', 'data-data-layers')
56958             .style('display', 'block');
56959
56960
56961         // area fills
56962         content
56963             .append('a')
56964             .text(t('map_data.fill_area'))
56965             .attr('href', '#')
56966             .classed('hide-toggle', true)
56967             .classed('expanded', false)
56968             .on('click', function() {
56969                 var exp = d3_select(this).classed('expanded');
56970                 fillContainer.style('display', exp ? 'none' : 'block');
56971                 d3_select(this).classed('expanded', !exp);
56972                 event.preventDefault();
56973             });
56974
56975         var fillContainer = content
56976             .append('div')
56977             .attr('class', 'data-area-fills')
56978             .style('display', 'none');
56979
56980         var fillList = fillContainer
56981             .append('ul')
56982             .attr('class', 'layer-list layer-fill-list');
56983
56984
56985         // feature filters
56986         content
56987             .append('a')
56988             .text(t('map_data.map_features'))
56989             .attr('href', '#')
56990             .classed('hide-toggle', true)
56991             .classed('expanded', false)
56992             .on('click', function() {
56993                 var exp = d3_select(this).classed('expanded');
56994                 featureContainer.style('display', exp ? 'none' : 'block');
56995                 d3_select(this).classed('expanded', !exp);
56996                 event.preventDefault();
56997             });
56998
56999         var featureContainer = content
57000             .append('div')
57001             .attr('class', 'data-feature-filters')
57002             .style('display', 'none');
57003
57004         var featureList = featureContainer
57005             .append('ul')
57006             .attr('class', 'layer-list layer-feature-list');
57007
57008
57009         context.features()
57010             .on('change.map_data-update', update);
57011
57012         setFill(fillDefault);
57013
57014         var keybinding = d3keybinding('features')
57015             .on(key, togglePanel)
57016             .on(t('area_fill.wireframe.key'), toggleWireframe)
57017             .on([t('background.key'), t('help.key')], hidePanel);
57018
57019         d3_select(document)
57020             .call(keybinding);
57021
57022         context.surface().on('mousedown.map_data-outside', hidePanel);
57023         context.container().on('mousedown.map_data-outside', hidePanel);
57024     }
57025
57026
57027     return map_data;
57028 }
57029
57030 function uiModes(context) {
57031     var modes = [
57032         modeAddPoint$$1(context),
57033         modeAddLine$$1(context),
57034         modeAddArea$$1(context)
57035     ];
57036
57037
57038     function editable() {
57039         return context.editable() && context.mode().id !== 'save';
57040     }
57041
57042
57043     return function(selection$$1) {
57044         var buttons = selection$$1.selectAll('button.add-button')
57045             .data(modes);
57046
57047         buttons = buttons.enter()
57048             .append('button')
57049             .attr('tabindex', -1)
57050             .attr('class', function(mode) { return mode.id + ' add-button col4'; })
57051             .on('click.mode-buttons', function(mode) {
57052                 // When drawing, ignore accidental clicks on mode buttons - #4042
57053                 var currMode = context.mode().id;
57054                 if (currMode.match(/^draw/) !== null) return;
57055
57056                 if (mode.id === currMode) {
57057                     context.enter(modeBrowse(context));
57058                 } else {
57059                     context.enter(mode);
57060                 }
57061             })
57062             .call(tooltip()
57063                 .placement('bottom')
57064                 .html(true)
57065                 .title(function(mode) {
57066                     return uiTooltipHtml(mode.description, mode.key);
57067                 })
57068             );
57069
57070         buttons
57071             .each(function(d) {
57072                 d3_select(this)
57073                     .call(svgIcon('#icon-' + d.button, 'pre-text'));
57074             });
57075
57076         buttons
57077             .append('span')
57078             .attr('class', 'label')
57079             .text(function(mode) { return mode.title; });
57080
57081         context
57082             .on('enter.editor', function(entered) {
57083                 selection$$1.selectAll('button.add-button')
57084                     .classed('active', function(mode) { return entered.button === mode.button; });
57085                 context.container()
57086                     .classed('mode-' + entered.id, true);
57087             });
57088
57089         context
57090             .on('exit.editor', function(exited) {
57091                 context.container()
57092                     .classed('mode-' + exited.id, false);
57093             });
57094
57095         var keybinding = d3keybinding('mode-buttons');
57096
57097         modes.forEach(function(mode) {
57098             keybinding.on(mode.key, function() {
57099                 if (editable()) {
57100                     if (mode.id === context.mode().id) {
57101                         context.enter(modeBrowse(context));
57102                     } else {
57103                         context.enter(mode);
57104                     }
57105                 }
57106             });
57107         });
57108
57109         d3_select(document)
57110             .call(keybinding);
57111
57112
57113         var debouncedUpdate = debounce$1(update, 500, { leading: true, trailing: true });
57114
57115         context.map()
57116             .on('move.modes', debouncedUpdate)
57117             .on('drawn.modes', debouncedUpdate);
57118
57119         context
57120             .on('enter.modes', update);
57121
57122
57123
57124         function update() {
57125             selection$$1.selectAll('button.add-button')
57126                 .property('disabled', !editable());
57127         }
57128     };
57129 }
57130
57131 function uiNotice(context) {
57132
57133     return function(selection$$1) {
57134         var div = selection$$1
57135             .append('div')
57136             .attr('class', 'notice');
57137
57138         var button = div
57139             .append('button')
57140             .attr('class', 'zoom-to notice fillD')
57141             .on('click', function() {
57142                 context.map().zoom(context.minEditableZoom());
57143             })
57144             .on('wheel', function() {   // let wheel events pass through #4482
57145                 var e2 = new WheelEvent(event.type, event);
57146                 context.surface().node().dispatchEvent(e2);
57147             });
57148
57149         button
57150             .call(svgIcon('#icon-plus', 'pre-text'))
57151             .append('span')
57152             .attr('class', 'label')
57153             .text(t('zoom_in_edit'));
57154
57155
57156         function disableTooHigh() {
57157             var canEdit = context.map().zoom() >= context.minEditableZoom();
57158             div.style('display', canEdit ? 'none' : 'block');
57159         }
57160
57161         context.map()
57162             .on('move.notice', debounce$1(disableTooHigh, 500));
57163
57164         disableTooHigh();
57165     };
57166 }
57167
57168 function uiRestore(context) {
57169
57170     return function(selection) {
57171         if (!context.history().lock() || !context.history().restorableChanges())
57172             return;
57173
57174         var modalSelection = uiModal(selection, true);
57175
57176         modalSelection.select('.modal')
57177             .attr('class', 'modal fillL col6');
57178
57179         var introModal = modalSelection.select('.content');
57180
57181         introModal
57182             .attr('class','cf');
57183
57184         introModal
57185             .append('div')
57186             .attr('class', 'modal-section')
57187             .append('h3')
57188             .text(t('restore.heading'));
57189
57190         introModal
57191             .append('div')
57192             .attr('class','modal-section')
57193             .append('p')
57194             .text(t('restore.description'));
57195
57196         var buttonWrap = introModal
57197             .append('div')
57198             .attr('class', 'modal-actions cf');
57199
57200         var restore = buttonWrap
57201             .append('button')
57202             .attr('class', 'restore col6')
57203             .on('click', function() {
57204                 context.history().restore();
57205                 modalSelection.remove();
57206             });
57207
57208         restore
57209             .append('svg')
57210             .attr('class', 'logo logo-restore')
57211             .append('use')
57212             .attr('xlink:href', '#logo-restore');
57213
57214         restore
57215             .append('div')
57216             .text(t('restore.restore'));
57217
57218         var reset = buttonWrap
57219             .append('button')
57220             .attr('class', 'reset col6')
57221             .on('click', function() {
57222                 context.history().clearSaved();
57223                 modalSelection.remove();
57224             });
57225
57226         reset
57227             .append('svg')
57228             .attr('class', 'logo logo-reset')
57229             .append('use')
57230             .attr('xlink:href', '#logo-reset');
57231
57232         reset
57233             .append('div')
57234             .text(t('restore.reset'));
57235
57236         restore.node().focus();
57237     };
57238 }
57239
57240 function uiSave(context) {
57241     var history = context.history(),
57242         key = uiCmd('⌘S');
57243
57244
57245     function saving() {
57246         return context.mode().id === 'save';
57247     }
57248
57249
57250     function save() {
57251         event.preventDefault();
57252         if (!context.inIntro() && !saving() && history.hasChanges()) {
57253             context.enter(modeSave$$1(context));
57254         }
57255     }
57256
57257
57258     function getBackground(numChanges) {
57259         var step;
57260         if (numChanges === 0) {
57261             return null;
57262         } else if (numChanges <= 50) {
57263             step = numChanges / 50;
57264             return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
57265         } else {
57266             step = Math.min((numChanges - 50) / 50, 1.0);
57267             return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
57268         }
57269     }
57270
57271
57272     return function(selection$$1) {
57273         var numChanges = 0;
57274
57275         function updateCount() {
57276             var _ = history.difference().summary().length;
57277             if (_ === numChanges) return;
57278             numChanges = _;
57279
57280             tooltipBehavior
57281                 .title(uiTooltipHtml(
57282                     t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
57283                 );
57284
57285             var background = getBackground(numChanges);
57286
57287             button
57288                 .classed('disabled', numChanges === 0)
57289                 .classed('has-count', numChanges > 0)
57290                 .style('background', background);
57291
57292             button.select('span.count')
57293                 .text(numChanges)
57294                 .style('background', background)
57295                 .style('border-color', background);
57296         }
57297
57298
57299         var tooltipBehavior = tooltip()
57300             .placement('bottom')
57301             .html(true)
57302             .title(uiTooltipHtml(t('save.no_changes'), key));
57303
57304         var button = selection$$1
57305             .append('button')
57306             .attr('class', 'save col12 disabled')
57307             .attr('tabindex', -1)
57308             .on('click', save)
57309             .call(tooltipBehavior);
57310
57311         button
57312             .call(svgIcon('#icon-save', 'pre-text'))
57313             .append('span')
57314             .attr('class', 'label')
57315             .text(t('save.title'));
57316
57317         button
57318             .append('span')
57319             .attr('class', 'count')
57320             .text('0');
57321
57322         updateCount();
57323
57324
57325         var keybinding = d3keybinding('save')
57326             .on(key, save, true);
57327
57328         d3_select(document)
57329             .call(keybinding);
57330
57331         context.history()
57332             .on('change.save', updateCount);
57333
57334         context
57335             .on('enter.save', function() {
57336                 button.property('disabled', saving());
57337                 if (saving()) button.call(tooltipBehavior.hide);
57338             });
57339     };
57340 }
57341
57342 function uiScale(context) {
57343     var projection = context.projection,
57344         isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
57345         maxLength = 180,
57346         tickHeight = 8;
57347
57348
57349     function scaleDefs(loc1, loc2) {
57350         var lat = (loc2[1] + loc1[1]) / 2,
57351             conversion = (isImperial ? 3.28084 : 1),
57352             dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
57353             scale = { dist: 0, px: 0, text: '' },
57354             buckets, i, val, dLon;
57355
57356         if (isImperial) {
57357             buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
57358         } else {
57359             buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
57360         }
57361
57362         // determine a user-friendly endpoint for the scale
57363         for (i = 0; i < buckets.length; i++) {
57364             val = buckets[i];
57365             if (dist >= val) {
57366                 scale.dist = Math.floor(dist / val) * val;
57367                 break;
57368             } else {
57369                 scale.dist = +dist.toFixed(2);
57370             }
57371         }
57372
57373         dLon = geoMetersToLon(scale.dist / conversion, lat);
57374         scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
57375
57376         if (isImperial) {
57377             if (scale.dist >= 5280) {
57378                 scale.dist /= 5280;
57379                 scale.text = String(scale.dist) + ' mi';
57380             } else {
57381                 scale.text = String(scale.dist) + ' ft';
57382             }
57383         } else {
57384             if (scale.dist >= 1000) {
57385                 scale.dist /= 1000;
57386                 scale.text = String(scale.dist) + ' km';
57387             } else {
57388                 scale.text = String(scale.dist) + ' m';
57389             }
57390         }
57391
57392         return scale;
57393     }
57394
57395
57396     function update(selection) {
57397         // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
57398         var dims = context.map().dimensions(),
57399             loc1 = projection.invert([0, dims[1]]),
57400             loc2 = projection.invert([maxLength, dims[1]]),
57401             scale = scaleDefs(loc1, loc2);
57402
57403         selection.select('#scale-path')
57404             .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
57405
57406         selection.select('#scale-textgroup')
57407             .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
57408
57409         selection.select('#scale-text')
57410             .text(scale.text);
57411     }
57412
57413
57414     return function(selection) {
57415         function switchUnits() {
57416             isImperial = !isImperial;
57417             selection.call(update);
57418         }
57419
57420         var scalegroup = selection.append('svg')
57421             .attr('id', 'scale')
57422             .on('click', switchUnits)
57423             .append('g')
57424             .attr('transform', 'translate(10,11)');
57425
57426         scalegroup
57427             .append('path')
57428             .attr('id', 'scale-path');
57429
57430         scalegroup
57431             .append('g')
57432             .attr('id', 'scale-textgroup')
57433             .append('text')
57434             .attr('id', 'scale-text');
57435
57436         selection.call(update);
57437
57438         context.map().on('move.scale', function() {
57439             update(selection);
57440         });
57441     };
57442 }
57443
57444 var pair_1 = pair$1;
57445 function search(x, dims, r) {
57446   if (!dims) dims = 'NSEW';
57447   if (typeof x !== 'string') return { val: null, regex: r };
57448
57449   r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
57450
57451   var m = r.exec(x);
57452   if (!m) return { val: null, regex: r };
57453
57454   var dim = m[1] || m[5];
57455   if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
57456
57457   return {
57458     val: (((m[2]) ? parseFloat(m[2]) : 0) +
57459           ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
57460           ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
57461           ((dim === 'S' || dim === 'W') ? -1 : 1),
57462     regex: r,
57463     raw: m[0],
57464     dim: dim
57465   };
57466 }
57467
57468 function pair$1(x, dims) {
57469   x = x.trim();
57470   var one = search(x, dims);
57471   if (one.val === null) return null;
57472   var two = search(x, dims, one.regex);
57473   if (two.val === null) return null;
57474   // null if one/two are not contiguous.
57475   if (one.raw + two.raw !== x) return null;
57476   if (one.dim) {
57477     return swapdim(one.val, two.val, one.dim);
57478   } else {
57479     return [one.val, two.val];
57480   }
57481 }
57482
57483 function swapdim(a, b, dim) {
57484   if (dim === 'N' || dim === 'S') return [a, b];
57485   if (dim === 'W' || dim === 'E') return [b, a];
57486 }
57487
57488 function uiFeatureList(context) {
57489     var geocodeResults;
57490
57491
57492     function featureList(selection$$1) {
57493         var header = selection$$1
57494             .append('div')
57495             .attr('class', 'header fillL cf');
57496
57497         header.append('h3')
57498             .text(t('inspector.feature_list'));
57499
57500         var searchWrap = selection$$1
57501             .append('div')
57502             .attr('class', 'search-header');
57503
57504         var search = searchWrap
57505             .append('input')
57506             .attr('placeholder', t('inspector.search'))
57507             .attr('type', 'search')
57508             .call(utilNoAuto)
57509             .on('keypress', keypress)
57510             .on('input', inputevent);
57511
57512         searchWrap
57513             .call(svgIcon('#icon-search', 'pre-text'));
57514
57515         var listWrap = selection$$1
57516             .append('div')
57517             .attr('class', 'inspector-body');
57518
57519         var list = listWrap
57520             .append('div')
57521             .attr('class', 'feature-list cf');
57522
57523         context
57524             .on('exit.feature-list', clearSearch);
57525         context.map()
57526             .on('drawn.feature-list', mapDrawn);
57527
57528
57529         function keypress() {
57530             var q = search.property('value'),
57531                 items = list.selectAll('.feature-list-item');
57532             if (event.keyCode === 13 && q.length && items.size()) {
57533                 click(items.datum());
57534             }
57535         }
57536
57537
57538         function inputevent() {
57539             geocodeResults = undefined;
57540             drawList();
57541         }
57542
57543
57544         function clearSearch() {
57545             search.property('value', '');
57546             drawList();
57547         }
57548
57549
57550         function mapDrawn(e) {
57551             if (e.full) {
57552                 drawList();
57553             }
57554         }
57555
57556
57557         function features() {
57558             var entities = {},
57559                 result = [],
57560                 graph = context.graph(),
57561                 q = search.property('value').toLowerCase();
57562
57563             if (!q) return result;
57564
57565             var idMatch = q.match(/^([nwr])([0-9]+)$/);
57566
57567             if (idMatch) {
57568                 result.push({
57569                     id: idMatch[0],
57570                     geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
57571                     type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
57572                     name: idMatch[2]
57573                 });
57574             }
57575
57576             var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
57577
57578             if (locationMatch) {
57579                 var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
57580                 result.push({
57581                     id: -1,
57582                     geometry: 'point',
57583                     type: t('inspector.location'),
57584                     name: loc[0].toFixed(6) + ', ' + loc[1].toFixed(6),
57585                     location: loc
57586                 });
57587             }
57588
57589             function addEntity(entity) {
57590                 if (entity.id in entities || result.length > 200)
57591                     return;
57592
57593                 entities[entity.id] = true;
57594
57595                 var name = utilDisplayName(entity) || '';
57596                 if (name.toLowerCase().indexOf(q) >= 0) {
57597                     var matched = context.presets().match(entity, graph),
57598                         type = (matched && matched.name()) || utilDisplayType(entity.id);
57599                     result.push({
57600                         id: entity.id,
57601                         entity: entity,
57602                         geometry: context.geometry(entity.id),
57603                         type: type,
57604                         name: name
57605                     });
57606                 }
57607
57608                 graph.parentRelations(entity).forEach(function(parent) {
57609                     addEntity(parent);
57610                 });
57611             }
57612
57613             var visible = context.surface().selectAll('.point, .line, .area').nodes();
57614             for (var i = 0; i < visible.length && result.length <= 200; i++) {
57615                 addEntity(visible[i].__data__);
57616             }
57617
57618             (geocodeResults || []).forEach(function(d) {
57619                 // https://github.com/openstreetmap/iD/issues/1890
57620                 if (d.osm_type && d.osm_id) {
57621                     result.push({
57622                         id: osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id),
57623                         geometry: d.osm_type === 'relation' ? 'relation' : d.osm_type === 'way' ? 'line' : 'point',
57624                         type: d.type !== 'yes' ? (d.type.charAt(0).toUpperCase() + d.type.slice(1)).replace('_', ' ')
57625                                                : (d.class.charAt(0).toUpperCase() + d.class.slice(1)).replace('_', ' '),
57626                         name: d.display_name,
57627                         extent: new geoExtent$$1(
57628                             [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
57629                             [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
57630                     });
57631                 }
57632             });
57633
57634             return result;
57635         }
57636
57637
57638         function drawList() {
57639             var value = search.property('value'),
57640                 results = features();
57641
57642             list.classed('filtered', value.length);
57643
57644             var noResultsWorldwide = geocodeResults && geocodeResults.length === 0;
57645
57646             var resultsIndicator = list.selectAll('.no-results-item')
57647                 .data([0])
57648                 .enter().append('button')
57649                 .property('disabled', true)
57650                 .attr('class', 'no-results-item')
57651                 .call(svgIcon('#icon-alert', 'pre-text'));
57652
57653             resultsIndicator.append('span')
57654                 .attr('class', 'entity-name');
57655
57656             list.selectAll('.no-results-item .entity-name')
57657                 .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
57658
57659             if (services.geocoder) {
57660               list.selectAll('.geocode-item')
57661                   .data([0])
57662                   .enter().append('button')
57663                   .attr('class', 'geocode-item')
57664                   .on('click', geocoderSearch)
57665                   .append('div')
57666                   .attr('class', 'label')
57667                   .append('span')
57668                   .attr('class', 'entity-name')
57669                   .text(t('geocoder.search'));
57670             }
57671
57672             list.selectAll('.no-results-item')
57673                 .style('display', (value.length && !results.length) ? 'block' : 'none');
57674
57675             list.selectAll('.geocode-item')
57676                 .style('display', (value && geocodeResults === undefined) ? 'block' : 'none');
57677
57678             list.selectAll('.feature-list-item')
57679                 .data([-1])
57680                 .remove();
57681
57682             var items = list.selectAll('.feature-list-item')
57683                 .data(results, function(d) { return d.id; });
57684
57685             var enter = items.enter()
57686                 .insert('button', '.geocode-item')
57687                 .attr('class', 'feature-list-item')
57688                 .on('mouseover', mouseover)
57689                 .on('mouseout', mouseout)
57690                 .on('click', click);
57691
57692             var label = enter
57693                 .append('div')
57694                 .attr('class', 'label');
57695
57696             label.each(function(d) {
57697                 d3_select(this)
57698                     .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
57699             });
57700
57701             label.append('span')
57702                 .attr('class', 'entity-type')
57703                 .text(function(d) { return d.type; });
57704
57705             label.append('span')
57706                 .attr('class', 'entity-name')
57707                 .text(function(d) { return d.name; });
57708
57709             enter.style('opacity', 0)
57710                 .transition()
57711                 .style('opacity', 1);
57712
57713             items.order();
57714
57715             items.exit()
57716                 .remove();
57717         }
57718
57719
57720         function mouseover(d) {
57721             if (d.id === -1) return;
57722
57723             context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
57724                 .classed('hover', true);
57725         }
57726
57727
57728         function mouseout() {
57729             context.surface().selectAll('.hover')
57730                 .classed('hover', false);
57731         }
57732
57733
57734         function click(d) {
57735             event.preventDefault();
57736             if (d.location) {
57737                 context.map().centerZoom([d.location[1], d.location[0]], 20);
57738             }
57739             else if (d.entity) {
57740                 if (d.entity.type === 'node') {
57741                     context.map().center(d.entity.loc);
57742                 } else if (d.entity.type === 'way') {
57743                     var center = context.projection(context.map().center()),
57744                         edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
57745                     context.map().center(edge.loc);
57746                 }
57747                 context.enter(modeSelect(context, [d.entity.id]));
57748             } else {
57749                 context.zoomToEntity(d.id);
57750             }
57751         }
57752
57753
57754         function geocoderSearch() {
57755             services.geocoder.search(search.property('value'), function (err, resp) {
57756                 geocodeResults = resp || [];
57757                 drawList();
57758             });
57759         }
57760     }
57761
57762
57763     return featureList;
57764 }
57765
57766 function uiPresetIcon() {
57767     var preset, geometry;
57768
57769
57770     function presetIcon(selection$$1) {
57771         selection$$1.each(render);
57772     }
57773
57774
57775     function getIcon(p, geom) {
57776         if (p.icon)
57777             return p.icon;
57778         else if (geom === 'line')
57779             return 'other-line';
57780         else if (geom === 'vertex')
57781             return p.isFallback() ? '' : 'poi-vertex';
57782         else
57783             return 'marker-stroked';
57784     }
57785
57786
57787     function render() {
57788         var selection$$1 = d3_select(this),
57789             p = preset.apply(this, arguments),
57790             geom = geometry.apply(this, arguments),
57791             picon = getIcon(p, geom),
57792             isPoi = picon.match(/^poi-/) !== null,
57793             isMaki = dataFeatureIcons.indexOf(picon) !== -1,
57794             isFramed = (geom === 'area' || geom === 'verex');
57795
57796
57797         function tag_classes(p) {
57798             var s = '';
57799             for (var i in p.tags) {
57800                 s += ' tag-' + i;
57801                 if (p.tags[i] !== '*') {
57802                     s += ' tag-' + i + '-' + p.tags[i];
57803                 }
57804             }
57805             return s;
57806         }
57807
57808
57809         var fill = selection$$1.selectAll('.preset-icon-fill')
57810             .data([0]);
57811
57812         fill = fill.enter()
57813             .append('div')
57814             .merge(fill);
57815
57816         fill
57817             .attr('class', function() {
57818                 return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
57819             });
57820
57821
57822         var areaFrame = selection$$1.selectAll('.preset-icon-frame')
57823             .data((geom === 'area') ? [0] : []);
57824
57825         areaFrame.exit()
57826             .remove();
57827
57828         areaFrame = areaFrame.enter()
57829             .append('div')
57830             .attr('class', 'preset-icon-frame')
57831             .call(svgIcon('#preset-icon-frame'));
57832
57833
57834         var icon = selection$$1.selectAll('.preset-icon')
57835             .data([0]);
57836
57837         icon = icon.enter()
57838             .append('div')
57839             .attr('class', 'preset-icon')
57840             .call(svgIcon(''))
57841             .merge(icon);
57842
57843         icon
57844             .attr('class', 'preset-icon preset-icon-' +
57845                 ((isMaki || isPoi) ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
57846             );
57847
57848         icon.selectAll('svg')
57849             .attr('class', function() {
57850                 return 'icon ' + picon + (isMaki || isPoi ? '' : tag_classes(p));
57851             });
57852
57853         icon.selectAll('use')
57854             .attr('href', '#' + picon + (isMaki ? '-15' : ''));
57855     }
57856
57857
57858     presetIcon.preset = function(_) {
57859         if (!arguments.length) return preset;
57860         preset = utilFunctor(_);
57861         return presetIcon;
57862     };
57863
57864
57865     presetIcon.geometry = function(_) {
57866         if (!arguments.length) return geometry;
57867         geometry = utilFunctor(_);
57868         return presetIcon;
57869     };
57870
57871     return presetIcon;
57872 }
57873
57874 function d3combobox() {
57875     var dispatch$$1 = dispatch('accept'),
57876         container = d3_select(document.body),
57877         data = [],
57878         suggestions = [],
57879         minItems = 2,
57880         caseSensitive = false;
57881
57882     var fetcher = function(val, cb) {
57883         cb(data.filter(function(d) {
57884             return d.value
57885                 .toString()
57886                 .toLowerCase()
57887                 .indexOf(val.toLowerCase()) !== -1;
57888         }));
57889     };
57890
57891     var combobox = function(input, attachTo) {
57892         var idx = -1,
57893             wrapper = container
57894                 .selectAll('div.combobox')
57895                 .filter(function(d) { return d === input.node(); }),
57896             shown = !wrapper.empty();
57897
57898         input
57899             .classed('combobox-input', true)
57900             .on('focus.typeahead', focus)
57901             .on('blur.typeahead', blur)
57902             .on('keydown.typeahead', keydown)
57903             .on('keyup.typeahead', keyup)
57904             .on('input.typeahead', change)
57905             .each(function() {
57906                 var parent = this.parentNode,
57907                     sibling = this.nextSibling;
57908
57909                 var caret = d3_select(parent).selectAll('.combobox-caret')
57910                     .filter(function(d) { return d === input.node(); })
57911                     .data([input.node()]);
57912
57913                 caret = caret.enter()
57914                   .insert('div', function() { return sibling; })
57915                     .attr('class', 'combobox-caret')
57916                   .merge(caret);
57917
57918                 caret
57919                     .on('mousedown', function () {
57920                         // prevent the form element from blurring. it blurs
57921                         // on mousedown
57922                         event.stopPropagation();
57923                         event.preventDefault();
57924                         if (!shown) {
57925                             input.node().focus();
57926                             fetch('', render);
57927                         } else {
57928                             hide();
57929                         }
57930                     });
57931             });
57932
57933         function focus() {
57934             fetch(value(), render);
57935         }
57936
57937         function blur() {
57938             window.setTimeout(hide, 150);
57939         }
57940
57941         function show() {
57942             if (!shown) {
57943                 wrapper = container
57944                     .insert('div', ':first-child')
57945                     .datum(input.node())
57946                     .attr('class', 'combobox')
57947                     .style('position', 'absolute')
57948                     .style('display', 'block')
57949                     .style('left', '0px')
57950                     .on('mousedown', function () {
57951                         // prevent moving focus out of the text field
57952                         event.preventDefault();
57953                     });
57954
57955                 d3_select('body')
57956                     .on('scroll.combobox', render, true);
57957
57958                 shown = true;
57959             }
57960         }
57961
57962         function hide() {
57963             if (shown) {
57964                 idx = -1;
57965                 wrapper.remove();
57966
57967                 d3_select('body')
57968                     .on('scroll.combobox', null);
57969
57970                 shown = false;
57971             }
57972         }
57973
57974         function keydown() {
57975            switch (event.keyCode) {
57976                // backspace, delete
57977                case 8:
57978                case 46:
57979                    input.on('input.typeahead', function() {
57980                        idx = -1;
57981                        render();
57982                        var start = input.property('selectionStart');
57983                        input.node().setSelectionRange(start, start);
57984                        input.on('input.typeahead', change);
57985                    });
57986                    break;
57987                // tab
57988                case 9:
57989                    wrapper.selectAll('a.selected').each(function (d) {
57990                        dispatch$$1.call('accept', this, d);
57991                    });
57992                    hide();
57993                    break;
57994                // return
57995                case 13:
57996                    event.preventDefault();
57997                    break;
57998                // up arrow
57999                case 38:
58000                    nav(-1);
58001                    event.preventDefault();
58002                    break;
58003                // down arrow
58004                case 40:
58005                    nav(+1);
58006                    event.preventDefault();
58007                    break;
58008            }
58009            event.stopPropagation();
58010         }
58011
58012         function keyup() {
58013             switch (event.keyCode) {
58014                 // escape
58015                 case 27:
58016                     hide();
58017                     break;
58018                 // return
58019                 case 13:
58020                     wrapper.selectAll('a.selected').each(function (d) {
58021                        dispatch$$1.call('accept', this, d);
58022                     });
58023                     hide();
58024                     break;
58025             }
58026         }
58027
58028         function change() {
58029             fetch(value(), function() {
58030                 if (input.property('selectionEnd') === input.property('value').length) {
58031                     autocomplete();
58032                 }
58033                 render();
58034             });
58035         }
58036
58037         function nav(dir) {
58038             if (!suggestions.length) return;
58039             idx = Math.max(Math.min(idx + dir, suggestions.length - 1), 0);
58040             input.property('value', suggestions[idx].value);
58041             render();
58042             ensureVisible();
58043         }
58044
58045         function value() {
58046             var value = input.property('value'),
58047                 start = input.property('selectionStart'),
58048                 end = input.property('selectionEnd');
58049
58050             if (start && end) {
58051                 value = value.substring(0, start);
58052             }
58053
58054             return value;
58055         }
58056
58057         function fetch(v, cb) {
58058             fetcher.call(input, v, function(_) {
58059                 suggestions = _;
58060                 cb();
58061             });
58062         }
58063
58064         function autocomplete() {
58065             var v = caseSensitive ? value() : value().toLowerCase();
58066             idx = -1;
58067             if (!v) return;
58068
58069             for (var i = 0; i < suggestions.length; i++) {
58070                 var suggestion = suggestions[i].value,
58071                     compare = caseSensitive ? suggestion : suggestion.toLowerCase();
58072
58073                 if (compare.indexOf(v) === 0) {
58074                     idx = i;
58075                     input.property('value', suggestion);
58076                     input.node().setSelectionRange(v.length, suggestion.length);
58077                     return;
58078                 }
58079             }
58080         }
58081
58082         function render() {
58083             if (suggestions.length >= minItems && document.activeElement === input.node()) {
58084                 show();
58085             } else {
58086                 hide();
58087                 return;
58088             }
58089
58090             var options = wrapper
58091                 .selectAll('a.combobox-option')
58092                 .data(suggestions, function(d) { return d.value; });
58093
58094             options.exit()
58095                 .remove();
58096
58097             options.enter()
58098                 .append('a')
58099                 .attr('class', 'combobox-option')
58100                 .text(function(d) { return d.value; })
58101                 .merge(options)
58102                 .attr('title', function(d) { return d.title; })
58103                 .classed('selected', function(d, i) { return i === idx; })
58104                 .on('mouseover', select)
58105                 .on('click', accept)
58106                 .order();
58107
58108
58109             var node = attachTo ? attachTo.node() : input.node(),
58110                 rect = node.getBoundingClientRect();
58111
58112             wrapper
58113                 .style('left', rect.left + 'px')
58114                 .style('width', rect.width + 'px')
58115                 .style('top', rect.height + rect.top + 'px');
58116         }
58117
58118         function select(d, i) {
58119             idx = i;
58120             render();
58121         }
58122
58123         function ensureVisible() {
58124             var node = wrapper.selectAll('a.selected').node();
58125             if (node) node.scrollIntoView();
58126         }
58127
58128         function accept(d) {
58129             if (!shown) return;
58130             input.property('value', d.value);
58131             utilTriggerEvent(input, 'change');
58132             dispatch$$1.call('accept', this, d);
58133             hide();
58134         }
58135     };
58136
58137     combobox.fetcher = function(_) {
58138         if (!arguments.length) return fetcher;
58139         fetcher = _;
58140         return combobox;
58141     };
58142
58143     combobox.data = function(_) {
58144         if (!arguments.length) return data;
58145         data = _;
58146         return combobox;
58147     };
58148
58149     combobox.minItems = function(_) {
58150         if (!arguments.length) return minItems;
58151         minItems = _;
58152         return combobox;
58153     };
58154
58155     combobox.caseSensitive = function(_) {
58156         if (!arguments.length) return caseSensitive;
58157         caseSensitive = _;
58158         return combobox;
58159     };
58160
58161     combobox.container = function(_) {
58162         if (!arguments.length) return container;
58163         container = _;
58164         return combobox;
58165     };
58166
58167     return utilRebind(combobox, dispatch$$1, 'on');
58168 }
58169
58170
58171 d3combobox.off = function(input) {
58172     input
58173         .on('focus.typeahead', null)
58174         .on('blur.typeahead', null)
58175         .on('keydown.typeahead', null)
58176         .on('keyup.typeahead', null)
58177         .on('input.typeahead', null)
58178         .each(function() {
58179             d3_select(this.parentNode).selectAll('.combobox-caret')
58180                 .filter(function(d) { return d === input.node(); })
58181                 .on('mousedown', null);
58182         });
58183
58184     d3_select('body')
58185         .on('scroll.combobox', null);
58186 };
58187
58188 function uiDisclosure() {
58189     var dispatch$$1 = dispatch('toggled'),
58190         title,
58191         expanded = false,
58192         content = function () {};
58193
58194
58195     var disclosure = function(selection) {
58196         var hideToggle = selection.selectAll('.hide-toggle')
58197             .data([0]);
58198
58199         hideToggle = hideToggle.enter()
58200             .append('a')
58201             .attr('href', '#')
58202             .attr('class', 'hide-toggle')
58203             .merge(hideToggle);
58204
58205         hideToggle
58206             .text(title)
58207             .on('click', toggle)
58208             .classed('expanded', expanded);
58209
58210
58211         var wrap = selection.selectAll('div')
58212             .data([0]);
58213
58214         wrap = wrap.enter()
58215             .append('div')
58216             .merge(wrap);
58217
58218         wrap
58219             .classed('hide', !expanded)
58220             .call(content);
58221
58222
58223         function toggle() {
58224             expanded = !expanded;
58225             hideToggle.classed('expanded', expanded);
58226             wrap.call(uiToggle(expanded));
58227             dispatch$$1.call('toggled', this, expanded);
58228         }
58229     };
58230
58231
58232     disclosure.title = function(_) {
58233         if (!arguments.length) return title;
58234         title = _;
58235         return disclosure;
58236     };
58237
58238
58239     disclosure.expanded = function(_) {
58240         if (!arguments.length) return expanded;
58241         expanded = _;
58242         return disclosure;
58243     };
58244
58245
58246     disclosure.content = function(_) {
58247         if (!arguments.length) return content;
58248         content = _;
58249         return disclosure;
58250     };
58251
58252
58253     return utilRebind(disclosure, dispatch$$1, 'on');
58254 }
58255
58256 function uiRawMemberEditor(context) {
58257     var id,
58258         taginfo = services.taginfo;
58259
58260
58261     function selectMember(d) {
58262         event.preventDefault();
58263         context.enter(modeSelect(context, [d.id]));
58264     }
58265
58266
58267     function changeRole(d) {
58268         var role = d3_select(this).property('value');
58269         var member = { id: d.id, type: d.type, role: role };
58270         context.perform(
58271             actionChangeMember(d.relation.id, member, d.index),
58272             t('operations.change_role.annotation')
58273         );
58274     }
58275
58276
58277     function deleteMember(d) {
58278         context.perform(
58279             actionDeleteMember(d.relation.id, d.index),
58280             t('operations.delete_member.annotation')
58281         );
58282
58283         if (!context.hasEntity(d.relation.id)) {
58284             context.enter(modeBrowse(context));
58285         }
58286     }
58287
58288
58289     function rawMemberEditor(selection$$1) {
58290         var entity = context.entity(id),
58291             memberships = [];
58292
58293         entity.members.slice(0, 1000).forEach(function(member, index) {
58294             memberships.push({
58295                 index: index,
58296                 id: member.id,
58297                 type: member.type,
58298                 role: member.role,
58299                 relation: entity,
58300                 member: context.hasEntity(member.id)
58301             });
58302         });
58303
58304         var gt = entity.members.length > 1000 ? '>' : '';
58305         selection$$1.call(uiDisclosure()
58306             .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
58307             .expanded(true)
58308             .on('toggled', toggled)
58309             .content(content)
58310         );
58311
58312
58313         function toggled(expanded) {
58314             if (expanded) {
58315                 selection$$1.node().parentNode.scrollTop += 200;
58316             }
58317         }
58318
58319
58320         function content(wrap) {
58321             var list = wrap.selectAll('.member-list')
58322                 .data([0]);
58323
58324             list = list.enter()
58325                 .append('ul')
58326                 .attr('class', 'member-list')
58327                 .merge(list);
58328
58329
58330             var items = list.selectAll('li')
58331                 .data(memberships, function(d) {
58332                     return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
58333                         (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
58334                 });
58335
58336             items.exit()
58337                 .each(unbind)
58338                 .remove();
58339
58340             var enter = items.enter()
58341                 .append('li')
58342                 .attr('class', 'member-row form-field')
58343                 .classed('member-incomplete', function(d) { return !d.member; });
58344
58345             enter
58346                 .each(function(d) {
58347                     if (d.member) {
58348                         var label = d3_select(this).append('label')
58349                             .attr('class', 'form-label')
58350                             .append('a')
58351                             .attr('href', '#')
58352                             .on('click', selectMember);
58353
58354                         label.append('span')
58355                             .attr('class', 'member-entity-type')
58356                             .text(function(d) {
58357                                 var matched = context.presets().match(d.member, context.graph());
58358                                 return (matched && matched.name()) || utilDisplayType(d.member.id);
58359                             });
58360
58361                         label.append('span')
58362                             .attr('class', 'member-entity-name')
58363                             .text(function(d) { return utilDisplayName(d.member); });
58364
58365                     } else {
58366                         d3_select(this).append('label')
58367                             .attr('class', 'form-label')
58368                             .text(t('inspector.incomplete', { id: d.id }));
58369                     }
58370                 });
58371
58372             enter
58373                 .append('input')
58374                 .attr('class', 'member-role')
58375                 .property('type', 'text')
58376                 .attr('maxlength', 255)
58377                 .attr('placeholder', t('inspector.role'))
58378                 .call(utilNoAuto)
58379                 .property('value', function(d) { return d.role; })
58380                 .on('change', changeRole);
58381
58382             enter
58383                 .append('button')
58384                 .attr('tabindex', -1)
58385                 .attr('class', 'remove button-input-action member-delete minor')
58386                 .on('click', deleteMember)
58387                 .call(svgIcon('#operation-delete'));
58388
58389             if (taginfo) {
58390                 enter.each(bindTypeahead);
58391             }
58392
58393
58394             function bindTypeahead(d) {
58395                 var row = d3_select(this),
58396                     role = row.selectAll('input.member-role');
58397
58398                 function sort(value, data) {
58399                     var sameletter = [],
58400                         other = [];
58401                     for (var i = 0; i < data.length; i++) {
58402                         if (data[i].value.substring(0, value.length) === value) {
58403                             sameletter.push(data[i]);
58404                         } else {
58405                             other.push(data[i]);
58406                         }
58407                     }
58408                     return sameletter.concat(other);
58409                 }
58410
58411                 role.call(d3combobox()
58412                     .container(context.container())
58413                     .fetcher(function(role, callback) {
58414                         var rtype = entity.tags.type;
58415                         taginfo.roles({
58416                             debounce: true,
58417                             rtype: rtype || '',
58418                             geometry: context.geometry(d.member.id),
58419                             query: role
58420                         }, function(err, data) {
58421                             if (!err) callback(sort(role, data));
58422                         });
58423                     }));
58424             }
58425
58426
58427             function unbind() {
58428                 var row = d3_select(this);
58429
58430                 row.selectAll('input.member-role')
58431                     .call(d3combobox.off);
58432             }
58433         }
58434     }
58435
58436
58437     rawMemberEditor.entityID = function(_) {
58438         if (!arguments.length) return id;
58439         id = _;
58440         return rawMemberEditor;
58441     };
58442
58443
58444     return rawMemberEditor;
58445 }
58446
58447 function uiRawMembershipEditor(context) {
58448     var taginfo = services.taginfo,
58449         id, showBlank;
58450
58451
58452     function selectRelation(d) {
58453         event.preventDefault();
58454         context.enter(modeSelect(context, [d.relation.id]));
58455     }
58456
58457
58458     function changeRole(d) {
58459         var role = d3_select(this).property('value');
58460         context.perform(
58461             actionChangeMember(d.relation.id, assignIn$1({}, d.member, { role: role }), d.index),
58462             t('operations.change_role.annotation')
58463         );
58464     }
58465
58466
58467     function addMembership(d, role) {
58468         showBlank = false;
58469
58470         if (d.relation) {
58471             context.perform(
58472                 actionAddMember(d.relation.id, { id: id, type: context.entity(id).type, role: role }),
58473                 t('operations.add_member.annotation')
58474             );
58475
58476         } else {
58477             var relation = osmRelation();
58478             context.perform(
58479                 actionAddEntity(relation),
58480                 actionAddMember(relation.id, { id: id, type: context.entity(id).type, role: role }),
58481                 t('operations.add.annotation.relation')
58482             );
58483
58484             context.enter(modeSelect(context, [relation.id]));
58485         }
58486     }
58487
58488
58489     function deleteMembership(d) {
58490         context.perform(
58491             actionDeleteMember(d.relation.id, d.index),
58492             t('operations.delete_member.annotation')
58493         );
58494     }
58495
58496
58497     function relations(q) {
58498         var newRelation = {
58499                 relation: null,
58500                 value: t('inspector.new_relation')
58501             },
58502             result = [],
58503             graph = context.graph();
58504
58505         context.intersects(context.extent()).forEach(function(entity) {
58506             if (entity.type !== 'relation' || entity.id === id)
58507                 return;
58508
58509             var matched = context.presets().match(entity, graph),
58510                 presetName = (matched && matched.name()) || t('inspector.relation'),
58511                 entityName = utilDisplayName(entity) || '';
58512
58513             var value = presetName + ' ' + entityName;
58514             if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
58515                 return;
58516
58517             result.push({
58518                 relation: entity,
58519                 value: value
58520             });
58521         });
58522
58523         result.sort(function(a, b) {
58524             return osmRelation.creationOrder(a.relation, b.relation);
58525         });
58526
58527         // Dedupe identical names by appending relation id - see #2891
58528         var dupeGroups = filter(
58529             groupBy(result, 'value'),
58530             function(v) { return v.length > 1; }
58531         );
58532
58533         dupeGroups.forEach(function(group) {
58534             group.forEach(function(obj) {
58535                 obj.value += ' ' + obj.relation.id;
58536             });
58537         });
58538
58539         result.unshift(newRelation);
58540         return result;
58541     }
58542
58543
58544     function rawMembershipEditor(selection$$1) {
58545         var entity = context.entity(id),
58546             parents = context.graph().parentRelations(entity),
58547             memberships = [];
58548
58549         parents.slice(0, 1000).forEach(function(relation) {
58550             relation.members.forEach(function(member, index) {
58551                 if (member.id === entity.id) {
58552                     memberships.push({ relation: relation, member: member, index: index });
58553                 }
58554             });
58555         });
58556
58557         var gt = parents.length > 1000 ? '>' : '';
58558         selection$$1.call(uiDisclosure()
58559             .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
58560             .expanded(true)
58561             .on('toggled', toggled)
58562             .content(content)
58563         );
58564
58565
58566         function toggled(expanded) {
58567             if (expanded) {
58568                 selection$$1.node().parentNode.scrollTop += 200;
58569             }
58570         }
58571
58572
58573         function content(wrap) {
58574             var list = wrap.selectAll('.member-list')
58575                 .data([0]);
58576
58577             list = list.enter()
58578                 .append('ul')
58579                 .attr('class', 'member-list')
58580                 .merge(list);
58581
58582
58583             var items = list.selectAll('li.member-row-normal')
58584                 .data(memberships, function(d) {
58585                     return osmEntity$$1.key(d.relation) + ',' + d.index;
58586                 });
58587
58588             items.exit()
58589                 .each(unbind)
58590                 .remove();
58591
58592             var enter = items.enter()
58593                 .append('li')
58594                 .attr('class', 'member-row member-row-normal form-field');
58595
58596             var label = enter
58597                 .append('label')
58598                 .attr('class', 'form-label')
58599                 .append('a')
58600                 .attr('href', '#')
58601                 .on('click', selectRelation);
58602
58603             label
58604                 .append('span')
58605                 .attr('class', 'member-entity-type')
58606                 .text(function(d) {
58607                     var matched = context.presets().match(d.relation, context.graph());
58608                     return (matched && matched.name()) || t('inspector.relation');
58609                 });
58610
58611             label
58612                 .append('span')
58613                 .attr('class', 'member-entity-name')
58614                 .text(function(d) { return utilDisplayName(d.relation); });
58615
58616             enter
58617                 .append('input')
58618                 .attr('class', 'member-role')
58619                 .property('type', 'text')
58620                 .attr('maxlength', 255)
58621                 .attr('placeholder', t('inspector.role'))
58622                 .call(utilNoAuto)
58623                 .property('value', function(d) { return d.member.role; })
58624                 .on('change', changeRole);
58625
58626             enter
58627                 .append('button')
58628                 .attr('tabindex', -1)
58629                 .attr('class', 'remove button-input-action member-delete minor')
58630                 .on('click', deleteMembership)
58631                 .call(svgIcon('#operation-delete'));
58632
58633             if (taginfo) {
58634                 enter.each(bindTypeahead);
58635             }
58636
58637
58638             var newrow = list.selectAll('.member-row-new')
58639                 .data(showBlank ? [0] : []);
58640
58641             newrow.exit()
58642                 .remove();
58643
58644             enter = newrow.enter()
58645                 .append('li')
58646                 .attr('class', 'member-row member-row-new form-field');
58647
58648             enter
58649                 .append('input')
58650                 .attr('type', 'text')
58651                 .attr('class', 'member-entity-input')
58652                 .call(utilNoAuto);
58653
58654             enter
58655                 .append('input')
58656                 .attr('class', 'member-role')
58657                 .property('type', 'text')
58658                 .attr('maxlength', 255)
58659                 .attr('placeholder', t('inspector.role'))
58660                 .call(utilNoAuto)
58661                 .on('change', changeRole);
58662
58663             enter
58664                 .append('button')
58665                 .attr('tabindex', -1)
58666                 .attr('class', 'remove button-input-action member-delete minor')
58667                 .on('click', deleteMembership)
58668                 .call(svgIcon('#operation-delete'));
58669
58670             newrow = newrow
58671                 .merge(enter);
58672
58673             newrow.selectAll('.member-entity-input')
58674                 .call(d3combobox()
58675                     .container(context.container())
58676                     .minItems(1)
58677                     .fetcher(function(value, callback) { callback(relations(value)); })
58678                     .on('accept', onAccept)
58679                 );
58680
58681
58682             var addrel = wrap.selectAll('.add-relation')
58683                 .data([0]);
58684
58685             addrel = addrel.enter()
58686                 .append('button')
58687                 .attr('class', 'add-relation')
58688                 .merge(addrel);
58689
58690             addrel
58691                 .call(svgIcon('#icon-plus', 'light'))
58692                 .on('click', function() {
58693                     showBlank = true;
58694                     content(wrap);
58695                     list.selectAll('.member-entity-input').node().focus();
58696                 });
58697
58698
58699             function onAccept(d) {
58700                 var role = list.selectAll('.member-row-new .member-role').property('value');
58701                 addMembership(d, role);
58702             }
58703
58704
58705             function bindTypeahead(d) {
58706                 var row = d3_select(this),
58707                     role = row.selectAll('input.member-role');
58708
58709                 function sort(value, data) {
58710                     var sameletter = [],
58711                         other = [];
58712                     for (var i = 0; i < data.length; i++) {
58713                         if (data[i].value.substring(0, value.length) === value) {
58714                             sameletter.push(data[i]);
58715                         } else {
58716                             other.push(data[i]);
58717                         }
58718                     }
58719                     return sameletter.concat(other);
58720                 }
58721
58722                 role.call(d3combobox()
58723                     .container(context.container())
58724                     .fetcher(function(role, callback) {
58725                         var rtype = d.relation.tags.type;
58726                         taginfo.roles({
58727                             debounce: true,
58728                             rtype: rtype || '',
58729                             geometry: context.geometry(id),
58730                             query: role
58731                         }, function(err, data) {
58732                             if (!err) callback(sort(role, data));
58733                         });
58734                     }));
58735             }
58736
58737
58738             function unbind() {
58739                 var row = d3_select(this);
58740
58741                 row.selectAll('input.member-role')
58742                     .call(d3combobox.off);
58743             }
58744         }
58745     }
58746
58747
58748     rawMembershipEditor.entityID = function(_) {
58749         if (!arguments.length) return id;
58750         id = _;
58751         return rawMembershipEditor;
58752     };
58753
58754
58755     return rawMembershipEditor;
58756 }
58757
58758 function uiTagReference(tag) {
58759     var taginfo = services.taginfo,
58760         tagReference = {},
58761         button = d3_select(null),
58762         body = d3_select(null),
58763         loaded,
58764         showing;
58765
58766
58767     function findLocal(data) {
58768         var locale = utilDetect().locale.toLowerCase(),
58769             localized;
58770
58771         if (locale !== 'pt-br') {  // see #3776, prefer 'pt' over 'pt-br'
58772             localized = find$1(data, function(d) {
58773                 return d.lang.toLowerCase() === locale;
58774             });
58775             if (localized) return localized;
58776         }
58777
58778         // try the non-regional version of a language, like
58779         // 'en' if the language is 'en-US'
58780         if (locale.indexOf('-') !== -1) {
58781             var first = locale.split('-')[0];
58782             localized = find$1(data, function(d) {
58783                 return d.lang.toLowerCase() === first;
58784             });
58785             if (localized) return localized;
58786         }
58787
58788         // finally fall back to english
58789         return find$1(data, function(d) {
58790             return d.lang.toLowerCase() === 'en';
58791         });
58792     }
58793
58794
58795     function load(param) {
58796         if (!taginfo) return;
58797
58798         button
58799             .classed('tag-reference-loading', true);
58800
58801         taginfo.docs(param, function show(err, data) {
58802             var docs;
58803             if (!err && data) {
58804                 docs = findLocal(data);
58805             }
58806
58807             body.html('');
58808
58809             if (!docs || !docs.title) {
58810                 if (param.hasOwnProperty('value')) {
58811                     load(omit(param, 'value'));   // retry with key only
58812                 } else {
58813                     body
58814                         .append('p')
58815                         .attr('class', 'tag-reference-description')
58816                         .text(t('inspector.no_documentation_key'));
58817                     done();
58818                 }
58819                 return;
58820             }
58821
58822             if (docs.image && docs.image.thumb_url_prefix) {
58823                 body
58824                     .append('img')
58825                     .attr('class', 'tag-reference-wiki-image')
58826                     .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
58827                     .on('load', function() { done(); })
58828                     .on('error', function() { d3_select(this).remove(); done(); });
58829             } else {
58830                 done();
58831             }
58832
58833             body
58834                 .append('p')
58835                 .attr('class', 'tag-reference-description')
58836                 .text(docs.description || t('inspector.documentation_redirect'));
58837
58838             body
58839                 .append('a')
58840                 .attr('class', 'tag-reference-link')
58841                 .attr('target', '_blank')
58842                 .attr('tabindex', -1)
58843                 .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
58844                 .call(svgIcon('#icon-out-link', 'inline'))
58845                 .append('span')
58846                 .text(t('inspector.reference'));
58847
58848             // Add link to info about "good changeset comments" - #2923
58849             if (param.key === 'comment') {
58850                 body
58851                     .append('a')
58852                     .attr('class', 'tag-reference-comment-link')
58853                     .attr('target', '_blank')
58854                     .attr('tabindex', -1)
58855                     .call(svgIcon('#icon-out-link', 'inline'))
58856                     .attr('href', t('commit.about_changeset_comments_link'))
58857                     .append('span')
58858                     .text(t('commit.about_changeset_comments'));
58859             }
58860         });
58861     }
58862
58863
58864     function done() {
58865         loaded = true;
58866
58867         button
58868             .classed('tag-reference-loading', false);
58869
58870         body
58871             .classed('expanded', true)
58872             .transition()
58873             .duration(200)
58874             .style('max-height', '200px')
58875             .style('opacity', '1');
58876
58877         showing = true;
58878     }
58879
58880
58881     function hide() {
58882         body
58883             .transition()
58884             .duration(200)
58885             .style('max-height', '0px')
58886             .style('opacity', '0')
58887             .on('end', function () {
58888                 body.classed('expanded', false);
58889             });
58890
58891         showing = false;
58892     }
58893
58894
58895     tagReference.button = function(selection$$1) {
58896         button = selection$$1.selectAll('.tag-reference-button')
58897             .data([0]);
58898
58899         button = button.enter()
58900             .append('button')
58901             .attr('class', 'tag-reference-button')
58902             .attr('tabindex', -1)
58903             .call(svgIcon('#icon-inspect'))
58904             .merge(button);
58905
58906         button
58907             .on('click', function () {
58908                 event.stopPropagation();
58909                 event.preventDefault();
58910                 if (showing) {
58911                     hide();
58912                 } else if (loaded) {
58913                     done();
58914                 } else {
58915                     load(tag);
58916                 }
58917             });
58918     };
58919
58920
58921     tagReference.body = function(selection$$1) {
58922
58923         var tagid = tag.rtype || (tag.key + '-' + tag.value);
58924
58925         body = selection$$1.selectAll('.tag-reference-body')
58926             .data([tagid], function(d) { return d; });
58927
58928         body.exit()
58929             .remove();
58930
58931         body = body.enter()
58932             .append('div')
58933             .attr('class', 'tag-reference-body cf')
58934             .style('max-height', '0')
58935             .style('opacity', '0')
58936             .merge(body);
58937
58938         if (showing === false) {
58939             hide();
58940         }
58941     };
58942
58943
58944     tagReference.showing = function(_) {
58945         if (!arguments.length) return showing;
58946         showing = _;
58947         return tagReference;
58948     };
58949
58950
58951     return tagReference;
58952 }
58953
58954 function uiRawTagEditor(context) {
58955     var taginfo = services.taginfo,
58956         dispatch$$1 = dispatch('change'),
58957         expandedPreference = (context.storage('raw_tag_editor.expanded') === 'true'),
58958         expandedCurrent = expandedPreference,
58959         updatePreference = true,
58960         readOnlyTags = [],
58961         showBlank = false,
58962         newRow,
58963         state,
58964         preset,
58965         tags,
58966         id;
58967
58968
58969     function rawTagEditor(selection$$1) {
58970         var count = Object.keys(tags).filter(function(d) { return d; }).length;
58971
58972         selection$$1.call(uiDisclosure()
58973             .title(t('inspector.all_tags') + ' (' + count + ')')
58974             .expanded(expandedCurrent)
58975             .on('toggled', toggled)
58976             .content(content)
58977         );
58978
58979         function toggled(expanded) {
58980             expandedCurrent = expanded;
58981             if (updatePreference) {
58982                 expandedPreference = expanded;
58983                 context.storage('raw_tag_editor.expanded', expanded);
58984             }
58985             if (expanded) {
58986                 selection$$1.node().parentNode.scrollTop += 200;
58987             }
58988         }
58989     }
58990
58991
58992     function content(wrap) {
58993         var entries = map$4(tags, function(v, k) {
58994             return { key: k, value: v };
58995         });
58996
58997         if (!entries.length || showBlank) {
58998             showBlank = false;
58999             entries.push({key: '', value: ''});
59000             newRow = '';
59001         }
59002
59003         var list = wrap.selectAll('.tag-list')
59004             .data([0]);
59005
59006         list = list.enter()
59007             .append('ul')
59008             .attr('class', 'tag-list')
59009             .merge(list);
59010
59011         var newTag = wrap.selectAll('.add-tag')
59012             .data([0]);
59013
59014         newTag.enter()
59015             .append('button')
59016             .attr('class', 'add-tag')
59017             .on('click', addTag)
59018             .call(svgIcon('#icon-plus', 'light'));
59019
59020
59021         var items = list.selectAll('.tag-row')
59022             .data(entries, function(d) { return d.key; });
59023
59024         items.exit()
59025             .each(unbind)
59026             .remove();
59027
59028         // Enter
59029
59030         var enter = items.enter()
59031             .append('li')
59032             .attr('class', 'tag-row cf')
59033             .classed('readonly', isReadOnly);
59034
59035         enter
59036             .append('div')
59037             .attr('class', 'key-wrap')
59038             .append('input')
59039             .property('type', 'text')
59040             .attr('class', 'key')
59041             .attr('maxlength', 255)
59042             .call(utilNoAuto)
59043             .on('blur', keyChange)
59044             .on('change', keyChange);
59045
59046         enter
59047             .append('div')
59048             .attr('class', 'input-wrap-position')
59049             .append('input')
59050             .property('type', 'text')
59051             .attr('class', 'value')
59052             .attr('maxlength', 255)
59053             .call(utilNoAuto)
59054             .on('blur', valueChange)
59055             .on('change', valueChange)
59056             .on('keydown.push-more', pushMore);
59057
59058         enter
59059             .append('button')
59060             .attr('tabindex', -1)
59061             .attr('class', 'remove minor')
59062             .call(svgIcon('#operation-delete'));
59063
59064
59065         // Update
59066
59067         items = items
59068             .merge(enter)
59069             .sort(function(a, b) {
59070                 return (a.key === newRow && b.key !== newRow) ? 1
59071                     : (a.key !== newRow && b.key === newRow) ? -1
59072                     : d3_ascending(a.key, b.key);
59073             });
59074
59075         items
59076             .each(function(tag) {
59077                 var row = d3_select(this),
59078                     key = row.select('input.key'),      // propagate bound data to child
59079                     value = row.select('input.value');  // propagate bound data to child
59080
59081                 if (id && taginfo) {
59082                     bindTypeahead(key, value);
59083                 }
59084
59085                 var isRelation = (id && context.entity(id).type === 'relation'),
59086                     reference;
59087
59088                 if (isRelation && tag.key === 'type') {
59089                     reference = uiTagReference({ rtype: tag.value }, context);
59090                 } else {
59091                     reference = uiTagReference({ key: tag.key, value: tag.value }, context);
59092                 }
59093
59094                 if (state === 'hover') {
59095                     reference.showing(false);
59096                 }
59097
59098                 row
59099                     .call(reference.button)
59100                     .call(reference.body);
59101             });
59102
59103         items.selectAll('input.key')
59104             .attr('title', function(d) { return d.key; })
59105             .call(utilGetSetValue, function(d) { return d.key; })
59106             .property('disabled', isReadOnly);
59107
59108         items.selectAll('input.value')
59109             .attr('title', function(d) { return d.value; })
59110             .call(utilGetSetValue, function(d) { return d.value; })
59111             .property('disabled', isReadOnly);
59112
59113         items.selectAll('button.remove')
59114             .on('click', removeTag);
59115
59116
59117
59118         function isReadOnly(d) {
59119             for (var i = 0; i < readOnlyTags.length; i++) {
59120                 if (d.key.match(readOnlyTags[i]) !== null) {
59121                     return true;
59122                 }
59123             }
59124             return false;
59125         }
59126
59127
59128         function pushMore() {
59129             if (event.keyCode === 9 && !event.shiftKey &&
59130                 list.selectAll('li:last-child input.value').node() === this) {
59131                 addTag();
59132             }
59133         }
59134
59135
59136         function bindTypeahead(key, value) {
59137             if (isReadOnly({ key: key })) return;
59138             var geometry = context.geometry(id);
59139
59140             key.call(d3combobox()
59141                 .container(context.container())
59142                 .fetcher(function(value, callback) {
59143                     taginfo.keys({
59144                         debounce: true,
59145                         geometry: geometry,
59146                         query: value
59147                     }, function(err, data) {
59148                         if (!err) callback(sort(value, data));
59149                     });
59150                 }));
59151
59152             value.call(d3combobox()
59153                 .container(context.container())
59154                 .fetcher(function(value, callback) {
59155                     taginfo.values({
59156                         debounce: true,
59157                         key: utilGetSetValue(key),
59158                         geometry: geometry,
59159                         query: value
59160                     }, function(err, data) {
59161                         if (!err) callback(sort(value, data));
59162                     });
59163                 }));
59164
59165
59166             function sort(value, data) {
59167                 var sameletter = [],
59168                     other = [];
59169                 for (var i = 0; i < data.length; i++) {
59170                     if (data[i].value.substring(0, value.length) === value) {
59171                         sameletter.push(data[i]);
59172                     } else {
59173                         other.push(data[i]);
59174                     }
59175                 }
59176                 return sameletter.concat(other);
59177             }
59178         }
59179
59180
59181         function unbind() {
59182             var row = d3_select(this);
59183
59184             row.selectAll('input.key')
59185                 .call(d3combobox.off);
59186
59187             row.selectAll('input.value')
59188                 .call(d3combobox.off);
59189         }
59190
59191
59192         function keyChange(d) {
59193             var kOld = d.key,
59194                 kNew = this.value.trim(),
59195                 tag = {};
59196
59197
59198             if (isReadOnly({ key: kNew })) {
59199                 this.value = kOld;
59200                 return;
59201             }
59202
59203             if (kNew && kNew !== kOld) {
59204                 var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
59205                     base = match[1],
59206                     suffix = +(match[2] || 1);
59207                 while (tags[kNew]) {  // rename key if already in use
59208                     kNew = base + '_' + suffix++;
59209                 }
59210             }
59211             tag[kOld] = undefined;
59212             tag[kNew] = d.value;
59213
59214             d.key = kNew; // Maintain DOM identity through the subsequent update.
59215
59216             if (newRow === kOld) {  // see if this row is still a new row
59217                 newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
59218             }
59219
59220             this.value = kNew;
59221             dispatch$$1.call('change', this, tag);
59222         }
59223
59224
59225         function valueChange(d) {
59226             if (isReadOnly(d)) return;
59227             var tag = {};
59228             tag[d.key] = this.value;
59229
59230             if (newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
59231                 newRow = undefined;
59232             }
59233
59234             dispatch$$1.call('change', this, tag);
59235         }
59236
59237
59238         function removeTag(d) {
59239             if (isReadOnly(d)) return;
59240             var tag = {};
59241             tag[d.key] = undefined;
59242             dispatch$$1.call('change', this, tag);
59243             d3_select(this.parentNode).remove();
59244         }
59245
59246
59247         function addTag() {
59248             // Wrapped in a setTimeout in case it's being called from a blur
59249             // handler. Without the setTimeout, the call to `content` would
59250             // wipe out the pending value change.
59251             setTimeout(function() {
59252                 showBlank = true;
59253                 content(wrap);
59254                 list.selectAll('li:last-child input.key').node().focus();
59255             }, 0);
59256         }
59257     }
59258
59259
59260     rawTagEditor.state = function(_) {
59261         if (!arguments.length) return state;
59262         state = _;
59263         return rawTagEditor;
59264     };
59265
59266
59267     rawTagEditor.preset = function(_) {
59268         if (!arguments.length) return preset;
59269         preset = _;
59270         if (preset.isFallback()) {
59271             expandedCurrent = true;
59272             updatePreference = false;
59273         } else {
59274             expandedCurrent = expandedPreference;
59275             updatePreference = true;
59276         }
59277         return rawTagEditor;
59278     };
59279
59280
59281     rawTagEditor.tags = function(_) {
59282         if (!arguments.length) return tags;
59283         tags = _;
59284         return rawTagEditor;
59285     };
59286
59287
59288     rawTagEditor.entityID = function(_) {
59289         if (!arguments.length) return id;
59290         id = _;
59291         return rawTagEditor;
59292     };
59293
59294
59295     rawTagEditor.expanded = function(_) {
59296         if (!arguments.length) return expandedCurrent;
59297         expandedCurrent = _;
59298         updatePreference = false;
59299         return rawTagEditor;
59300     };
59301
59302
59303     rawTagEditor.readOnlyTags = function(_) {
59304         if (!arguments.length) return readOnlyTags;
59305         readOnlyTags = _;
59306         return rawTagEditor;
59307     };
59308
59309
59310     return utilRebind(rawTagEditor, dispatch$$1, 'on');
59311 }
59312
59313 function uiFieldCheck(field, context) {
59314     var dispatch$$1 = dispatch('change'),
59315         options = field.strings && field.strings.options,
59316         values = [],
59317         texts = [],
59318         input = d3_select(null),
59319         text = d3_select(null),
59320         label = d3_select(null),
59321         reverser = d3_select(null),
59322         impliedYes,
59323         entityId,
59324         value;
59325
59326
59327     if (options) {
59328         for (var k in options) {
59329             values.push(k === 'undefined' ? undefined : k);
59330             texts.push(field.t('options.' + k, { 'default': options[k] }));
59331         }
59332     } else {
59333         values = [undefined, 'yes'];
59334         texts = [t('inspector.unknown'), t('inspector.check.yes')];
59335         if (field.type !== 'defaultCheck') {
59336             values.push('no');
59337             texts.push(t('inspector.check.no'));
59338         }
59339     }
59340
59341
59342     // Checks tags to see whether an undefined value is "Assumed to be Yes"
59343     function checkImpliedYes() {
59344         impliedYes = (field.id === 'oneway_yes');
59345
59346         // hack: pretend `oneway` field is a `oneway_yes` field
59347         // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
59348         if (field.id === 'oneway') {
59349             var entity = context.entity(entityId);
59350             for (var key in entity.tags) {
59351                 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
59352                     impliedYes = true;
59353                     texts[0] = t('presets.fields.oneway_yes.options.undefined');
59354                     break;
59355                 }
59356             }
59357         }
59358     }
59359
59360
59361     function reverserHidden() {
59362         if (!d3_select('div.inspector-hover').empty()) return true;
59363         return !(value === 'yes' || (impliedYes && !value));
59364     }
59365
59366
59367     function reverserSetText(selection$$1) {
59368         var entity = context.hasEntity(entityId);
59369         if (reverserHidden() || !entity) return selection$$1;
59370
59371         var first = entity.first(),
59372             last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last(),
59373             pseudoDirection = first < last,
59374             icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
59375
59376         selection$$1.selectAll('.reverser-span')
59377             .text(t('inspector.check.reverser'))
59378             .call(svgIcon(icon, 'inline'));
59379
59380         return selection$$1;
59381     }
59382
59383
59384     var check = function(selection$$1) {
59385         checkImpliedYes();
59386         selection$$1.classed('checkselect', 'true');
59387
59388         label = selection$$1.selectAll('.preset-input-wrap')
59389             .data([0]);
59390
59391         var enter = label.enter()
59392             .append('label')
59393             .attr('class', 'preset-input-wrap');
59394
59395         enter
59396             .append('input')
59397             .property('indeterminate', field.type !== 'defaultCheck')
59398             .attr('type', 'checkbox')
59399             .attr('id', 'preset-input-' + field.id);
59400
59401         enter
59402             .append('span')
59403             .text(texts[0])
59404             .attr('class', 'value');
59405
59406         if (field.type === 'onewayCheck') {
59407             enter
59408                 .append('a')
59409                 .attr('id', 'preset-input-' + field.id + '-reverser')
59410                 .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
59411                 .attr('href', '#')
59412                 .append('span')
59413                 .attr('class', 'reverser-span');
59414         }
59415
59416         label = label.merge(enter);
59417         input = label.selectAll('input');
59418         text = label.selectAll('span.value');
59419
59420         input
59421             .on('click', function() {
59422                 var t$$1 = {};
59423                 t$$1[field.key] = values[(values.indexOf(value) + 1) % values.length];
59424                 dispatch$$1.call('change', this, t$$1);
59425                 event.stopPropagation();
59426             });
59427
59428         if (field.type === 'onewayCheck') {
59429             reverser = label.selectAll('.reverser');
59430
59431             reverser
59432                 .call(reverserSetText)
59433                 .on('click', function() {
59434                     event.preventDefault();
59435                     event.stopPropagation();
59436                     context.perform(
59437                         actionReverse(entityId),
59438                         t('operations.reverse.annotation')
59439                     );
59440                     d3_select(this)
59441                         .call(reverserSetText);
59442                 });
59443         }
59444     };
59445
59446
59447     check.entity = function(_) {
59448         if (!arguments.length) return context.hasEntity(entityId);
59449         entityId = _.id;
59450         return check;
59451     };
59452
59453
59454     check.tags = function(tags) {
59455         checkImpliedYes();
59456         value = tags[field.key] && tags[field.key].toLowerCase();
59457
59458         if (field.type === 'onewayCheck' && (value === '1' || value === '-1')) {
59459             value = 'yes';
59460         }
59461
59462         input
59463             .property('indeterminate', field.type !== 'defaultCheck' && !value)
59464             .property('checked', value === 'yes');
59465
59466         text
59467             .text(texts[values.indexOf(value)]);
59468
59469         label
59470             .classed('set', !!value);
59471
59472         if (field.type === 'onewayCheck') {
59473             reverser
59474                 .classed('hide', reverserHidden())
59475                 .call(reverserSetText);
59476         }
59477     };
59478
59479
59480     check.focus = function() {
59481         input.node().focus();
59482     };
59483
59484     return utilRebind(check, dispatch$$1, 'on');
59485 }
59486
59487 /** Used for built-in method references. */
59488 var arrayProto$1 = Array.prototype;
59489
59490 /** Built-in value references. */
59491 var splice$1 = arrayProto$1.splice;
59492
59493 /**
59494  * The base implementation of `_.pullAt` without support for individual
59495  * indexes or capturing the removed elements.
59496  *
59497  * @private
59498  * @param {Array} array The array to modify.
59499  * @param {number[]} indexes The indexes of elements to remove.
59500  * @returns {Array} Returns `array`.
59501  */
59502 function basePullAt(array, indexes) {
59503   var length = array ? indexes.length : 0,
59504       lastIndex = length - 1;
59505
59506   while (length--) {
59507     var index = indexes[length];
59508     if (length == lastIndex || index !== previous) {
59509       var previous = index;
59510       if (isIndex(index)) {
59511         splice$1.call(array, index, 1);
59512       } else {
59513         baseUnset(array, index);
59514       }
59515     }
59516   }
59517   return array;
59518 }
59519
59520 /**
59521  * Removes all elements from `array` that `predicate` returns truthy for
59522  * and returns an array of the removed elements. The predicate is invoked
59523  * with three arguments: (value, index, array).
59524  *
59525  * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
59526  * to pull elements from an array by value.
59527  *
59528  * @static
59529  * @memberOf _
59530  * @since 2.0.0
59531  * @category Array
59532  * @param {Array} array The array to modify.
59533  * @param {Function} [predicate=_.identity] The function invoked per iteration.
59534  * @returns {Array} Returns the new array of removed elements.
59535  * @example
59536  *
59537  * var array = [1, 2, 3, 4];
59538  * var evens = _.remove(array, function(n) {
59539  *   return n % 2 == 0;
59540  * });
59541  *
59542  * console.log(array);
59543  * // => [1, 3]
59544  *
59545  * console.log(evens);
59546  * // => [2, 4]
59547  */
59548 function remove$8(array, predicate) {
59549   var result = [];
59550   if (!(array && array.length)) {
59551     return result;
59552   }
59553   var index = -1,
59554       indexes = [],
59555       length = array.length;
59556
59557   predicate = baseIteratee(predicate, 3);
59558   while (++index < length) {
59559     var value = array[index];
59560     if (predicate(value, index, array)) {
59561       result.push(value);
59562       indexes.push(index);
59563     }
59564   }
59565   basePullAt(array, indexes);
59566   return result;
59567 }
59568
59569 function uiFieldCombo(field, context) {
59570     var dispatch$$1 = dispatch('change'),
59571         nominatim = services.geocoder,
59572         taginfo = services.taginfo,
59573         isMulti = (field.type === 'multiCombo'),
59574         isNetwork = (field.type === 'networkCombo'),
59575         isSemi = (field.type === 'semiCombo'),
59576         optstrings = field.strings && field.strings.options,
59577         optarray = field.options,
59578         snake_case = (field.snake_case || (field.snake_case === undefined)),
59579         combobox = d3combobox()
59580             .container(context.container())
59581             .minItems(isMulti || isSemi ? 1 : 2),
59582         comboData = [],
59583         multiData = [],
59584         container,
59585         input,
59586         entity,
59587         country;
59588
59589     // ensure multiCombo field.key ends with a ':'
59590     if (isMulti && field.key.match(/:$/) === null) {
59591         field.key += ':';
59592     }
59593
59594
59595     function snake(s) {
59596         return s.replace(/\s+/g, '_');
59597     }
59598
59599     function unsnake(s) {
59600         return s.replace(/_+/g, ' ');
59601     }
59602
59603     function clean(s) {
59604         return s.split(';')
59605             .map(function(s) { return s.trim(); })
59606             .join(';');
59607     }
59608
59609
59610     // returns the tag value for a display value
59611     // (for multiCombo, dval should be the key suffix, not the entire key)
59612     function tagValue(dval) {
59613         dval = clean(dval || '');
59614
59615         if (optstrings) {
59616             var match = find$1(comboData, function(o) {
59617                 return o.key && clean(o.value) === dval;
59618             });
59619             if (match) {
59620                 return match.key;
59621             }
59622         }
59623
59624         if (field.type === 'typeCombo' && !dval) {
59625             return 'yes';
59626         }
59627
59628         return (snake_case ? snake(dval) : dval) || undefined;
59629     }
59630
59631
59632     // returns the display value for a tag value
59633     // (for multiCombo, tval should be the key suffix, not the entire key)
59634     function displayValue(tval) {
59635         tval = tval || '';
59636
59637         if (optstrings) {
59638             var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
59639             if (match) {
59640                 return match.value;
59641             }
59642         }
59643
59644         if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
59645             return '';
59646         }
59647
59648         return snake_case ? unsnake(tval) : tval;
59649     }
59650
59651
59652     function objectDifference(a, b) {
59653         return reject(a, function(d1) {
59654             return some(b, function(d2) { return d1.value === d2.value; });
59655         });
59656     }
59657
59658
59659     function initCombo(selection$$1, attachTo) {
59660         if (optstrings) {
59661             selection$$1.attr('readonly', 'readonly');
59662             selection$$1.call(combobox, attachTo);
59663             setStaticValues(setPlaceholder);
59664
59665         } else if (optarray) {
59666             selection$$1.call(combobox, attachTo);
59667             setStaticValues(setPlaceholder);
59668
59669         } else if (taginfo) {
59670             selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
59671             setTaginfoValues('', setPlaceholder);
59672         }
59673     }
59674
59675
59676     function setStaticValues(callback) {
59677         if (!(optstrings || optarray)) return;
59678
59679         if (optstrings) {
59680             comboData = Object.keys(optstrings).map(function(k) {
59681                 var v = field.t('options.' + k, { 'default': optstrings[k] });
59682                 return {
59683                     key: k,
59684                     value: v,
59685                     title: v
59686                 };
59687             });
59688
59689         } else if (optarray) {
59690             comboData = optarray.map(function(k) {
59691                 var v = snake_case ? unsnake(k) : k;
59692                 return {
59693                     key: k,
59694                     value: v,
59695                     title: v
59696                 };
59697             });
59698         }
59699
59700         combobox.data(objectDifference(comboData, multiData));
59701         if (callback) callback(comboData);
59702     }
59703
59704
59705     function setTaginfoValues(q, callback) {
59706         var fn = isMulti ? 'multikeys' : 'values';
59707         var query = (isMulti ? field.key : '') + q;
59708         var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
59709         if (hasCountryPrefix) {
59710             query = country + ':';
59711         }
59712
59713         var params = {
59714             debounce: (q !== ''),
59715             key: field.key,
59716             query: query
59717         };
59718
59719         if (entity) {
59720             params.geometry = context.geometry(entity.id);
59721         }
59722
59723         taginfo[fn](params, function(err, data) {
59724             if (err) return;
59725             if (hasCountryPrefix) {
59726                 data = filter(data, function(d) {
59727                     return d.value.toLowerCase().indexOf(country + ':') === 0;
59728                 });
59729             }
59730
59731             comboData = map$4(data, function(d) {
59732                 var k = d.value;
59733                 if (isMulti) k = k.replace(field.key, '');
59734                 var v = snake_case ? unsnake(k) : k;
59735                 return {
59736                     key: k,
59737                     value: v,
59738                     title: isMulti ? v : d.title
59739                 };
59740             });
59741
59742             comboData = objectDifference(comboData, multiData);
59743             if (callback) callback(comboData);
59744         });
59745     }
59746
59747
59748     function setPlaceholder(d) {
59749         var ph;
59750
59751         if (isMulti || isSemi) {
59752             ph = field.placeholder() || t('inspector.add');
59753         } else {
59754             var vals = map$4(d, 'value').filter(function(s) { return s.length < 20; }),
59755                 placeholders = vals.length > 1 ? vals : map$4(d, 'key');
59756             ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
59757         }
59758
59759         if (ph.match(/(…|\.\.\.)$/) === null) {
59760             ph += '…';
59761         }
59762
59763         container.selectAll('input')
59764             .attr('placeholder', ph);
59765     }
59766
59767
59768     function change() {
59769         var val = tagValue(utilGetSetValue(input)),
59770             t$$1 = {};
59771
59772         if (isMulti || isSemi) {
59773             if (!val) return;
59774             container.classed('active', false);
59775             utilGetSetValue(input, '');
59776             if (isMulti) {
59777                 field.keys.push(field.key + val);
59778                 t$$1[field.key + val] = 'yes';
59779             } else if (isSemi) {
59780                 var arr = multiData.map(function(d) { return d.key; });
59781                 arr.push(val);
59782                 t$$1[field.key] = compact(uniq(arr)).join(';');
59783             }
59784             window.setTimeout(function() { input.node().focus(); }, 10);
59785
59786         } else {
59787             t$$1[field.key] = val;
59788         }
59789
59790         dispatch$$1.call('change', this, t$$1);
59791     }
59792
59793
59794     function removeMultikey(d) {
59795         event.stopPropagation();
59796         var t$$1 = {};
59797         if (isMulti) {
59798             t$$1[d.key] = undefined;
59799         } else if (isSemi) {
59800             remove$8(multiData, function(md) { return md.key === d.key; });
59801             var arr = multiData.map(function(md) { return md.key; });
59802             arr = compact(uniq(arr));
59803             t$$1[field.key] = arr.length ? arr.join(';') : undefined;
59804         }
59805         dispatch$$1.call('change', this, t$$1);
59806     }
59807
59808
59809     function combo(selection$$1) {
59810         if (isMulti || isSemi) {
59811             container = selection$$1.selectAll('ul').data([0]);
59812
59813             container = container.enter()
59814                 .append('ul')
59815                 .attr('class', 'form-field-multicombo')
59816                 .on('click', function() {
59817                     window.setTimeout(function() { input.node().focus(); }, 10);
59818                 })
59819                 .merge(container);
59820
59821         } else {
59822             container = selection$$1;
59823         }
59824
59825         input = container.selectAll('input')
59826             .data([0]);
59827
59828         input = input.enter()
59829             .append('input')
59830             .attr('type', 'text')
59831             .attr('id', 'preset-input-' + field.id)
59832             .call(utilNoAuto)
59833             .call(initCombo, selection$$1)
59834             .merge(input);
59835
59836         if (isNetwork && nominatim && entity) {
59837             var center = entity.extent(context.graph()).center();
59838             nominatim.countryCode(center, function (err, code) {
59839                 country = code;
59840             });
59841         }
59842
59843         input
59844             .on('change', change)
59845             .on('blur', change);
59846
59847         if (isMulti || isSemi) {
59848             combobox
59849                 .on('accept', function() {
59850                     input.node().blur();
59851                     input.node().focus();
59852                 });
59853
59854             input
59855                 .on('focus', function() { container.classed('active', true); });
59856         }
59857     }
59858
59859
59860     combo.tags = function(tags) {
59861         if (isMulti || isSemi) {
59862             multiData = [];
59863
59864             if (isMulti) {
59865                 // Build multiData array containing keys already set..
59866                 Object.keys(tags).forEach(function(key) {
59867                     if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
59868
59869                     var suffix = key.substring(field.key.length);
59870                     multiData.push({
59871                         key: key,
59872                         value: displayValue(suffix)
59873                     });
59874                 });
59875
59876                 // Set keys for form-field modified (needed for undo and reset buttons)..
59877                 field.keys = map$4(multiData, 'key');
59878
59879             } else if (isSemi) {
59880                 var arr = compact(uniq((tags[field.key] || '').split(';')));
59881                 multiData = arr.map(function(key) {
59882                     return {
59883                         key: key,
59884                         value: displayValue(key)
59885                     };
59886                 });
59887             }
59888
59889             // Exclude existing multikeys from combo options..
59890             var available = objectDifference(comboData, multiData);
59891             combobox.data(available);
59892
59893             // Hide 'Add' button if this field uses fixed set of
59894             // translateable optstrings and they're all currently used..
59895             container.selectAll('.combobox-input, .combobox-caret')
59896                 .classed('hide', optstrings && !available.length);
59897
59898
59899             // Render chips
59900             var chips = container.selectAll('.chips')
59901                 .data(multiData);
59902
59903             chips.exit()
59904                 .remove();
59905
59906             var enter = chips.enter()
59907                 .insert('li', 'input')
59908                 .attr('class', 'chips');
59909
59910             enter.append('span');
59911             enter.append('a');
59912
59913             chips = chips.merge(enter);
59914
59915             chips.select('span')
59916                 .text(function(d) { return d.value; });
59917
59918             chips.select('a')
59919                 .on('click', removeMultikey)
59920                 .attr('class', 'remove')
59921                 .text('×');
59922
59923         } else {
59924             utilGetSetValue(input, displayValue(tags[field.key]));
59925         }
59926     };
59927
59928
59929     combo.focus = function() {
59930         input.node().focus();
59931     };
59932
59933
59934     combo.entity = function(_) {
59935         if (!arguments.length) return entity;
59936         entity = _;
59937         return combo;
59938     };
59939
59940
59941     return utilRebind(combo, dispatch$$1, 'on');
59942 }
59943
59944 function uiFieldText(field, context) {
59945     var dispatch$$1 = dispatch('change'),
59946         nominatim = services.geocoder,
59947         input,
59948         entity;
59949
59950
59951     function i(selection$$1) {
59952         var fieldId = 'preset-input-' + field.id;
59953
59954         input = selection$$1.selectAll('input')
59955             .data([0]);
59956
59957         input = input.enter()
59958             .append('input')
59959             .attr('type', field.type)
59960             .attr('id', fieldId)
59961             .attr('placeholder', field.placeholder() || t('inspector.unknown'))
59962             .call(utilNoAuto)
59963             .merge(input);
59964
59965         input
59966             .on('input', change(true))
59967             .on('blur', change())
59968             .on('change', change());
59969
59970         if (field.type === 'tel' && nominatim && entity) {
59971             var center = entity.extent(context.graph()).center();
59972             nominatim.countryCode(center, function (err, countryCode) {
59973                 if (err || !dataPhoneFormats[countryCode]) return;
59974                 selection$$1.selectAll('#' + fieldId)
59975                     .attr('placeholder', dataPhoneFormats[countryCode]);
59976             });
59977
59978         } else if (field.type === 'number') {
59979             var rtl = (textDirection === 'rtl');
59980
59981             input.attr('type', 'text');
59982
59983             var spinControl = selection$$1.selectAll('.spin-control')
59984                 .data([0]);
59985
59986             var enter = spinControl.enter()
59987                 .append('div')
59988                 .attr('class', 'spin-control');
59989
59990             enter
59991                 .append('button')
59992                 .datum(rtl ? 1 : -1)
59993                 .attr('class', rtl ? 'increment' : 'decrement')
59994                 .attr('tabindex', -1);
59995
59996             enter
59997                 .append('button')
59998                 .datum(rtl ? -1 : 1)
59999                 .attr('class', rtl ? 'decrement' : 'increment')
60000                 .attr('tabindex', -1);
60001
60002             spinControl = spinControl
60003                 .merge(enter);
60004
60005             spinControl.selectAll('button')
60006                 .on('click', function(d) {
60007                     event.preventDefault();
60008                     var num = parseInt(input.node().value || 0, 10);
60009                     if (!isNaN(num)) input.node().value = num + d;
60010                     change()();
60011                 });
60012         }
60013     }
60014
60015
60016     function change(onInput) {
60017         return function() {
60018             var t$$1 = {};
60019             t$$1[field.key] = utilGetSetValue(input) || undefined;
60020             dispatch$$1.call('change', this, t$$1, onInput);
60021         };
60022     }
60023
60024
60025     i.entity = function(_) {
60026         if (!arguments.length) return entity;
60027         entity = _;
60028         return i;
60029     };
60030
60031
60032     i.tags = function(tags) {
60033         utilGetSetValue(input, tags[field.key] || '');
60034     };
60035
60036
60037     i.focus = function() {
60038         var node = input.node();
60039         if (node) node.focus();
60040     };
60041
60042     return utilRebind(i, dispatch$$1, 'on');
60043 }
60044
60045 function uiFieldAccess(field, context) {
60046     var dispatch$$1 = dispatch('change'),
60047         items;
60048
60049     function access(selection$$1) {
60050         var wrap = selection$$1.selectAll('.preset-input-wrap')
60051             .data([0]);
60052
60053         wrap = wrap.enter()
60054             .append('div')
60055             .attr('class', 'cf preset-input-wrap')
60056             .append('ul')
60057             .merge(wrap);
60058
60059         var list = wrap.selectAll('ul')
60060             .data([0]);
60061
60062         list = list.enter()
60063             .append('ul')
60064             .merge(list);
60065
60066
60067         items = list.selectAll('li')
60068             .data(field.keys);
60069
60070         // Enter
60071         var enter = items.enter()
60072             .append('li')
60073             .attr('class', function(d) { return 'cf preset-access-' + d; });
60074
60075         enter
60076             .append('span')
60077             .attr('class', 'col6 label preset-label-access')
60078             .attr('for', function(d) { return 'preset-input-access-' + d; })
60079             .text(function(d) { return field.t('types.' + d); });
60080
60081         enter
60082             .append('div')
60083             .attr('class', 'col6 preset-input-access-wrap')
60084             .append('input')
60085             .attr('type', 'text')
60086             .attr('class', 'preset-input-access')
60087             .attr('id', function(d) { return 'preset-input-access-' + d; })
60088             .call(utilNoAuto)
60089             .each(function(d) {
60090                 d3_select(this)
60091                     .call(d3combobox()
60092                         .container(context.container())
60093                         .data(access.options(d))
60094                     );
60095             });
60096
60097
60098         // Update
60099         items = items.merge(enter);
60100
60101         wrap.selectAll('.preset-input-access')
60102             .on('change', change)
60103             .on('blur', change);
60104     }
60105
60106
60107     function change(d) {
60108         var tag = {};
60109         tag[d] = utilGetSetValue(d3_select(this)) || undefined;
60110         dispatch$$1.call('change', this, tag);
60111     }
60112
60113
60114     access.options = function(type) {
60115         var options = ['no', 'permissive', 'private', 'destination'];
60116
60117         if (type !== 'access') {
60118             options.unshift('yes');
60119             options.push('designated');
60120
60121             if (type === 'bicycle') {
60122                 options.push('dismount');
60123             }
60124         }
60125
60126         return options.map(function(option) {
60127             return {
60128                 title: field.t('options.' + option + '.description'),
60129                 value: option
60130             };
60131         });
60132     };
60133
60134
60135     var placeholders = {
60136         footway: {
60137             foot: 'designated',
60138             motor_vehicle: 'no'
60139         },
60140         steps: {
60141             foot: 'yes',
60142             motor_vehicle: 'no',
60143             bicycle: 'no',
60144             horse: 'no'
60145         },
60146         pedestrian: {
60147             foot: 'yes',
60148             motor_vehicle: 'no'
60149         },
60150         cycleway: {
60151             motor_vehicle: 'no',
60152             bicycle: 'designated'
60153         },
60154         bridleway: {
60155             motor_vehicle: 'no',
60156             horse: 'designated'
60157         },
60158         path: {
60159             foot: 'yes',
60160             motor_vehicle: 'no',
60161             bicycle: 'yes',
60162             horse: 'yes'
60163         },
60164         motorway: {
60165             foot: 'no',
60166             motor_vehicle: 'yes',
60167             bicycle: 'no',
60168             horse: 'no'
60169         },
60170         trunk: {
60171             motor_vehicle: 'yes'
60172         },
60173         primary: {
60174             foot: 'yes',
60175             motor_vehicle: 'yes',
60176             bicycle: 'yes',
60177             horse: 'yes'
60178         },
60179         secondary: {
60180             foot: 'yes',
60181             motor_vehicle: 'yes',
60182             bicycle: 'yes',
60183             horse: 'yes'
60184         },
60185         tertiary: {
60186             foot: 'yes',
60187             motor_vehicle: 'yes',
60188             bicycle: 'yes',
60189             horse: 'yes'
60190         },
60191         residential: {
60192             foot: 'yes',
60193             motor_vehicle: 'yes',
60194             bicycle: 'yes',
60195             horse: 'yes'
60196         },
60197         unclassified: {
60198             foot: 'yes',
60199             motor_vehicle: 'yes',
60200             bicycle: 'yes',
60201             horse: 'yes'
60202         },
60203         service: {
60204             foot: 'yes',
60205             motor_vehicle: 'yes',
60206             bicycle: 'yes',
60207             horse: 'yes'
60208         },
60209         motorway_link: {
60210             foot: 'no',
60211             motor_vehicle: 'yes',
60212             bicycle: 'no',
60213             horse: 'no'
60214         },
60215         trunk_link: {
60216             motor_vehicle: 'yes'
60217         },
60218         primary_link: {
60219             foot: 'yes',
60220             motor_vehicle: 'yes',
60221             bicycle: 'yes',
60222             horse: 'yes'
60223         },
60224         secondary_link: {
60225             foot: 'yes',
60226             motor_vehicle: 'yes',
60227             bicycle: 'yes',
60228             horse: 'yes'
60229         },
60230         tertiary_link: {
60231             foot: 'yes',
60232             motor_vehicle: 'yes',
60233             bicycle: 'yes',
60234             horse: 'yes'
60235         }
60236     };
60237
60238
60239     access.tags = function(tags) {
60240         utilGetSetValue(items.selectAll('.preset-input-access'),
60241             function(d) { return tags[d] || ''; })
60242             .attr('placeholder', function() {
60243                 return tags.access ? tags.access : field.placeholder();
60244             });
60245
60246         items.selectAll('#preset-input-access-access')
60247             .attr('placeholder', 'yes');
60248
60249         forEach(placeholders[tags.highway], function(v, k) {
60250             items.selectAll('#preset-input-access-' + k)
60251                 .attr('placeholder', function() { return (tags.access || v); });
60252         });
60253     };
60254
60255
60256     access.focus = function() {
60257         items.selectAll('.preset-input-access')
60258             .node().focus();
60259     };
60260
60261
60262     return utilRebind(access, dispatch$$1, 'on');
60263 }
60264
60265 function uiFieldAddress(field, context) {
60266     var dispatch$$1 = dispatch('init', 'change'),
60267         nominatim = services.geocoder,
60268         wrap = d3_select(null),
60269         isInitialized = false,
60270         entity;
60271
60272     function getNearStreets() {
60273         var extent = entity.extent(context.graph()),
60274             l = extent.center(),
60275             box = geoExtent$$1(l).padByMeters(200);
60276
60277         var streets = context.intersects(box)
60278             .filter(isAddressable)
60279             .map(function(d) {
60280                 var loc = context.projection([
60281                     (extent[0][0] + extent[1][0]) / 2,
60282                     (extent[0][1] + extent[1][1]) / 2]),
60283                     choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
60284                 return {
60285                     title: d.tags.name,
60286                     value: d.tags.name,
60287                     dist: choice.distance
60288                 };
60289             })
60290             .sort(function(a, b) {
60291                 return a.dist - b.dist;
60292             });
60293
60294         return uniqBy(streets, 'value');
60295
60296         function isAddressable(d) {
60297             return d.tags.highway && d.tags.name && d.type === 'way';
60298         }
60299     }
60300
60301
60302     function getNearCities() {
60303         var extent = entity.extent(context.graph()),
60304             l = extent.center(),
60305             box = geoExtent$$1(l).padByMeters(200);
60306
60307         var cities = context.intersects(box)
60308             .filter(isAddressable)
60309             .map(function(d) {
60310                 return {
60311                     title: d.tags['addr:city'] || d.tags.name,
60312                     value: d.tags['addr:city'] || d.tags.name,
60313                     dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
60314                 };
60315             })
60316             .sort(function(a, b) {
60317                 return a.dist - b.dist;
60318             });
60319
60320         return uniqBy(cities, 'value');
60321
60322
60323         function isAddressable(d) {
60324             if (d.tags.name &&
60325                 (d.tags.admin_level === '8' || d.tags.border_type === 'city'))
60326                 return true;
60327
60328             if (d.tags.place && d.tags.name && (
60329                     d.tags.place === 'city' ||
60330                     d.tags.place === 'town' ||
60331                     d.tags.place === 'village'))
60332                 return true;
60333
60334             if (d.tags['addr:city']) return true;
60335
60336             return false;
60337         }
60338     }
60339
60340     function getNearValues(key) {
60341         var extent = entity.extent(context.graph()),
60342             l = extent.center(),
60343             box = geoExtent$$1(l).padByMeters(200);
60344
60345         var results = context.intersects(box)
60346             .filter(function hasTag(d) {
60347                 return d.tags[key];
60348             })
60349             .map(function(d) {
60350                 return {
60351                     title: d.tags[key],
60352                     value: d.tags[key],
60353                     dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
60354                 };
60355             })
60356             .sort(function(a, b) {
60357                 return a.dist - b.dist;
60358             });
60359
60360         return uniqBy(results, 'value');
60361     }
60362
60363
60364     function initCallback(err, countryCode) {
60365         if (err) return;
60366
60367         var addressFormat = find$1(dataAddressFormats, function (a) {
60368             return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
60369         }) || dataAddressFormats[0];
60370
60371         var widths = addressFormat.widths || {
60372             housenumber: 1/3, street: 2/3,
60373             city: 2/3, state: 1/4, postcode: 1/3
60374         };
60375
60376         function row(r) {
60377             // Normalize widths.
60378             var total = reduce(r, function(sum, field) {
60379                 return sum + (widths[field] || 0.5);
60380             }, 0);
60381
60382             return r.map(function (field) {
60383                 return {
60384                     id: field,
60385                     width: (widths[field] || 0.5) / total
60386                 };
60387             });
60388         }
60389
60390         wrap.selectAll('div.addr-row')
60391             .data(addressFormat.format)
60392             .enter()
60393             .append('div')
60394             .attr('class', 'addr-row')
60395             .selectAll('input')
60396             .data(row)
60397             .enter()
60398             .append('input')
60399             .property('type', 'text')
60400             .attr('placeholder', function (d) {
60401                 var localkey = d.id + '!' + countryCode.toLowerCase(),
60402                     tkey = field.strings.placeholders[localkey] ? localkey : d.id;
60403                 return field.t('placeholders.' + tkey);
60404             })
60405             .attr('class', function (d) { return 'addr-' + d.id; })
60406             .call(utilNoAuto)
60407             .style('width', function (d) { return d.width * 100 + '%'; });
60408
60409         // Update
60410
60411         // setup dropdowns for common address tags
60412         var dropdowns = addressFormat.dropdowns || [
60413             'city', 'county', 'country', 'district', 'hamlet',
60414             'neighbourhood', 'place', 'postcode', 'province',
60415             'quarter', 'state', 'street', 'subdistrict', 'suburb'
60416         ];
60417
60418         // If fields exist for any of these tags, create dropdowns to pick nearby values..
60419         dropdowns.forEach(function(tag) {
60420             var nearValues = (tag === 'street') ? getNearStreets
60421                     : (tag === 'city') ? getNearCities
60422                     : getNearValues;
60423
60424             wrap.selectAll('input.addr-' + tag)
60425                 .call(d3combobox()
60426                     .container(context.container())
60427                     .minItems(1)
60428                     .fetcher(function(value, callback) {
60429                         callback(nearValues('addr:' + tag));
60430                     })
60431                 );
60432         });
60433
60434         wrap.selectAll('input')
60435             .on('blur', change())
60436             .on('change', change());
60437
60438         wrap.selectAll('input:not(.combobox-input)')
60439             .on('input', change(true));
60440
60441         dispatch$$1.call('init');
60442         isInitialized = true;
60443     }
60444
60445
60446     function address(selection$$1) {
60447         isInitialized = false;
60448
60449         wrap = selection$$1.selectAll('.preset-input-wrap')
60450             .data([0]);
60451
60452         wrap = wrap.enter()
60453             .append('div')
60454             .attr('class', 'preset-input-wrap')
60455             .merge(wrap);
60456
60457         if (nominatim && entity) {
60458             var center = entity.extent(context.graph()).center();
60459             nominatim.countryCode(center, initCallback);
60460         }
60461     }
60462
60463
60464     function change(onInput) {
60465         return function() {
60466             var tags = {};
60467
60468             wrap.selectAll('input')
60469                 .each(function (field) {
60470                     tags['addr:' + field.id] = this.value || undefined;
60471                 });
60472
60473             dispatch$$1.call('change', this, tags, onInput);
60474         };
60475     }
60476
60477
60478     function updateTags(tags) {
60479         utilGetSetValue(wrap.selectAll('input'), function (field) {
60480             return tags['addr:' + field.id] || '';
60481         });
60482     }
60483
60484
60485     address.entity = function(_) {
60486         if (!arguments.length) return entity;
60487         entity = _;
60488         return address;
60489     };
60490
60491
60492     address.tags = function(tags) {
60493         if (isInitialized) {
60494             updateTags(tags);
60495         } else {
60496             dispatch$$1.on('init', function () {
60497                 dispatch$$1.on('init', null);
60498                 updateTags(tags);
60499             });
60500         }
60501     };
60502
60503
60504     address.focus = function() {
60505         var node = wrap.selectAll('input').node();
60506         if (node) node.focus();
60507     };
60508
60509
60510     return utilRebind(address, dispatch$$1, 'on');
60511 }
60512
60513 function uiFieldCycleway(field, context) {
60514     var dispatch$$1 = dispatch('change'),
60515         items = d3_select(null);
60516
60517
60518     function cycleway(selection$$1) {
60519
60520         function stripcolon(s) {
60521             return s.replace(':', '');
60522         }
60523
60524
60525         var wrap = selection$$1.selectAll('.preset-input-wrap')
60526             .data([0]);
60527
60528         wrap = wrap.enter()
60529             .append('div')
60530             .attr('class', 'cf preset-input-wrap')
60531             .merge(wrap);
60532
60533
60534         var div = wrap.selectAll('ul')
60535             .data([0]);
60536
60537         div = div.enter()
60538             .append('ul')
60539             .merge(div);
60540
60541
60542         items = div.selectAll('li')
60543             .data(field.keys);
60544
60545         var enter = items.enter()
60546             .append('li')
60547             .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
60548
60549         enter
60550             .append('span')
60551             .attr('class', 'col6 label preset-label-cycleway')
60552             .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
60553             .text(function(d) { return field.t('types.' + d); });
60554
60555         enter
60556             .append('div')
60557             .attr('class', 'col6 preset-input-cycleway-wrap')
60558             .append('input')
60559             .attr('type', 'text')
60560             .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
60561             .call(utilNoAuto)
60562             .each(function(d) {
60563                 d3_select(this)
60564                     .call(d3combobox()
60565                         .container(context.container())
60566                         .data(cycleway.options(d))
60567                     );
60568             });
60569
60570
60571         // Update
60572         wrap.selectAll('.preset-input-cycleway')
60573             .on('change', change)
60574             .on('blur', change);
60575     }
60576
60577
60578     function change() {
60579         var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft')),
60580             right = utilGetSetValue(d3_select('.preset-input-cyclewayright')),
60581             tag = {};
60582
60583         if (left === 'none' || left === '') { left = undefined; }
60584         if (right === 'none' || right === '') { right = undefined; }
60585
60586         // Always set both left and right as changing one can affect the other
60587         tag = {
60588             cycleway: undefined,
60589             'cycleway:left': left,
60590             'cycleway:right': right
60591         };
60592
60593         // If the left and right tags match, use the cycleway tag to tag both
60594         // sides the same way
60595         if (left === right) {
60596             tag = {
60597                 cycleway: left,
60598                 'cycleway:left': undefined,
60599                 'cycleway:right': undefined
60600             };
60601         }
60602
60603         dispatch$$1.call('change', this, tag);
60604     }
60605
60606
60607     cycleway.options = function() {
60608         return keys$1(field.strings.options).map(function(option) {
60609             return {
60610                 title: field.t('options.' + option + '.description'),
60611                 value: option
60612             };
60613         });
60614     };
60615
60616
60617     cycleway.tags = function(tags) {
60618         utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
60619                 // If cycleway is set, always return that
60620                 if (tags.cycleway) {
60621                     return tags.cycleway;
60622                 }
60623                 return tags[d] || '';
60624             })
60625             .attr('placeholder', field.placeholder());
60626     };
60627
60628
60629     cycleway.focus = function() {
60630         items.selectAll('.preset-input-cycleway')
60631             .node().focus();
60632     };
60633
60634
60635     return utilRebind(cycleway, dispatch$$1, 'on');
60636 }
60637
60638 function uiFieldLanes(field, context) {
60639     var dispatch$$1 = dispatch('change'),
60640         LANE_WIDTH = 40,
60641         LANE_HEIGHT = 200,
60642         wayID,
60643         lanesData;
60644
60645     function lanes(selection$$1) {
60646         lanesData = context.entity(wayID).lanes();
60647
60648         if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
60649             selection$$1.call(lanes.off);
60650             return;
60651         }
60652
60653         var wrap = selection$$1.selectAll('.preset-input-wrap')
60654             .data([0]);
60655
60656         wrap = wrap.enter()
60657             .append('div')
60658             .attr('class', 'preset-input-wrap')
60659             .merge(wrap);
60660
60661         var surface =  wrap.selectAll('.surface')
60662             .data([0]);
60663
60664         var d = utilGetDimensions(wrap);
60665         var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
60666
60667         surface = surface.enter()
60668             .append('svg')
60669             .attr('width', d[0])
60670             .attr('height', 300)
60671             .attr('class', 'surface')
60672             .merge(surface);
60673
60674
60675         var lanesSelection = surface.selectAll('.lanes')
60676             .data([0]);
60677
60678         lanesSelection = lanesSelection.enter()
60679             .append('g')
60680             .attr('class', 'lanes')
60681             .merge(lanesSelection);
60682
60683         lanesSelection
60684             .attr('transform', function () {
60685                 return 'translate(' + (freeSpace / 2) + ', 0)';
60686             });
60687
60688
60689         var lane = lanesSelection.selectAll('.lane')
60690            .data(lanesData.lanes);
60691
60692         lane.exit()
60693             .remove();
60694
60695         var enter = lane.enter()
60696             .append('g')
60697             .attr('class', 'lane');
60698
60699         enter
60700             .append('g')
60701             .append('rect')
60702             .attr('y', 50)
60703             .attr('width', LANE_WIDTH)
60704             .attr('height', LANE_HEIGHT);
60705
60706         enter
60707             .append('g')
60708             .attr('class', 'forward')
60709             .append('text')
60710             .attr('y', 40)
60711             .attr('x', 14)
60712             .text('▲');
60713
60714         enter
60715             .append('g')
60716             .attr('class', 'bothways')
60717             .append('text')
60718             .attr('y', 40)
60719             .attr('x', 14)
60720             .text('▲▼');
60721
60722         enter
60723             .append('g')
60724             .attr('class', 'backward')
60725             .append('text')
60726             .attr('y', 40)
60727             .attr('x', 14)
60728             .text('▼');
60729
60730
60731         lane = lane
60732             .merge(enter);
60733
60734         lane
60735             .attr('transform', function(d) {
60736                 return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
60737             });
60738
60739         lane.select('.forward')
60740             .style('visibility', function(d) {
60741                 return d.direction === 'forward' ? 'visible' : 'hidden';
60742             });
60743
60744         lane.select('.bothways')
60745             .style('visibility', function(d) {
60746                 return d.direction === 'bothways' ? 'visible' : 'hidden';
60747             });
60748
60749         lane.select('.backward')
60750             .style('visibility', function(d) {
60751                 return d.direction === 'backward' ? 'visible' : 'hidden';
60752             });
60753     }
60754
60755
60756     lanes.entity = function(_) {
60757         if (!wayID || wayID !== _.id) {
60758             wayID = _.id;
60759         }
60760     };
60761
60762     lanes.tags = function() {};
60763     lanes.focus = function() {};
60764     lanes.off = function() {};
60765
60766     return utilRebind(lanes, dispatch$$1, 'on');
60767 }
60768
60769 function uiFieldLocalized(field, context) {
60770     var dispatch$$1 = dispatch('change', 'input'),
60771         wikipedia = services.wikipedia,
60772         input = d3_select(null),
60773         localizedInputs = d3_select(null),
60774         wikiTitles,
60775         entity;
60776
60777
60778     function localized(selection$$1) {
60779         input = selection$$1.selectAll('.localized-main')
60780             .data([0]);
60781
60782         input = input.enter()
60783             .append('input')
60784             .attr('type', 'text')
60785             .attr('id', 'preset-input-' + field.id)
60786             .attr('class', 'localized-main')
60787             .attr('placeholder', field.placeholder())
60788             .call(utilNoAuto)
60789             .merge(input);
60790
60791         if (field.id === 'name') {
60792             var preset = context.presets().match(entity, context.graph());
60793             input
60794                 .call(d3combobox()
60795                     .container(context.container())
60796                     .fetcher(utilSuggestNames(preset, dataSuggestions))
60797                 );
60798         }
60799
60800         input
60801             .on('input', change(true))
60802             .on('blur', change())
60803             .on('change', change());
60804
60805
60806         var translateButton = selection$$1.selectAll('.localized-add')
60807             .data([0]);
60808
60809         translateButton = translateButton.enter()
60810             .append('button')
60811             .attr('class', 'button-input-action localized-add minor')
60812             .attr('tabindex', -1)
60813             .call(svgIcon('#icon-plus'))
60814             .call(tooltip()
60815                 .title(t('translate.translate'))
60816                 .placement('left'))
60817             .merge(translateButton);
60818
60819         translateButton
60820             .on('click', addNew);
60821
60822
60823         localizedInputs = selection$$1.selectAll('.localized-wrap')
60824             .data([0]);
60825
60826         localizedInputs = localizedInputs.enter().append('div')
60827             .attr('class', 'localized-wrap')
60828             .merge(localizedInputs);
60829     }
60830
60831
60832     function addNew() {
60833         event.preventDefault();
60834         var data$$1 = localizedInputs.selectAll('div.entry').data();
60835         var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
60836         var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
60837         var isLangEn = defaultLang.indexOf('en') > -1;
60838         if (isLangEn || langExists) {
60839             defaultLang = '';
60840         }
60841         data$$1.push({ lang: defaultLang, value: '' });
60842         localizedInputs.call(render, data$$1);
60843     }
60844
60845
60846     function change(onInput) {
60847         return function() {
60848             var t$$1 = {};
60849             t$$1[field.key] = utilGetSetValue(d3_select(this)) || undefined;
60850             dispatch$$1.call('change', this, t$$1, onInput);
60851         };
60852     }
60853
60854
60855     function key(lang) {
60856         return field.key + ':' + lang;
60857     }
60858
60859
60860     function changeLang(d) {
60861         var lang = utilGetSetValue(d3_select(this)),
60862             t$$1 = {},
60863             language = find$1(dataWikipedia, function(d) {
60864                 return d[0].toLowerCase() === lang.toLowerCase() ||
60865                     d[1].toLowerCase() === lang.toLowerCase();
60866             });
60867
60868         if (language) lang = language[2];
60869
60870         if (d.lang && d.lang !== lang) {
60871             t$$1[key(d.lang)] = undefined;
60872         }
60873
60874         var value = utilGetSetValue(d3_select(this.parentNode)
60875             .selectAll('.localized-value'));
60876
60877         if (lang && value) {
60878             t$$1[key(lang)] = value;
60879         } else if (lang && wikiTitles && wikiTitles[d.lang]) {
60880             t$$1[key(lang)] = wikiTitles[d.lang];
60881         }
60882
60883         d.lang = lang;
60884         dispatch$$1.call('change', this, t$$1);
60885     }
60886
60887
60888     function changeValue(d) {
60889         if (!d.lang) return;
60890         var t$$1 = {};
60891         t$$1[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
60892         dispatch$$1.call('change', this, t$$1);
60893     }
60894
60895
60896     function fetcher(value, cb) {
60897         var v = value.toLowerCase();
60898
60899         cb(dataWikipedia.filter(function(d) {
60900             return d[0].toLowerCase().indexOf(v) >= 0 ||
60901             d[1].toLowerCase().indexOf(v) >= 0 ||
60902             d[2].toLowerCase().indexOf(v) >= 0;
60903         }).map(function(d) {
60904             return { value: d[1] };
60905         }));
60906     }
60907
60908
60909     function render(selection$$1, data$$1) {
60910         var wraps = selection$$1.selectAll('div.entry').
60911             data(data$$1, function(d) { return d.lang; });
60912
60913         wraps.exit()
60914             .transition()
60915             .duration(200)
60916             .style('max-height','0px')
60917             .style('opacity', '0')
60918             .style('top','-10px')
60919             .remove();
60920
60921         var innerWrap = wraps.enter()
60922             .insert('div', ':first-child');
60923
60924         innerWrap.attr('class', 'entry')
60925             .each(function() {
60926                 var wrap = d3_select(this);
60927                 var langcombo = d3combobox()
60928                     .container(context.container())
60929                     .fetcher(fetcher)
60930                     .minItems(0);
60931
60932                 var label = wrap
60933                     .append('label')
60934                     .attr('class','form-label')
60935                     .text(t('translate.localized_translation_label'))
60936                     .attr('for','localized-lang');
60937
60938                 label
60939                     .append('button')
60940                     .attr('class', 'minor remove')
60941                     .on('click', function(d){
60942                         event.preventDefault();
60943                         var t$$1 = {};
60944                         t$$1[key(d.lang)] = undefined;
60945                         dispatch$$1.call('change', this, t$$1);
60946                         d3_select(this.parentNode.parentNode)
60947                             .style('top','0')
60948                             .style('max-height','240px')
60949                             .transition()
60950                             .style('opacity', '0')
60951                             .style('max-height','0px')
60952                             .remove();
60953                     })
60954                     .call(svgIcon('#operation-delete'));
60955
60956                 wrap
60957                     .append('input')
60958                     .attr('class', 'localized-lang')
60959                     .attr('type', 'text')
60960                     .attr('placeholder',t('translate.localized_translation_language'))
60961                     .on('blur', changeLang)
60962                     .on('change', changeLang)
60963                     .call(langcombo);
60964
60965                 wrap
60966                     .append('input')
60967                     .on('blur', changeValue)
60968                     .on('change', changeValue)
60969                     .attr('type', 'text')
60970                     .attr('placeholder', t('translate.localized_translation_name'))
60971                     .attr('class', 'localized-value');
60972             });
60973
60974         innerWrap
60975             .style('margin-top', '0px')
60976             .style('max-height', '0px')
60977             .style('opacity', '0')
60978             .transition()
60979             .duration(200)
60980             .style('margin-top', '10px')
60981             .style('max-height', '240px')
60982             .style('opacity', '1')
60983             .on('end', function() {
60984                 d3_select(this)
60985                     .style('max-height', '')
60986                     .style('overflow', 'visible');
60987             });
60988
60989
60990         var entry = selection$$1.selectAll('.entry');
60991
60992         utilGetSetValue(entry.select('.localized-lang'), function(d) {
60993                 var lang = find$1(dataWikipedia, function(lang) { return lang[2] === d.lang; });
60994                 return lang ? lang[1] : d.lang;
60995             });
60996
60997         utilGetSetValue(entry.select('.localized-value'),
60998             function(d) { return d.value; });
60999     }
61000
61001
61002     localized.tags = function(tags) {
61003         // Fetch translations from wikipedia
61004         if (tags.wikipedia && !wikiTitles) {
61005             wikiTitles = {};
61006             var wm = tags.wikipedia.match(/([^:]+):(.+)/);
61007             if (wm && wm[0] && wm[1]) {
61008                 wikipedia.translations(wm[1], wm[2], function(d) {
61009                     wikiTitles = d;
61010                 });
61011             }
61012         }
61013
61014         utilGetSetValue(input, tags[field.key] || '');
61015
61016         var postfixed = [], k, m;
61017         for (k in tags) {
61018             m = k.match(/^(.*):([a-zA-Z_-]+)$/);
61019             if (m && m[1] === field.key && m[2]) {
61020                 postfixed.push({ lang: m[2], value: tags[k] });
61021             }
61022         }
61023
61024         localizedInputs.call(render, postfixed.reverse());
61025     };
61026
61027
61028     localized.focus = function() {
61029         input.node().focus();
61030     };
61031
61032
61033     localized.entity = function(_) {
61034         if (!arguments.length) return entity;
61035         entity = _;
61036         return localized;
61037     };
61038
61039     return utilRebind(localized, dispatch$$1, 'on');
61040 }
61041
61042 function uiFieldMaxspeed(field, context) {
61043     var dispatch$$1 = dispatch('change'),
61044         entity,
61045         isImperial,
61046         unitInput = d3_select(null),
61047         input = d3_select(null),
61048         combobox;
61049
61050     var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
61051         imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
61052
61053
61054     function maxspeed(selection$$1) {
61055         combobox = d3combobox()
61056             .container(context.container());
61057
61058         var unitCombobox = d3combobox()
61059             .container(context.container())
61060             .data(['km/h', 'mph'].map(comboValues));
61061
61062         input = selection$$1.selectAll('#preset-input-' + field.id)
61063             .data([0]);
61064
61065         input = input.enter()
61066             .append('input')
61067             .attr('type', 'text')
61068             .attr('id', 'preset-input-' + field.id)
61069             .attr('placeholder', field.placeholder())
61070             .call(utilNoAuto)
61071             .call(combobox)
61072             .merge(input);
61073
61074         input
61075             .on('change', change)
61076             .on('blur', change);
61077
61078         var childNodes = context.graph().childNodes(context.entity(entity.id)),
61079             loc = childNodes[~~(childNodes.length/2)].loc;
61080
61081         isImperial = some(dataImperial.features, function(f) {
61082             return some(f.geometry.coordinates, function(d) {
61083                 return geoPointInPolygon(loc, d);
61084             });
61085         });
61086
61087         unitInput = selection$$1.selectAll('input.maxspeed-unit')
61088             .data([0]);
61089
61090         unitInput = unitInput.enter()
61091             .append('input')
61092             .attr('type', 'text')
61093             .attr('class', 'maxspeed-unit')
61094             .call(unitCombobox)
61095             .merge(unitInput);
61096
61097         unitInput
61098             .on('blur', changeUnits)
61099             .on('change', changeUnits);
61100
61101
61102         function changeUnits() {
61103             isImperial = utilGetSetValue(unitInput) === 'mph';
61104             utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
61105             setSuggestions();
61106             change();
61107         }
61108     }
61109
61110
61111     function setSuggestions() {
61112         combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
61113         utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
61114     }
61115
61116
61117     function comboValues(d) {
61118         return {
61119             value: d.toString(),
61120             title: d.toString()
61121         };
61122     }
61123
61124
61125     function change() {
61126         var tag = {},
61127             value = utilGetSetValue(input);
61128
61129         if (!value) {
61130             tag[field.key] = undefined;
61131         } else if (isNaN(value) || !isImperial) {
61132             tag[field.key] = value;
61133         } else {
61134             tag[field.key] = value + ' mph';
61135         }
61136
61137         dispatch$$1.call('change', this, tag);
61138     }
61139
61140
61141     maxspeed.tags = function(tags) {
61142         var value = tags[field.key];
61143
61144         if (value && value.indexOf('mph') >= 0) {
61145             value = parseInt(value, 10);
61146             isImperial = true;
61147         } else if (value) {
61148             isImperial = false;
61149         }
61150
61151         setSuggestions();
61152         utilGetSetValue(input, value || '');
61153     };
61154
61155
61156     maxspeed.focus = function() {
61157         input.node().focus();
61158     };
61159
61160
61161     maxspeed.entity = function(_) {
61162         entity = _;
61163     };
61164
61165
61166     return utilRebind(maxspeed, dispatch$$1, 'on');
61167 }
61168
61169 /**
61170  * This function is like `baseIndexOf` except that it accepts a comparator.
61171  *
61172  * @private
61173  * @param {Array} array The array to inspect.
61174  * @param {*} value The value to search for.
61175  * @param {number} fromIndex The index to search from.
61176  * @param {Function} comparator The comparator invoked per element.
61177  * @returns {number} Returns the index of the matched value, else `-1`.
61178  */
61179 function baseIndexOfWith(array, value, fromIndex, comparator) {
61180   var index = fromIndex - 1,
61181       length = array.length;
61182
61183   while (++index < length) {
61184     if (comparator(array[index], value)) {
61185       return index;
61186     }
61187   }
61188   return -1;
61189 }
61190
61191 /** Used for built-in method references. */
61192 var arrayProto$2 = Array.prototype;
61193
61194 /** Built-in value references. */
61195 var splice$2 = arrayProto$2.splice;
61196
61197 /**
61198  * The base implementation of `_.pullAllBy` without support for iteratee
61199  * shorthands.
61200  *
61201  * @private
61202  * @param {Array} array The array to modify.
61203  * @param {Array} values The values to remove.
61204  * @param {Function} [iteratee] The iteratee invoked per element.
61205  * @param {Function} [comparator] The comparator invoked per element.
61206  * @returns {Array} Returns `array`.
61207  */
61208 function basePullAll(array, values, iteratee, comparator) {
61209   var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
61210       index = -1,
61211       length = values.length,
61212       seen = array;
61213
61214   if (array === values) {
61215     values = copyArray(values);
61216   }
61217   if (iteratee) {
61218     seen = arrayMap(array, baseUnary(iteratee));
61219   }
61220   while (++index < length) {
61221     var fromIndex = 0,
61222         value = values[index],
61223         computed = iteratee ? iteratee(value) : value;
61224
61225     while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
61226       if (seen !== array) {
61227         splice$2.call(seen, fromIndex, 1);
61228       }
61229       splice$2.call(array, fromIndex, 1);
61230     }
61231   }
61232   return array;
61233 }
61234
61235 /**
61236  * This method is like `_.pull` except that it accepts an array of values to remove.
61237  *
61238  * **Note:** Unlike `_.difference`, this method mutates `array`.
61239  *
61240  * @static
61241  * @memberOf _
61242  * @since 4.0.0
61243  * @category Array
61244  * @param {Array} array The array to modify.
61245  * @param {Array} values The values to remove.
61246  * @returns {Array} Returns `array`.
61247  * @example
61248  *
61249  * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
61250  *
61251  * _.pullAll(array, ['a', 'c']);
61252  * console.log(array);
61253  * // => ['b', 'b']
61254  */
61255 function pullAll(array, values) {
61256   return (array && array.length && values && values.length)
61257     ? basePullAll(array, values)
61258     : array;
61259 }
61260
61261 /**
61262  * Removes all given values from `array` using
61263  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
61264  * for equality comparisons.
61265  *
61266  * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
61267  * to remove elements from an array by predicate.
61268  *
61269  * @static
61270  * @memberOf _
61271  * @since 2.0.0
61272  * @category Array
61273  * @param {Array} array The array to modify.
61274  * @param {...*} [values] The values to remove.
61275  * @returns {Array} Returns `array`.
61276  * @example
61277  *
61278  * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
61279  *
61280  * _.pull(array, 'a', 'c');
61281  * console.log(array);
61282  * // => ['b', 'b']
61283  */
61284 var pull = baseRest(pullAll);
61285
61286 function uiFieldRadio(field, context) {
61287     var dispatch$$1 = dispatch('change'),
61288         placeholder = d3_select(null),
61289         wrap = d3_select(null),
61290         labels = d3_select(null),
61291         radios = d3_select(null),
61292         radioData = clone(field.options || field.keys),
61293         typeField,
61294         layerField,
61295         oldType = {},
61296         entity;
61297
61298
61299     function selectedKey() {
61300         var node = wrap.selectAll('.toggle-list label.active input');
61301         return !node.empty() && node.datum();
61302     }
61303
61304
61305     function radio(selection$$1) {
61306         selection$$1.classed('preset-radio', true);
61307
61308         wrap = selection$$1.selectAll('.preset-input-wrap')
61309             .data([0]);
61310
61311         var enter = wrap.enter()
61312             .append('div')
61313             .attr('class', 'preset-input-wrap toggle-list');
61314
61315         enter
61316             .append('span')
61317             .attr('class', 'placeholder');
61318
61319         wrap = wrap
61320             .merge(enter);
61321
61322
61323         placeholder = wrap.selectAll('.placeholder');
61324
61325         labels = wrap.selectAll('label')
61326             .data(radioData);
61327
61328         enter = labels.enter()
61329             .append('label');
61330
61331         enter
61332             .append('input')
61333             .attr('type', 'radio')
61334             .attr('name', field.id)
61335             .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
61336             .attr('checked', false);
61337
61338         enter
61339             .append('span')
61340             .text(function(d) { return field.t('options.' + d, { 'default': d }); });
61341
61342         labels = labels
61343             .merge(enter);
61344
61345         radios = labels.selectAll('input')
61346             .on('change', changeRadio);
61347
61348     }
61349
61350
61351     function structureExtras(selection$$1, tags) {
61352         var selected = selectedKey(),
61353             type = context.presets().field(selected),
61354             layer = context.presets().field('layer'),
61355             showLayer = (selected === 'bridge' || selected === 'tunnel');
61356
61357
61358         var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
61359             .data(selected ? [0] : []);
61360
61361         extrasWrap.exit()
61362             .remove();
61363
61364         extrasWrap = extrasWrap.enter()
61365             .append('div')
61366             .attr('class', 'structure-extras-wrap')
61367             .merge(extrasWrap);
61368
61369         var list = extrasWrap.selectAll('ul')
61370             .data([0]);
61371
61372         list = list.enter()
61373             .append('ul')
61374             .merge(list);
61375
61376
61377         // Type
61378         if (type) {
61379             if (!typeField || typeField.id !== selected) {
61380                 typeField = uiField(context, type, entity, { wrap: false })
61381                     .on('change', changeType);
61382             }
61383             typeField.tags(tags);
61384         } else {
61385             typeField = null;
61386         }
61387
61388         var typeItem = list.selectAll('.structure-type-item')
61389             .data(typeField ? [typeField] : [], function(d) { return d.id; });
61390
61391         // Exit
61392         typeItem.exit()
61393             .remove();
61394
61395         // Enter
61396         var typeEnter = typeItem.enter()
61397             .insert('li', ':first-child')
61398             .attr('class', 'cf structure-type-item');
61399
61400         typeEnter
61401             .append('span')
61402             .attr('class', 'col6 label structure-label-type')
61403             .attr('for', 'preset-input-' + selected)
61404             .text(t('inspector.radio.structure.type'));
61405
61406         typeEnter
61407             .append('div')
61408             .attr('class', 'col6 structure-input-type-wrap');
61409
61410         // Update
61411         typeItem = typeItem
61412             .merge(typeEnter);
61413
61414         if (typeField) {
61415             typeItem.selectAll('.structure-input-type-wrap')
61416                 .call(typeField.render);
61417         }
61418
61419
61420         // Layer
61421         if (layer && showLayer) {
61422             if (!layerField) {
61423                 layerField = uiField(context, layer, entity, { wrap: false })
61424                     .on('change', changeLayer);
61425             }
61426             layerField.tags(tags);
61427             field.keys = union(field.keys, ['layer']);
61428         } else {
61429             layerField = null;
61430             pull(field.keys, 'layer');
61431         }
61432
61433         var layerItem = list.selectAll('.structure-layer-item')
61434             .data(layerField ? [layerField] : []);
61435
61436         // Exit
61437         layerItem.exit()
61438             .remove();
61439
61440         // Enter
61441         var layerEnter = layerItem.enter()
61442             .append('li')
61443             .attr('class', 'cf structure-layer-item');
61444
61445         layerEnter
61446             .append('span')
61447             .attr('class', 'col6 label structure-label-layer')
61448             .attr('for', 'preset-input-layer')
61449             .text(t('inspector.radio.structure.layer'));
61450
61451         layerEnter
61452             .append('div')
61453             .attr('class', 'col6 structure-input-layer-wrap');
61454
61455         // Update
61456         layerItem = layerItem
61457             .merge(layerEnter);
61458
61459         if (layerField) {
61460             layerItem.selectAll('.structure-input-layer-wrap')
61461                 .call(layerField.render);
61462         }
61463     }
61464
61465
61466     function changeType(t$$1, onInput) {
61467         var key = selectedKey();
61468         if (!key) return;
61469
61470         var val = t$$1[key];
61471         if (val !== 'no') {
61472             oldType[key] = val;
61473         }
61474
61475         if (field.type === 'structureRadio') {
61476             // remove layer if it should not be set
61477             if (val === 'no' ||
61478                 (key !== 'bridge' && key !== 'tunnel') ||
61479                 (key === 'tunnel' && val === 'building_passage')) {
61480                 t$$1.layer = undefined;
61481             }
61482             // add layer if it should be set
61483             if (t$$1.layer === undefined) {
61484                 if (key === 'bridge' && val !== 'no') {
61485                     t$$1.layer = '1';
61486                 }
61487                 if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
61488                     t$$1.layer = '-1';
61489                 }
61490             }
61491          }
61492
61493         dispatch$$1.call('change', this, t$$1, onInput);
61494     }
61495
61496
61497     function changeLayer(t$$1, onInput) {
61498         if (t$$1.layer === '0') {
61499             t$$1.layer = undefined;
61500         }
61501         dispatch$$1.call('change', this, t$$1, onInput);
61502     }
61503
61504
61505     function changeRadio() {
61506         var t$$1 = {},
61507             activeKey;
61508
61509         if (field.key) {
61510             t$$1[field.key] = undefined;
61511         }
61512
61513         radios.each(function(d) {
61514             var active = d3_select(this).property('checked');
61515             if (active) activeKey = d;
61516
61517             if (field.key) {
61518                 if (active) t$$1[field.key] = d;
61519             } else {
61520                 var val = oldType[activeKey] || 'yes';
61521                 t$$1[d] = active ? val : undefined;
61522             }
61523         });
61524
61525         if (field.type === 'structureRadio') {
61526             if (activeKey === 'bridge') {
61527                 t$$1.layer = '1';
61528             } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
61529                 t$$1.layer = '-1';
61530             } else {
61531                 t$$1.layer = undefined;
61532             }
61533         }
61534
61535         dispatch$$1.call('change', this, t$$1);
61536     }
61537
61538
61539     radio.tags = function(tags) {
61540         function checked(d) {
61541             if (field.key) {
61542                 return tags[field.key] === d;
61543             } else {
61544                 return !!(tags[d] && tags[d].toLowerCase() !== 'no');
61545             }
61546         }
61547
61548         labels.classed('active', checked);
61549         radios.property('checked', checked);
61550
61551         var selection$$1 = radios.filter(function() { return this.checked; });
61552
61553         if (selection$$1.empty()) {
61554             placeholder.text(t('inspector.none'));
61555         } else {
61556             placeholder.text(selection$$1.attr('value'));
61557             oldType[selection$$1.datum()] = tags[selection$$1.datum()];
61558         }
61559
61560         if (field.type === 'structureRadio') {
61561             // For waterways without a tunnel tag, set 'culvert' as
61562             // the oldType to default to if the user picks 'tunnel'
61563             if (!!tags.waterway && !oldType.tunnel) {
61564                 oldType.tunnel = 'culvert';
61565             }
61566
61567             wrap.call(structureExtras, tags);
61568         }
61569     };
61570
61571
61572     radio.focus = function() {
61573         radios.node().focus();
61574     };
61575
61576
61577     radio.entity = function(_) {
61578         if (!arguments.length) return entity;
61579         entity = _;
61580         oldType = {};
61581         return radio;
61582     };
61583
61584
61585     return utilRebind(radio, dispatch$$1, 'on');
61586 }
61587
61588 function uiFieldRestrictions(field, context) {
61589     var dispatch$$1 = dispatch('change'),
61590         breathe = behaviorBreathe(context),
61591         hover = behaviorHover(context),
61592         initialized = false,
61593         vertexID,
61594         fromNodeID;
61595
61596
61597     function restrictions(selection$$1) {
61598         // if form field is hidden or has detached from dom, clean up.
61599         if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
61600             selection$$1.call(restrictions.off);
61601             return;
61602         }
61603
61604         var wrap = selection$$1.selectAll('.preset-input-wrap')
61605             .data([0]);
61606
61607         var enter = wrap.enter()
61608             .append('div')
61609             .attr('class', 'preset-input-wrap');
61610
61611         enter
61612             .append('div')
61613             .attr('class', 'restriction-help');
61614
61615
61616         var intersection = osmIntersection(context.graph(), vertexID),
61617             graph = intersection.graph,
61618             vertex = graph.entity(vertexID),
61619             filter = utilFunctor(true),
61620             extent = geoExtent$$1(),
61621             projection = geoRawMercator();
61622
61623         var d = utilGetDimensions(wrap.merge(enter)),
61624             c = [d[0] / 2, d[1] / 2],
61625             z = 24;
61626
61627         projection
61628             .scale(256 * Math.pow(2, z) / (2 * Math.PI));
61629
61630         var s = projection(vertex.loc);
61631
61632         projection
61633             .translate([c[0] - s[0], c[1] - s[1]])
61634             .clipExtent([[0, 0], d]);
61635
61636         var drawLayers = svgLayers(projection, context).only('osm').dimensions(d),
61637             drawVertices = svgVertices$$1(projection, context),
61638             drawLines = svgLines$$1(projection, context),
61639             drawTurns = svgTurns(projection, context);
61640
61641         enter
61642             .call(drawLayers);
61643
61644         wrap = wrap
61645             .merge(enter);
61646
61647         var surface = wrap.selectAll('.surface');
61648
61649         if (!enter.empty()) {
61650             initialized = true;
61651             surface
61652                 .call(breathe)
61653                 .call(hover);
61654         }
61655
61656         surface
61657             .call(utilSetDimensions, d)
61658             .call(drawVertices, graph, [vertex], filter, extent, z)
61659             .call(drawLines, graph, intersection.ways, filter)
61660             .call(drawTurns, graph, intersection.turns(fromNodeID));
61661
61662         surface
61663             .on('click.restrictions', click)
61664             .on('mouseover.restrictions', mouseover)
61665             .on('mouseout.restrictions', mouseout);
61666
61667         surface
61668             .selectAll('.selected')
61669             .classed('selected', false);
61670
61671         if (fromNodeID) {
61672             surface
61673                 .selectAll('.' + intersection.highways[fromNodeID].id)
61674                 .classed('selected', true);
61675         }
61676
61677         mouseout();
61678
61679         context.history()
61680             .on('change.restrictions', render);
61681
61682         d3_select(window)
61683             .on('resize.restrictions', function() {
61684                 utilSetDimensions(wrap, null);
61685                 render();
61686             });
61687
61688
61689         function click() {
61690             surface
61691                 .call(breathe.off)
61692                 .call(breathe);
61693
61694             var datum = event.target.__data__;
61695             if (datum instanceof osmEntity$$1) {
61696                 fromNodeID = intersection.adjacentNodeId(datum.id);
61697                 render();
61698             } else if (datum instanceof osmTurn) {
61699                 if (datum.restriction) {
61700                     context.perform(
61701                         actionUnrestrictTurn(datum, projection),
61702                         t('operations.restriction.annotation.delete')
61703                     );
61704                 } else {
61705                     context.perform(
61706                         actionRestrictTurn(datum, projection),
61707                         t('operations.restriction.annotation.create')
61708                     );
61709                 }
61710             }
61711         }
61712
61713
61714         function mouseover() {
61715             var datum = event.target.__data__;
61716             if (datum instanceof osmTurn) {
61717                 var graph = context.graph(),
61718                     presets = context.presets(),
61719                     preset;
61720
61721                 if (datum.restriction) {
61722                     preset = presets.match(graph.entity(datum.restriction), graph);
61723                 } else {
61724                     preset = presets.item('type/restriction/' +
61725                         osmInferRestriction(
61726                             graph,
61727                             datum.from,
61728                             datum.via,
61729                             datum.to,
61730                             projection
61731                         )
61732                     );
61733                 }
61734
61735                 wrap.selectAll('.restriction-help')
61736                     .text(t('operations.restriction.help.' +
61737                         (datum.restriction ? 'toggle_off' : 'toggle_on'),
61738                         { restriction: preset.name() })
61739                     );
61740             }
61741         }
61742
61743
61744         function mouseout() {
61745             wrap.selectAll('.restriction-help')
61746                 .text(t('operations.restriction.help.' +
61747                     (fromNodeID ? 'toggle' : 'select'))
61748                 );
61749         }
61750
61751
61752         function render() {
61753             if (context.hasEntity(vertexID)) {
61754                 restrictions(selection$$1);
61755             }
61756         }
61757     }
61758
61759
61760     restrictions.entity = function(_) {
61761         if (!vertexID || vertexID !== _.id) {
61762             fromNodeID = null;
61763             vertexID = _.id;
61764         }
61765     };
61766
61767
61768     restrictions.tags = function() {};
61769     restrictions.focus = function() {};
61770
61771
61772     restrictions.off = function(selection$$1) {
61773         if (!initialized) return;
61774
61775         selection$$1.selectAll('.surface')
61776             .call(hover.off)
61777             .call(breathe.off)
61778             .on('click.restrictions', null)
61779             .on('mouseover.restrictions', null)
61780             .on('mouseout.restrictions', null);
61781
61782         context.history()
61783             .on('change.restrictions', null);
61784
61785         d3_select(window)
61786             .on('resize.restrictions', null);
61787     };
61788
61789
61790     return utilRebind(restrictions, dispatch$$1, 'on');
61791 }
61792
61793 function uiFieldTextarea(field) {
61794     var dispatch$$1 = dispatch('change'),
61795         input = d3_select(null);
61796
61797
61798     function textarea(selection$$1) {
61799         input = selection$$1.selectAll('textarea')
61800             .data([0]);
61801
61802         input = input.enter()
61803             .append('textarea')
61804             .attr('id', 'preset-input-' + field.id)
61805             .attr('placeholder', field.placeholder() || t('inspector.unknown'))
61806             .attr('maxlength', 255)
61807             .call(utilNoAuto)
61808             .on('input', change(true))
61809             .on('blur', change())
61810             .on('change', change())
61811             .merge(input);
61812     }
61813
61814
61815     function change(onInput) {
61816         return function() {
61817             var t$$1 = {};
61818             t$$1[field.key] = utilGetSetValue(input) || undefined;
61819             dispatch$$1.call('change', this, t$$1, onInput);
61820         };
61821     }
61822
61823
61824     textarea.tags = function(tags) {
61825         utilGetSetValue(input, tags[field.key] || '');
61826     };
61827
61828
61829     textarea.focus = function() {
61830         input.node().focus();
61831     };
61832
61833
61834     return utilRebind(textarea, dispatch$$1, 'on');
61835 }
61836
61837 function uiFieldWikipedia(field, context) {
61838     var dispatch$$1 = dispatch('change'),
61839         wikipedia = services.wikipedia,
61840         wikidata = services.wikidata,
61841         link = d3_select(null),
61842         lang = d3_select(null),
61843         title = d3_select(null),
61844         wikiURL = '',
61845         entity;
61846
61847
61848     function wiki(selection$$1) {
61849         var langcombo = d3combobox()
61850             .container(context.container())
61851             .fetcher(function(value, cb) {
61852                 var v = value.toLowerCase();
61853
61854                 cb(dataWikipedia.filter(function(d) {
61855                     return d[0].toLowerCase().indexOf(v) >= 0 ||
61856                         d[1].toLowerCase().indexOf(v) >= 0 ||
61857                         d[2].toLowerCase().indexOf(v) >= 0;
61858                 }).map(function(d) {
61859                     return { value: d[1] };
61860                 }));
61861             });
61862
61863         var titlecombo = d3combobox()
61864             .container(context.container())
61865             .fetcher(function(value, cb) {
61866                 if (!value) {
61867                     value = context.entity(entity.id).tags.name || '';
61868                 }
61869
61870                 var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
61871                 searchfn(language()[2], value, function(query, data$$1) {
61872                     cb(data$$1.map(function(d) {
61873                         return { value: d };
61874                     }));
61875                 });
61876             });
61877
61878
61879         lang = selection$$1.selectAll('input.wiki-lang')
61880             .data([0]);
61881
61882         lang = lang.enter()
61883             .append('input')
61884             .attr('type', 'text')
61885             .attr('class', 'wiki-lang')
61886             .attr('placeholder', t('translate.localized_translation_language'))
61887             .call(utilNoAuto)
61888             .merge(lang);
61889
61890         utilGetSetValue(lang, language()[1]);
61891
61892         lang
61893             .call(langcombo)
61894             .on('blur', changeLang)
61895             .on('change', changeLang);
61896
61897
61898         title = selection$$1.selectAll('input.wiki-title')
61899             .data([0]);
61900
61901         title = title.enter()
61902             .append('input')
61903             .attr('type', 'text')
61904             .attr('class', 'wiki-title')
61905             .attr('id', 'preset-input-' + field.id)
61906             .call(utilNoAuto)
61907             .merge(title);
61908
61909         title
61910             .call(titlecombo)
61911             .on('blur', blur)
61912             .on('change', change);
61913
61914
61915         link = selection$$1.selectAll('.wiki-link')
61916             .data([0]);
61917
61918         link = link.enter()
61919             .append('button')
61920             .attr('class', 'button-input-action wiki-link minor')
61921             .attr('tabindex', -1)
61922             .call(svgIcon('#icon-out-link'))
61923             .merge(link);
61924
61925         link
61926             .on('click', function() {
61927                 event.preventDefault();
61928                 if (wikiURL) window.open(wikiURL, '_blank');
61929             });
61930     }
61931
61932
61933     function language() {
61934         var value = utilGetSetValue(lang).toLowerCase();
61935         var locale = utilDetect().locale.toLowerCase();
61936         var localeLanguage;
61937         return find$1(dataWikipedia, function(d) {
61938             if (d[2] === locale) localeLanguage = d;
61939             return d[0].toLowerCase() === value ||
61940                 d[1].toLowerCase() === value ||
61941                 d[2] === value;
61942         }) || localeLanguage || ['English', 'English', 'en'];
61943     }
61944
61945
61946     function changeLang() {
61947         utilGetSetValue(lang, language()[1]);
61948         change(true);
61949     }
61950
61951
61952     function blur() {
61953         change(true);
61954     }
61955
61956
61957     function change(skipWikidata) {
61958         var value = utilGetSetValue(title),
61959             m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
61960             l = m && find$1(dataWikipedia, function(d) { return m[1] === d[2]; }),
61961             syncTags = {};
61962
61963         if (l) {
61964             // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
61965             value = decodeURIComponent(m[2]).replace(/_/g, ' ');
61966             if (m[3]) {
61967                 var anchor;
61968                 try {
61969                     // Best-effort `anchordecode:` implementation
61970                     anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
61971                 } catch (e) {
61972                     anchor = decodeURIComponent(m[3]);
61973                 }
61974                 value += '#' + anchor.replace(/_/g, ' ');
61975             }
61976             value = value.slice(0, 1).toUpperCase() + value.slice(1);
61977             utilGetSetValue(lang, l[1]);
61978             utilGetSetValue(title, value);
61979         }
61980
61981         if (value) {
61982             syncTags.wikipedia = language()[2] + ':' + value;
61983         } else {
61984             syncTags.wikipedia = undefined;
61985             syncTags.wikidata = undefined;
61986         }
61987
61988         dispatch$$1.call('change', this, syncTags);
61989
61990
61991         if (skipWikidata || !value || !language()[2]) return;
61992
61993         // attempt asynchronous update of wikidata tag..
61994         var initGraph = context.graph(),
61995             initEntityId = entity.id;
61996
61997         wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
61998             // If graph has changed, we can't apply this update.
61999             if (context.graph() !== initGraph) return;
62000
62001             if (!data$$1 || !Object.keys(data$$1).length) return;
62002
62003             var qids = Object.keys(data$$1);
62004             var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
62005             var currTags = clone(context.entity(initEntityId).tags);
62006
62007             currTags.wikidata = value;
62008
62009             // Coalesce the update of wikidata tag into the previous tag change
62010             context.overwrite(
62011                 actionChangeTags(initEntityId, currTags),
62012                 context.history().undoAnnotation()
62013             );
62014
62015             // do not dispatch.call('change') here, because entity_editor
62016             // changeTags() is not intended to be called asynchronously
62017         });
62018     }
62019
62020
62021     wiki.tags = function(tags) {
62022         var value = tags[field.key] || '',
62023             m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
62024             l = m && find$1(dataWikipedia, function(d) { return m[1] === d[2]; }),
62025             anchor = m && m[3];
62026
62027         // value in correct format
62028         if (l) {
62029             utilGetSetValue(lang, l[1]);
62030             utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
62031             if (anchor) {
62032                 try {
62033                     // Best-effort `anchorencode:` implementation
62034                     anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
62035                 } catch (e) {
62036                     anchor = anchor.replace(/ /g, '_');
62037                 }
62038             }
62039             wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
62040                 m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
62041
62042         // unrecognized value format
62043         } else {
62044             utilGetSetValue(title, value);
62045             if (value && value !== '') {
62046                 utilGetSetValue(lang, '');
62047                 wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
62048             } else {
62049                 wikiURL = '';
62050             }
62051         }
62052     };
62053
62054
62055     wiki.entity = function(_) {
62056         if (!arguments.length) return entity;
62057         entity = _;
62058         return wiki;
62059     };
62060
62061
62062     wiki.focus = function() {
62063         title.node().focus();
62064     };
62065
62066
62067     return utilRebind(wiki, dispatch$$1, 'on');
62068 }
62069
62070 var uiFields = {
62071     access: uiFieldAccess,
62072     address: uiFieldAddress,
62073     check: uiFieldCheck,
62074     combo: uiFieldCombo,
62075     cycleway: uiFieldCycleway,
62076     defaultCheck: uiFieldCheck,
62077     email: uiFieldText,
62078     lanes: uiFieldLanes,
62079     localized: uiFieldLocalized,
62080     maxspeed: uiFieldMaxspeed,
62081     multiCombo: uiFieldCombo,
62082     networkCombo: uiFieldCombo,
62083     number: uiFieldText,
62084     onewayCheck: uiFieldCheck,
62085     radio: uiFieldRadio,
62086     restrictions: uiFieldRestrictions,
62087     semiCombo: uiFieldCombo,
62088     structureRadio: uiFieldRadio,
62089     tel: uiFieldText,
62090     text: uiFieldText,
62091     textarea: uiFieldTextarea,
62092     typeCombo: uiFieldCombo,
62093     url: uiFieldText,
62094     wikipedia: uiFieldWikipedia
62095 };
62096
62097 function uiField(context, presetField, entity, options) {
62098     options = assignIn$1({
62099         show: true,
62100         wrap: true,
62101         remove: true,
62102         revert: true,
62103         info: true
62104     }, options);
62105
62106     var dispatch$$1 = dispatch('change'),
62107         field = clone(presetField),
62108         show = options.show,
62109         state = '',
62110         tags = {};
62111
62112
62113     field.impl = uiFields[field.type](field, context)
62114         .on('change', function(t$$1, onInput) {
62115             dispatch$$1.call('change', field, t$$1, onInput);
62116         });
62117
62118     if (entity && field.impl.entity) {
62119         field.impl.entity(entity);
62120     }
62121
62122     field.keys = field.keys || [field.key];
62123
62124
62125     function isModified() {
62126         if (!entity) return false;
62127         var original = context.graph().base().entities[entity.id];
62128         return some(field.keys, function(key) {
62129             return original ? tags[key] !== original.tags[key] : tags[key];
62130         });
62131     }
62132
62133
62134     function isPresent() {
62135         return some(field.keys, function(key) {
62136             return tags[key];
62137         });
62138     }
62139
62140
62141     function revert(d) {
62142         event.stopPropagation();
62143         event.preventDefault();
62144         if (!entity) return false;
62145
62146         var original = context.graph().base().entities[entity.id],
62147             t$$1 = {};
62148         d.keys.forEach(function(key) {
62149             t$$1[key] = original ? original.tags[key] : undefined;
62150         });
62151
62152         dispatch$$1.call('change', d, t$$1);
62153     }
62154
62155
62156     function remove(d) {
62157         event.stopPropagation();
62158         event.preventDefault();
62159
62160         var t$$1 = {};
62161         d.keys.forEach(function(key) {
62162             t$$1[key] = undefined;
62163         });
62164
62165         dispatch$$1.call('change', d, t$$1);
62166     }
62167
62168
62169     field.render = function(selection$$1) {
62170         var container = selection$$1.selectAll('.form-field')
62171             .data([field]);
62172
62173         // Enter
62174         var enter = container.enter()
62175             .append('div')
62176             .attr('class', function(d) { return 'form-field form-field-' + d.id; })
62177             .classed('nowrap', !options.wrap);
62178
62179         if (options.wrap) {
62180             var label = enter
62181                 .append('label')
62182                 .attr('class', 'form-label')
62183                 .attr('for', function(d) { return 'preset-input-' + d.id; })
62184                 .text(function(d) { return d.label(); });
62185
62186             var wrap = label
62187                 .append('div')
62188                 .attr('class', 'form-label-button-wrap');
62189
62190             if (options.remove) {
62191                 wrap
62192                     .append('button')
62193                     .attr('class', 'remove-icon')
62194                     .attr('tabindex', -1)
62195                     .call(svgIcon('#operation-delete'));
62196             }
62197
62198             if (options.revert) {
62199                 wrap
62200                     .append('button')
62201                     .attr('class', 'modified-icon')
62202                     .attr('tabindex', -1)
62203                     .call(
62204                         (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
62205                     );
62206             }
62207         }
62208
62209
62210         // Update
62211         container = container
62212             .merge(enter);
62213
62214         container.selectAll('.form-label-button-wrap .remove-icon')
62215             .on('click', remove);
62216
62217         container.selectAll('.form-label-button-wrap .modified-icon')
62218             .on('click', revert);
62219
62220         container
62221             .classed('modified', isModified())
62222             .classed('present', isPresent())
62223             .each(function(d) {
62224                 if (options.wrap && options.info) {
62225                     var referenceKey = d.key;
62226                     if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
62227                         referenceKey = referenceKey.replace(/:$/, '');
62228                     }
62229                     var reference = uiTagReference(d.reference || { key: referenceKey }, context);
62230
62231                     if (state === 'hover') {
62232                         reference.showing(false);
62233                     }
62234                 }
62235
62236                 d3_select(this)
62237                     .call(d.impl);
62238
62239                 if (options.wrap && options.info) {
62240                     d3_select(this)
62241                         .call(reference.body)
62242                         .select('.form-label-button-wrap')
62243                         .call(reference.button);
62244                 }
62245
62246                 d.impl.tags(tags);
62247             });
62248     };
62249
62250
62251     field.state = function(_) {
62252         if (!arguments.length) return state;
62253         state = _;
62254         return field;
62255     };
62256
62257
62258     field.tags = function(_) {
62259         if (!arguments.length) return tags;
62260         tags = _;
62261         return field;
62262     };
62263
62264
62265     field.show = function() {
62266         show = true;
62267         if (field.default && field.key && tags[field.key] !== field.default) {
62268             var t$$1 = {};
62269             t$$1[field.key] = field.default;
62270             dispatch$$1.call('change', this, t$$1);
62271         }
62272     };
62273
62274
62275     field.isShown = function() {
62276         return show || some(field.keys, function(key) { return !!tags[key]; });
62277     };
62278
62279
62280     field.focus = function() {
62281         field.impl.focus();
62282     };
62283
62284
62285     return utilRebind(field, dispatch$$1, 'on');
62286 }
62287
62288 function uiFormFields(context) {
62289     var fieldsArr;
62290
62291
62292     function formFields(selection$$1, klass) {
62293         render(selection$$1, klass);
62294     }
62295
62296
62297     function render(selection$$1, klass) {
62298
62299         var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
62300             notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
62301
62302         var container = selection$$1.selectAll('.form-fields-container')
62303             .data([0]);
62304
62305         container = container.enter()
62306             .append('div')
62307             .attr('class', 'form-fields-container ' + (klass || ''))
62308             .merge(container);
62309
62310
62311         var fields = container.selectAll('.wrap-form-field')
62312             .data(shown, function(d) { return d.id; });
62313
62314         fields.exit()
62315             .remove();
62316
62317         // Enter
62318         var enter = fields.enter()
62319             .append('div')
62320             .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.id; });
62321
62322         // Update
62323         fields = fields
62324             .merge(enter);
62325
62326         fields
62327             .order()
62328             .each(function(d) {
62329                 d3_select(this)
62330                     .call(d.render);
62331             });
62332
62333
62334         notShown = notShown.map(function(field) {
62335             return {
62336                 title: field.label(),
62337                 value: field.label(),
62338                 field: field
62339             };
62340         });
62341
62342
62343         var more = selection$$1.selectAll('.more-fields')
62344             .data((notShown.length > 0) ? [0] : []);
62345
62346         more.exit()
62347             .remove();
62348
62349         more = more.enter()
62350             .append('div')
62351             .attr('class', 'more-fields')
62352             .append('label')
62353             .text(t('inspector.add_fields'))
62354             .merge(more);
62355
62356
62357         var input = more.selectAll('.value')
62358             .data([0]);
62359
62360         input.exit()
62361             .remove();
62362
62363         input = input.enter()
62364             .append('input')
62365             .attr('class', 'value')
62366             .attr('type', 'text')
62367             .call(utilNoAuto)
62368             .merge(input);
62369
62370         input
62371             .call(utilGetSetValue, '')
62372             .attr('placeholder', function() {
62373                 var placeholder = [];
62374                 for (var field in notShown) {
62375                     placeholder.push(notShown[field].title);
62376                 }
62377                 return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
62378             })
62379             .call(d3combobox()
62380                 .container(context.container())
62381                 .data(notShown)
62382                 .minItems(1)
62383                 .on('accept', function (d) {
62384                     var field = d.field;
62385                     field.show();
62386                     render(selection$$1);
62387                     if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
62388                         field.focus();
62389                     }
62390                 })
62391             );
62392     }
62393
62394
62395     formFields.fieldsArr = function(_) {
62396         if (!arguments.length) return fieldsArr;
62397         fieldsArr = _;
62398         return formFields;
62399     };
62400
62401
62402     return formFields;
62403 }
62404
62405 function uiPresetEditor(context) {
62406     var dispatch$$1 = dispatch('change'),
62407         formFields = uiFormFields(context),
62408         expandedPreference = (context.storage('preset_fields.expanded') !== 'false'),
62409         state,
62410         fieldsArr,
62411         preset,
62412         tags,
62413         entityId;
62414
62415
62416     function presetEditor(selection$$1) {
62417         selection$$1.call(uiDisclosure()
62418             .title(t('inspector.all_fields'))
62419             .expanded(expandedPreference)
62420             .on('toggled', toggled)
62421             .content(render)
62422         );
62423
62424         function toggled(expanded) {
62425             expandedPreference = expanded;
62426             context.storage('preset_fields.expanded', expanded);
62427         }
62428     }
62429
62430
62431     function render(selection$$1) {
62432         if (!fieldsArr) {
62433             var entity = context.entity(entityId),
62434                 geometry = context.geometry(entityId),
62435                 presets = context.presets();
62436
62437             fieldsArr = [];
62438
62439             preset.fields.forEach(function(field) {
62440                 if (field.matchGeometry(geometry)) {
62441                     fieldsArr.push(
62442                         uiField(context, field, entity)
62443                     );
62444                 }
62445             });
62446
62447             if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
62448                 fieldsArr.push(
62449                     uiField(context, presets.field('restrictions'), entity)
62450                 );
62451             }
62452
62453             presets.universal().forEach(function(field) {
62454                 if (preset.fields.indexOf(field) === -1) {
62455                     fieldsArr.push(
62456                         uiField(context, field, entity, { show: false })
62457                     );
62458                 }
62459             });
62460
62461             fieldsArr.forEach(function(field) {
62462                 field
62463                     .on('change', function(t$$1, onInput) {
62464                         dispatch$$1.call('change', field, t$$1, onInput);
62465                     });
62466             });
62467         }
62468
62469         fieldsArr.forEach(function(field) {
62470             field
62471                 .state(state)
62472                 .tags(tags);
62473         });
62474
62475
62476         selection$$1
62477             .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
62478
62479
62480         selection$$1.selectAll('.wrap-form-field input')
62481             .on('keydown', function() {
62482                 // if user presses enter, and combobox is not active, accept edits..
62483                 if (event.keyCode === 13 && d3_select('.combobox').empty()) {
62484                     context.enter(modeBrowse(context));
62485                 }
62486             });
62487     }
62488
62489
62490     presetEditor.preset = function(_) {
62491         if (!arguments.length) return preset;
62492         if (preset && preset.id === _.id) return presetEditor;
62493         preset = _;
62494         fieldsArr = null;
62495         return presetEditor;
62496     };
62497
62498
62499     presetEditor.state = function(_) {
62500         if (!arguments.length) return state;
62501         state = _;
62502         return presetEditor;
62503     };
62504
62505
62506     presetEditor.tags = function(_) {
62507         if (!arguments.length) return tags;
62508         tags = _;
62509         // Don't reset fieldsArr here.
62510         return presetEditor;
62511     };
62512
62513
62514     presetEditor.entityID = function(_) {
62515         if (!arguments.length) return entityId;
62516         if (entityId === _) return presetEditor;
62517         entityId = _;
62518         fieldsArr = null;
62519         return presetEditor;
62520     };
62521
62522
62523     return utilRebind(presetEditor, dispatch$$1, 'on');
62524 }
62525
62526 function uiEntityEditor(context) {
62527     var dispatch$$1 = dispatch('choose'),
62528         state = 'select',
62529         coalesceChanges = false,
62530         modified = false,
62531         base,
62532         entityId,
62533         activePreset,
62534         reference;
62535
62536     var presetEditor = uiPresetEditor(context)
62537         .on('change', changeTags);
62538     var rawTagEditor = uiRawTagEditor(context)
62539         .on('change', changeTags);
62540
62541
62542     function entityEditor(selection$$1) {
62543         var entity = context.entity(entityId),
62544             tags = clone(entity.tags);
62545
62546         // Header
62547         var header = selection$$1.selectAll('.header')
62548             .data([0]);
62549
62550         // Enter
62551         var enter = header.enter()
62552             .append('div')
62553             .attr('class', 'header fillL cf');
62554
62555         enter
62556             .append('button')
62557             .attr('class', 'fl preset-reset preset-choose')
62558             .call(svgIcon((textDirection === 'rtl') ? '#icon-forward' : '#icon-backward'));
62559
62560         enter
62561             .append('button')
62562             .attr('class', 'fr preset-close')
62563             .on('click', function() { context.enter(modeBrowse(context)); })
62564             .call(svgIcon(modified ? '#icon-apply' : '#icon-close'));
62565
62566         enter
62567             .append('h3')
62568             .text(t('inspector.edit'));
62569
62570         // Update
62571         header = header
62572             .merge(enter);
62573
62574         header.selectAll('.preset-reset')
62575             .on('click', function() {
62576                 dispatch$$1.call('choose', this, activePreset);
62577             });
62578
62579
62580         // Body
62581         var body = selection$$1.selectAll('.inspector-body')
62582             .data([0]);
62583
62584         // Enter
62585         enter = body.enter()
62586             .append('div')
62587             .attr('class', 'inspector-body');
62588
62589         enter
62590             .append('div')
62591             .attr('class', 'preset-list-item inspector-inner')
62592             .append('div')
62593             .attr('class', 'preset-list-button-wrap')
62594             .append('button')
62595             .attr('class', 'preset-list-button preset-reset')
62596             .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
62597             .append('div')
62598             .attr('class', 'label');
62599
62600         enter
62601             .append('div')
62602             .attr('class', 'inspector-border preset-editor');
62603
62604         enter
62605             .append('div')
62606             .attr('class', 'inspector-border raw-tag-editor inspector-inner');
62607
62608         enter
62609             .append('div')
62610             .attr('class', 'inspector-border raw-member-editor inspector-inner');
62611
62612         enter
62613             .append('div')
62614             .attr('class', 'raw-membership-editor inspector-inner');
62615
62616         enter
62617             .append('input')
62618             .attr('type', 'text')
62619             .attr('class', 'key-trap');
62620
62621
62622         // Update
62623         body = body
62624             .merge(enter);
62625
62626         body.selectAll('.preset-list-button-wrap')
62627             .call(reference.button);
62628
62629         body.selectAll('.preset-list-item')
62630             .call(reference.body);
62631
62632         body.selectAll('.preset-reset')
62633             .on('click', function() {
62634                 dispatch$$1.call('choose', this, activePreset);
62635             });
62636
62637         body.select('.preset-list-item button')
62638             .call(uiPresetIcon()
62639                 .geometry(context.geometry(entityId))
62640                 .preset(activePreset)
62641             );
62642
62643         body.select('.preset-list-item .label')
62644             .text(activePreset.name());
62645
62646         body.select('.preset-editor')
62647             .call(presetEditor
62648                 .preset(activePreset)
62649                 .entityID(entityId)
62650                 .tags(tags)
62651                 .state(state)
62652             );
62653
62654         body.select('.raw-tag-editor')
62655             .call(rawTagEditor
62656                 .preset(activePreset)
62657                 .entityID(entityId)
62658                 .tags(tags)
62659                 .state(state)
62660             );
62661
62662         if (entity.type === 'relation') {
62663             body.select('.raw-member-editor')
62664                 .style('display', 'block')
62665                 .call(uiRawMemberEditor(context)
62666                     .entityID(entityId)
62667                 );
62668         } else {
62669             body.select('.raw-member-editor')
62670                 .style('display', 'none');
62671         }
62672
62673         body.select('.raw-membership-editor')
62674             .call(uiRawMembershipEditor(context)
62675                 .entityID(entityId)
62676             );
62677
62678         body.select('.key-trap')
62679             .on('keydown.key-trap', function() {
62680                 // On tabbing, send focus back to the first field on the inspector-body
62681                 // (probably the `name` field) #4159
62682                 if (event.keyCode === 9 && !event.shiftKey) {
62683                     event.preventDefault();
62684                     body.select('input').node().focus();
62685                 }
62686             });
62687
62688         context.history()
62689             .on('change.entity-editor', historyChanged);
62690
62691
62692         function historyChanged() {
62693             if (state === 'hide') return;
62694
62695             var entity = context.hasEntity(entityId);
62696             var graph = context.graph();
62697             if (!entity) return;
62698
62699             var match = context.presets().match(entity, graph);
62700             var activePreset = entityEditor.preset();
62701             var weakPreset = activePreset && isEmpty(activePreset.addTags);
62702
62703             // A "weak" preset doesn't set any tags. (e.g. "Address")
62704             // Don't replace a weak preset with a fallback preset (e.g. "Point")
62705             if (!(weakPreset && match.isFallback())) {
62706                 entityEditor.preset(match);
62707             }
62708             entityEditor.modified(base !== graph);
62709             entityEditor(selection$$1);
62710         }
62711     }
62712
62713
62714     function clean(o) {
62715
62716         function cleanVal(k, v) {
62717             function keepSpaces(k) {
62718                 return k.match(/_hours|_times/) !== null;
62719             }
62720
62721             var blacklist = ['description', 'note', 'fixme'];
62722             if (some(blacklist, function(s) { return k.indexOf(s) !== -1; })) return v;
62723
62724             var cleaned = v.split(';')
62725                 .map(function(s) { return s.trim(); })
62726                 .join(keepSpaces(k) ? '; ' : ';');
62727
62728             // The code below is not intended to validate websites and emails.
62729             // It is only intended to prevent obvious copy-paste errors. (#2323)
62730             // clean website- and email-like tags
62731             if (k.indexOf('website') !== -1 ||
62732                 k.indexOf('email') !== -1 ||
62733                 cleaned.indexOf('http') === 0) {
62734                 cleaned = cleaned
62735                     .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
62736
62737             }
62738
62739             return cleaned;
62740         }
62741
62742         var out = {}, k, v;
62743         for (k in o) {
62744             if (k && (v = o[k]) !== undefined) {
62745                 out[k] = cleanVal(k, v);
62746             }
62747         }
62748         return out;
62749     }
62750
62751
62752     // Tag changes that fire on input can all get coalesced into a single
62753     // history operation when the user leaves the field.  #2342
62754     function changeTags(changed, onInput) {
62755         var entity = context.entity(entityId),
62756             annotation = t('operations.change_tags.annotation'),
62757             tags = clone(entity.tags);
62758
62759         forEach(changed, function(v, k) {
62760             if (v !== undefined || tags.hasOwnProperty(k)) {
62761                 tags[k] = v;
62762             }
62763         });
62764
62765         if (!onInput) {
62766             tags = clean(tags);
62767         }
62768
62769         if (!isEqual(entity.tags, tags)) {
62770             if (coalesceChanges) {
62771                 context.overwrite(actionChangeTags(entityId, tags), annotation);
62772             } else {
62773                 context.perform(actionChangeTags(entityId, tags), annotation);
62774                 coalesceChanges = !!onInput;
62775             }
62776         }
62777     }
62778
62779
62780     entityEditor.modified = function(_) {
62781         if (!arguments.length) return modified;
62782         modified = _;
62783         d3_selectAll('button.preset-close use')
62784             .attr('xlink:href', (modified ? '#icon-apply' : '#icon-close'));
62785     };
62786
62787
62788     entityEditor.state = function(_) {
62789         if (!arguments.length) return state;
62790         state = _;
62791         return entityEditor;
62792     };
62793
62794
62795     entityEditor.entityID = function(_) {
62796         if (!arguments.length) return entityId;
62797         entityId = _;
62798         base = context.graph();
62799         entityEditor.preset(context.presets().match(context.entity(entityId), base));
62800         entityEditor.modified(false);
62801         coalesceChanges = false;
62802         return entityEditor;
62803     };
62804
62805
62806     entityEditor.preset = function(_) {
62807         if (!arguments.length) return activePreset;
62808         if (_ !== activePreset) {
62809             activePreset = _;
62810             reference = uiTagReference(activePreset.reference(context.geometry(entityId)), context)
62811                 .showing(false);
62812         }
62813         return entityEditor;
62814     };
62815
62816
62817     return utilRebind(entityEditor, dispatch$$1, 'on');
62818 }
62819
62820 function uiPresetList(context) {
62821     var dispatch$$1 = dispatch('choose'),
62822         id,
62823         currentPreset,
62824         autofocus = false;
62825
62826
62827     function presetList(selection$$1) {
62828         var entity = context.entity(id),
62829             geometry = context.geometry(id);
62830
62831         // Treat entities on addr:interpolation lines as points, not vertices (#3241)
62832         if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
62833             geometry = 'point';
62834         }
62835
62836         var presets = context.presets().matchGeometry(geometry);
62837
62838         selection$$1.html('');
62839
62840         var messagewrap = selection$$1
62841             .append('div')
62842             .attr('class', 'header fillL cf');
62843
62844         var message = messagewrap
62845             .append('h3')
62846             .text(t('inspector.choose'));
62847
62848         if (context.entity(id).isUsed(context.graph())) {
62849             messagewrap
62850                 .append('button')
62851                 .attr('class', 'preset-choose')
62852                 .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
62853                 .call(svgIcon((textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'));
62854         } else {
62855             messagewrap
62856                 .append('button')
62857                 .attr('class', 'close')
62858                 .on('click', function() {
62859                     context.enter(modeBrowse(context));
62860                 })
62861                 .call(svgIcon('#icon-close'));
62862         }
62863
62864         function keydown() {
62865             // hack to let delete shortcut work when search is autofocused
62866             if (search.property('value').length === 0 &&
62867                 (event.keyCode === d3keybinding.keyCodes['⌫'] ||
62868                  event.keyCode === d3keybinding.keyCodes['⌦'])) {
62869                 event.preventDefault();
62870                 event.stopPropagation();
62871                 operationDelete([id], context)();
62872             } else if (search.property('value').length === 0 &&
62873                 (event.ctrlKey || event.metaKey) &&
62874                 event.keyCode === d3keybinding.keyCodes.z) {
62875                 event.preventDefault();
62876                 event.stopPropagation();
62877                 context.undo();
62878             } else if (!event.ctrlKey && !event.metaKey) {
62879                 d3_select(this).on('keydown', null);
62880             }
62881         }
62882
62883         function keypress() {
62884             // enter
62885             var value = search.property('value');
62886             if (event.keyCode === 13 && value.length) {
62887                 list.selectAll('.preset-list-item:first-child').datum().choose();
62888             }
62889         }
62890
62891         function inputevent() {
62892             var value = search.property('value');
62893             list.classed('filtered', value.length);
62894             if (value.length) {
62895                 var results = presets.search(value, geometry);
62896                 message.text(t('inspector.results', {
62897                     n: results.collection.length,
62898                     search: value
62899                 }));
62900                 list.call(drawList, results);
62901             } else {
62902                 list.call(drawList, context.presets().defaults(geometry, 36));
62903                 message.text(t('inspector.choose'));
62904             }
62905         }
62906
62907         var searchWrap = selection$$1
62908             .append('div')
62909             .attr('class', 'search-header');
62910
62911         var search = searchWrap
62912             .append('input')
62913             .attr('class', 'preset-search-input')
62914             .attr('placeholder', t('inspector.search'))
62915             .attr('type', 'search')
62916             .call(utilNoAuto)
62917             .on('keydown', keydown)
62918             .on('keypress', keypress)
62919             .on('input', inputevent);
62920
62921         searchWrap
62922             .call(svgIcon('#icon-search', 'pre-text'));
62923
62924         if (autofocus) {
62925             search.node().focus();
62926         }
62927
62928         var listWrap = selection$$1
62929             .append('div')
62930             .attr('class', 'inspector-body');
62931
62932         var list = listWrap
62933             .append('div')
62934             .attr('class', 'preset-list fillL cf')
62935             .call(drawList, context.presets().defaults(geometry, 36));
62936     }
62937
62938
62939     function drawList(list, presets) {
62940         var collection = presets.collection.map(function(preset) {
62941             return preset.members ? CategoryItem(preset) : PresetItem(preset);
62942         });
62943
62944         var items = list.selectAll('.preset-list-item')
62945             .data(collection, function(d) { return d.preset.id; });
62946
62947         items.order();
62948
62949         items.exit()
62950             .remove();
62951
62952         items.enter()
62953             .append('div')
62954             .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
62955             .classed('current', function(item) { return item.preset === currentPreset; })
62956             .each(function(item) { d3_select(this).call(item); })
62957             .style('opacity', 0)
62958             .transition()
62959             .style('opacity', 1);
62960     }
62961
62962
62963     function CategoryItem(preset) {
62964         var box, sublist, shown = false;
62965
62966         function item(selection$$1) {
62967             var wrap = selection$$1.append('div')
62968                 .attr('class', 'preset-list-button-wrap category col12');
62969
62970             var button = wrap
62971                 .append('button')
62972                 .attr('class', 'preset-list-button')
62973                 .classed('expanded', false)
62974                 .call(uiPresetIcon()
62975                     .geometry(context.geometry(id))
62976                     .preset(preset))
62977                 .on('click', function() {
62978                     var isExpanded = d3_select(this).classed('expanded');
62979                     var iconName = isExpanded ?
62980                         (textDirection === 'rtl' ? '#icon-backward' : '#icon-forward') : '#icon-down';
62981                     d3_select(this)
62982                         .classed('expanded', !isExpanded);
62983                     d3_select(this).selectAll('div.label svg.icon use')
62984                         .attr('href', iconName);
62985                     item.choose();
62986                 });
62987
62988             var label = button
62989                 .append('div')
62990                 .attr('class', 'label');
62991
62992             label
62993                 .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'))
62994                 .append('span')
62995                 .html(function() { return preset.name() + '&hellip;'; });
62996
62997             box = selection$$1.append('div')
62998                 .attr('class', 'subgrid col12')
62999                 .style('max-height', '0px')
63000                 .style('opacity', 0);
63001
63002             box.append('div')
63003                 .attr('class', 'arrow');
63004
63005             sublist = box.append('div')
63006                 .attr('class', 'preset-list fillL3 cf fl');
63007         }
63008
63009
63010         item.choose = function() {
63011             if (!box || !sublist) return;
63012
63013             if (shown) {
63014                 shown = false;
63015                 box.transition()
63016                     .duration(200)
63017                     .style('opacity', '0')
63018                     .style('max-height', '0px')
63019                     .style('padding-bottom', '0px');
63020             } else {
63021                 shown = true;
63022                 sublist.call(drawList, preset.members);
63023                 box.transition()
63024                     .duration(200)
63025                     .style('opacity', '1')
63026                     .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
63027                     .style('padding-bottom', '20px');
63028             }
63029         };
63030
63031         item.preset = preset;
63032
63033         return item;
63034     }
63035
63036
63037     function PresetItem(preset) {
63038         function item(selection$$1) {
63039             var wrap = selection$$1.append('div')
63040                 .attr('class', 'preset-list-button-wrap col12');
63041
63042             wrap.append('button')
63043                 .attr('class', 'preset-list-button')
63044                 .call(uiPresetIcon()
63045                     .geometry(context.geometry(id))
63046                     .preset(preset))
63047                 .on('click', item.choose)
63048                 .append('div')
63049                 .attr('class', 'label')
63050                 .text(preset.name());
63051
63052             wrap.call(item.reference.button);
63053             selection$$1.call(item.reference.body);
63054         }
63055
63056         item.choose = function() {
63057             context.presets().choose(preset);
63058
63059             context.perform(
63060                 actionChangePreset(id, currentPreset, preset),
63061                 t('operations.change_tags.annotation')
63062             );
63063
63064             dispatch$$1.call('choose', this, preset);
63065         };
63066
63067         item.help = function() {
63068             event.stopPropagation();
63069             item.reference.toggle();
63070         };
63071
63072         item.preset = preset;
63073         item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
63074
63075         return item;
63076     }
63077
63078
63079     presetList.autofocus = function(_) {
63080         if (!arguments.length) return autofocus;
63081         autofocus = _;
63082         return presetList;
63083     };
63084
63085
63086     presetList.entityID = function(_) {
63087         if (!arguments.length) return id;
63088         id = _;
63089         presetList.preset(context.presets().match(context.entity(id), context.graph()));
63090         return presetList;
63091     };
63092
63093
63094     presetList.preset = function(_) {
63095         if (!arguments.length) return currentPreset;
63096         currentPreset = _;
63097         return presetList;
63098     };
63099
63100
63101     return utilRebind(presetList, dispatch$$1, 'on');
63102 }
63103
63104 function uiViewOnOSM(context) {
63105     var id;
63106
63107     function viewOnOSM(selection) {
63108         var entity = context.entity(id);
63109
63110         selection.style('display', entity.isNew() ? 'none' : null);
63111
63112         var link = selection.selectAll('.view-on-osm')
63113             .data([0]);
63114
63115         var enter = link.enter()
63116             .append('a')
63117             .attr('class', 'view-on-osm')
63118             .attr('target', '_blank')
63119             .call(svgIcon('#icon-out-link', 'inline'));
63120
63121         enter
63122             .append('span')
63123             .text(t('inspector.view_on_osm'));
63124
63125         link
63126             .merge(enter)
63127             .attr('href', context.connection().entityURL(entity));
63128     }
63129
63130
63131     viewOnOSM.entityID = function(_) {
63132         if (!arguments.length) return id;
63133         id = _;
63134         return viewOnOSM;
63135     };
63136
63137     return viewOnOSM;
63138 }
63139
63140 function uiInspector(context) {
63141     var presetList = uiPresetList(context),
63142         entityEditor = uiEntityEditor(context),
63143         state = 'select',
63144         entityID,
63145         newFeature = false;
63146
63147
63148     function inspector(selection) {
63149         presetList
63150             .entityID(entityID)
63151             .autofocus(newFeature)
63152             .on('choose', setPreset);
63153
63154         entityEditor
63155             .state(state)
63156             .entityID(entityID)
63157             .on('choose', showList);
63158
63159         var wrap = selection.selectAll('.panewrap')
63160             .data([0]);
63161
63162         var enter = wrap.enter()
63163             .append('div')
63164             .attr('class', 'panewrap');
63165
63166         enter
63167             .append('div')
63168             .attr('class', 'preset-list-pane pane');
63169
63170         enter
63171             .append('div')
63172             .attr('class', 'entity-editor-pane pane');
63173
63174         wrap = wrap.merge(enter);
63175         var presetPane = wrap.selectAll('.preset-list-pane');
63176         var editorPane = wrap.selectAll('.entity-editor-pane');
63177
63178         var graph = context.graph(),
63179             entity = context.entity(entityID),
63180             showEditor = state === 'hover' ||
63181                 entity.isUsed(graph) ||
63182                 entity.isHighwayIntersection(graph);
63183
63184         if (showEditor) {
63185             wrap.style('right', '0%');
63186             editorPane.call(entityEditor);
63187         } else {
63188             wrap.style('right', '-100%');
63189             presetPane.call(presetList);
63190         }
63191
63192         var footer = selection.selectAll('.footer')
63193             .data([0]);
63194
63195         footer = footer.enter()
63196             .append('div')
63197             .attr('class', 'footer')
63198             .merge(footer);
63199
63200         footer
63201             .call(uiViewOnOSM(context).entityID(entityID));
63202
63203
63204         function showList(preset) {
63205             wrap.transition()
63206                 .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
63207
63208             presetPane
63209                 .call(presetList.preset(preset).autofocus(true));
63210         }
63211
63212
63213         function setPreset(preset) {
63214             wrap.transition()
63215                 .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
63216
63217             editorPane
63218                 .call(entityEditor.preset(preset));
63219         }
63220     }
63221
63222
63223     inspector.state = function(_) {
63224         if (!arguments.length) return state;
63225         state = _;
63226         entityEditor.state(state);
63227         return inspector;
63228     };
63229
63230
63231     inspector.entityID = function(_) {
63232         if (!arguments.length) return entityID;
63233         entityID = _;
63234         return inspector;
63235     };
63236
63237
63238     inspector.newFeature = function(_) {
63239         if (!arguments.length) return newFeature;
63240         newFeature = _;
63241         return inspector;
63242     };
63243
63244
63245     return inspector;
63246 }
63247
63248 function uiSidebar(context) {
63249     var inspector = uiInspector(context),
63250         current;
63251
63252
63253     function sidebar(selection) {
63254         var featureListWrap = selection
63255             .append('div')
63256             .attr('class', 'feature-list-pane')
63257             .call(uiFeatureList(context));
63258
63259
63260         var inspectorWrap = selection
63261             .append('div')
63262             .attr('class', 'inspector-hidden inspector-wrap fr');
63263
63264
63265         function hover(id) {
63266             if (!current && context.hasEntity(id)) {
63267                 featureListWrap
63268                     .classed('inspector-hidden', true);
63269
63270                 inspectorWrap
63271                     .classed('inspector-hidden', false)
63272                     .classed('inspector-hover', true);
63273
63274                 if (inspector.entityID() !== id || inspector.state() !== 'hover') {
63275                     inspector
63276                         .state('hover')
63277                         .entityID(id);
63278
63279                     inspectorWrap
63280                         .call(inspector);
63281                 }
63282
63283             } else if (!current) {
63284                 featureListWrap
63285                     .classed('inspector-hidden', false);
63286                 inspectorWrap
63287                     .classed('inspector-hidden', true);
63288                 inspector
63289                     .state('hide');
63290             }
63291         }
63292
63293
63294         sidebar.hover = throttle(hover, 200);
63295
63296
63297         sidebar.select = function(id, newFeature) {
63298             if (!current && id) {
63299                 featureListWrap
63300                     .classed('inspector-hidden', true);
63301
63302                 inspectorWrap
63303                     .classed('inspector-hidden', false)
63304                     .classed('inspector-hover', false);
63305
63306                 if (inspector.entityID() !== id || inspector.state() !== 'select') {
63307                     inspector
63308                         .state('select')
63309                         .entityID(id)
63310                         .newFeature(newFeature);
63311
63312                     inspectorWrap
63313                         .call(inspector);
63314                 }
63315
63316             } else if (!current) {
63317                 featureListWrap
63318                     .classed('inspector-hidden', false);
63319                 inspectorWrap
63320                     .classed('inspector-hidden', true);
63321                 inspector
63322                     .state('hide');
63323             }
63324         };
63325
63326
63327         sidebar.show = function(component) {
63328             featureListWrap
63329                 .classed('inspector-hidden', true);
63330             inspectorWrap
63331                 .classed('inspector-hidden', true);
63332
63333             if (current) current.remove();
63334             current = selection
63335                 .append('div')
63336                 .attr('class', 'sidebar-component')
63337                 .call(component);
63338         };
63339
63340
63341         sidebar.hide = function() {
63342             featureListWrap
63343                 .classed('inspector-hidden', false);
63344             inspectorWrap
63345                 .classed('inspector-hidden', true);
63346
63347             if (current) current.remove();
63348             current = null;
63349         };
63350     }
63351
63352
63353     sidebar.hover = function() {};
63354     sidebar.hover.cancel = function() {};
63355     sidebar.select = function() {};
63356     sidebar.show = function() {};
63357     sidebar.hide = function() {};
63358
63359     return sidebar;
63360 }
63361
63362 function uiSpinner(context) {
63363     var osm = context.connection();
63364
63365
63366     return function(selection) {
63367         var img = selection
63368             .append('img')
63369             .attr('src', context.imagePath('loader-black.gif'))
63370             .style('opacity', 0);
63371
63372         if (osm) {
63373             osm
63374                 .on('loading.spinner', function() {
63375                     img.transition()
63376                         .style('opacity', 1);
63377                 })
63378                 .on('loaded.spinner', function() {
63379                     img.transition()
63380                         .style('opacity', 0);
63381                 });
63382         }
63383     };
63384 }
63385
63386 function uiSplash(context) {
63387
63388     return function(selection) {
63389         if (context.storage('sawSplash'))
63390              return;
63391
63392         context.storage('sawSplash', true);
63393
63394         var modalSelection = uiModal(selection);
63395
63396         modalSelection.select('.modal')
63397             .attr('class', 'modal-splash modal col6');
63398
63399         var introModal = modalSelection.select('.content')
63400             .append('div')
63401             .attr('class', 'fillL');
63402
63403         introModal
63404             .append('div')
63405             .attr('class','modal-section cf')
63406             .append('h3').text(t('splash.welcome'));
63407
63408         introModal
63409             .append('div')
63410             .attr('class','modal-section')
63411             .append('p')
63412             .html(t('splash.text', {
63413                 version: context.version,
63414                 website: '<a href="http://ideditor.com/">ideditor.com</a>',
63415                 github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
63416             }));
63417
63418         var buttonWrap = introModal
63419             .append('div')
63420             .attr('class', 'modal-actions cf');
63421
63422         var walkthrough = buttonWrap
63423             .append('button')
63424             .attr('class', 'walkthrough col6')
63425             .on('click', function() {
63426                 context.container().call(uiIntro(context));
63427                 modalSelection.close();
63428             });
63429
63430         walkthrough
63431             .append('svg')
63432             .attr('class', 'logo logo-walkthrough')
63433             .append('use')
63434             .attr('xlink:href', '#logo-walkthrough');
63435
63436         walkthrough
63437             .append('div')
63438             .text(t('splash.walkthrough'));
63439
63440         var startEditing = buttonWrap
63441             .append('button')
63442             .attr('class', 'start-editing col6')
63443             .on('click', modalSelection.close);
63444
63445         startEditing
63446             .append('svg')
63447             .attr('class', 'logo logo-features')
63448             .append('use')
63449             .attr('xlink:href', '#logo-features');
63450
63451         startEditing
63452             .append('div')
63453             .text(t('splash.start'));
63454
63455
63456         modalSelection.select('button.close')
63457             .attr('class','hide');
63458
63459     };
63460 }
63461
63462 function uiStatus(context) {
63463     var osm = context.connection();
63464
63465
63466     return function(selection$$1) {
63467         if (!osm) return;
63468
63469         function update() {
63470             osm.status(function(err, apiStatus) {
63471                 selection$$1.html('');
63472
63473                 if (err) {
63474                     if (apiStatus === 'rateLimited') {
63475                         selection$$1
63476                             .text(t('status.rateLimit'))
63477                             .append('a')
63478                             .attr('class', 'api-status-login')
63479                             .attr('target', '_blank')
63480                             .call(svgIcon('#icon-out-link', 'inline'))
63481                             .append('span')
63482                             .text(t('login'))
63483                             .on('click.login', function() {
63484                                 event.preventDefault();
63485                                 osm.authenticate();
63486                             });
63487                     } else {
63488                         // eslint-disable-next-line no-warning-comments
63489                         // TODO: nice messages for different error types
63490                         selection$$1.text(t('status.error'));
63491                     }
63492
63493                 } else if (apiStatus === 'readonly') {
63494                     selection$$1.text(t('status.readonly'));
63495                 } else if (apiStatus === 'offline') {
63496                     selection$$1.text(t('status.offline'));
63497                 }
63498
63499                 selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
63500             });
63501         }
63502
63503         osm.on('change', function() { update(selection$$1); });
63504
63505         window.setInterval(update, 90000);
63506         update(selection$$1);
63507     };
63508 }
63509
63510 function uiUndoRedo(context) {
63511     var commands = [{
63512         id: 'undo',
63513         cmd: uiCmd('⌘Z'),
63514         action: function() { if (editable()) context.undo(); },
63515         annotation: function() { return context.history().undoAnnotation(); }
63516     }, {
63517         id: 'redo',
63518         cmd: uiCmd('⌘⇧Z'),
63519         action: function() { if (editable()) context.redo(); },
63520         annotation: function() { return context.history().redoAnnotation(); }
63521     }];
63522
63523
63524     function editable() {
63525         return context.editable() && context.mode().id !== 'save';
63526     }
63527
63528
63529     return function(selection$$1) {
63530         var tooltipBehavior = tooltip()
63531             .placement('bottom')
63532             .html(true)
63533             .title(function (d) {
63534                 return uiTooltipHtml(d.annotation() ?
63535                     t(d.id + '.tooltip', {action: d.annotation()}) :
63536                     t(d.id + '.nothing'), d.cmd);
63537             });
63538
63539         var buttons = selection$$1.selectAll('button')
63540             .data(commands)
63541             .enter()
63542             .append('button')
63543             .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
63544             .on('click', function(d) { return d.action(); })
63545             .call(tooltipBehavior);
63546
63547         buttons.each(function(d) {
63548             var iconName = d.id;
63549             if (textDirection === 'rtl') {
63550                 if (iconName === 'undo') {
63551                     iconName = 'redo';
63552                 } else if (iconName === 'redo') {
63553                     iconName = 'undo';
63554                 }
63555             }
63556             d3_select(this)
63557                 .call(svgIcon('#icon-' + iconName));
63558         });
63559
63560         var keybinding = d3keybinding('undo')
63561             .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
63562             .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
63563
63564         d3_select(document)
63565             .call(keybinding);
63566
63567
63568         var debouncedUpdate = debounce$1(update, 500, { leading: true, trailing: true });
63569
63570         context.map()
63571             .on('move.undo_redo', debouncedUpdate)
63572             .on('drawn.undo_redo', debouncedUpdate);
63573
63574         context.history()
63575             .on('change.undo_redo', update);
63576
63577         context
63578             .on('enter.undo_redo', update);
63579
63580
63581         function update() {
63582             buttons
63583                 .property('disabled', !editable())
63584                 .classed('disabled', function(d) { return !d.annotation(); })
63585                 .each(function() {
63586                     var selection$$1 = d3_select(this);
63587                     if (selection$$1.property('tooltipVisible')) {
63588                         selection$$1.call(tooltipBehavior.show);
63589                     }
63590                 });
63591         }
63592     };
63593 }
63594
63595 // these are module variables so they are preserved through a ui.restart()
63596 var sawVersion = null;
63597 var isNewVersion = false;
63598 var isNewUser = false;
63599
63600
63601 function uiVersion(context) {
63602
63603     var currVersion = context.version,
63604         matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
63605
63606     if (sawVersion === null && matchedVersion !== null) {
63607         isNewVersion = (context.storage('sawVersion') !== currVersion);
63608         isNewUser = !context.storage('sawSplash');
63609         context.storage('sawVersion', currVersion);
63610         sawVersion = currVersion;
63611     }
63612
63613     return function(selection) {
63614         selection
63615             .append('a')
63616             .attr('target', '_blank')
63617             .attr('tabindex', -1)
63618             .attr('href', 'https://github.com/openstreetmap/iD')
63619             .text(currVersion);
63620
63621         // only show new version indicator to users that have used iD before
63622         if (isNewVersion && !isNewUser) {
63623             selection
63624                 .append('div')
63625                 .attr('class', 'badge')
63626                 .append('a')
63627                 .attr('target', '_blank')
63628                 .attr('tabindex', -1)
63629                 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
63630                 .call(svgIcon('#gift-11'))
63631                 .call(tooltip()
63632                     .title(t('version.whats_new', { version: currVersion }))
63633                     .placement('top')
63634                 );
63635         }
63636     };
63637 }
63638
63639 function uiZoom(context) {
63640     var zooms = [{
63641         id: 'zoom-in',
63642         icon: 'plus',
63643         title: t('zoom.in'),
63644         action: context.zoomIn,
63645         key: '+'
63646     }, {
63647         id: 'zoom-out',
63648         icon: 'minus',
63649         title: t('zoom.out'),
63650         action: context.zoomOut,
63651         key: '-'
63652     }];
63653
63654
63655     function zoomIn() {
63656         event.preventDefault();
63657         context.zoomIn();
63658     }
63659
63660
63661     function zoomOut() {
63662         event.preventDefault();
63663         context.zoomOut();
63664     }
63665
63666
63667     function zoomInFurther() {
63668         event.preventDefault();
63669         context.zoomInFurther();
63670     }
63671
63672
63673     function zoomOutFurther() {
63674         event.preventDefault();
63675         context.zoomOutFurther();
63676     }
63677
63678
63679     return function(selection$$1) {
63680         var button = selection$$1.selectAll('button')
63681             .data(zooms)
63682             .enter()
63683             .append('button')
63684             .attr('tabindex', -1)
63685             .attr('class', function(d) { return d.id; })
63686             .on('click.editor', function(d) { d.action(); })
63687             .call(tooltip()
63688                 .placement((textDirection === 'rtl') ? 'right' : 'left')
63689                 .html(true)
63690                 .title(function(d) {
63691                     return uiTooltipHtml(d.title, d.key);
63692                 })
63693             );
63694
63695         button.each(function(d) {
63696             d3_select(this)
63697                 .call(svgIcon('#icon-' + d.icon, 'light'));
63698         });
63699
63700         var keybinding = d3keybinding('zoom');
63701
63702         ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
63703             keybinding.on([key], zoomIn);
63704             keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
63705         });
63706
63707         ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
63708             keybinding.on([key], zoomOut);
63709             keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
63710         });
63711
63712         d3_select(document)
63713             .call(keybinding);
63714     };
63715 }
63716
63717 function uiInit(context) {
63718     var uiInitCounter = 0;
63719
63720
63721     function render(container) {
63722         container
63723             .attr('dir', textDirection);
63724
63725         var map = context.map();
63726
63727         var hash = behaviorHash(context);
63728         hash();
63729
63730         if (!hash.hadHash) {
63731             map.centerZoom([0, 0], 2);
63732         }
63733
63734         container
63735             .append('svg')
63736             .attr('id', 'defs')
63737             .call(svgDefs(context));
63738
63739         container
63740             .append('div')
63741             .attr('id', 'sidebar')
63742             .attr('class', 'col4')
63743             .call(ui.sidebar);
63744
63745         var content = container
63746             .append('div')
63747             .attr('id', 'content')
63748             .attr('class', 'active');
63749
63750         var bar = content
63751             .append('div')
63752             .attr('id', 'bar')
63753             .attr('class', 'fillD');
63754
63755         content
63756             .append('div')
63757             .attr('id', 'map')
63758             .attr('dir', 'ltr')
63759             .call(map);
63760
63761         content
63762             .call(uiMapInMap(context))
63763             .call(uiInfo(context))
63764             .call(uiNotice(context));
63765
63766         bar
63767             .append('div')
63768             .attr('class', 'spacer col4');
63769
63770         var limiter = bar.append('div')
63771             .attr('class', 'limiter');
63772
63773         limiter
63774             .append('div')
63775             .attr('class', 'button-wrap joined col3')
63776             .call(uiModes(context), limiter);
63777
63778         limiter
63779             .append('div')
63780             .attr('class', 'button-wrap joined col1')
63781             .call(uiUndoRedo(context));
63782
63783         limiter
63784             .append('div')
63785             .attr('class', 'button-wrap col1')
63786             .call(uiSave(context));
63787
63788         bar
63789             .append('div')
63790             .attr('class', 'full-screen')
63791             .call(uiFullScreen(context));
63792
63793         bar
63794             .append('div')
63795             .attr('class', 'spinner')
63796             .call(uiSpinner(context));
63797
63798
63799         var controls = bar
63800             .append('div')
63801             .attr('class', 'map-controls');
63802
63803         controls
63804             .append('div')
63805             .attr('class', 'map-control zoombuttons')
63806             .call(uiZoom(context));
63807
63808         controls
63809             .append('div')
63810             .attr('class', 'map-control geolocate-control')
63811             .call(uiGeolocate(context));
63812
63813         controls
63814             .append('div')
63815             .attr('class', 'map-control background-control')
63816             .call(uiBackground(context));
63817
63818         controls
63819             .append('div')
63820             .attr('class', 'map-control map-data-control')
63821             .call(uiMapData(context));
63822
63823         controls
63824             .append('div')
63825             .attr('class', 'map-control help-control')
63826             .call(uiHelp(context));
63827
63828
63829         var about = content
63830             .append('div')
63831             .attr('id', 'about');
63832
63833         about
63834             .append('div')
63835             .attr('id', 'attrib')
63836             .attr('dir', 'ltr')
63837             .call(uiAttribution(context));
63838
63839         about
63840             .append('div')
63841             .attr('class', 'api-status')
63842             .call(uiStatus(context));
63843
63844
63845         var footer = about
63846             .append('div')
63847             .attr('id', 'footer')
63848             .attr('class', 'fillD');
63849
63850         footer
63851             .append('div')
63852             .attr('id', 'flash-wrap')
63853             .attr('class', 'footer-hide');
63854
63855         var footerWrap = footer
63856             .append('div')
63857             .attr('id', 'footer-wrap')
63858             .attr('class', 'footer-show');
63859
63860         footerWrap
63861             .append('div')
63862             .attr('id', 'scale-block')
63863             .call(uiScale(context));
63864
63865         var aboutList = footerWrap
63866             .append('div')
63867             .attr('id', 'info-block')
63868             .append('ul')
63869             .attr('id', 'about-list');
63870
63871         if (!context.embed()) {
63872             aboutList
63873                 .call(uiAccount(context));
63874         }
63875
63876         aboutList
63877             .append('li')
63878             .attr('class', 'version')
63879             .call(uiVersion(context));
63880
63881         var issueLinks = aboutList
63882             .append('li');
63883
63884         issueLinks
63885             .append('a')
63886             .attr('target', '_blank')
63887             .attr('tabindex', -1)
63888             .attr('href', 'https://github.com/openstreetmap/iD/issues')
63889             .call(svgIcon('#icon-bug', 'light'))
63890             .call(tooltip().title(t('report_a_bug')).placement('top'));
63891
63892         issueLinks
63893             .append('a')
63894             .attr('target', '_blank')
63895             .attr('tabindex', -1)
63896             .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
63897             .call(svgIcon('#icon-translate', 'light'))
63898             .call(tooltip().title(t('help_translate')).placement('top'));
63899
63900         aboutList
63901             .append('li')
63902             .attr('class', 'feature-warning')
63903             .attr('tabindex', -1)
63904             .call(uiFeatureInfo(context));
63905
63906         aboutList
63907             .append('li')
63908             .attr('class', 'user-list')
63909             .attr('tabindex', -1)
63910             .call(uiContributors(context));
63911
63912
63913         var photoviewer = content
63914             .append('div')
63915             .attr('id', 'photoviewer')
63916             .classed('al', true)       // 'al'=left,  'ar'=right
63917             .classed('hide', true);
63918
63919         photoviewer
63920             .append('button')
63921             .attr('class', 'thumb-hide')
63922             .on('click', function () {
63923                 if (services.mapillary) { services.mapillary.hideViewer(); }
63924                 if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
63925             })
63926             .append('div')
63927             .call(svgIcon('#icon-close'));
63928
63929
63930         window.onbeforeunload = function() {
63931             return context.save();
63932         };
63933
63934         window.onunload = function() {
63935             context.history().unlock();
63936         };
63937
63938         var mapDimensions = map.dimensions();
63939
63940
63941         function onResize() {
63942             mapDimensions = utilGetDimensions(content, true);
63943             map.dimensions(mapDimensions);
63944         }
63945
63946         d3_select(window)
63947             .on('resize.editor', onResize);
63948
63949         onResize();
63950
63951         function pan(d) {
63952             return function() {
63953                 event.preventDefault();
63954                 context.pan(d, 100);
63955             };
63956         }
63957
63958
63959         // pan amount
63960         var pa = 80;
63961
63962         var keybinding = d3keybinding('main')
63963             .on('⌫', function() { event.preventDefault(); })
63964             .on('←', pan([pa, 0]))
63965             .on('↑', pan([0, pa]))
63966             .on('→', pan([-pa, 0]))
63967             .on('↓', pan([0, -pa]))
63968             .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
63969             .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
63970             .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
63971             .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
63972
63973         d3_select(document)
63974             .call(keybinding);
63975
63976         context.enter(modeBrowse(context));
63977
63978         if (!uiInitCounter++) {
63979             if (!hash.startWalkthrough) {
63980                 context.container()
63981                     .call(uiSplash(context))
63982                     .call(uiRestore(context));
63983             }
63984
63985             context.container()
63986                 .call(uiShortcuts(context));
63987         }
63988
63989         var osm = context.connection(),
63990             auth = uiLoading(context).message(t('loading_auth')).blocking(true);
63991
63992         if (osm && auth) {
63993             osm
63994                 .on('authLoading.ui', function() {
63995                     context.container()
63996                         .call(auth);
63997                 })
63998                 .on('authDone.ui', function() {
63999                     auth.close();
64000                 });
64001         }
64002
64003         uiInitCounter++;
64004
64005         if (hash.startWalkthrough) {
64006             hash.startWalkthrough = false;
64007             context.container().call(uiIntro(context));
64008         }
64009     }
64010
64011
64012     var renderCallback;
64013
64014     function ui(node, callback) {
64015         renderCallback = callback;
64016         var container = d3_select(node);
64017         context.container(container);
64018         context.loadLocale(function(err) {
64019             if (!err) {
64020                 render(container);
64021             }
64022             if (callback) {
64023                 callback(err);
64024             }
64025         });
64026     }
64027
64028
64029     ui.restart = function(arg) {
64030         context.locale(arg);
64031         context.loadLocale(function(err) {
64032             if (!err) {
64033                 context.container().selectAll('*').remove();
64034                 render(context.container());
64035                 if (renderCallback) renderCallback();
64036             }
64037         });
64038     };
64039
64040
64041     ui.sidebar = uiSidebar(context);
64042
64043     return ui;
64044 }
64045
64046 function uiChangesetEditor(context) {
64047     var dispatch$$1 = dispatch('change'),
64048         formFields = uiFormFields(context),
64049         fieldsArr,
64050         tags,
64051         changesetId;
64052
64053
64054
64055     function changesetEditor(selection) {
64056         render(selection);
64057     }
64058
64059
64060     function render(selection) {
64061         var initial = false;
64062
64063         if (!fieldsArr) {
64064             initial = true;
64065             var presets = context.presets();
64066
64067             fieldsArr = [
64068                 uiField(context, presets.field('comment'), null, { show: true, revert: false }),
64069                 uiField(context, presets.field('source'), null, { show: false, revert: false }),
64070                 uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
64071             ];
64072
64073             fieldsArr.forEach(function(field) {
64074                 field
64075                     .on('change', function(t$$1, onInput) {
64076                         dispatch$$1.call('change', field, t$$1, onInput);
64077                     });
64078             });
64079         }
64080
64081         fieldsArr.forEach(function(field) {
64082             field
64083                 .tags(tags);
64084         });
64085
64086
64087         selection
64088             .call(formFields.fieldsArr(fieldsArr));
64089
64090
64091         if (initial) {
64092             var commentField = selection.select('#preset-input-comment'),
64093                 commentNode = commentField.node();
64094
64095             if (commentNode) {
64096                 commentNode.focus();
64097                 commentNode.select();
64098             }
64099
64100             // trigger a 'blur' event so that comment field can be cleaned
64101             // and checked for hashtags, even if retrieved from localstorage
64102             utilTriggerEvent(commentField, 'blur');
64103
64104             var osm = context.connection();
64105             if (osm) {
64106                 osm.userChangesets(function (err, changesets) {
64107                     if (err) return;
64108
64109                     var comments = changesets.map(function(changeset) {
64110                         return {
64111                             title: changeset.tags.comment,
64112                             value: changeset.tags.comment
64113                         };
64114                     });
64115
64116                     commentField
64117                         .call(d3combobox()
64118                             .container(context.container())
64119                             .caseSensitive(true)
64120                             .data(uniqBy(comments, 'title'))
64121                         );
64122                 });
64123             }
64124         }
64125
64126         // Add warning if comment mentions Google
64127         var hasGoogle = tags.comment.match(/google/i);
64128         var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
64129             .data(hasGoogle ? [0] : []);
64130
64131         commentWarning.exit()
64132             .transition()
64133             .duration(200)
64134             .style('opacity', 0)
64135             .remove();
64136
64137         var commentEnter = commentWarning.enter()
64138             .insert('div', '.tag-reference-body')
64139             .attr('class', 'field-warning comment-warning')
64140             .style('opacity', 0);
64141
64142         commentEnter
64143             .append('a')
64144             .attr('target', '_blank')
64145             .attr('tabindex', -1)
64146             .call(svgIcon('#icon-alert', 'inline'))
64147             .attr('href', t('commit.google_warning_link'))
64148             .append('span')
64149             .text(t('commit.google_warning'));
64150
64151         commentEnter
64152             .transition()
64153             .duration(200)
64154             .style('opacity', 1);
64155     }
64156
64157
64158     changesetEditor.tags = function(_) {
64159         if (!arguments.length) return tags;
64160         tags = _;
64161         // Don't reset fieldsArr here.
64162         return changesetEditor;
64163     };
64164
64165
64166     changesetEditor.changesetID = function(_) {
64167         if (!arguments.length) return changesetId;
64168         if (changesetId === _) return changesetEditor;
64169         changesetId = _;
64170         fieldsArr = null;
64171         return changesetEditor;
64172     };
64173
64174
64175     return utilRebind(changesetEditor, dispatch$$1, 'on');
64176 }
64177
64178 /**
64179  * This method is like `_.union` except that it accepts `iteratee` which is
64180  * invoked for each element of each `arrays` to generate the criterion by
64181  * which uniqueness is computed. Result values are chosen from the first
64182  * array in which the value occurs. The iteratee is invoked with one argument:
64183  * (value).
64184  *
64185  * @static
64186  * @memberOf _
64187  * @since 4.0.0
64188  * @category Array
64189  * @param {...Array} [arrays] The arrays to inspect.
64190  * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
64191  * @returns {Array} Returns the new array of combined values.
64192  * @example
64193  *
64194  * _.unionBy([2.1], [1.2, 2.3], Math.floor);
64195  * // => [2.1, 1.2]
64196  *
64197  * // The `_.property` iteratee shorthand.
64198  * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
64199  * // => [{ 'x': 1 }, { 'x': 2 }]
64200  */
64201 var unionBy = baseRest(function(arrays) {
64202   var iteratee = last(arrays);
64203   if (isArrayLikeObject(iteratee)) {
64204     iteratee = undefined;
64205   }
64206   return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
64207 });
64208
64209 function uiCommitChanges(context) {
64210     var detected = utilDetect();
64211
64212
64213     function commitChanges(selection$$1) {
64214
64215         var history = context.history(),
64216             summary = history.difference().summary();
64217
64218         var container = selection$$1.selectAll('.modal-section.commit-section')
64219             .data([0]);
64220
64221         var containerEnter = container.enter()
64222             .append('div')
64223             .attr('class', 'commit-section modal-section fillL2');
64224
64225         containerEnter
64226             .append('h3')
64227             .text(t('commit.changes', { count: summary.length }));
64228
64229         containerEnter
64230             .append('ul')
64231             .attr('class', 'changeset-list');
64232
64233         container = containerEnter
64234             .merge(container);
64235
64236
64237         var items = container.select('ul').selectAll('li')
64238             .data(summary);
64239
64240         var itemsEnter = items.enter()
64241             .append('li')
64242             .attr('class', 'change-item');
64243
64244         itemsEnter
64245             .each(function(d) {
64246                 d3_select(this)
64247                     .call(svgIcon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
64248             });
64249
64250         itemsEnter
64251             .append('span')
64252             .attr('class', 'change-type')
64253             .text(function(d) { return t('commit.' + d.changeType) + ' '; });
64254
64255         itemsEnter
64256             .append('strong')
64257             .attr('class', 'entity-type')
64258             .text(function(d) {
64259                 var matched = context.presets().match(d.entity, d.graph);
64260                 return (matched && matched.name()) || utilDisplayType(d.entity.id);
64261             });
64262
64263         itemsEnter
64264             .append('span')
64265             .attr('class', 'entity-name')
64266             .text(function(d) {
64267                 var name = utilDisplayName(d.entity) || '',
64268                     string = '';
64269                 if (name !== '') {
64270                     string += ':';
64271                 }
64272                 return string += ' ' + name;
64273             });
64274
64275         itemsEnter
64276             .style('opacity', 0)
64277             .transition()
64278             .style('opacity', 1);
64279
64280         items = itemsEnter
64281             .merge(items);
64282
64283         items
64284             .on('mouseover', mouseover)
64285             .on('mouseout', mouseout)
64286             .on('click', zoomToEntity);
64287
64288
64289         // Download changeset link
64290         var changeset = new osmChangeset().update({ id: undefined }),
64291             changes = history.changes(actionDiscardTags(history.difference()));
64292
64293         delete changeset.id;  // Export without chnageset_id
64294
64295         var data = JXON.stringify(changeset.osmChangeJXON(changes)),
64296             blob = new Blob([data], {type: 'text/xml;charset=utf-8;'}),
64297             fileName = 'changes.osc';
64298
64299         var linkEnter = container.selectAll('.download-changes')
64300             .data([0])
64301             .enter()
64302             .append('a')
64303             .attr('class', 'download-changes');
64304
64305         if (detected.download) {      // All except IE11 and Edge
64306             linkEnter                 // download the data as a file
64307                 .attr('href', window.URL.createObjectURL(blob))
64308                 .attr('download', fileName);
64309
64310         } else {                      // IE11 and Edge
64311             linkEnter                 // open data uri in a new tab
64312                 .attr('target', '_blank')
64313                 .on('click.download', function() {
64314                     navigator.msSaveBlob(blob, fileName);
64315                 });
64316         }
64317
64318         linkEnter
64319             .call(svgIcon('#icon-load', 'inline'))
64320             .append('span')
64321             .text(t('commit.download_changes'));
64322
64323
64324         function mouseover(d) {
64325             if (d.entity) {
64326                 context.surface().selectAll(
64327                     utilEntityOrMemberSelector([d.entity.id], context.graph())
64328                 ).classed('hover', true);
64329             }
64330         }
64331
64332
64333         function mouseout() {
64334             context.surface().selectAll('.hover')
64335                 .classed('hover', false);
64336         }
64337
64338
64339         function zoomToEntity(change) {
64340             var entity = change.entity;
64341             if (change.changeType !== 'deleted' &&
64342                 context.graph().entity(entity.id).geometry(context.graph()) !== 'vertex') {
64343                 context.map().zoomTo(entity);
64344                 context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
64345                     .classed('hover', true);
64346             }
64347         }
64348     }
64349
64350
64351     return commitChanges;
64352 }
64353
64354 function uiCommitWarnings(context) {
64355
64356     function commitWarnings(selection) {
64357
64358         var changes = context.history().changes();
64359         var warnings = context.history().validate(changes);
64360
64361         var container = selection.selectAll('.warning-section')
64362             .data(warnings.length ? [0] : []);
64363
64364         container.exit()
64365             .remove();
64366
64367         var containerEnter = container.enter()
64368             .append('div')
64369             .attr('class', 'modal-section warning-section fillL2');
64370
64371         containerEnter
64372             .append('h3')
64373             .text(t('commit.warnings'));
64374
64375         containerEnter
64376             .append('ul')
64377             .attr('class', 'changeset-list');
64378
64379         container = containerEnter
64380             .merge(container);
64381
64382
64383         var items = container.select('ul').selectAll('li')
64384             .data(warnings);
64385
64386         items.exit()
64387             .remove();
64388
64389         var itemsEnter = items.enter()
64390             .append('li')
64391             .attr('class', 'warning-item');
64392
64393         itemsEnter
64394             .call(svgIcon('#icon-alert', 'pre-text'));
64395
64396         itemsEnter
64397             .append('strong')
64398             .text(function(d) { return d.message; });
64399
64400         itemsEnter.filter(function(d) { return d.tooltip; })
64401             .call(tooltip()
64402                 .title(function(d) { return d.tooltip; })
64403                 .placement('top')
64404             );
64405
64406         items = itemsEnter
64407             .merge(items);
64408
64409         items
64410             .on('mouseover', mouseover)
64411             .on('mouseout', mouseout)
64412             .on('click', warningClick);
64413
64414
64415         function mouseover(d) {
64416             if (d.entity) {
64417                 context.surface().selectAll(
64418                     utilEntityOrMemberSelector([d.entity.id], context.graph())
64419                 ).classed('hover', true);
64420             }
64421         }
64422
64423
64424         function mouseout() {
64425             context.surface().selectAll('.hover')
64426                 .classed('hover', false);
64427         }
64428
64429
64430         function warningClick(d) {
64431             if (d.entity) {
64432                 context.map().zoomTo(d.entity);
64433                 context.enter(modeSelect(context, [d.entity.id]));
64434             }
64435         }
64436
64437     }
64438
64439
64440     return commitWarnings;
64441 }
64442
64443 var changeset;
64444 var readOnlyTags = [
64445     /^changesets_count$/,
64446     /^created_by$/,
64447     /^ideditor:/,
64448     /^imagery_used$/,
64449     /^host$/,
64450     /^locale$/
64451 ];
64452
64453 // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
64454 // from https://stackoverflow.com/a/25575009
64455 var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
64456
64457
64458 function uiCommit(context) {
64459     var dispatch$$1 = dispatch('cancel', 'save'),
64460         userDetails,
64461         _selection;
64462
64463     var changesetEditor = uiChangesetEditor(context)
64464         .on('change', changeTags);
64465     var rawTagEditor = uiRawTagEditor(context)
64466         .on('change', changeTags);
64467     var commitChanges = uiCommitChanges(context);
64468     var commitWarnings = uiCommitWarnings(context);
64469
64470
64471     function commit(selection$$1) {
64472         _selection = selection$$1;
64473
64474         var osm = context.connection();
64475         if (!osm) return;
64476
64477         // expire stored comment and hashtags after cutoff datetime - #3947
64478         var commentDate = +context.storage('commentDate') || 0,
64479             currDate = Date.now(),
64480             cutoff = 2 * 86400 * 1000;   // 2 days
64481         if (commentDate > currDate || currDate - commentDate > cutoff) {
64482             context.storage('comment', null);
64483             context.storage('hashtags', null);
64484         }
64485
64486         var tags;
64487         if (!changeset) {
64488             var detected = utilDetect();
64489             tags = {
64490                 comment: context.storage('comment') || '',
64491                 created_by: ('iD ' + context.version).substr(0, 255),
64492                 host: detected.host.substr(0, 255),
64493                 locale: detected.locale.substr(0, 255)
64494             };
64495
64496             // call findHashtags initially - this will remove stored
64497             // hashtags if any hashtags are found in the comment - #4304
64498             findHashtags(tags, true);
64499
64500             var hashtags = context.storage('hashtags');
64501             if (hashtags) {
64502                 tags.hashtags = hashtags;
64503             }
64504
64505             changeset = new osmChangeset({ tags: tags });
64506         }
64507
64508         tags = clone(changeset.tags);
64509         tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
64510         changeset = changeset.update({ tags: tags });
64511
64512         var header = selection$$1.selectAll('.header')
64513             .data([0]);
64514
64515         header.enter()
64516             .append('div')
64517             .attr('class', 'header fillL')
64518             .append('h3')
64519             .text(t('commit.title'));
64520
64521         var body = selection$$1.selectAll('.body')
64522             .data([0]);
64523
64524         body = body.enter()
64525             .append('div')
64526             .attr('class', 'body')
64527             .merge(body);
64528
64529
64530         // Changeset Section
64531         var changesetSection = body.selectAll('.changeset-editor')
64532             .data([0]);
64533
64534         changesetSection = changesetSection.enter()
64535             .append('div')
64536             .attr('class', 'modal-section changeset-editor')
64537             .merge(changesetSection);
64538
64539         changesetSection
64540             .call(changesetEditor
64541                 .changesetID(changeset.id)
64542                 .tags(tags)
64543             );
64544
64545
64546         // Warnings
64547         body.call(commitWarnings);
64548
64549
64550         // Upload Explanation
64551         var saveSection = body.selectAll('.save-section')
64552             .data([0]);
64553
64554         saveSection = saveSection.enter()
64555             .append('div')
64556             .attr('class','modal-section save-section fillL cf')
64557             .merge(saveSection);
64558
64559         var prose = saveSection.selectAll('.commit-info')
64560             .data([0]);
64561
64562         prose = prose.enter()
64563             .append('p')
64564             .attr('class', 'commit-info')
64565             .text(t('commit.upload_explanation'))
64566             .merge(prose);
64567
64568         osm.userDetails(function(err, user) {
64569             if (err) return;
64570
64571             var userLink = d3_select(document.createElement('div'));
64572
64573             userDetails = user;
64574
64575             if (user.image_url) {
64576                 userLink
64577                     .append('img')
64578                     .attr('src', user.image_url)
64579                     .attr('class', 'icon pre-text user-icon');
64580             }
64581
64582             userLink
64583                 .append('a')
64584                 .attr('class','user-info')
64585                 .text(user.display_name)
64586                 .attr('href', osm.userURL(user.display_name))
64587                 .attr('tabindex', -1)
64588                 .attr('target', '_blank');
64589
64590             prose
64591                 .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
64592         });
64593
64594
64595         // Request Review
64596         var requestReview = saveSection.selectAll('.request-review')
64597             .data([0]);
64598
64599         // Enter
64600         var requestReviewEnter = requestReview.enter()
64601             .append('div')
64602             .attr('class', 'request-review');
64603
64604         var labelEnter = requestReviewEnter
64605             .append('label')
64606             .attr('for', 'commit-input-request-review');
64607
64608         labelEnter
64609             .append('input')
64610             .attr('type', 'checkbox')
64611             .attr('id', 'commit-input-request-review');
64612
64613         labelEnter
64614             .append('span')
64615             .text(t('commit.request_review'));
64616
64617         // Update
64618         requestReview = requestReview
64619             .merge(requestReviewEnter);
64620
64621         var requestReviewInput = requestReview.selectAll('input')
64622             .property('checked', isReviewRequested(changeset.tags))
64623             .on('change', toggleRequestReview);
64624
64625
64626         // Buttons
64627         var buttonSection = saveSection.selectAll('.buttons')
64628             .data([0]);
64629
64630         // enter
64631         var buttonEnter = buttonSection.enter()
64632             .append('div')
64633             .attr('class', 'buttons fillL cf');
64634
64635         buttonEnter
64636             .append('button')
64637             .attr('class', 'secondary-action col5 button cancel-button')
64638             .append('span')
64639             .attr('class', 'label')
64640             .text(t('commit.cancel'));
64641
64642         buttonEnter
64643             .append('button')
64644             .attr('class', 'action col5 button save-button')
64645             .append('span')
64646             .attr('class', 'label')
64647             .text(t('commit.save'));
64648
64649         // update
64650         buttonSection = buttonSection
64651             .merge(buttonEnter);
64652
64653         buttonSection.selectAll('.cancel-button')
64654             .on('click.cancel', function() {
64655                 dispatch$$1.call('cancel');
64656             });
64657
64658         buttonSection.selectAll('.save-button')
64659             .attr('disabled', function() {
64660                 var n = d3_select('#preset-input-comment').node();
64661                 return (n && n.value.length) ? null : true;
64662             })
64663             .on('click.save', function() {
64664                 dispatch$$1.call('save', this, changeset);
64665             });
64666
64667
64668         // Raw Tag Editor
64669         var tagSection = body.selectAll('.tag-section.raw-tag-editor')
64670             .data([0]);
64671
64672         tagSection = tagSection.enter()
64673             .append('div')
64674             .attr('class', 'modal-section tag-section raw-tag-editor')
64675             .merge(tagSection);
64676
64677         var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
64678         tagSection
64679             .call(rawTagEditor
64680                 .expanded(expanded)
64681                 .readOnlyTags(readOnlyTags)
64682                 .tags(clone(changeset.tags))
64683             );
64684
64685
64686         // Change summary
64687         body.call(commitChanges);
64688
64689
64690         function toggleRequestReview() {
64691             var rr = requestReviewInput.property('checked');
64692             updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
64693
64694             var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
64695
64696             tagSection
64697                 .call(rawTagEditor
64698                     .expanded(expanded)
64699                     .readOnlyTags(readOnlyTags)
64700                     .tags(clone(changeset.tags))
64701                 );
64702         }
64703     }
64704
64705
64706     function changeTags(changed, onInput) {
64707         if (changed.hasOwnProperty('comment')) {
64708             if (changed.comment === undefined) {
64709                 changed.comment = '';
64710             }
64711             if (!onInput) {
64712                 context.storage('comment', changed.comment);
64713                 context.storage('commentDate', Date.now());
64714             }
64715         }
64716
64717         updateChangeset(changed, onInput);
64718
64719         if (_selection) {
64720             _selection.call(commit);
64721         }
64722     }
64723
64724
64725     function findHashtags(tags, commentOnly) {
64726         var inComment = commentTags(),
64727             inHashTags = hashTags();
64728
64729         if (inComment !== null) {                    // when hashtags are detected in comment...
64730             context.storage('hashtags', null);       // always remove stored hashtags - #4304
64731             if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
64732         }
64733         return unionBy(inComment, inHashTags, function (s) {
64734             return s.toLowerCase();
64735         });
64736
64737         // Extract hashtags from `comment`
64738         function commentTags() {
64739             return tags.comment
64740                 .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
64741                 .match(hashtagRegex);
64742         }
64743
64744         // Extract and clean hashtags from `hashtags`
64745         function hashTags() {
64746             var t$$1 = tags.hashtags || '';
64747             return t$$1
64748                 .split(/[,;\s]+/)
64749                 .map(function (s) {
64750                     if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
64751                     var matched = s.match(hashtagRegex);
64752                     return matched && matched[0];
64753                 }).filter(Boolean);                       // exclude falsey
64754         }
64755     }
64756
64757
64758     function isReviewRequested(tags) {
64759         var rr = tags.review_requested;
64760         if (rr === undefined) return false;
64761         rr = rr.trim().toLowerCase();
64762         return !(rr === '' || rr === 'no');
64763     }
64764
64765
64766     function updateChangeset(changed, onInput) {
64767         var tags = clone(changeset.tags);
64768
64769         forEach(changed, function(v, k) {
64770             k = k.trim().substr(0, 255);
64771             if (readOnlyTags.indexOf(k) !== -1) return;
64772
64773             if (k !== '' && v !== undefined) {
64774                 if (onInput) {
64775                     tags[k] = v;
64776                 } else {
64777                     tags[k] = v.trim().substr(0, 255);
64778                 }
64779             } else {
64780                 delete tags[k];
64781             }
64782         });
64783
64784         if (!onInput) {
64785             // when changing the comment, override hashtags with any found in comment.
64786             var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
64787             var arr = findHashtags(tags, commentOnly);
64788             if (arr.length) {
64789                 tags.hashtags = arr.join(';').substr(0, 255);
64790                 context.storage('hashtags', tags.hashtags);
64791             } else {
64792                 delete tags.hashtags;
64793                 context.storage('hashtags', null);
64794             }
64795         }
64796
64797         // always update userdetails, just in case user reauthenticates as someone else
64798         if (userDetails && userDetails.changesets_count !== undefined) {
64799             var changesetsCount = parseInt(userDetails.changesets_count, 10) + 1;  // #4283
64800             tags.changesets_count = String(changesetsCount);
64801
64802             // first 100 edits - new user
64803             if (changesetsCount <= 100) {
64804                 var s;
64805                 s = context.storage('walkthrough_completed');
64806                 if (s) {
64807                     tags['ideditor:walkthrough_completed'] = s;
64808                 }
64809
64810                 s = context.storage('walkthrough_progress');
64811                 if (s) {
64812                     tags['ideditor:walkthrough_progress'] = s;
64813                 }
64814
64815                 s = context.storage('walkthrough_started');
64816                 if (s) {
64817                     tags['ideditor:walkthrough_started'] = s;
64818                 }
64819             }
64820         } else {
64821             delete tags.changesets_count;
64822         }
64823
64824         if (!isEqual(changeset.tags, tags)) {
64825             changeset = changeset.update({ tags: tags });
64826         }
64827     }
64828
64829
64830     commit.reset = function() {
64831         changeset = null;
64832     };
64833
64834
64835     return utilRebind(commit, dispatch$$1, 'on');
64836 }
64837
64838 function uiConfirm(selection) {
64839     var modalSelection = uiModal(selection);
64840
64841     modalSelection.select('.modal')
64842         .classed('modal-alert', true);
64843
64844     var section = modalSelection.select('.content');
64845
64846     section.append('div')
64847         .attr('class', 'modal-section header');
64848
64849     section.append('div')
64850         .attr('class', 'modal-section message-text');
64851
64852     var buttons = section.append('div')
64853         .attr('class', 'modal-section buttons cf');
64854
64855
64856     modalSelection.okButton = function() {
64857         buttons
64858             .append('button')
64859             .attr('class', 'action col4')
64860             .on('click.confirm', function() {
64861                 modalSelection.remove();
64862             })
64863             .text(t('confirm.okay'));
64864
64865         return modalSelection;
64866     };
64867
64868
64869     return modalSelection;
64870 }
64871
64872 function uiConflicts(context) {
64873     var dispatch$$1 = dispatch('cancel', 'save'),
64874         origChanges,
64875         conflictList;
64876
64877
64878     function conflicts(selection$$1) {
64879         var header = selection$$1
64880             .append('div')
64881             .attr('class', 'header fillL');
64882
64883         header
64884             .append('button')
64885             .attr('class', 'fr')
64886             .on('click', function() { dispatch$$1.call('cancel'); })
64887             .call(svgIcon('#icon-close'));
64888
64889         header
64890             .append('h3')
64891             .text(t('save.conflict.header'));
64892
64893         var body = selection$$1
64894             .append('div')
64895             .attr('class', 'body fillL');
64896
64897         var conflictsHelp = body
64898             .append('div')
64899             .attr('class', 'conflicts-help')
64900             .text(t('save.conflict.help'));
64901
64902
64903         // Download changes link
64904         var detected = utilDetect(),
64905             changeset = new osmChangeset();
64906
64907         delete changeset.id;  // Export without chnageset_id
64908
64909         var data = JXON.stringify(changeset.osmChangeJXON(origChanges)),
64910             blob = new Blob([data], {type: 'text/xml;charset=utf-8;'}),
64911             fileName = 'changes.osc';
64912
64913         var linkEnter = conflictsHelp.selectAll('.download-changes')
64914             .data([0])
64915             .enter()
64916             .append('a')
64917             .attr('class', 'download-changes');
64918
64919         if (detected.download) {      // All except IE11 and Edge
64920             linkEnter                 // download the data as a file
64921                 .attr('href', window.URL.createObjectURL(blob))
64922                 .attr('download', fileName);
64923
64924         } else {                      // IE11 and Edge
64925             linkEnter                 // open data uri in a new tab
64926                 .attr('target', '_blank')
64927                 .on('click.download', function() {
64928                     navigator.msSaveBlob(blob, fileName);
64929                 });
64930         }
64931
64932         linkEnter
64933             .call(svgIcon('#icon-load', 'inline'))
64934             .append('span')
64935             .text(t('save.conflict.download_changes'));
64936
64937
64938         body
64939             .append('div')
64940             .attr('class', 'conflict-container fillL3')
64941             .call(showConflict, 0);
64942
64943         body
64944             .append('div')
64945             .attr('class', 'conflicts-done')
64946             .attr('opacity', 0)
64947             .style('display', 'none')
64948             .text(t('save.conflict.done'));
64949
64950         var buttons = body
64951             .append('div')
64952             .attr('class','buttons col12 joined conflicts-buttons');
64953
64954         buttons
64955             .append('button')
64956             .attr('disabled', conflictList.length > 1)
64957             .attr('class', 'action conflicts-button col6')
64958             .text(t('save.title'))
64959             .on('click.try_again', function() { dispatch$$1.call('save'); });
64960
64961         buttons
64962             .append('button')
64963             .attr('class', 'secondary-action conflicts-button col6')
64964             .text(t('confirm.cancel'))
64965             .on('click.cancel', function() { dispatch$$1.call('cancel'); });
64966     }
64967
64968
64969     function showConflict(selection$$1, index) {
64970         if (index < 0 || index >= conflictList.length) return;
64971
64972         var parent = d3_select(selection$$1.node().parentNode);
64973
64974         // enable save button if this is the last conflict being reviewed..
64975         if (index === conflictList.length - 1) {
64976             window.setTimeout(function() {
64977                 parent.select('.conflicts-button')
64978                     .attr('disabled', null);
64979
64980                 parent.select('.conflicts-done')
64981                     .transition()
64982                     .attr('opacity', 1)
64983                     .style('display', 'block');
64984             }, 250);
64985         }
64986
64987         var item = selection$$1
64988             .selectAll('.conflict')
64989             .data([conflictList[index]]);
64990
64991         var enter = item.enter()
64992             .append('div')
64993             .attr('class', 'conflict');
64994
64995         enter
64996             .append('h4')
64997             .attr('class', 'conflict-count')
64998             .text(t('save.conflict.count', { num: index + 1, total: conflictList.length }));
64999
65000         enter
65001             .append('a')
65002             .attr('class', 'conflict-description')
65003             .attr('href', '#')
65004             .text(function(d) { return d.name; })
65005             .on('click', function(d) {
65006                 zoomToEntity(d.id);
65007                 event.preventDefault();
65008             });
65009
65010         var details = enter
65011             .append('div')
65012             .attr('class', 'conflict-detail-container');
65013
65014         details
65015             .append('ul')
65016             .attr('class', 'conflict-detail-list')
65017             .selectAll('li')
65018             .data(function(d) { return d.details || []; })
65019             .enter()
65020             .append('li')
65021             .attr('class', 'conflict-detail-item')
65022             .html(function(d) { return d; });
65023
65024         details
65025             .append('div')
65026             .attr('class', 'conflict-choices')
65027             .call(addChoices);
65028
65029         details
65030             .append('div')
65031             .attr('class', 'conflict-nav-buttons joined cf')
65032             .selectAll('button')
65033             .data(['previous', 'next'])
65034             .enter()
65035             .append('button')
65036             .text(function(d) { return t('save.conflict.' + d); })
65037             .attr('class', 'conflict-nav-button action col6')
65038             .attr('disabled', function(d, i) {
65039                 return (i === 0 && index === 0) ||
65040                     (i === 1 && index === conflictList.length - 1) || null;
65041             })
65042             .on('click', function(d, i) {
65043                 var container = parent.select('.conflict-container'),
65044                 sign = (i === 0 ? -1 : 1);
65045
65046                 container
65047                     .selectAll('.conflict')
65048                     .remove();
65049
65050                 container
65051                     .call(showConflict, index + sign);
65052
65053                 event.preventDefault();
65054             });
65055
65056         item.exit()
65057             .remove();
65058     }
65059
65060
65061     function addChoices(selection$$1) {
65062         var choices = selection$$1
65063             .append('ul')
65064             .attr('class', 'layer-list')
65065             .selectAll('li')
65066             .data(function(d) { return d.choices || []; });
65067
65068         var enter = choices.enter()
65069             .append('li')
65070             .attr('class', 'layer');
65071
65072         var label = enter
65073             .append('label');
65074
65075         label
65076             .append('input')
65077             .attr('type', 'radio')
65078             .attr('name', function(d) { return d.id; })
65079             .on('change', function(d, i) {
65080                 var ul = this.parentNode.parentNode.parentNode;
65081                 ul.__data__.chosen = i;
65082                 choose(ul, d);
65083             });
65084
65085         label
65086             .append('span')
65087             .text(function(d) { return d.text; });
65088
65089         choices
65090             .each(function(d, i) {
65091                 var ul = this.parentNode;
65092                 if (ul.__data__.chosen === i) choose(ul, d);
65093             });
65094     }
65095
65096
65097     function choose(ul, datum) {
65098         if (event) event.preventDefault();
65099
65100         d3_select(ul)
65101             .selectAll('li')
65102             .classed('active', function(d) { return d === datum; })
65103             .selectAll('input')
65104             .property('checked', function(d) { return d === datum; });
65105
65106         var extent = geoExtent$$1(),
65107             entity;
65108
65109         entity = context.graph().hasEntity(datum.id);
65110         if (entity) extent._extend(entity.extent(context.graph()));
65111
65112         datum.action();
65113
65114         entity = context.graph().hasEntity(datum.id);
65115         if (entity) extent._extend(entity.extent(context.graph()));
65116
65117         zoomToEntity(datum.id, extent);
65118     }
65119
65120
65121     function zoomToEntity(id, extent) {
65122         context.surface().selectAll('.hover')
65123             .classed('hover', false);
65124
65125         var entity = context.graph().hasEntity(id);
65126         if (entity) {
65127             if (extent) {
65128                 context.map().trimmedExtent(extent);
65129             } else {
65130                 context.map().zoomTo(entity);
65131             }
65132             context.surface().selectAll(
65133                 utilEntityOrMemberSelector([entity.id], context.graph()))
65134                 .classed('hover', true);
65135         }
65136     }
65137
65138
65139     // The conflict list should be an array of objects like:
65140     // {
65141     //     id: id,
65142     //     name: entityName(local),
65143     //     details: merge.conflicts(),
65144     //     chosen: 1,
65145     //     choices: [
65146     //         choice(id, keepMine, forceLocal),
65147     //         choice(id, keepTheirs, forceRemote)
65148     //     ]
65149     // }
65150     conflicts.list = function(_) {
65151         if (!arguments.length) return conflictList;
65152         conflictList = _;
65153         return conflicts;
65154     };
65155
65156
65157     conflicts.origChanges = function(_) {
65158         if (!arguments.length) return origChanges;
65159         origChanges = _;
65160         return conflicts;
65161     };
65162
65163
65164     return utilRebind(conflicts, dispatch$$1, 'on');
65165 }
65166
65167 function uiEditMenu(context, operations) {
65168     var menu,
65169         center = [0, 0],
65170         offset = [0, 0],
65171         tooltip;
65172
65173     var p = 8,               // top padding
65174         m = 4,               // top margin
65175         h = 15,              // height of icon
65176         vpBottomMargin = 45, // viewport bottom margin
65177         vpSideMargin = 35,   // viewport side margin
65178         buttonWidth = 44,
65179         buttonHeight = (2 * p + h),
65180         menuWidth = buttonWidth,
65181         menuHeight = (2 * m) + operations.length * buttonHeight,
65182         menuSideMargin = 10,
65183         tooltipWidth = 200,
65184         tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
65185
65186
65187     var editMenu = function (selection$$1) {
65188         if (!operations.length) return;
65189
65190         selection$$1.node().parentNode.focus();
65191
65192         var isRTL = textDirection === 'rtl',
65193             viewport = context.surfaceRect();
65194
65195         if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
65196             // menu is going left-to-right and near right viewport edge, go left instead
65197             isRTL = true;
65198         } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
65199             // menu is going right-to-left and near left viewport edge, go right instead
65200             isRTL = false;
65201         }
65202
65203         offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
65204
65205         if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
65206             // menu is near bottom viewport edge, shift upwards
65207             offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
65208         }
65209
65210         var origin = [ center[0] + offset[0], center[1] + offset[1] ];
65211
65212         menu = selection$$1
65213             .append('g')
65214             .attr('class', 'edit-menu')
65215             .attr('transform', 'translate(' + origin + ')')
65216             .attr('opacity', 0);
65217
65218         menu
65219             .transition()
65220             .attr('opacity', 1);
65221
65222         menu
65223             .append('rect')
65224             .attr('class', 'edit-menu-background')
65225             .attr('x', 4)
65226             .attr('rx', 4)
65227             .attr('ry', 4)
65228             .attr('width', menuWidth)
65229             .attr('height', menuHeight)
65230             .attr('stroke-linecap', 'round');
65231
65232
65233         var button = menu.selectAll('.edit-menu-item')
65234             .data(operations)
65235             .enter()
65236             .append('g')
65237             .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
65238             .classed('disabled', function (d) { return d.disabled(); })
65239             .attr('transform', function (d, i) {
65240                 return 'translate(' + geoRoundCoords([
65241                     0,
65242                     m + i * buttonHeight
65243                 ]).join(',') + ')';
65244             });
65245
65246         button
65247             .append('rect')
65248             .attr('x', 4)
65249             .attr('width', buttonWidth)
65250             .attr('height', buttonHeight)
65251             .on('click', click)
65252             .on('mousedown', mousedown)
65253             .on('mouseover', mouseover)
65254             .on('mouseout', mouseout);
65255
65256         button
65257             .append('use')
65258             .attr('width', '20')
65259             .attr('height', '20')
65260             .attr('transform', function () {
65261                 return 'translate(' + [2 * p, 5] + ')';
65262             })
65263             .attr('xlink:href', function (d) { return '#operation-' + d.id; });
65264
65265         tooltip = d3_select(document.body)
65266             .append('div')
65267             .attr('class', 'tooltip-inner edit-menu-tooltip');
65268
65269
65270         function click(operation) {
65271             event.stopPropagation();
65272             if (operation.disabled()) return;
65273             operation();
65274             editMenu.close();
65275         }
65276
65277         function mousedown() {
65278             event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
65279         }
65280
65281         function mouseover(d, i) {
65282             var tipX, tipY;
65283
65284             if (!isRTL) {
65285                 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
65286             } else {
65287                 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
65288             }
65289
65290             if (tipX + tooltipWidth > viewport.right) {
65291                 // tip is going left-to-right and near right viewport edge, go left instead
65292                 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
65293             } else if (tipX < viewport.left) {
65294                 // tip is going right-to-left and near left viewport edge, go right instead
65295                 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
65296             }
65297
65298             tipY = viewport.top + origin[1] + (i * buttonHeight);
65299             if (tipY + tooltipHeight > viewport.bottom) {
65300                 // tip is near bottom viewport edge, shift upwards
65301                 tipY -= tipY + tooltipHeight - viewport.bottom;
65302             }
65303
65304             tooltip
65305                 .style('left', tipX + 'px')
65306                 .style('top', tipY + 'px')
65307                 .style('display', 'block')
65308                 .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
65309         }
65310
65311         function mouseout() {
65312             tooltip.style('display', 'none');
65313         }
65314     };
65315
65316
65317     editMenu.close = function () {
65318         if (menu) {
65319             menu
65320                 .style('pointer-events', 'none')
65321                 .transition()
65322                 .attr('opacity', 0)
65323                 .remove();
65324         }
65325
65326         if (tooltip) {
65327             tooltip.remove();
65328         }
65329     };
65330
65331
65332     editMenu.center = function (_) {
65333         if (!arguments.length) return center;
65334         center = _;
65335         return editMenu;
65336     };
65337
65338
65339     return editMenu;
65340 }
65341
65342 var timer$1;
65343
65344
65345 function uiFlash(showDuration) {
65346     showDuration = showDuration || 1500;
65347
65348     if (timer$1) {
65349         timer$1.stop();
65350     }
65351
65352     d3_select('#footer-wrap')
65353         .attr('class', 'footer-hide');
65354     d3_select('#flash-wrap')
65355         .attr('class', 'footer-show');
65356
65357     var content = d3_select('#flash-wrap').selectAll('.content')
65358         .data([0]);
65359
65360     content = content.enter()
65361         .append('div')
65362         .attr('class', 'content')
65363         .merge(content);
65364
65365     timer$1 = d3_timeout(function() {
65366         timer$1 = null;
65367         d3_select('#footer-wrap')
65368             .attr('class', 'footer-show');
65369         d3_select('#flash-wrap')
65370             .attr('class', 'footer-hide');
65371     }, showDuration);
65372
65373
65374     return content;
65375 }
65376
65377 function uiLasso(context) {
65378     var group, polygon;
65379
65380     lasso.coordinates = [];
65381
65382     function lasso(selection$$1) {
65383         context.container()
65384             .classed('lasso', true);
65385
65386         group = selection$$1
65387             .append('g')
65388             .attr('class', 'lasso hide');
65389
65390         polygon = group
65391             .append('path')
65392             .attr('class', 'lasso-path');
65393
65394         group
65395             .call(uiToggle(true));
65396     }
65397
65398
65399     function draw() {
65400         if (polygon) {
65401             polygon.data([lasso.coordinates])
65402                 .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
65403         }
65404     }
65405
65406
65407     lasso.extent = function () {
65408         return lasso.coordinates.reduce(function(extent, point) {
65409             return extent.extend(geoExtent$$1(point));
65410         }, geoExtent$$1());
65411     };
65412
65413
65414     lasso.p = function(_) {
65415         if (!arguments.length) return lasso;
65416         lasso.coordinates.push(_);
65417         draw();
65418         return lasso;
65419     };
65420
65421
65422     lasso.close = function() {
65423         if (group) {
65424             group.call(uiToggle(false, function() {
65425                 d3_select(this).remove();
65426             }));
65427         }
65428         context.container().classed('lasso', false);
65429     };
65430
65431
65432     return lasso;
65433 }
65434
65435 function uiRadialMenu(context, operations) {
65436     var menu,
65437         center = [0, 0],
65438         tooltip;
65439
65440
65441     var radialMenu = function(selection$$1) {
65442         if (!operations.length) return;
65443
65444         selection$$1.node().parentNode.focus();
65445
65446         function click(operation) {
65447             event.stopPropagation();
65448             if (operation.disabled()) return;
65449             operation();
65450             radialMenu.close();
65451         }
65452
65453         menu = selection$$1
65454             .append('g')
65455             .attr('class', 'radial-menu')
65456             .attr('transform', 'translate(' + center + ')')
65457             .attr('opacity', 0);
65458
65459         menu
65460             .transition()
65461             .attr('opacity', 1);
65462
65463         var r = 50,
65464             a = Math.PI / 4,
65465             a0 = -Math.PI / 4,
65466             a1 = a0 + (operations.length - 1) * a;
65467
65468         menu
65469             .append('path')
65470             .attr('class', 'radial-menu-background')
65471             .attr('d', 'M' + r * Math.sin(a0) + ',' +
65472                              r * Math.cos(a0) +
65473                       ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
65474                              (r * Math.sin(a1) + 1e-3) + ',' +
65475                              (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
65476             .attr('stroke-width', 50)
65477             .attr('stroke-linecap', 'round');
65478
65479         var button = menu.selectAll()
65480             .data(operations)
65481             .enter()
65482             .append('g')
65483             .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
65484             .classed('disabled', function(d) { return d.disabled(); })
65485             .attr('transform', function(d, i) {
65486                 return 'translate(' + geoRoundCoords([
65487                         r * Math.sin(a0 + i * a),
65488                         r * Math.cos(a0 + i * a)]).join(',') + ')';
65489             });
65490
65491         button
65492             .append('circle')
65493             .attr('r', 15)
65494             .on('click', click)
65495             .on('mousedown', mousedown)
65496             .on('mouseover', mouseover)
65497             .on('mouseout', mouseout);
65498
65499         button
65500             .append('use')
65501             .attr('transform', 'translate(-10,-10)')
65502             .attr('width', '20')
65503             .attr('height', '20')
65504             .attr('xlink:href', function(d) { return '#operation-' + d.id; });
65505
65506         tooltip = d3_select(document.body)
65507             .append('div')
65508             .attr('class', 'tooltip-inner radial-menu-tooltip');
65509
65510         function mousedown() {
65511             event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
65512         }
65513
65514         function mouseover(d, i) {
65515             var rect = context.surfaceRect(),
65516                 angle = a0 + i * a,
65517                 top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px',
65518                 left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px',
65519                 bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px',
65520                 right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
65521
65522             tooltip
65523                 .style('top', null)
65524                 .style('left', null)
65525                 .style('bottom', null)
65526                 .style('right', null)
65527                 .style('display', 'block')
65528                 .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
65529
65530             if (i === 0) {
65531                 tooltip
65532                     .style('right', right)
65533                     .style('top', top);
65534             } else if (i >= 4) {
65535                 tooltip
65536                     .style('left', left)
65537                     .style('bottom', bottom);
65538             } else {
65539                 tooltip
65540                     .style('left', left)
65541                     .style('top', top);
65542             }
65543         }
65544
65545         function mouseout() {
65546             tooltip.style('display', 'none');
65547         }
65548     };
65549
65550
65551     radialMenu.close = function() {
65552         if (menu) {
65553             menu
65554                 .style('pointer-events', 'none')
65555                 .transition()
65556                 .attr('opacity', 0)
65557                 .remove();
65558         }
65559
65560         if (tooltip) {
65561             tooltip.remove();
65562         }
65563     };
65564
65565
65566     radialMenu.center = function(_) {
65567         if (!arguments.length) return center;
65568         center = _;
65569         return radialMenu;
65570     };
65571
65572
65573     return radialMenu;
65574 }
65575
65576 function uiSelectionList(context, selectedIDs) {
65577
65578     function selectEntity(entity) {
65579         context.enter(modeSelect(context, [entity.id]));
65580     }
65581
65582
65583     function deselectEntity(entity) {
65584         event.stopPropagation();
65585         var index = selectedIDs.indexOf(entity.id);
65586         if (index > -1) {
65587             selectedIDs.splice(index, 1);
65588         }
65589         context.enter(modeSelect(context, selectedIDs));
65590     }
65591
65592
65593     function selectionList(selection$$1) {
65594         selection$$1.classed('selection-list-pane', true);
65595
65596         var header = selection$$1
65597             .append('div')
65598             .attr('class', 'header fillL cf');
65599
65600         header
65601             .append('h3')
65602             .text(t('inspector.multiselect'));
65603
65604         var listWrap = selection$$1
65605             .append('div')
65606             .attr('class', 'inspector-body');
65607
65608         var list = listWrap
65609             .append('div')
65610             .attr('class', 'feature-list cf');
65611
65612         context.history().on('change.selection-list', drawList);
65613         drawList();
65614
65615
65616         function drawList() {
65617             var entities = selectedIDs
65618                 .map(function(id) { return context.hasEntity(id); })
65619                 .filter(function(entity) { return entity; });
65620
65621             var items = list.selectAll('.feature-list-item')
65622                 .data(entities, osmEntity$$1.key);
65623
65624             items.exit()
65625                 .remove();
65626
65627             // Enter
65628             var enter = items.enter()
65629                 .append('div')
65630                 .attr('class', 'feature-list-item')
65631                 .on('click', selectEntity);
65632
65633             var label = enter
65634                 .append('button')
65635                 .attr('class', 'label');
65636
65637             enter
65638                 .append('button')
65639                 .attr('class', 'close')
65640                 .on('click', deselectEntity)
65641                 .call(svgIcon('#icon-close'));
65642
65643             label
65644                 .append('span')
65645                 .attr('class', 'entity-geom-icon')
65646                 .call(svgIcon('', 'pre-text'));
65647
65648             label
65649                 .append('span')
65650                 .attr('class', 'entity-type');
65651
65652             label
65653                 .append('span')
65654                 .attr('class', 'entity-name');
65655
65656             // Update
65657             items = items.merge(enter);
65658
65659             items.selectAll('.entity-geom-icon use')
65660                 .attr('href', function() {
65661                     var entity = this.parentNode.parentNode.__data__;
65662                     return '#icon-' + context.geometry(entity.id);
65663                 });
65664
65665             items.selectAll('.entity-type')
65666                 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
65667
65668             items.selectAll('.entity-name')
65669                 .text(function(entity) { return utilDisplayName(entity); });
65670         }
65671     }
65672
65673     return selectionList;
65674 }
65675
65676 function uiSourceSwitch(context) {
65677     var keys;
65678
65679
65680     function click() {
65681         event.preventDefault();
65682         if (context.inIntro()) return;
65683
65684         if (context.history().hasChanges() &&
65685             !window.confirm(t('source_switch.lose_changes'))) return;
65686
65687         var live = d3_select(this)
65688             .classed('live');
65689
65690         context.history().clearSaved();
65691         context.connection().switch(live ? keys[1] : keys[0]);
65692         context.enter(modeBrowse(context));
65693         context.flush();
65694
65695         d3_select(this)
65696             .text(live ? t('source_switch.dev') : t('source_switch.live'))
65697             .classed('live', !live);
65698     }
65699
65700     var sourceSwitch = function(selection$$1) {
65701         selection$$1
65702             .append('a')
65703             .attr('href', '#')
65704             .text(t('source_switch.live'))
65705             .classed('live', true)
65706             .attr('tabindex', -1)
65707             .on('click', click);
65708     };
65709
65710
65711     sourceSwitch.keys = function(_) {
65712         if (!arguments.length) return keys;
65713         keys = _;
65714         return sourceSwitch;
65715     };
65716
65717
65718     return sourceSwitch;
65719 }
65720
65721 function uiSuccess(context) {
65722     var dispatch$$1 = dispatch('cancel'),
65723         changeset;
65724
65725
65726     function success(selection$$1) {
65727         var header = selection$$1
65728             .append('div')
65729             .attr('class', 'header fillL');
65730
65731         header
65732             .append('button')
65733             .attr('class', 'fr')
65734             .on('click', function() { dispatch$$1.call('cancel'); })
65735             .call(svgIcon('#icon-close'));
65736
65737         header
65738             .append('h3')
65739             .text(t('success.just_edited'));
65740
65741         var body = selection$$1
65742             .append('div')
65743             .attr('class', 'body save-success fillL');
65744
65745         body
65746             .append('p')
65747             .html(t('success.help_html'));
65748
65749         body
65750             .append('a')
65751             .attr('class', 'details')
65752             .attr('target', '_blank')
65753             .attr('tabindex', -1)
65754             .call(svgIcon('#icon-out-link', 'inline'))
65755             .attr('href', t('success.help_link_url'))
65756             .append('span')
65757             .text(t('success.help_link_text'));
65758
65759         var osm = context.connection();
65760         if (!osm) return;
65761
65762         var changesetURL = osm.changesetURL(changeset.id);
65763
65764         var viewOnOsm = body
65765             .append('a')
65766             .attr('class', 'button col12 osm')
65767             .attr('target', '_blank')
65768             .attr('href', changesetURL);
65769
65770         viewOnOsm
65771             .append('svg')
65772             .attr('class', 'logo logo-osm')
65773             .append('use')
65774             .attr('xlink:href', '#logo-osm');
65775
65776         viewOnOsm
65777             .append('div')
65778             .text(t('success.view_on_osm'));
65779
65780         var message = (changeset.tags.comment || t('success.edited_osm')).substring(0, 130) +
65781             ' ' + changesetURL;
65782
65783         var sharing = [
65784             { key: 'facebook', value: 'https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(changesetURL) },
65785             { key: 'twitter', value: 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message) },
65786             { key: 'google', value: 'https://plus.google.com/share?url=' + encodeURIComponent(changesetURL) }
65787         ];
65788
65789         body.selectAll('.button.social')
65790             .data(sharing)
65791             .enter()
65792             .append('a')
65793             .attr('class', 'button social col4')
65794             .attr('target', '_blank')
65795             .attr('href', function(d) { return d.value; })
65796             .call(tooltip()
65797                 .title(function(d) { return t('success.' + d.key); })
65798                 .placement('bottom'))
65799             .each(function(d) { d3_select(this).call(svgIcon('#logo-' + d.key, 'social')); });
65800     }
65801
65802
65803     success.changeset = function(_) {
65804         if (!arguments.length) return changeset;
65805         changeset = _;
65806         return success;
65807     };
65808
65809
65810     return utilRebind(success, dispatch$$1, 'on');
65811 }
65812
65813 function coreHistory(context) {
65814     var imageryUsed = ['Bing'],
65815         dispatch$$1 = dispatch('change', 'undone', 'redone'),
65816         lock = utilSessionMutex('lock'),
65817         duration = 150,
65818         checkpoints = {},
65819         stack, index, tree;
65820
65821
65822     // internal _act, accepts list of actions and eased time
65823     function _act(actions, t) {
65824         actions = Array.prototype.slice.call(actions);
65825
65826         var annotation;
65827
65828         if (!isFunction(actions[actions.length - 1])) {
65829             annotation = actions.pop();
65830         }
65831
65832         stack[index].transform = context.projection.transform();
65833         stack[index].selectedIDs = context.selectedIDs();
65834
65835         var graph = stack[index].graph;
65836         for (var i = 0; i < actions.length; i++) {
65837             graph = actions[i](graph, t);
65838         }
65839
65840         return {
65841             graph: graph,
65842             annotation: annotation,
65843             imageryUsed: imageryUsed
65844         };
65845     }
65846
65847
65848     // internal _perform with eased time
65849     function _perform(args, t) {
65850         var previous = stack[index].graph;
65851         stack = stack.slice(0, index + 1);
65852         stack.push(_act(args, t));
65853         index++;
65854         return change(previous);
65855     }
65856
65857
65858     // internal _replace with eased time
65859     function _replace(args, t) {
65860         var previous = stack[index].graph;
65861         // assert(index == stack.length - 1)
65862         stack[index] = _act(args, t);
65863         return change(previous);
65864     }
65865
65866
65867     // internal _overwrite with eased time
65868     function _overwrite(args, t) {
65869         var previous = stack[index].graph;
65870         if (index > 0) {
65871             index--;
65872             stack.pop();
65873         }
65874         stack = stack.slice(0, index + 1);
65875         stack.push(_act(args, t));
65876         index++;
65877         return change(previous);
65878     }
65879
65880
65881     // determine diffrence and dispatch a change event
65882     function change(previous) {
65883         var difference$$1 = coreDifference(previous, history.graph());
65884         dispatch$$1.call('change', this, difference$$1);
65885         return difference$$1;
65886     }
65887
65888
65889     // iD uses namespaced keys so multiple installations do not conflict
65890     function getKey(n) {
65891         return 'iD_' + window.location.origin + '_' + n;
65892     }
65893
65894
65895     var history = {
65896
65897         graph: function() {
65898             return stack[index].graph;
65899         },
65900
65901
65902         base: function() {
65903             return stack[0].graph;
65904         },
65905
65906
65907         merge: function(entities, extent) {
65908             stack[0].graph.rebase(entities, map$4(stack, 'graph'), false);
65909             tree.rebase(entities, false);
65910
65911             dispatch$$1.call('change', this, undefined, extent);
65912         },
65913
65914
65915         perform: function() {
65916             // complete any transition already in progress
65917             d3_select(document).interrupt('history.perform');
65918
65919             var transitionable = false,
65920                 action0 = arguments[0];
65921
65922             if (arguments.length === 1 ||
65923                 arguments.length === 2 && !isFunction(arguments[1])) {
65924                 transitionable = !!action0.transitionable;
65925             }
65926
65927             if (transitionable) {
65928                 var origArguments = arguments;
65929                 d3_select(document)
65930                     .transition('history.perform')
65931                     .duration(duration)
65932                     .ease(linear$1)
65933                     .tween('history.tween', function() {
65934                         return function(t) {
65935                             if (t < 1) _overwrite([action0], t);
65936                         };
65937                     })
65938                     .on('start', function() {
65939                         _perform([action0], 0);
65940                     })
65941                     .on('end interrupt', function() {
65942                         _overwrite(origArguments, 1);
65943                     });
65944
65945             } else {
65946                 return _perform(arguments);
65947             }
65948         },
65949
65950
65951         replace: function() {
65952             d3_select(document).interrupt('history.perform');
65953             return _replace(arguments, 1);
65954         },
65955
65956
65957         // Same as calling pop and then perform
65958         overwrite: function() {
65959             d3_select(document).interrupt('history.perform');
65960             return _overwrite(arguments, 1);
65961         },
65962
65963
65964         pop: function(n) {
65965             d3_select(document).interrupt('history.perform');
65966
65967             var previous = stack[index].graph;
65968             if (isNaN(+n) || +n < 0) {
65969                 n = 1;
65970             }
65971             while (n-- > 0 && index > 0) {
65972                 index--;
65973                 stack.pop();
65974             }
65975             return change(previous);
65976         },
65977
65978
65979         // Back to the previous annotated state or index = 0.
65980         undo: function() {
65981             d3_select(document).interrupt('history.perform');
65982
65983             var previous = stack[index].graph;
65984             while (index > 0) {
65985                 index--;
65986                 if (stack[index].annotation) break;
65987             }
65988
65989             dispatch$$1.call('undone', this, stack[index]);
65990             return change(previous);
65991         },
65992
65993
65994         // Forward to the next annotated state.
65995         redo: function() {
65996             d3_select(document).interrupt('history.perform');
65997
65998             var previous = stack[index].graph;
65999             var tryIndex = index;
66000             while (tryIndex < stack.length - 1) {
66001                 tryIndex++;
66002                 if (stack[tryIndex].annotation) {
66003                     index = tryIndex;
66004                     dispatch$$1.call('redone', this, stack[index]);
66005                     break;
66006                 }
66007             }
66008
66009             return change(previous);
66010         },
66011
66012
66013         undoAnnotation: function() {
66014             var i = index;
66015             while (i >= 0) {
66016                 if (stack[i].annotation) return stack[i].annotation;
66017                 i--;
66018             }
66019         },
66020
66021
66022         redoAnnotation: function() {
66023             var i = index + 1;
66024             while (i <= stack.length - 1) {
66025                 if (stack[i].annotation) return stack[i].annotation;
66026                 i++;
66027             }
66028         },
66029
66030
66031         intersects: function(extent) {
66032             return tree.intersects(extent, stack[index].graph);
66033         },
66034
66035
66036         difference: function() {
66037             var base = stack[0].graph,
66038                 head = stack[index].graph;
66039             return coreDifference(base, head);
66040         },
66041
66042
66043         changes: function(action) {
66044             var base = stack[0].graph,
66045                 head = stack[index].graph;
66046
66047             if (action) {
66048                 head = action(head);
66049             }
66050
66051             var difference$$1 = coreDifference(base, head);
66052
66053             return {
66054                 modified: difference$$1.modified(),
66055                 created: difference$$1.created(),
66056                 deleted: difference$$1.deleted()
66057             };
66058         },
66059
66060
66061         validate: function(changes) {
66062             return flatten(
66063                 map$4(Validations, function(fn) { return fn()(changes, stack[index].graph); })
66064             );
66065         },
66066
66067
66068         hasChanges: function() {
66069             return this.difference().length() > 0;
66070         },
66071
66072
66073         imageryUsed: function(sources) {
66074             if (sources) {
66075                 imageryUsed = sources;
66076                 return history;
66077             } else {
66078                 var arr = map$4(stack.slice(1, index + 1), 'imageryUsed');
66079                 return without(uniq(flatten(arr)), 'Custom');
66080             }
66081         },
66082
66083
66084         // save the current history state
66085         checkpoint: function(key) {
66086             checkpoints[key] = {
66087                 stack: cloneDeep(stack),
66088                 index: index
66089             };
66090             return history;
66091         },
66092
66093
66094         // restore history state to a given checkpoint or reset completely
66095         reset: function(key) {
66096             if (key !== undefined && checkpoints.hasOwnProperty(key)) {
66097                 stack = cloneDeep(checkpoints[key].stack);
66098                 index = checkpoints[key].index;
66099             } else {
66100                 stack = [{graph: coreGraph$$1()}];
66101                 index = 0;
66102                 tree = coreTree(stack[0].graph);
66103                 checkpoints = {};
66104             }
66105             dispatch$$1.call('change');
66106             return history;
66107         },
66108
66109
66110         toIntroGraph: function() {
66111             var nextId = { n: 0, r: 0, w: 0 },
66112                 permIds = {},
66113                 graph = this.graph(),
66114                 baseEntities = {};
66115
66116             // clone base entities..
66117             forEach(graph.base().entities, function(entity) {
66118                 var copy = cloneDeepWith(entity, customizer);
66119                 baseEntities[copy.id] = copy;
66120             });
66121
66122             // replace base entities with head entities..
66123             forEach(graph.entities, function(entity, id) {
66124                 if (entity) {
66125                     var copy = cloneDeepWith(entity, customizer);
66126                     baseEntities[copy.id] = copy;
66127                 } else {
66128                     delete baseEntities[id];
66129                 }
66130             });
66131
66132             // swap temporary for permanent ids..
66133             forEach(baseEntities, function(entity) {
66134                 if (Array.isArray(entity.nodes)) {
66135                     entity.nodes = entity.nodes.map(function(node) {
66136                         return permIds[node] || node;
66137                     });
66138                 }
66139                 if (Array.isArray(entity.members)) {
66140                     entity.members = entity.members.map(function(member) {
66141                         member.id = permIds[member.id] || member.id;
66142                         return member;
66143                     });
66144                 }
66145             });
66146
66147             return JSON.stringify({ dataIntroGraph: baseEntities });
66148
66149
66150             function customizer(src) {
66151                 var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
66152                 if (isEmpty(copy.tags)) {
66153                     delete copy.tags;
66154                 }
66155
66156                 if (Array.isArray(copy.loc)) {
66157                     copy.loc[0] = +copy.loc[0].toFixed(6);
66158                     copy.loc[1] = +copy.loc[1].toFixed(6);
66159                 }
66160
66161                 var match = src.id.match(/([nrw])-\d*/);  // temporary id
66162                 if (match !== null) {
66163                     var nrw = match[1], permId;
66164                     do { permId = nrw + (++nextId[nrw]); }
66165                     while (baseEntities.hasOwnProperty(permId));
66166
66167                     copy.id = permIds[src.id] = permId;
66168                 }
66169                 return copy;
66170             }
66171         },
66172
66173
66174         toJSON: function() {
66175             if (!this.hasChanges()) return;
66176
66177             var allEntities = {},
66178                 baseEntities = {},
66179                 base = stack[0];
66180
66181             var s = stack.map(function(i) {
66182                 var modified = [], deleted = [];
66183
66184                 forEach(i.graph.entities, function(entity, id) {
66185                     if (entity) {
66186                         var key = osmEntity$$1.key(entity);
66187                         allEntities[key] = entity;
66188                         modified.push(key);
66189                     } else {
66190                         deleted.push(id);
66191                     }
66192
66193                     // make sure that the originals of changed or deleted entities get merged
66194                     // into the base of the stack after restoring the data from JSON.
66195                     if (id in base.graph.entities) {
66196                         baseEntities[id] = base.graph.entities[id];
66197                     }
66198                     // get originals of parent entities too
66199                     forEach(base.graph._parentWays[id], function(parentId) {
66200                         if (parentId in base.graph.entities) {
66201                             baseEntities[parentId] = base.graph.entities[parentId];
66202                         }
66203                     });
66204                 });
66205
66206                 var x = {};
66207
66208                 if (modified.length) x.modified = modified;
66209                 if (deleted.length) x.deleted = deleted;
66210                 if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
66211                 if (i.annotation) x.annotation = i.annotation;
66212
66213                 return x;
66214             });
66215
66216             return JSON.stringify({
66217                 version: 3,
66218                 entities: values$1(allEntities),
66219                 baseEntities: values$1(baseEntities),
66220                 stack: s,
66221                 nextIDs: osmEntity$$1.id.next,
66222                 index: index
66223             });
66224         },
66225
66226
66227         fromJSON: function(json, loadChildNodes) {
66228             var h = JSON.parse(json),
66229                 loadComplete = true;
66230
66231             osmEntity$$1.id.next = h.nextIDs;
66232             index = h.index;
66233
66234             if (h.version === 2 || h.version === 3) {
66235                 var allEntities = {};
66236
66237                 h.entities.forEach(function(entity) {
66238                     allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
66239                 });
66240
66241                 if (h.version === 3) {
66242                     // This merges originals for changed entities into the base of
66243                     // the stack even if the current stack doesn't have them (for
66244                     // example when iD has been restarted in a different region)
66245                     var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
66246                     stack[0].graph.rebase(baseEntities, map$4(stack, 'graph'), true);
66247                     tree.rebase(baseEntities, true);
66248
66249                     // When we restore a modified way, we also need to fetch any missing
66250                     // childnodes that would normally have been downloaded with it.. #2142
66251                     if (loadChildNodes) {
66252                         var osm = context.connection();
66253                         var nodes = flatten(uniq(map$4(filter(baseEntities, { type: 'way' }), 'nodes')));
66254                         var missing = reject(nodes, function(n) { return stack[0].graph.hasEntity(n); });
66255
66256                         if (!isEmpty(missing) && osm) {
66257                             loadComplete = false;
66258                             context.redrawEnable(false);
66259
66260                             var loading = uiLoading(context).blocking(true);
66261                             context.container().call(loading);
66262
66263                             var childNodesLoaded = function(err, result) {
66264                                 if (!err) {
66265                                     var visible = groupBy(result.data, 'visible');
66266                                     if (!isEmpty(visible.true)) {
66267                                         missing = difference(missing, map$4(visible.true, 'id'));
66268                                         stack[0].graph.rebase(visible.true, map$4(stack, 'graph'), true);
66269                                         tree.rebase(visible.true, true);
66270                                     }
66271
66272                                     // fetch older versions of nodes that were deleted..
66273                                     forEach(visible.false, function(entity) {
66274                                         osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
66275                                     });
66276                                 }
66277
66278                                 if (err || isEmpty(missing)) {
66279                                     loading.close();
66280                                     context.redrawEnable(true);
66281                                     dispatch$$1.call('change');
66282                                 }
66283                             };
66284
66285                             osm.loadMultiple(missing, childNodesLoaded);
66286                         }
66287                     }
66288                 }
66289
66290                 stack = h.stack.map(function(d) {
66291                     var entities = {}, entity;
66292
66293                     if (d.modified) {
66294                         d.modified.forEach(function(key) {
66295                             entity = allEntities[key];
66296                             entities[entity.id] = entity;
66297                         });
66298                     }
66299
66300                     if (d.deleted) {
66301                         d.deleted.forEach(function(id) {
66302                             entities[id] = undefined;
66303                         });
66304                     }
66305
66306                     return {
66307                         graph: coreGraph$$1(stack[0].graph).load(entities),
66308                         annotation: d.annotation,
66309                         imageryUsed: d.imageryUsed
66310                     };
66311                 });
66312
66313             } else { // original version
66314                 stack = h.stack.map(function(d) {
66315                     var entities = {};
66316
66317                     for (var i in d.entities) {
66318                         var entity = d.entities[i];
66319                         entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
66320                     }
66321
66322                     d.graph = coreGraph$$1(stack[0].graph).load(entities);
66323                     return d;
66324                 });
66325             }
66326
66327             if (loadComplete) {
66328                 dispatch$$1.call('change');
66329             }
66330
66331             return history;
66332         },
66333
66334
66335         save: function() {
66336             if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
66337             return history;
66338         },
66339
66340
66341         clearSaved: function() {
66342             context.debouncedSave.cancel();
66343             if (lock.locked()) context.storage(getKey('saved_history'), null);
66344             return history;
66345         },
66346
66347
66348         lock: function() {
66349             return lock.lock();
66350         },
66351
66352
66353         unlock: function() {
66354             lock.unlock();
66355         },
66356
66357
66358         // is iD not open in another window and it detects that
66359         // there's a history stored in localStorage that's recoverable?
66360         restorableChanges: function() {
66361             return lock.locked() && !!context.storage(getKey('saved_history'));
66362         },
66363
66364
66365         // load history from a version stored in localStorage
66366         restore: function() {
66367             if (!lock.locked()) return;
66368
66369             var json = context.storage(getKey('saved_history'));
66370             if (json) history.fromJSON(json, true);
66371         },
66372
66373
66374         _getKey: getKey
66375
66376     };
66377
66378
66379     history.reset();
66380
66381     return utilRebind(history, dispatch$$1, 'on');
66382 }
66383
66384 /** Used to store function metadata. */
66385 var metaMap = WeakMap && new WeakMap;
66386
66387 /**
66388  * The base implementation of `setData` without support for hot loop shorting.
66389  *
66390  * @private
66391  * @param {Function} func The function to associate metadata with.
66392  * @param {*} data The metadata.
66393  * @returns {Function} Returns `func`.
66394  */
66395 var baseSetData = !metaMap ? identity$8 : function(func, data) {
66396   metaMap.set(func, data);
66397   return func;
66398 };
66399
66400 /**
66401  * Creates a function that produces an instance of `Ctor` regardless of
66402  * whether it was invoked as part of a `new` expression or by `call` or `apply`.
66403  *
66404  * @private
66405  * @param {Function} Ctor The constructor to wrap.
66406  * @returns {Function} Returns the new wrapped function.
66407  */
66408 function createCtor(Ctor) {
66409   return function() {
66410     // Use a `switch` statement to work with class constructors. See
66411     // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
66412     // for more details.
66413     var args = arguments;
66414     switch (args.length) {
66415       case 0: return new Ctor;
66416       case 1: return new Ctor(args[0]);
66417       case 2: return new Ctor(args[0], args[1]);
66418       case 3: return new Ctor(args[0], args[1], args[2]);
66419       case 4: return new Ctor(args[0], args[1], args[2], args[3]);
66420       case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
66421       case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
66422       case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
66423     }
66424     var thisBinding = baseCreate(Ctor.prototype),
66425         result = Ctor.apply(thisBinding, args);
66426
66427     // Mimic the constructor's `return` behavior.
66428     // See https://es5.github.io/#x13.2.2 for more details.
66429     return isObject(result) ? result : thisBinding;
66430   };
66431 }
66432
66433 /** Used to compose bitmasks for function metadata. */
66434 var WRAP_BIND_FLAG$2 = 1;
66435
66436 /**
66437  * Creates a function that wraps `func` to invoke it with the optional `this`
66438  * binding of `thisArg`.
66439  *
66440  * @private
66441  * @param {Function} func The function to wrap.
66442  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66443  * @param {*} [thisArg] The `this` binding of `func`.
66444  * @returns {Function} Returns the new wrapped function.
66445  */
66446 function createBind(func, bitmask, thisArg) {
66447   var isBind = bitmask & WRAP_BIND_FLAG$2,
66448       Ctor = createCtor(func);
66449
66450   function wrapper() {
66451     var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
66452     return fn.apply(isBind ? thisArg : this, arguments);
66453   }
66454   return wrapper;
66455 }
66456
66457 /* Built-in method references for those with the same name as other `lodash` methods. */
66458 var nativeMax$6 = Math.max;
66459
66460 /**
66461  * Creates an array that is the composition of partially applied arguments,
66462  * placeholders, and provided arguments into a single array of arguments.
66463  *
66464  * @private
66465  * @param {Array} args The provided arguments.
66466  * @param {Array} partials The arguments to prepend to those provided.
66467  * @param {Array} holders The `partials` placeholder indexes.
66468  * @params {boolean} [isCurried] Specify composing for a curried function.
66469  * @returns {Array} Returns the new array of composed arguments.
66470  */
66471 function composeArgs(args, partials, holders, isCurried) {
66472   var argsIndex = -1,
66473       argsLength = args.length,
66474       holdersLength = holders.length,
66475       leftIndex = -1,
66476       leftLength = partials.length,
66477       rangeLength = nativeMax$6(argsLength - holdersLength, 0),
66478       result = Array(leftLength + rangeLength),
66479       isUncurried = !isCurried;
66480
66481   while (++leftIndex < leftLength) {
66482     result[leftIndex] = partials[leftIndex];
66483   }
66484   while (++argsIndex < holdersLength) {
66485     if (isUncurried || argsIndex < argsLength) {
66486       result[holders[argsIndex]] = args[argsIndex];
66487     }
66488   }
66489   while (rangeLength--) {
66490     result[leftIndex++] = args[argsIndex++];
66491   }
66492   return result;
66493 }
66494
66495 /* Built-in method references for those with the same name as other `lodash` methods. */
66496 var nativeMax$7 = Math.max;
66497
66498 /**
66499  * This function is like `composeArgs` except that the arguments composition
66500  * is tailored for `_.partialRight`.
66501  *
66502  * @private
66503  * @param {Array} args The provided arguments.
66504  * @param {Array} partials The arguments to append to those provided.
66505  * @param {Array} holders The `partials` placeholder indexes.
66506  * @params {boolean} [isCurried] Specify composing for a curried function.
66507  * @returns {Array} Returns the new array of composed arguments.
66508  */
66509 function composeArgsRight(args, partials, holders, isCurried) {
66510   var argsIndex = -1,
66511       argsLength = args.length,
66512       holdersIndex = -1,
66513       holdersLength = holders.length,
66514       rightIndex = -1,
66515       rightLength = partials.length,
66516       rangeLength = nativeMax$7(argsLength - holdersLength, 0),
66517       result = Array(rangeLength + rightLength),
66518       isUncurried = !isCurried;
66519
66520   while (++argsIndex < rangeLength) {
66521     result[argsIndex] = args[argsIndex];
66522   }
66523   var offset = argsIndex;
66524   while (++rightIndex < rightLength) {
66525     result[offset + rightIndex] = partials[rightIndex];
66526   }
66527   while (++holdersIndex < holdersLength) {
66528     if (isUncurried || argsIndex < argsLength) {
66529       result[offset + holders[holdersIndex]] = args[argsIndex++];
66530     }
66531   }
66532   return result;
66533 }
66534
66535 /**
66536  * Gets the number of `placeholder` occurrences in `array`.
66537  *
66538  * @private
66539  * @param {Array} array The array to inspect.
66540  * @param {*} placeholder The placeholder to search for.
66541  * @returns {number} Returns the placeholder count.
66542  */
66543 function countHolders(array, placeholder) {
66544   var length = array.length,
66545       result = 0;
66546
66547   while (length--) {
66548     if (array[length] === placeholder) {
66549       ++result;
66550     }
66551   }
66552   return result;
66553 }
66554
66555 /**
66556  * The function whose prototype chain sequence wrappers inherit from.
66557  *
66558  * @private
66559  */
66560 function baseLodash() {
66561   // No operation performed.
66562 }
66563
66564 /** Used as references for the maximum length and index of an array. */
66565 var MAX_ARRAY_LENGTH = 4294967295;
66566
66567 /**
66568  * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
66569  *
66570  * @private
66571  * @constructor
66572  * @param {*} value The value to wrap.
66573  */
66574 function LazyWrapper(value) {
66575   this.__wrapped__ = value;
66576   this.__actions__ = [];
66577   this.__dir__ = 1;
66578   this.__filtered__ = false;
66579   this.__iteratees__ = [];
66580   this.__takeCount__ = MAX_ARRAY_LENGTH;
66581   this.__views__ = [];
66582 }
66583
66584 // Ensure `LazyWrapper` is an instance of `baseLodash`.
66585 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
66586 LazyWrapper.prototype.constructor = LazyWrapper;
66587
66588 /**
66589  * Gets metadata for `func`.
66590  *
66591  * @private
66592  * @param {Function} func The function to query.
66593  * @returns {*} Returns the metadata for `func`.
66594  */
66595 var getData = !metaMap ? noop$3 : function(func) {
66596   return metaMap.get(func);
66597 };
66598
66599 /** Used to lookup unminified function names. */
66600 var realNames = {};
66601
66602 /** Used for built-in method references. */
66603 var objectProto$19 = Object.prototype;
66604
66605 /** Used to check objects for own properties. */
66606 var hasOwnProperty$17 = objectProto$19.hasOwnProperty;
66607
66608 /**
66609  * Gets the name of `func`.
66610  *
66611  * @private
66612  * @param {Function} func The function to query.
66613  * @returns {string} Returns the function name.
66614  */
66615 function getFuncName(func) {
66616   var result = (func.name + ''),
66617       array = realNames[result],
66618       length = hasOwnProperty$17.call(realNames, result) ? array.length : 0;
66619
66620   while (length--) {
66621     var data = array[length],
66622         otherFunc = data.func;
66623     if (otherFunc == null || otherFunc == func) {
66624       return data.name;
66625     }
66626   }
66627   return result;
66628 }
66629
66630 /**
66631  * The base constructor for creating `lodash` wrapper objects.
66632  *
66633  * @private
66634  * @param {*} value The value to wrap.
66635  * @param {boolean} [chainAll] Enable explicit method chain sequences.
66636  */
66637 function LodashWrapper(value, chainAll) {
66638   this.__wrapped__ = value;
66639   this.__actions__ = [];
66640   this.__chain__ = !!chainAll;
66641   this.__index__ = 0;
66642   this.__values__ = undefined;
66643 }
66644
66645 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
66646 LodashWrapper.prototype.constructor = LodashWrapper;
66647
66648 /**
66649  * Creates a clone of `wrapper`.
66650  *
66651  * @private
66652  * @param {Object} wrapper The wrapper to clone.
66653  * @returns {Object} Returns the cloned wrapper.
66654  */
66655 function wrapperClone(wrapper) {
66656   if (wrapper instanceof LazyWrapper) {
66657     return wrapper.clone();
66658   }
66659   var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
66660   result.__actions__ = copyArray(wrapper.__actions__);
66661   result.__index__  = wrapper.__index__;
66662   result.__values__ = wrapper.__values__;
66663   return result;
66664 }
66665
66666 /** Used for built-in method references. */
66667 var objectProto$20 = Object.prototype;
66668
66669 /** Used to check objects for own properties. */
66670 var hasOwnProperty$18 = objectProto$20.hasOwnProperty;
66671
66672 /**
66673  * Creates a `lodash` object which wraps `value` to enable implicit method
66674  * chain sequences. Methods that operate on and return arrays, collections,
66675  * and functions can be chained together. Methods that retrieve a single value
66676  * or may return a primitive value will automatically end the chain sequence
66677  * and return the unwrapped value. Otherwise, the value must be unwrapped
66678  * with `_#value`.
66679  *
66680  * Explicit chain sequences, which must be unwrapped with `_#value`, may be
66681  * enabled using `_.chain`.
66682  *
66683  * The execution of chained methods is lazy, that is, it's deferred until
66684  * `_#value` is implicitly or explicitly called.
66685  *
66686  * Lazy evaluation allows several methods to support shortcut fusion.
66687  * Shortcut fusion is an optimization to merge iteratee calls; this avoids
66688  * the creation of intermediate arrays and can greatly reduce the number of
66689  * iteratee executions. Sections of a chain sequence qualify for shortcut
66690  * fusion if the section is applied to an array and iteratees accept only
66691  * one argument. The heuristic for whether a section qualifies for shortcut
66692  * fusion is subject to change.
66693  *
66694  * Chaining is supported in custom builds as long as the `_#value` method is
66695  * directly or indirectly included in the build.
66696  *
66697  * In addition to lodash methods, wrappers have `Array` and `String` methods.
66698  *
66699  * The wrapper `Array` methods are:
66700  * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
66701  *
66702  * The wrapper `String` methods are:
66703  * `replace` and `split`
66704  *
66705  * The wrapper methods that support shortcut fusion are:
66706  * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
66707  * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
66708  * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
66709  *
66710  * The chainable wrapper methods are:
66711  * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
66712  * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
66713  * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
66714  * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
66715  * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
66716  * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
66717  * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
66718  * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
66719  * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
66720  * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
66721  * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
66722  * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
66723  * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
66724  * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
66725  * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
66726  * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
66727  * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
66728  * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
66729  * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
66730  * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
66731  * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
66732  * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
66733  * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
66734  * `zipObject`, `zipObjectDeep`, and `zipWith`
66735  *
66736  * The wrapper methods that are **not** chainable by default are:
66737  * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
66738  * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
66739  * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
66740  * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
66741  * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
66742  * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
66743  * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
66744  * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
66745  * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
66746  * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
66747  * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
66748  * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
66749  * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
66750  * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
66751  * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
66752  * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
66753  * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
66754  * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
66755  * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
66756  * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
66757  * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
66758  * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
66759  * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
66760  * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
66761  * `upperFirst`, `value`, and `words`
66762  *
66763  * @name _
66764  * @constructor
66765  * @category Seq
66766  * @param {*} value The value to wrap in a `lodash` instance.
66767  * @returns {Object} Returns the new `lodash` wrapper instance.
66768  * @example
66769  *
66770  * function square(n) {
66771  *   return n * n;
66772  * }
66773  *
66774  * var wrapped = _([1, 2, 3]);
66775  *
66776  * // Returns an unwrapped value.
66777  * wrapped.reduce(_.add);
66778  * // => 6
66779  *
66780  * // Returns a wrapped value.
66781  * var squares = wrapped.map(square);
66782  *
66783  * _.isArray(squares);
66784  * // => false
66785  *
66786  * _.isArray(squares.value());
66787  * // => true
66788  */
66789 function lodash(value) {
66790   if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
66791     if (value instanceof LodashWrapper) {
66792       return value;
66793     }
66794     if (hasOwnProperty$18.call(value, '__wrapped__')) {
66795       return wrapperClone(value);
66796     }
66797   }
66798   return new LodashWrapper(value);
66799 }
66800
66801 // Ensure wrappers are instances of `baseLodash`.
66802 lodash.prototype = baseLodash.prototype;
66803 lodash.prototype.constructor = lodash;
66804
66805 /**
66806  * Checks if `func` has a lazy counterpart.
66807  *
66808  * @private
66809  * @param {Function} func The function to check.
66810  * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
66811  *  else `false`.
66812  */
66813 function isLaziable(func) {
66814   var funcName = getFuncName(func),
66815       other = lodash[funcName];
66816
66817   if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
66818     return false;
66819   }
66820   if (func === other) {
66821     return true;
66822   }
66823   var data = getData(other);
66824   return !!data && func === data[0];
66825 }
66826
66827 /**
66828  * Sets metadata for `func`.
66829  *
66830  * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
66831  * period of time, it will trip its breaker and transition to an identity
66832  * function to avoid garbage collection pauses in V8. See
66833  * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
66834  * for more details.
66835  *
66836  * @private
66837  * @param {Function} func The function to associate metadata with.
66838  * @param {*} data The metadata.
66839  * @returns {Function} Returns `func`.
66840  */
66841 var setData = shortOut(baseSetData);
66842
66843 /** Used to match wrap detail comments. */
66844 var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/;
66845 var reSplitDetails = /,? & /;
66846
66847 /**
66848  * Extracts wrapper details from the `source` body comment.
66849  *
66850  * @private
66851  * @param {string} source The source to inspect.
66852  * @returns {Array} Returns the wrapper details.
66853  */
66854 function getWrapDetails(source) {
66855   var match = source.match(reWrapDetails);
66856   return match ? match[1].split(reSplitDetails) : [];
66857 }
66858
66859 /** Used to match wrap detail comments. */
66860 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
66861
66862 /**
66863  * Inserts wrapper `details` in a comment at the top of the `source` body.
66864  *
66865  * @private
66866  * @param {string} source The source to modify.
66867  * @returns {Array} details The details to insert.
66868  * @returns {string} Returns the modified source.
66869  */
66870 function insertWrapDetails(source, details) {
66871   var length = details.length;
66872   if (!length) {
66873     return source;
66874   }
66875   var lastIndex = length - 1;
66876   details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
66877   details = details.join(length > 2 ? ', ' : ' ');
66878   return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
66879 }
66880
66881 /** Used to compose bitmasks for function metadata. */
66882 var WRAP_BIND_FLAG$5 = 1;
66883 var WRAP_BIND_KEY_FLAG$3 = 2;
66884 var WRAP_CURRY_FLAG$3 = 8;
66885 var WRAP_CURRY_RIGHT_FLAG$2 = 16;
66886 var WRAP_PARTIAL_FLAG$3 = 32;
66887 var WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
66888 var WRAP_ARY_FLAG$1 = 128;
66889 var WRAP_REARG_FLAG = 256;
66890 var WRAP_FLIP_FLAG$1 = 512;
66891
66892 /** Used to associate wrap methods with their bit flags. */
66893 var wrapFlags = [
66894   ['ary', WRAP_ARY_FLAG$1],
66895   ['bind', WRAP_BIND_FLAG$5],
66896   ['bindKey', WRAP_BIND_KEY_FLAG$3],
66897   ['curry', WRAP_CURRY_FLAG$3],
66898   ['curryRight', WRAP_CURRY_RIGHT_FLAG$2],
66899   ['flip', WRAP_FLIP_FLAG$1],
66900   ['partial', WRAP_PARTIAL_FLAG$3],
66901   ['partialRight', WRAP_PARTIAL_RIGHT_FLAG$2],
66902   ['rearg', WRAP_REARG_FLAG]
66903 ];
66904
66905 /**
66906  * Updates wrapper `details` based on `bitmask` flags.
66907  *
66908  * @private
66909  * @returns {Array} details The details to modify.
66910  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66911  * @returns {Array} Returns `details`.
66912  */
66913 function updateWrapDetails(details, bitmask) {
66914   arrayEach(wrapFlags, function(pair) {
66915     var value = '_.' + pair[0];
66916     if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
66917       details.push(value);
66918     }
66919   });
66920   return details.sort();
66921 }
66922
66923 /**
66924  * Sets the `toString` method of `wrapper` to mimic the source of `reference`
66925  * with wrapper details in a comment at the top of the source body.
66926  *
66927  * @private
66928  * @param {Function} wrapper The function to modify.
66929  * @param {Function} reference The reference function.
66930  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66931  * @returns {Function} Returns `wrapper`.
66932  */
66933 function setWrapToString(wrapper, reference, bitmask) {
66934   var source = (reference + '');
66935   return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
66936 }
66937
66938 /** Used to compose bitmasks for function metadata. */
66939 var WRAP_BIND_FLAG$4 = 1;
66940 var WRAP_BIND_KEY_FLAG$2 = 2;
66941 var WRAP_CURRY_BOUND_FLAG = 4;
66942 var WRAP_CURRY_FLAG$2 = 8;
66943 var WRAP_PARTIAL_FLAG$2 = 32;
66944 var WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
66945
66946 /**
66947  * Creates a function that wraps `func` to continue currying.
66948  *
66949  * @private
66950  * @param {Function} func The function to wrap.
66951  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66952  * @param {Function} wrapFunc The function to create the `func` wrapper.
66953  * @param {*} placeholder The placeholder value.
66954  * @param {*} [thisArg] The `this` binding of `func`.
66955  * @param {Array} [partials] The arguments to prepend to those provided to
66956  *  the new function.
66957  * @param {Array} [holders] The `partials` placeholder indexes.
66958  * @param {Array} [argPos] The argument positions of the new function.
66959  * @param {number} [ary] The arity cap of `func`.
66960  * @param {number} [arity] The arity of `func`.
66961  * @returns {Function} Returns the new wrapped function.
66962  */
66963 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
66964   var isCurry = bitmask & WRAP_CURRY_FLAG$2,
66965       newHolders = isCurry ? holders : undefined,
66966       newHoldersRight = isCurry ? undefined : holders,
66967       newPartials = isCurry ? partials : undefined,
66968       newPartialsRight = isCurry ? undefined : partials;
66969
66970   bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$2 : WRAP_PARTIAL_RIGHT_FLAG$1);
66971   bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$2);
66972
66973   if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
66974     bitmask &= ~(WRAP_BIND_FLAG$4 | WRAP_BIND_KEY_FLAG$2);
66975   }
66976   var newData = [
66977     func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
66978     newHoldersRight, argPos, ary, arity
66979   ];
66980
66981   var result = wrapFunc.apply(undefined, newData);
66982   if (isLaziable(func)) {
66983     setData(result, newData);
66984   }
66985   result.placeholder = placeholder;
66986   return setWrapToString(result, func, bitmask);
66987 }
66988
66989 /**
66990  * Gets the argument placeholder value for `func`.
66991  *
66992  * @private
66993  * @param {Function} func The function to inspect.
66994  * @returns {*} Returns the placeholder value.
66995  */
66996 function getHolder(func) {
66997   var object = func;
66998   return object.placeholder;
66999 }
67000
67001 /* Built-in method references for those with the same name as other `lodash` methods. */
67002 var nativeMin$2 = Math.min;
67003
67004 /**
67005  * Reorder `array` according to the specified indexes where the element at
67006  * the first index is assigned as the first element, the element at
67007  * the second index is assigned as the second element, and so on.
67008  *
67009  * @private
67010  * @param {Array} array The array to reorder.
67011  * @param {Array} indexes The arranged array indexes.
67012  * @returns {Array} Returns `array`.
67013  */
67014 function reorder(array, indexes) {
67015   var arrLength = array.length,
67016       length = nativeMin$2(indexes.length, arrLength),
67017       oldArray = copyArray(array);
67018
67019   while (length--) {
67020     var index = indexes[length];
67021     array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
67022   }
67023   return array;
67024 }
67025
67026 /** Used as the internal argument placeholder. */
67027 var PLACEHOLDER = '__lodash_placeholder__';
67028
67029 /**
67030  * Replaces all `placeholder` elements in `array` with an internal placeholder
67031  * and returns an array of their indexes.
67032  *
67033  * @private
67034  * @param {Array} array The array to modify.
67035  * @param {*} placeholder The placeholder to replace.
67036  * @returns {Array} Returns the new array of placeholder indexes.
67037  */
67038 function replaceHolders(array, placeholder) {
67039   var index = -1,
67040       length = array.length,
67041       resIndex = 0,
67042       result = [];
67043
67044   while (++index < length) {
67045     var value = array[index];
67046     if (value === placeholder || value === PLACEHOLDER) {
67047       array[index] = PLACEHOLDER;
67048       result[resIndex++] = index;
67049     }
67050   }
67051   return result;
67052 }
67053
67054 /** Used to compose bitmasks for function metadata. */
67055 var WRAP_BIND_FLAG$3 = 1;
67056 var WRAP_BIND_KEY_FLAG$1 = 2;
67057 var WRAP_CURRY_FLAG$1 = 8;
67058 var WRAP_CURRY_RIGHT_FLAG$1 = 16;
67059 var WRAP_ARY_FLAG = 128;
67060 var WRAP_FLIP_FLAG = 512;
67061
67062 /**
67063  * Creates a function that wraps `func` to invoke it with optional `this`
67064  * binding of `thisArg`, partial application, and currying.
67065  *
67066  * @private
67067  * @param {Function|string} func The function or method name to wrap.
67068  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
67069  * @param {*} [thisArg] The `this` binding of `func`.
67070  * @param {Array} [partials] The arguments to prepend to those provided to
67071  *  the new function.
67072  * @param {Array} [holders] The `partials` placeholder indexes.
67073  * @param {Array} [partialsRight] The arguments to append to those provided
67074  *  to the new function.
67075  * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
67076  * @param {Array} [argPos] The argument positions of the new function.
67077  * @param {number} [ary] The arity cap of `func`.
67078  * @param {number} [arity] The arity of `func`.
67079  * @returns {Function} Returns the new wrapped function.
67080  */
67081 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
67082   var isAry = bitmask & WRAP_ARY_FLAG,
67083       isBind = bitmask & WRAP_BIND_FLAG$3,
67084       isBindKey = bitmask & WRAP_BIND_KEY_FLAG$1,
67085       isCurried = bitmask & (WRAP_CURRY_FLAG$1 | WRAP_CURRY_RIGHT_FLAG$1),
67086       isFlip = bitmask & WRAP_FLIP_FLAG,
67087       Ctor = isBindKey ? undefined : createCtor(func);
67088
67089   function wrapper() {
67090     var length = arguments.length,
67091         args = Array(length),
67092         index = length;
67093
67094     while (index--) {
67095       args[index] = arguments[index];
67096     }
67097     if (isCurried) {
67098       var placeholder = getHolder(wrapper),
67099           holdersCount = countHolders(args, placeholder);
67100     }
67101     if (partials) {
67102       args = composeArgs(args, partials, holders, isCurried);
67103     }
67104     if (partialsRight) {
67105       args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
67106     }
67107     length -= holdersCount;
67108     if (isCurried && length < arity) {
67109       var newHolders = replaceHolders(args, placeholder);
67110       return createRecurry(
67111         func, bitmask, createHybrid, wrapper.placeholder, thisArg,
67112         args, newHolders, argPos, ary, arity - length
67113       );
67114     }
67115     var thisBinding = isBind ? thisArg : this,
67116         fn = isBindKey ? thisBinding[func] : func;
67117
67118     length = args.length;
67119     if (argPos) {
67120       args = reorder(args, argPos);
67121     } else if (isFlip && length > 1) {
67122       args.reverse();
67123     }
67124     if (isAry && ary < length) {
67125       args.length = ary;
67126     }
67127     if (this && this !== root$2 && this instanceof wrapper) {
67128       fn = Ctor || createCtor(fn);
67129     }
67130     return fn.apply(thisBinding, args);
67131   }
67132   return wrapper;
67133 }
67134
67135 /**
67136  * Creates a function that wraps `func` to enable currying.
67137  *
67138  * @private
67139  * @param {Function} func The function to wrap.
67140  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
67141  * @param {number} arity The arity of `func`.
67142  * @returns {Function} Returns the new wrapped function.
67143  */
67144 function createCurry(func, bitmask, arity) {
67145   var Ctor = createCtor(func);
67146
67147   function wrapper() {
67148     var length = arguments.length,
67149         args = Array(length),
67150         index = length,
67151         placeholder = getHolder(wrapper);
67152
67153     while (index--) {
67154       args[index] = arguments[index];
67155     }
67156     var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
67157       ? []
67158       : replaceHolders(args, placeholder);
67159
67160     length -= holders.length;
67161     if (length < arity) {
67162       return createRecurry(
67163         func, bitmask, createHybrid, wrapper.placeholder, undefined,
67164         args, holders, undefined, undefined, arity - length);
67165     }
67166     var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
67167     return apply(fn, this, args);
67168   }
67169   return wrapper;
67170 }
67171
67172 /** Used to compose bitmasks for function metadata. */
67173 var WRAP_BIND_FLAG$6 = 1;
67174
67175 /**
67176  * Creates a function that wraps `func` to invoke it with the `this` binding
67177  * of `thisArg` and `partials` prepended to the arguments it receives.
67178  *
67179  * @private
67180  * @param {Function} func The function to wrap.
67181  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
67182  * @param {*} thisArg The `this` binding of `func`.
67183  * @param {Array} partials The arguments to prepend to those provided to
67184  *  the new function.
67185  * @returns {Function} Returns the new wrapped function.
67186  */
67187 function createPartial(func, bitmask, thisArg, partials) {
67188   var isBind = bitmask & WRAP_BIND_FLAG$6,
67189       Ctor = createCtor(func);
67190
67191   function wrapper() {
67192     var argsIndex = -1,
67193         argsLength = arguments.length,
67194         leftIndex = -1,
67195         leftLength = partials.length,
67196         args = Array(leftLength + argsLength),
67197         fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
67198
67199     while (++leftIndex < leftLength) {
67200       args[leftIndex] = partials[leftIndex];
67201     }
67202     while (argsLength--) {
67203       args[leftIndex++] = arguments[++argsIndex];
67204     }
67205     return apply(fn, isBind ? thisArg : this, args);
67206   }
67207   return wrapper;
67208 }
67209
67210 /** Used as the internal argument placeholder. */
67211 var PLACEHOLDER$1 = '__lodash_placeholder__';
67212
67213 /** Used to compose bitmasks for function metadata. */
67214 var WRAP_BIND_FLAG$7 = 1;
67215 var WRAP_BIND_KEY_FLAG$4 = 2;
67216 var WRAP_CURRY_BOUND_FLAG$1 = 4;
67217 var WRAP_CURRY_FLAG$4 = 8;
67218 var WRAP_ARY_FLAG$2 = 128;
67219 var WRAP_REARG_FLAG$1 = 256;
67220
67221 /* Built-in method references for those with the same name as other `lodash` methods. */
67222 var nativeMin$3 = Math.min;
67223
67224 /**
67225  * Merges the function metadata of `source` into `data`.
67226  *
67227  * Merging metadata reduces the number of wrappers used to invoke a function.
67228  * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
67229  * may be applied regardless of execution order. Methods like `_.ary` and
67230  * `_.rearg` modify function arguments, making the order in which they are
67231  * executed important, preventing the merging of metadata. However, we make
67232  * an exception for a safe combined case where curried functions have `_.ary`
67233  * and or `_.rearg` applied.
67234  *
67235  * @private
67236  * @param {Array} data The destination metadata.
67237  * @param {Array} source The source metadata.
67238  * @returns {Array} Returns `data`.
67239  */
67240 function mergeData(data, source) {
67241   var bitmask = data[1],
67242       srcBitmask = source[1],
67243       newBitmask = bitmask | srcBitmask,
67244       isCommon = newBitmask < (WRAP_BIND_FLAG$7 | WRAP_BIND_KEY_FLAG$4 | WRAP_ARY_FLAG$2);
67245
67246   var isCombo =
67247     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$4)) ||
67248     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
67249     ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$4));
67250
67251   // Exit early if metadata can't be merged.
67252   if (!(isCommon || isCombo)) {
67253     return data;
67254   }
67255   // Use source `thisArg` if available.
67256   if (srcBitmask & WRAP_BIND_FLAG$7) {
67257     data[2] = source[2];
67258     // Set when currying a bound function.
67259     newBitmask |= bitmask & WRAP_BIND_FLAG$7 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
67260   }
67261   // Compose partial arguments.
67262   var value = source[3];
67263   if (value) {
67264     var partials = data[3];
67265     data[3] = partials ? composeArgs(partials, value, source[4]) : value;
67266     data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
67267   }
67268   // Compose partial right arguments.
67269   value = source[5];
67270   if (value) {
67271     partials = data[5];
67272     data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
67273     data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
67274   }
67275   // Use source `argPos` if available.
67276   value = source[7];
67277   if (value) {
67278     data[7] = value;
67279   }
67280   // Use source `ary` if it's smaller.
67281   if (srcBitmask & WRAP_ARY_FLAG$2) {
67282     data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
67283   }
67284   // Use source `arity` if one is not provided.
67285   if (data[9] == null) {
67286     data[9] = source[9];
67287   }
67288   // Use source `func` and merge bitmasks.
67289   data[0] = source[0];
67290   data[1] = newBitmask;
67291
67292   return data;
67293 }
67294
67295 /** Error message constants. */
67296 var FUNC_ERROR_TEXT$4 = 'Expected a function';
67297
67298 /** Used to compose bitmasks for function metadata. */
67299 var WRAP_BIND_FLAG$1 = 1;
67300 var WRAP_BIND_KEY_FLAG = 2;
67301 var WRAP_CURRY_FLAG = 8;
67302 var WRAP_CURRY_RIGHT_FLAG = 16;
67303 var WRAP_PARTIAL_FLAG$1 = 32;
67304 var WRAP_PARTIAL_RIGHT_FLAG = 64;
67305
67306 /* Built-in method references for those with the same name as other `lodash` methods. */
67307 var nativeMax$5 = Math.max;
67308
67309 /**
67310  * Creates a function that either curries or invokes `func` with optional
67311  * `this` binding and partially applied arguments.
67312  *
67313  * @private
67314  * @param {Function|string} func The function or method name to wrap.
67315  * @param {number} bitmask The bitmask flags.
67316  *    1 - `_.bind`
67317  *    2 - `_.bindKey`
67318  *    4 - `_.curry` or `_.curryRight` of a bound function
67319  *    8 - `_.curry`
67320  *   16 - `_.curryRight`
67321  *   32 - `_.partial`
67322  *   64 - `_.partialRight`
67323  *  128 - `_.rearg`
67324  *  256 - `_.ary`
67325  *  512 - `_.flip`
67326  * @param {*} [thisArg] The `this` binding of `func`.
67327  * @param {Array} [partials] The arguments to be partially applied.
67328  * @param {Array} [holders] The `partials` placeholder indexes.
67329  * @param {Array} [argPos] The argument positions of the new function.
67330  * @param {number} [ary] The arity cap of `func`.
67331  * @param {number} [arity] The arity of `func`.
67332  * @returns {Function} Returns the new wrapped function.
67333  */
67334 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
67335   var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
67336   if (!isBindKey && typeof func != 'function') {
67337     throw new TypeError(FUNC_ERROR_TEXT$4);
67338   }
67339   var length = partials ? partials.length : 0;
67340   if (!length) {
67341     bitmask &= ~(WRAP_PARTIAL_FLAG$1 | WRAP_PARTIAL_RIGHT_FLAG);
67342     partials = holders = undefined;
67343   }
67344   ary = ary === undefined ? ary : nativeMax$5(toInteger(ary), 0);
67345   arity = arity === undefined ? arity : toInteger(arity);
67346   length -= holders ? holders.length : 0;
67347
67348   if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
67349     var partialsRight = partials,
67350         holdersRight = holders;
67351
67352     partials = holders = undefined;
67353   }
67354   var data = isBindKey ? undefined : getData(func);
67355
67356   var newData = [
67357     func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
67358     argPos, ary, arity
67359   ];
67360
67361   if (data) {
67362     mergeData(newData, data);
67363   }
67364   func = newData[0];
67365   bitmask = newData[1];
67366   thisArg = newData[2];
67367   partials = newData[3];
67368   holders = newData[4];
67369   arity = newData[9] = newData[9] === undefined
67370     ? (isBindKey ? 0 : func.length)
67371     : nativeMax$5(newData[9] - length, 0);
67372
67373   if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
67374     bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
67375   }
67376   if (!bitmask || bitmask == WRAP_BIND_FLAG$1) {
67377     var result = createBind(func, bitmask, thisArg);
67378   } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
67379     result = createCurry(func, bitmask, arity);
67380   } else if ((bitmask == WRAP_PARTIAL_FLAG$1 || bitmask == (WRAP_BIND_FLAG$1 | WRAP_PARTIAL_FLAG$1)) && !holders.length) {
67381     result = createPartial(func, bitmask, thisArg, partials);
67382   } else {
67383     result = createHybrid.apply(undefined, newData);
67384   }
67385   var setter = data ? baseSetData : setData;
67386   return setWrapToString(setter(result, newData), func, bitmask);
67387 }
67388
67389 /** Used to compose bitmasks for function metadata. */
67390 var WRAP_BIND_FLAG = 1;
67391 var WRAP_PARTIAL_FLAG = 32;
67392
67393 /**
67394  * Creates a function that invokes `func` with the `this` binding of `thisArg`
67395  * and `partials` prepended to the arguments it receives.
67396  *
67397  * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
67398  * may be used as a placeholder for partially applied arguments.
67399  *
67400  * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
67401  * property of bound functions.
67402  *
67403  * @static
67404  * @memberOf _
67405  * @since 0.1.0
67406  * @category Function
67407  * @param {Function} func The function to bind.
67408  * @param {*} thisArg The `this` binding of `func`.
67409  * @param {...*} [partials] The arguments to be partially applied.
67410  * @returns {Function} Returns the new bound function.
67411  * @example
67412  *
67413  * function greet(greeting, punctuation) {
67414  *   return greeting + ' ' + this.user + punctuation;
67415  * }
67416  *
67417  * var object = { 'user': 'fred' };
67418  *
67419  * var bound = _.bind(greet, object, 'hi');
67420  * bound('!');
67421  * // => 'hi fred!'
67422  *
67423  * // Bound with placeholders.
67424  * var bound = _.bind(greet, object, _, '!');
67425  * bound('hi');
67426  * // => 'hi fred!'
67427  */
67428 var bind$2 = baseRest(function(func, thisArg, partials) {
67429   var bitmask = WRAP_BIND_FLAG;
67430   if (partials.length) {
67431     var holders = replaceHolders(partials, getHolder(bind$2));
67432     bitmask |= WRAP_PARTIAL_FLAG;
67433   }
67434   return createWrap(func, bitmask, thisArg, partials, holders);
67435 });
67436
67437 // Assign default placeholders.
67438 bind$2.placeholder = {};
67439
67440 function presetCollection(collection) {
67441     var maxSearchResults = 50,
67442         maxSuggestionResults = 10;
67443
67444     var presets = {
67445
67446         collection: collection,
67447
67448
67449         item: function(id) {
67450             return find$1(this.collection, function(d) {
67451                 return d.id === id;
67452             });
67453         },
67454
67455
67456         matchGeometry: function(geometry) {
67457             return presetCollection(this.collection.filter(function(d) {
67458                 return d.matchGeometry(geometry);
67459             }));
67460         },
67461
67462
67463         search: function(value, geometry) {
67464             if (!value) return this;
67465
67466             function leading(a) {
67467                 var index = a.indexOf(value);
67468                 return index === 0 || a[index - 1] === ' ';
67469             }
67470
67471             function suggestionName(name) {
67472                 var nameArray = name.split(' - ');
67473                 if (nameArray.length > 1) {
67474                     name = nameArray.slice(0, nameArray.length - 1).join(' - ');
67475                 }
67476                 return name.toLowerCase();
67477             }
67478
67479
67480             value = value.toLowerCase();
67481
67482             var searchable = filter(this.collection, function(a) {
67483                     return a.searchable !== false && a.suggestion !== true;
67484                 }),
67485                 suggestions = filter(this.collection, function(a) {
67486                     return a.suggestion === true;
67487                 });
67488
67489
67490             // matches value to preset.name
67491             var leading_name = filter(searchable, function(a) {
67492                     return leading(a.name().toLowerCase());
67493                 }).sort(function(a, b) {
67494                     var aCompare = a.name().toLowerCase(),
67495                         bCompare = b.name().toLowerCase(),
67496                         i;
67497
67498                     // priority if search string matches preset name exactly - #4325
67499                     if (value === aCompare) return -1;
67500                     if (value === bCompare) return 1;
67501
67502                     // priority for higher matchScore
67503                     i = b.originalScore - a.originalScore;
67504                     if (i !== 0) return i;
67505
67506                     // priority if search string appears earlier in preset name
67507                     i = aCompare.indexOf(value) - bCompare.indexOf(value);
67508                     if (i !== 0) return i;
67509
67510                     // priority for shorter preset names
67511                     return a.name().length - b.name().length;
67512                 });
67513
67514             // matches value to preset.terms values
67515             var leading_terms = filter(searchable, function(a) {
67516                     return some(a.terms() || [], leading);
67517                 });
67518
67519             // matches value to preset.tags values
67520             var leading_tag_values = filter(searchable, function(a) {
67521                     return some(without(values$1(a.tags || {}), '*'), leading);
67522                 });
67523
67524
67525             // finds close matches to value in preset.name
67526             var similar_name = searchable.map(function(a) {
67527                     return {
67528                         preset: a,
67529                         dist: utilEditDistance(value, a.name())
67530                     };
67531                 }).filter(function(a) {
67532                     return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
67533                 }).sort(function(a, b) {
67534                     return a.dist - b.dist;
67535                 }).map(function(a) {
67536                     return a.preset;
67537                 });
67538
67539             // finds close matches to value in preset.terms
67540             var similar_terms = filter(searchable, function(a) {
67541                     return some(a.terms() || [], function(b) {
67542                         return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
67543                     });
67544                 });
67545
67546             var leading_suggestions = filter(suggestions, function(a) {
67547                     return leading(suggestionName(a.name()));
67548                 }).sort(function(a, b) {
67549                     a = suggestionName(a.name());
67550                     b = suggestionName(b.name());
67551                     var i = a.indexOf(value) - b.indexOf(value);
67552                     if (i === 0) return a.length - b.length;
67553                     else return i;
67554                 });
67555
67556             var similar_suggestions = suggestions.map(function(a) {
67557                     return {
67558                         preset: a,
67559                         dist: utilEditDistance(value, suggestionName(a.name()))
67560                     };
67561                 }).filter(function(a) {
67562                     return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
67563                 }).sort(function(a, b) {
67564                     return a.dist - b.dist;
67565                 }).map(function(a) {
67566                     return a.preset;
67567                 });
67568
67569             var other = presets.item(geometry);
67570
67571             var results = leading_name.concat(
67572                     leading_terms,
67573                     leading_tag_values,
67574                     leading_suggestions.slice(0, maxSuggestionResults + 5),
67575                     similar_name,
67576                     similar_terms,
67577                     similar_suggestions.slice(0, maxSuggestionResults)
67578                 ).slice(0, maxSearchResults - 1);
67579
67580             return presetCollection(uniq(results.concat(other)));
67581         }
67582     };
67583
67584
67585     return presets;
67586 }
67587
67588 function presetCategory(id, category, all) {
67589     category = clone(category);
67590
67591     category.id = id;
67592
67593
67594     category.members = presetCollection(category.members.map(function(id) {
67595         return all.item(id);
67596     }));
67597
67598
67599     category.matchGeometry = function(geometry) {
67600         return category.geometry.indexOf(geometry) >= 0;
67601     };
67602
67603
67604     category.matchScore = function() {
67605         return -1;
67606     };
67607
67608
67609     category.name = function() {
67610         return t('presets.categories.' + id + '.name', {'default': id});
67611     };
67612
67613
67614     category.terms = function() {
67615         return [];
67616     };
67617
67618
67619     return category;
67620 }
67621
67622 function presetField(id, field) {
67623     field = clone(field);
67624
67625     field.id = id;
67626
67627
67628     field.matchGeometry = function(geometry) {
67629         return !field.geometry || field.geometry === geometry;
67630     };
67631
67632
67633     field.t = function(scope, options) {
67634         return t('presets.fields.' + id + '.' + scope, options);
67635     };
67636
67637
67638     field.label = function() {
67639         return field.t('label', {'default': id});
67640     };
67641
67642
67643     var placeholder = field.placeholder;
67644     field.placeholder = function() {
67645         return field.t('placeholder', {'default': placeholder});
67646     };
67647
67648
67649     return field;
67650 }
67651
67652 function presetPreset(id, preset, fields) {
67653     preset = clone(preset);
67654
67655     preset.id = id;
67656     preset.fields = (preset.fields || []).map(getFields);
67657     preset.geometry = (preset.geometry || []);
67658
67659
67660     function getFields(f) {
67661         return fields[f];
67662     }
67663
67664
67665     preset.matchGeometry = function(geometry) {
67666         return preset.geometry.indexOf(geometry) >= 0;
67667     };
67668
67669
67670     preset.originalScore = preset.matchScore || 1;
67671
67672
67673     preset.matchScore = function(entity) {
67674         var tags = preset.tags,
67675             score = 0;
67676
67677         for (var t$$1 in tags) {
67678             if (entity.tags[t$$1] === tags[t$$1]) {
67679                 score += preset.originalScore;
67680             } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
67681                 score += preset.originalScore / 2;
67682             } else {
67683                 return -1;
67684             }
67685         }
67686
67687         return score;
67688     };
67689
67690
67691     preset.t = function(scope, options) {
67692         return t('presets.presets.' + id + '.' + scope, options);
67693     };
67694
67695
67696     var origName = preset.name || '';
67697     preset.name = function() {
67698         if (preset.suggestion) {
67699             id = id.split('/');
67700             id = id[0] + '/' + id[1];
67701             return origName + ' - ' + t('presets.presets.' + id + '.name');
67702         }
67703         return preset.t('name', { 'default': origName });
67704     };
67705
67706     var origTerms = (preset.terms || []).join();
67707     preset.terms = function() {
67708         return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
67709     };
67710
67711
67712     preset.isFallback = function() {
67713         var tagCount = Object.keys(preset.tags).length;
67714         return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
67715     };
67716
67717
67718     var reference = preset.reference || {};
67719     preset.reference = function(geometry) {
67720         var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
67721             value = reference.value || preset.tags[key];
67722
67723         if (geometry === 'relation' && key === 'type') {
67724             if (value in preset.tags) {
67725                 key = value;
67726                 value = preset.tags[key];
67727             } else {
67728                 return { rtype: value };
67729             }
67730         }
67731
67732         if (value === '*') {
67733             return { key: key };
67734         } else {
67735             return { key: key, value: value };
67736         }
67737     };
67738
67739
67740     var removeTags = preset.removeTags || preset.tags || {};
67741     preset.removeTags = function(tags, geometry) {
67742         tags = omit(tags, keys$1(removeTags));
67743
67744         for (var f in preset.fields) {
67745             var field = preset.fields[f];
67746             if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
67747                 delete tags[field.key];
67748             }
67749         }
67750
67751         delete tags.area;
67752         return tags;
67753     };
67754
67755
67756     var applyTags = preset.addTags || preset.tags || {};
67757     preset.applyTags = function(tags, geometry) {
67758         var k;
67759
67760         tags = clone(tags);
67761
67762         for (k in applyTags) {
67763             if (applyTags[k] === '*') {
67764                 tags[k] = 'yes';
67765             } else {
67766                 tags[k] = applyTags[k];
67767             }
67768         }
67769
67770         // Add area=yes if necessary.
67771         // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
67772         // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
67773         // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
67774         if (!applyTags.hasOwnProperty('area')) {
67775             delete tags.area;
67776             if (geometry === 'area') {
67777                 var needsAreaTag = true;
67778                 if (preset.geometry.indexOf('line') === -1) {
67779                     for (k in applyTags) {
67780                         if (k in areaKeys) {
67781                             needsAreaTag = false;
67782                             break;
67783                         }
67784                     }
67785                 }
67786                 if (needsAreaTag) {
67787                     tags.area = 'yes';
67788                 }
67789             }
67790         }
67791
67792         for (var f in preset.fields) {
67793             var field = preset.fields[f];
67794             if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
67795                 tags[field.key] = field.default;
67796             }
67797         }
67798
67799         return tags;
67800     };
67801
67802
67803     return preset;
67804 }
67805
67806 function presetIndex() {
67807     // a presetCollection with methods for
67808     // loading new data and returning defaults
67809
67810     var all = presetCollection([]),
67811         defaults = { area: all, line: all, point: all, vertex: all, relation: all },
67812         fields = {},
67813         universal = [],
67814         recent = presetCollection([]);
67815
67816     // Index of presets by (geometry, tag key).
67817     var index = {
67818         point: {},
67819         vertex: {},
67820         line: {},
67821         area: {},
67822         relation: {}
67823     };
67824
67825     all.match = function(entity, resolver) {
67826         var geometry = entity.geometry(resolver);
67827         var address;
67828
67829         // Treat entities on addr:interpolation lines as points, not vertices - #3241
67830         if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
67831             geometry = 'point';
67832         }
67833
67834         var geometryMatches = index[geometry],
67835             best = -1,
67836             match;
67837
67838         for (var k in entity.tags) {
67839             // If any part of an address is present,
67840             // allow fallback to "Address" preset - #4353
67841             if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
67842                 address = geometryMatches['addr:*'][0];
67843             }
67844
67845             var keyMatches = geometryMatches[k];
67846             if (!keyMatches) continue;
67847
67848             for (var i = 0; i < keyMatches.length; i++) {
67849                 var score = keyMatches[i].matchScore(entity);
67850                 if (score > best) {
67851                     best = score;
67852                     match = keyMatches[i];
67853                 }
67854             }
67855         }
67856
67857         if (address && (!match || match.isFallback())) {
67858             match = address;
67859         }
67860
67861         return match || all.item(geometry);
67862     };
67863
67864
67865     // Because of the open nature of tagging, iD will never have a complete
67866     // list of tags used in OSM, so we want it to have logic like "assume
67867     // that a closed way with an amenity tag is an area, unless the amenity
67868     // is one of these specific types". This function computes a structure
67869     // that allows testing of such conditions, based on the presets designated
67870     // as as supporting (or not supporting) the area geometry.
67871     //
67872     // The returned object L is a whitelist/blacklist of tags. A closed way
67873     // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
67874     // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
67875     // and the subkeys form the blacklist.
67876     all.areaKeys = function() {
67877         var areaKeys = {},
67878             ignore = ['barrier', 'highway', 'footway', 'railway', 'type'],  // probably a line..
67879             presets = reject(all.collection, 'suggestion');
67880
67881         // whitelist
67882         presets.forEach(function(d) {
67883             for (var key in d.tags) break;
67884             if (!key) return;
67885             if (ignore.indexOf(key) !== -1) return;
67886
67887             if (d.geometry.indexOf('area') !== -1) {    // probably an area..
67888                 areaKeys[key] = areaKeys[key] || {};
67889             }
67890         });
67891
67892         // blacklist
67893         presets.forEach(function(d) {
67894             for (var key in d.tags) break;
67895             if (!key) return;
67896             if (ignore.indexOf(key) !== -1) return;
67897
67898             var value = d.tags[key];
67899             if (key in areaKeys &&                      // probably an area...
67900                 d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
67901                 value !== '*') {
67902                 areaKeys[key][value] = true;
67903             }
67904         });
67905
67906         return areaKeys;
67907     };
67908
67909
67910     all.init = function() {
67911         var d = data.presets;
67912
67913         all.collection = [];
67914         recent.collection = [];
67915         fields = {};
67916         universal = [];
67917         index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
67918
67919         if (d.fields) {
67920             forEach(d.fields, function(d, id) {
67921                 fields[id] = presetField(id, d);
67922                 if (d.universal) universal.push(fields[id]);
67923             });
67924         }
67925
67926         if (d.presets) {
67927             forEach(d.presets, function(d, id) {
67928                 all.collection.push(presetPreset(id, d, fields));
67929             });
67930         }
67931
67932         if (d.categories) {
67933             forEach(d.categories, function(d, id) {
67934                 all.collection.push(presetCategory(id, d, all));
67935             });
67936         }
67937
67938         if (d.defaults) {
67939             var getItem = bind$2(all.item, all);
67940             defaults = {
67941                 area: presetCollection(d.defaults.area.map(getItem)),
67942                 line: presetCollection(d.defaults.line.map(getItem)),
67943                 point: presetCollection(d.defaults.point.map(getItem)),
67944                 vertex: presetCollection(d.defaults.vertex.map(getItem)),
67945                 relation: presetCollection(d.defaults.relation.map(getItem))
67946             };
67947         }
67948
67949         for (var i = 0; i < all.collection.length; i++) {
67950             var preset = all.collection[i],
67951                 geometry = preset.geometry;
67952
67953             for (var j = 0; j < geometry.length; j++) {
67954                 var g = index[geometry[j]];
67955                 for (var k in preset.tags) {
67956                     (g[k] = g[k] || []).push(preset);
67957                 }
67958             }
67959         }
67960
67961         return all;
67962     };
67963
67964     all.field = function(id) {
67965         return fields[id];
67966     };
67967
67968     all.universal = function() {
67969         return universal;
67970     };
67971
67972     all.defaults = function(geometry, n) {
67973         var rec = recent.matchGeometry(geometry).collection.slice(0, 4),
67974             def = uniq(rec.concat(defaults[geometry].collection)).slice(0, n - 1);
67975         return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
67976     };
67977
67978     all.choose = function(preset) {
67979         if (!preset.isFallback()) {
67980             recent = presetCollection(uniq([preset].concat(recent.collection)));
67981         }
67982         return all;
67983     };
67984
67985     return all;
67986 }
67987
67988 var areaKeys = {};
67989
67990 function setAreaKeys(value) {
67991     areaKeys = value;
67992 }
67993
67994
67995 function coreContext() {
67996     var context = {};
67997     context.version = '2.5.0';
67998
67999     // create a special translation that contains the keys in place of the strings
68000     var tkeys = cloneDeep(en);
68001     var parents = [];
68002
68003     function traverser(v, k, obj) {
68004         parents.push(k);
68005         if (isObject(v)) {
68006             forOwn(v, traverser);
68007         } else if (isString(v)) {
68008             obj[k] = parents.join('.');
68009         }
68010         parents.pop();
68011     }
68012
68013     forOwn(tkeys, traverser);
68014     addTranslation('_tkeys_', tkeys);
68015
68016     addTranslation('en', en);
68017     setLocale('en');
68018
68019     var dispatch$$1 = dispatch('enter', 'exit', 'change');
68020
68021     // https://github.com/openstreetmap/iD/issues/772
68022     // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
68023     var storage;
68024     try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
68025     storage = storage || (function() {
68026         var s = {};
68027         return {
68028             getItem: function(k) { return s[k]; },
68029             setItem: function(k, v) { s[k] = v; },
68030             removeItem: function(k) { delete s[k]; }
68031         };
68032     })();
68033
68034     context.storage = function(k, v) {
68035         try {
68036             if (arguments.length === 1) return storage.getItem(k);
68037             else if (v === null) storage.removeItem(k);
68038             else storage.setItem(k, v);
68039         } catch (e) {
68040             // localstorage quota exceeded
68041             /* eslint-disable no-console */
68042             if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
68043             /* eslint-enable no-console */
68044         }
68045     };
68046
68047
68048     /* Straight accessors. Avoid using these if you can. */
68049     var ui, connection, history;
68050     context.ui = function() { return ui; };
68051     context.connection = function() { return connection; };
68052     context.history = function() { return history; };
68053
68054
68055     /* Connection */
68056     function entitiesLoaded(err, result) {
68057         if (!err) history.merge(result.data, result.extent);
68058     }
68059
68060     context.preauth = function(options) {
68061         if (connection) {
68062             connection.switch(options);
68063         }
68064         return context;
68065     };
68066
68067     context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
68068         function done(err, result) {
68069             entitiesLoaded(err, result);
68070             if (callback) callback(err, result);
68071         }
68072         if (connection) {
68073             connection.loadTiles(projection, dimensions, done);
68074         }
68075     });
68076
68077     context.loadEntity = function(id, callback) {
68078         function done(err, result) {
68079             entitiesLoaded(err, result);
68080             if (callback) callback(err, result);
68081         }
68082         if (connection) {
68083             connection.loadEntity(id, done);
68084         }
68085     };
68086
68087     context.zoomToEntity = function(id, zoomTo) {
68088         if (zoomTo !== false) {
68089             this.loadEntity(id, function(err, result) {
68090                 if (err) return;
68091                 var entity = find$1(result.data, function(e) { return e.id === id; });
68092                 if (entity) { map.zoomTo(entity); }
68093             });
68094         }
68095
68096         map.on('drawn.zoomToEntity', function() {
68097             if (!context.hasEntity(id)) return;
68098             map.on('drawn.zoomToEntity', null);
68099             context.on('enter.zoomToEntity', null);
68100             context.enter(modeSelect(context, [id]));
68101         });
68102
68103         context.on('enter.zoomToEntity', function() {
68104             if (mode.id !== 'browse') {
68105                 map.on('drawn.zoomToEntity', null);
68106                 context.on('enter.zoomToEntity', null);
68107             }
68108         });
68109     };
68110
68111     var minEditableZoom = 16;
68112     context.minEditableZoom = function(_) {
68113         if (!arguments.length) return minEditableZoom;
68114         minEditableZoom = _;
68115         if (connection) {
68116             connection.tileZoom(_);
68117         }
68118         return context;
68119     };
68120
68121
68122     /* History */
68123     var inIntro = false;
68124     context.inIntro = function(_) {
68125         if (!arguments.length) return inIntro;
68126         inIntro = _;
68127         return context;
68128     };
68129
68130     context.save = function() {
68131         // no history save, no message onbeforeunload
68132         if (inIntro || d3_select('.modal').size()) return;
68133
68134         var canSave;
68135         if (mode && mode.id === 'save') {
68136             canSave = false;
68137         } else {
68138             canSave = context.selectedIDs().every(function(id) {
68139                 var entity = context.hasEntity(id);
68140                 return entity && !entity.isDegenerate();
68141             });
68142         }
68143
68144         if (canSave) {
68145             history.save();
68146         }
68147         if (history.hasChanges()) {
68148             return t('save.unsaved_changes');
68149         }
68150     };
68151
68152
68153     /* Graph */
68154     context.hasEntity = function(id) {
68155         return history.graph().hasEntity(id);
68156     };
68157     context.entity = function(id) {
68158         return history.graph().entity(id);
68159     };
68160     context.childNodes = function(way) {
68161         return history.graph().childNodes(way);
68162     };
68163     context.geometry = function(id) {
68164         return context.entity(id).geometry(history.graph());
68165     };
68166
68167
68168     /* Modes */
68169     var mode;
68170     context.mode = function() {
68171         return mode;
68172     };
68173     context.enter = function(newMode) {
68174         if (mode) {
68175             mode.exit();
68176             dispatch$$1.call('exit', this, mode);
68177         }
68178
68179         mode = newMode;
68180         mode.enter();
68181         dispatch$$1.call('enter', this, mode);
68182     };
68183
68184     context.selectedIDs = function() {
68185         if (mode && mode.selectedIDs) {
68186             return mode.selectedIDs();
68187         } else {
68188             return [];
68189         }
68190     };
68191
68192
68193     /* Behaviors */
68194     context.install = function(behavior) {
68195         context.surface().call(behavior);
68196     };
68197     context.uninstall = function(behavior) {
68198         context.surface().call(behavior.off);
68199     };
68200
68201
68202     /* Copy/Paste */
68203     var copyIDs = [], copyGraph;
68204     context.copyGraph = function() { return copyGraph; };
68205     context.copyIDs = function(_) {
68206         if (!arguments.length) return copyIDs;
68207         copyIDs = _;
68208         copyGraph = history.graph();
68209         return context;
68210     };
68211
68212
68213     /* Background */
68214     var background;
68215     context.background = function() { return background; };
68216
68217
68218     /* Features */
68219     var features;
68220     context.features = function() { return features; };
68221     context.hasHiddenConnections = function(id) {
68222         var graph = history.graph(),
68223             entity = graph.entity(id);
68224         return features.hasHiddenConnections(entity, graph);
68225     };
68226
68227
68228     /* Presets */
68229     var presets;
68230     context.presets = function() { return presets; };
68231
68232
68233     /* Map */
68234     var map;
68235     context.map = function() { return map; };
68236     context.layers = function() { return map.layers; };
68237     context.surface = function() { return map.surface; };
68238     context.editable = function() { return map.editable(); };
68239     context.surfaceRect = function() {
68240         return map.surface.node().getBoundingClientRect();
68241     };
68242
68243
68244     /* Debug */
68245     var debugFlags = {
68246         tile: false,
68247         collision: false,
68248         imagery: false,
68249         imperial: false,
68250         driveLeft: false
68251     };
68252     context.debugFlags = function() {
68253         return debugFlags;
68254     };
68255     context.setDebug = function(flag, val) {
68256         if (arguments.length === 1) val = true;
68257         debugFlags[flag] = val;
68258         dispatch$$1.call('change');
68259         return context;
68260     };
68261     context.getDebug = function(flag) {
68262         return flag && debugFlags[flag];
68263     };
68264
68265
68266     /* Container */
68267     var container = d3_select(document.body);
68268     context.container = function(_) {
68269         if (!arguments.length) return container;
68270         container = _;
68271         container.classed('id-container', true);
68272         return context;
68273     };
68274     var embed;
68275     context.embed = function(_) {
68276         if (!arguments.length) return embed;
68277         embed = _;
68278         return context;
68279     };
68280
68281
68282     /* Assets */
68283     var assetPath = '';
68284     context.assetPath = function(_) {
68285         if (!arguments.length) return assetPath;
68286         assetPath = _;
68287         return context;
68288     };
68289
68290     var assetMap = {};
68291     context.assetMap = function(_) {
68292         if (!arguments.length) return assetMap;
68293         assetMap = _;
68294         return context;
68295     };
68296
68297     context.asset = function(_) {
68298         var filename = assetPath + _;
68299         return assetMap[filename] || filename;
68300     };
68301
68302     context.imagePath = function(_) {
68303         return context.asset('img/' + _);
68304     };
68305
68306
68307     /* locales */
68308     // `locale` variable contains a "requested locale".
68309     // It won't become the `currentLocale` until after loadLocale() is called.
68310     var locale, localePath;
68311
68312     context.locale = function(loc, path) {
68313         if (!arguments.length) return currentLocale;
68314         locale = loc;
68315         localePath = path;
68316         return context;
68317     };
68318
68319     context.loadLocale = function(callback) {
68320         if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
68321             localePath = localePath || context.asset('locales/' + locale + '.json');
68322             d3_json(localePath, function(err, result) {
68323                 if (!err) {
68324                     addTranslation(locale, result[locale]);
68325                     setLocale(locale);
68326                     utilDetect(true);
68327                 }
68328                 if (callback) {
68329                     callback(err);
68330                 }
68331             });
68332         } else {
68333             if (locale) {
68334                 setLocale(locale);
68335                 utilDetect(true);
68336             }
68337             if (callback) {
68338                 callback();
68339             }
68340         }
68341     };
68342
68343
68344     /* reset (aka flush) */
68345     context.reset = context.flush = function() {
68346         context.debouncedSave.cancel();
68347         forEach(services, function(service) {
68348             if (service && typeof service.reset === 'function') {
68349                 service.reset(context);
68350             }
68351         });
68352         features.reset();
68353         history.reset();
68354         return context;
68355     };
68356
68357
68358     /* Init */
68359
68360     context.projection = geoRawMercator();
68361     context.curtainProjection = geoRawMercator();
68362
68363     locale = utilDetect().locale;
68364     if (locale && !dataLocales.hasOwnProperty(locale)) {
68365         locale = locale.split('-')[0];
68366     }
68367
68368     history = coreHistory(context);
68369     context.graph = history.graph;
68370     context.changes = history.changes;
68371     context.intersects = history.intersects;
68372
68373     // Debounce save, since it's a synchronous localStorage write,
68374     // and history changes can happen frequently (e.g. when dragging).
68375     context.debouncedSave = debounce$1(context.save, 350);
68376     function withDebouncedSave(fn) {
68377         return function() {
68378             var result = fn.apply(history, arguments);
68379             context.debouncedSave();
68380             return result;
68381         };
68382     }
68383
68384     context.perform = withDebouncedSave(history.perform);
68385     context.replace = withDebouncedSave(history.replace);
68386     context.pop = withDebouncedSave(history.pop);
68387     context.overwrite = withDebouncedSave(history.overwrite);
68388     context.undo = withDebouncedSave(history.undo);
68389     context.redo = withDebouncedSave(history.redo);
68390
68391     ui = uiInit(context);
68392
68393     connection = services.osm;
68394     background = rendererBackground(context);
68395     features = rendererFeatures(context);
68396     presets = presetIndex();
68397
68398     map = rendererMap(context);
68399     context.mouse = map.mouse;
68400     context.extent = map.extent;
68401     context.pan = map.pan;
68402     context.zoomIn = map.zoomIn;
68403     context.zoomOut = map.zoomOut;
68404     context.zoomInFurther = map.zoomInFurther;
68405     context.zoomOutFurther = map.zoomOutFurther;
68406     context.redrawEnable = map.redrawEnable;
68407
68408     forEach(services, function(service) {
68409         if (service && typeof service.init === 'function') {
68410             service.init(context);
68411         }
68412     });
68413
68414     background.init();
68415     features.init();
68416     presets.init();
68417     areaKeys = presets.areaKeys();
68418
68419
68420     return utilRebind(context, dispatch$$1, 'on');
68421 }
68422
68423 function osmWay() {
68424     if (!(this instanceof osmWay)) {
68425         return (new osmWay()).initialize(arguments);
68426     } else if (arguments.length) {
68427         this.initialize(arguments);
68428     }
68429 }
68430
68431
68432 osmEntity$$1.way = osmWay;
68433
68434 osmWay.prototype = Object.create(osmEntity$$1.prototype);
68435
68436
68437 assignIn$1(osmWay.prototype, {
68438     type: 'way',
68439     nodes: [],
68440
68441
68442     copy: function(resolver, copies) {
68443         if (copies[this.id])
68444             return copies[this.id];
68445
68446         var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
68447
68448         var nodes = this.nodes.map(function(id) {
68449             return resolver.entity(id).copy(resolver, copies).id;
68450         });
68451
68452         copy = copy.update({ nodes: nodes });
68453         copies[this.id] = copy;
68454
68455         return copy;
68456     },
68457
68458
68459     extent: function(resolver) {
68460         return resolver.transient(this, 'extent', function() {
68461             var extent = geoExtent$$1();
68462             for (var i = 0; i < this.nodes.length; i++) {
68463                 var node = resolver.hasEntity(this.nodes[i]);
68464                 if (node) {
68465                     extent._extend(node.extent());
68466                 }
68467             }
68468             return extent;
68469         });
68470     },
68471
68472
68473     first: function() {
68474         return this.nodes[0];
68475     },
68476
68477
68478     last: function() {
68479         return this.nodes[this.nodes.length - 1];
68480     },
68481
68482
68483     contains: function(node) {
68484         return this.nodes.indexOf(node) >= 0;
68485     },
68486
68487
68488     affix: function(node) {
68489         if (this.nodes[0] === node) return 'prefix';
68490         if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
68491     },
68492
68493
68494     layer: function() {
68495         // explicit layer tag, clamp between -10, 10..
68496         if (isFinite(this.tags.layer)) {
68497             return Math.max(-10, Math.min(+(this.tags.layer), 10));
68498         }
68499
68500         // implied layer tag..
68501         if (this.tags.location === 'overground') return 1;
68502         if (this.tags.location === 'underground') return -1;
68503         if (this.tags.location === 'underwater') return -10;
68504
68505         if (this.tags.power === 'line') return 10;
68506         if (this.tags.power === 'minor_line') return 10;
68507         if (this.tags.aerialway) return 10;
68508         if (this.tags.bridge) return 1;
68509         if (this.tags.cutting) return -1;
68510         if (this.tags.tunnel) return -1;
68511         if (this.tags.waterway) return -1;
68512         if (this.tags.man_made === 'pipeline') return -10;
68513         if (this.tags.boundary) return -10;
68514         return 0;
68515     },
68516
68517
68518     isOneWay: function() {
68519         // explicit oneway tag..
68520         if (['yes', '1', '-1'].indexOf(this.tags.oneway) !== -1) { return true; }
68521         if (['no', '0'].indexOf(this.tags.oneway) !== -1) { return false; }
68522
68523         // implied oneway tag..
68524         for (var key in this.tags) {
68525             if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
68526                 return true;
68527         }
68528         return false;
68529     },
68530
68531
68532     lanes: function() {
68533         return osmLanes(this);
68534     },
68535
68536
68537     isClosed: function() {
68538         return this.nodes.length > 1 && this.first() === this.last();
68539     },
68540
68541
68542     isConvex: function(resolver) {
68543         if (!this.isClosed() || this.isDegenerate()) return null;
68544
68545         var nodes = uniq(resolver.childNodes(this)),
68546             coords = map$4(nodes, 'loc'),
68547             curr = 0, prev = 0;
68548
68549         for (var i = 0; i < coords.length; i++) {
68550             var o = coords[(i+1) % coords.length],
68551                 a = coords[i],
68552                 b = coords[(i+2) % coords.length],
68553                 res = geoCross(o, a, b);
68554
68555             curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
68556             if (curr === 0) {
68557                 continue;
68558             } else if (prev && curr !== prev) {
68559                 return false;
68560             }
68561             prev = curr;
68562         }
68563         return true;
68564     },
68565
68566
68567     isArea: function() {
68568         // `highway` and `railway` are typically linear features, but there
68569         // are a few exceptions that should be treated as areas, even in the
68570         // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
68571         var lineKeys = {
68572             highway: {
68573                 rest_area: true,
68574                 services: true
68575             },
68576             railway: {
68577                 roundhouse: true,
68578                 station: true,
68579                 traverser: true,
68580                 turntable: true,
68581                 wash: true
68582             }
68583         };
68584
68585         if (this.tags.area === 'yes')
68586             return true;
68587         if (!this.isClosed() || this.tags.area === 'no')
68588             return false;
68589         for (var key in this.tags) {
68590             if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
68591                 return true;
68592             }
68593             if (key in lineKeys && this.tags[key] in lineKeys[key]) {
68594                 return true;
68595             }
68596         }
68597         return false;
68598     },
68599
68600
68601     isDegenerate: function() {
68602         return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
68603     },
68604
68605
68606     areAdjacent: function(n1, n2) {
68607         for (var i = 0; i < this.nodes.length; i++) {
68608             if (this.nodes[i] === n1) {
68609                 if (this.nodes[i - 1] === n2) return true;
68610                 if (this.nodes[i + 1] === n2) return true;
68611             }
68612         }
68613         return false;
68614     },
68615
68616
68617     geometry: function(graph) {
68618         return graph.transient(this, 'geometry', function() {
68619             return this.isArea() ? 'area' : 'line';
68620         });
68621     },
68622
68623
68624     // If this way is not closed, append the beginning node to the end of the nodelist to close it.
68625     close: function() {
68626         if (this.isClosed() || !this.nodes.length) return this;
68627
68628         var nodes = this.nodes.slice();
68629         nodes = nodes.filter(noRepeatNodes);
68630         nodes.push(nodes[0]);
68631         return this.update({ nodes: nodes });
68632     },
68633
68634
68635     // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
68636     unclose: function() {
68637         if (!this.isClosed()) return this;
68638
68639         var nodes = this.nodes.slice(),
68640             connector = this.first(),
68641             i = nodes.length - 1;
68642
68643         // remove trailing connectors..
68644         while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
68645             nodes.splice(i, 1);
68646             i = nodes.length - 1;
68647         }
68648
68649         nodes = nodes.filter(noRepeatNodes);
68650         return this.update({ nodes: nodes });
68651     },
68652
68653
68654     // Adds a node (id) in front of the node which is currently at position index.
68655     // If index is undefined, the node will be added to the end of the way for linear ways,
68656     //   or just before the final connecting node for circular ways.
68657     // Consecutive duplicates are eliminated including existing ones.
68658     // Circularity is always preserved when adding a node.
68659     addNode: function(id, index) {
68660         var nodes = this.nodes.slice(),
68661             isClosed = this.isClosed(),
68662             max = isClosed ? nodes.length - 1 : nodes.length;
68663
68664         if (index === undefined) {
68665             index = max;
68666         }
68667
68668         if (index < 0 || index > max) {
68669             throw new RangeError('index ' + index + ' out of range 0..' + max);
68670         }
68671
68672         // If this is a closed way, remove all connector nodes except the first one
68673         // (there may be duplicates) and adjust index if necessary..
68674         if (isClosed) {
68675             var connector = this.first();
68676
68677             // leading connectors..
68678             var i = 1;
68679             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
68680                 nodes.splice(i, 1);
68681                 if (index > i) index--;
68682             }
68683
68684             // trailing connectors..
68685             i = nodes.length - 1;
68686             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
68687                 nodes.splice(i, 1);
68688                 if (index > i) index--;
68689                 i = nodes.length - 1;
68690             }
68691         }
68692
68693         nodes.splice(index, 0, id);
68694         nodes = nodes.filter(noRepeatNodes);
68695
68696         // If the way was closed before, append a connector node to keep it closed..
68697         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
68698             nodes.push(nodes[0]);
68699         }
68700
68701         return this.update({ nodes: nodes });
68702     },
68703
68704
68705     // Replaces the node which is currently at position index with the given node (id).
68706     // Consecutive duplicates are eliminated including existing ones.
68707     // Circularity is preserved when updating a node.
68708     updateNode: function(id, index) {
68709         var nodes = this.nodes.slice(),
68710             isClosed = this.isClosed(),
68711             max = nodes.length - 1;
68712
68713         if (index === undefined || index < 0 || index > max) {
68714             throw new RangeError('index ' + index + ' out of range 0..' + max);
68715         }
68716
68717         // If this is a closed way, remove all connector nodes except the first one
68718         // (there may be duplicates) and adjust index if necessary..
68719         if (isClosed) {
68720             var connector = this.first();
68721
68722             // leading connectors..
68723             var i = 1;
68724             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
68725                 nodes.splice(i, 1);
68726                 if (index > i) index--;
68727             }
68728
68729             // trailing connectors..
68730             i = nodes.length - 1;
68731             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
68732                 nodes.splice(i, 1);
68733                 if (index === i) index = 0;  // update leading connector instead
68734                 i = nodes.length - 1;
68735             }
68736         }
68737
68738         nodes.splice(index, 1, id);
68739         nodes = nodes.filter(noRepeatNodes);
68740
68741         // If the way was closed before, append a connector node to keep it closed..
68742         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
68743             nodes.push(nodes[0]);
68744         }
68745
68746         return this.update({nodes: nodes});
68747     },
68748
68749
68750     // Replaces each occurrence of node id needle with replacement.
68751     // Consecutive duplicates are eliminated including existing ones.
68752     // Circularity is preserved.
68753     replaceNode: function(needle, replacement) {
68754         var nodes = this.nodes.slice(),
68755             isClosed = this.isClosed();
68756
68757         for (var i = 0; i < nodes.length; i++) {
68758             if (nodes[i] === needle) {
68759                 nodes[i] = replacement;
68760             }
68761         }
68762
68763         nodes = nodes.filter(noRepeatNodes);
68764
68765         // If the way was closed before, append a connector node to keep it closed..
68766         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
68767             nodes.push(nodes[0]);
68768         }
68769
68770         return this.update({nodes: nodes});
68771     },
68772
68773
68774     // Removes each occurrence of node id needle with replacement.
68775     // Consecutive duplicates are eliminated including existing ones.
68776     // Circularity is preserved.
68777     removeNode: function(id) {
68778         var nodes = this.nodes.slice(),
68779             isClosed = this.isClosed();
68780
68781         nodes = nodes
68782             .filter(function(node) { return node !== id; })
68783             .filter(noRepeatNodes);
68784
68785         // If the way was closed before, append a connector node to keep it closed..
68786         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
68787             nodes.push(nodes[0]);
68788         }
68789
68790         return this.update({nodes: nodes});
68791     },
68792
68793
68794     asJXON: function(changeset_id) {
68795         var r = {
68796             way: {
68797                 '@id': this.osmId(),
68798                 '@version': this.version || 0,
68799                 nd: map$4(this.nodes, function(id) {
68800                     return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
68801                 }),
68802                 tag: map$4(this.tags, function(v, k) {
68803                     return { keyAttributes: { k: k, v: v } };
68804                 })
68805             }
68806         };
68807         if (changeset_id) {
68808             r.way['@changeset'] = changeset_id;
68809         }
68810         return r;
68811     },
68812
68813
68814     asGeoJSON: function(resolver) {
68815         return resolver.transient(this, 'GeoJSON', function() {
68816             var coordinates = map$4(resolver.childNodes(this), 'loc');
68817             if (this.isArea() && this.isClosed()) {
68818                 return {
68819                     type: 'Polygon',
68820                     coordinates: [coordinates]
68821                 };
68822             } else {
68823                 return {
68824                     type: 'LineString',
68825                     coordinates: coordinates
68826                 };
68827             }
68828         });
68829     },
68830
68831
68832     area: function(resolver) {
68833         return resolver.transient(this, 'area', function() {
68834             var nodes = resolver.childNodes(this);
68835
68836             var json = {
68837                 type: 'Polygon',
68838                 coordinates: [map$4(nodes, 'loc')]
68839             };
68840
68841             if (!this.isClosed() && nodes.length) {
68842                 json.coordinates[0].push(nodes[0].loc);
68843             }
68844
68845             var area = d3_geoArea(json);
68846
68847             // Heuristic for detecting counterclockwise winding order. Assumes
68848             // that OpenStreetMap polygons are not hemisphere-spanning.
68849             if (area > 2 * Math.PI) {
68850                 json.coordinates[0] = json.coordinates[0].reverse();
68851                 area = d3_geoArea(json);
68852             }
68853
68854             return isNaN(area) ? 0 : area;
68855         });
68856     }
68857 });
68858
68859
68860 // Filter function to eliminate consecutive duplicates.
68861 function noRepeatNodes(node, i, arr) {
68862     return i === 0 || node !== arr[i - 1];
68863 }
68864
68865 /* Built-in method references for those with the same name as other `lodash` methods. */
68866 var nativeMax$8 = Math.max;
68867
68868 /**
68869  * Gets the index at which the first occurrence of `value` is found in `array`
68870  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
68871  * for equality comparisons. If `fromIndex` is negative, it's used as the
68872  * offset from the end of `array`.
68873  *
68874  * @static
68875  * @memberOf _
68876  * @since 0.1.0
68877  * @category Array
68878  * @param {Array} array The array to inspect.
68879  * @param {*} value The value to search for.
68880  * @param {number} [fromIndex=0] The index to search from.
68881  * @returns {number} Returns the index of the matched value, else `-1`.
68882  * @example
68883  *
68884  * _.indexOf([1, 2, 1, 2], 2);
68885  * // => 1
68886  *
68887  * // Search from the `fromIndex`.
68888  * _.indexOf([1, 2, 1, 2], 2, 2);
68889  * // => 3
68890  */
68891 function indexOf(array, value, fromIndex) {
68892   var length = array == null ? 0 : array.length;
68893   if (!length) {
68894     return -1;
68895   }
68896   var index = fromIndex == null ? 0 : toInteger(fromIndex);
68897   if (index < 0) {
68898     index = nativeMax$8(length + index, 0);
68899   }
68900   return baseIndexOf(array, value, index);
68901 }
68902
68903 function osmTurn(turn) {
68904     if (!(this instanceof osmTurn))
68905         return new osmTurn(turn);
68906     assignIn$1(this, turn);
68907 }
68908
68909
68910 function osmIntersection(graph, vertexId) {
68911     var vertex = graph.entity(vertexId),
68912         parentWays = graph.parentWays(vertex),
68913         coincident = [],
68914         highways = {};
68915
68916     function addHighway(way, adjacentNodeId) {
68917         if (highways[adjacentNodeId]) {
68918             coincident.push(adjacentNodeId);
68919         } else {
68920             highways[adjacentNodeId] = way;
68921         }
68922     }
68923
68924     // Pre-split ways that would need to be split in
68925     // order to add a restriction. The real split will
68926     // happen when the restriction is added.
68927     parentWays.forEach(function(way) {
68928         if (!way.tags.highway || way.isArea() || way.isDegenerate())
68929             return;
68930
68931         var isFirst = (vertexId === way.first()),
68932             isLast = (vertexId === way.last()),
68933             isAffix = (isFirst || isLast),
68934             isClosingNode = (isFirst && isLast);
68935
68936         if (isAffix && !isClosingNode) {
68937             var index = (isFirst ? 1 : way.nodes.length - 2);
68938             addHighway(way, way.nodes[index]);
68939
68940         } else {
68941             var splitIndex, wayA, wayB, indexA, indexB;
68942             if (isClosingNode) {
68943                 splitIndex = Math.ceil(way.nodes.length / 2);  // split at midpoint
68944                 wayA = osmWay({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex)});
68945                 wayB = osmWay({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
68946                 indexA = 1;
68947                 indexB = way.nodes.length - 2;
68948             } else {
68949                 splitIndex = indexOf(way.nodes, vertex.id, 1);  // split at vertexid
68950                 wayA = osmWay({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex + 1)});
68951                 wayB = osmWay({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
68952                 indexA = splitIndex - 1;
68953                 indexB = splitIndex + 1;
68954             }
68955             graph = graph.replace(wayA).replace(wayB);
68956             addHighway(wayA, way.nodes[indexA]);
68957             addHighway(wayB, way.nodes[indexB]);
68958         }
68959     });
68960
68961     // remove any ways from this intersection that are coincident
68962     // (i.e. any adjacent node used by more than one intersecting way)
68963     coincident.forEach(function (n) {
68964         delete highways[n];
68965     });
68966
68967
68968     var intersection = {
68969         highways: highways,
68970         ways: values$1(highways),
68971         graph: graph
68972     };
68973
68974
68975     intersection.adjacentNodeId = function(fromWayId) {
68976         return find$1(keys$1(highways), function(k) {
68977             return highways[k].id === fromWayId;
68978         });
68979     };
68980
68981
68982     intersection.turns = function(fromNodeId) {
68983         var start = highways[fromNodeId];
68984         if (!start)
68985             return [];
68986
68987         if (start.first() === vertex.id && start.tags.oneway === 'yes')
68988             return [];
68989         if (start.last() === vertex.id && start.tags.oneway === '-1')
68990             return [];
68991
68992         function withRestriction(turn) {
68993             graph.parentRelations(graph.entity(turn.from.way)).forEach(function(relation) {
68994                 if (relation.tags.type !== 'restriction')
68995                     return;
68996
68997                 var f = relation.memberByRole('from'),
68998                     t = relation.memberByRole('to'),
68999                     v = relation.memberByRole('via');
69000
69001                 if (f && f.id === turn.from.way &&
69002                     v && v.id === turn.via.node &&
69003                     t && t.id === turn.to.way) {
69004                     turn.restriction = relation.id;
69005                 } else if (/^only_/.test(relation.tags.restriction) &&
69006                     f && f.id === turn.from.way &&
69007                     v && v.id === turn.via.node &&
69008                     t && t.id !== turn.to.way) {
69009                     turn.restriction = relation.id;
69010                     turn.indirect_restriction = true;
69011                 }
69012             });
69013
69014             return osmTurn(turn);
69015         }
69016
69017
69018         var from = {
69019                 node: fromNodeId,
69020                 way: start.id.split(/-(a|b)/)[0]
69021             },
69022             via = { node: vertex.id },
69023             turns = [];
69024
69025         forEach(highways, function(end, adjacentNodeId) {
69026             if (end === start)
69027                 return;
69028
69029             // backward
69030             if (end.first() !== vertex.id && end.tags.oneway !== 'yes') {
69031                 turns.push(withRestriction({
69032                     from: from,
69033                     via: via,
69034                     to: {
69035                         node: adjacentNodeId,
69036                         way: end.id.split(/-(a|b)/)[0]
69037                     }
69038                 }));
69039             }
69040
69041             // forward
69042             if (end.last() !== vertex.id && end.tags.oneway !== '-1') {
69043                 turns.push(withRestriction({
69044                     from: from,
69045                     via: via,
69046                     to: {
69047                         node: adjacentNodeId,
69048                         way: end.id.split(/-(a|b)/)[0]
69049                     }
69050                 }));
69051             }
69052
69053         });
69054
69055         // U-turn
69056         if (start.tags.oneway !== 'yes' && start.tags.oneway !== '-1') {
69057             turns.push(withRestriction({
69058                 from: from,
69059                 via: via,
69060                 to: from,
69061                 u: true
69062             }));
69063         }
69064
69065         return turns;
69066     };
69067
69068     return intersection;
69069 }
69070
69071
69072 function osmInferRestriction(graph, from, via, to, projection) {
69073     var fromWay = graph.entity(from.way),
69074         fromNode = graph.entity(from.node),
69075         toWay = graph.entity(to.way),
69076         toNode = graph.entity(to.node),
69077         viaNode = graph.entity(via.node),
69078         fromOneWay = (fromWay.tags.oneway === 'yes' && fromWay.last() === via.node) ||
69079             (fromWay.tags.oneway === '-1' && fromWay.first() === via.node),
69080         toOneWay = (toWay.tags.oneway === 'yes' && toWay.first() === via.node) ||
69081             (toWay.tags.oneway === '-1' && toWay.last() === via.node),
69082         angle = geoAngle(viaNode, fromNode, projection) -
69083                 geoAngle(viaNode, toNode, projection);
69084
69085     angle = angle * 180 / Math.PI;
69086
69087     while (angle < 0)
69088         angle += 360;
69089
69090     if (fromNode === toNode)
69091         return 'no_u_turn';
69092     if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
69093         return 'no_u_turn';
69094     if (angle < 158)
69095         return 'no_right_turn';
69096     if (angle > 202)
69097         return 'no_left_turn';
69098
69099     return 'no_straight_on';
69100 }
69101
69102 function actionAddMember(relationId, member, memberIndex) {
69103     return function(graph) {
69104         var relation = graph.entity(relationId);
69105
69106         if (isNaN(memberIndex) && member.type === 'way') {
69107             var members = relation.indexedMembers();
69108             members.push(member);
69109
69110             var joined = osmJoinWays(members, graph);
69111             for (var i = 0; i < joined.length; i++) {
69112                 var segment = joined[i];
69113                 for (var j = 0; j < segment.length && segment.length >= 2; j++) {
69114                     if (segment[j] !== member)
69115                         continue;
69116
69117                     if (j === 0) {
69118                         memberIndex = segment[j + 1].index;
69119                     } else if (j === segment.length - 1) {
69120                         memberIndex = segment[j - 1].index + 1;
69121                     } else {
69122                         memberIndex = Math.min(segment[j - 1].index + 1, segment[j + 1].index + 1);
69123                     }
69124                 }
69125             }
69126         }
69127
69128         return graph.replace(relation.addMember(member, memberIndex));
69129     };
69130 }
69131
69132 function actionAddMidpoint(midpoint, node) {
69133     return function(graph) {
69134         graph = graph.replace(node.move(midpoint.loc));
69135
69136         var parents = intersection(
69137             graph.parentWays(graph.entity(midpoint.edge[0])),
69138             graph.parentWays(graph.entity(midpoint.edge[1])));
69139
69140         parents.forEach(function(way) {
69141             for (var i = 0; i < way.nodes.length - 1; i++) {
69142                 if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
69143                     graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
69144
69145                     // Add only one midpoint on doubled-back segments,
69146                     // turning them into self-intersections.
69147                     return;
69148                 }
69149             }
69150         });
69151
69152         return graph;
69153     };
69154 }
69155
69156 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
69157 function actionAddVertex(wayId, nodeId, index) {
69158     return function(graph) {
69159         return graph.replace(graph.entity(wayId).addNode(nodeId, index));
69160     };
69161 }
69162
69163 function actionChangeMember(relationId, member, memberIndex) {
69164     return function(graph) {
69165         return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
69166     };
69167 }
69168
69169 function actionChangePreset(entityId, oldPreset, newPreset) {
69170     return function(graph) {
69171         var entity = graph.entity(entityId),
69172             geometry = entity.geometry(graph),
69173             tags = entity.tags;
69174
69175         if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
69176         if (newPreset) tags = newPreset.applyTags(tags, geometry);
69177
69178         return graph.replace(entity.update({tags: tags}));
69179     };
69180 }
69181
69182 function actionChangeTags(entityId, tags) {
69183     return function(graph) {
69184         var entity = graph.entity(entityId);
69185         return graph.replace(entity.update({tags: tags}));
69186     };
69187 }
69188
69189 function actionCircularize(wayId, projection, maxAngle) {
69190     maxAngle = (maxAngle || 20) * Math.PI / 180;
69191
69192
69193     var action = function(graph, t) {
69194         if (t === null || !isFinite(t)) t = 1;
69195         t = Math.min(Math.max(+t, 0), 1);
69196
69197         var way = graph.entity(wayId),
69198             origNodes = {};
69199
69200         graph.childNodes(way).forEach(function(node) {
69201             if (!origNodes[node.id]) origNodes[node.id] = node;
69202         });
69203
69204         if (!way.isConvex(graph)) {
69205             graph = action.makeConvex(graph);
69206         }
69207
69208         var nodes = uniq(graph.childNodes(way)),
69209             keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
69210             points = nodes.map(function(n) { return projection(n.loc); }),
69211             keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
69212             centroid = (points.length === 2) ? geoInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
69213             radius = d3_median(points, function(p) { return geoEuclideanDistance(centroid, p); }),
69214             sign = d3_polygonArea(points) > 0 ? 1 : -1,
69215             ids;
69216
69217         // we need atleast two key nodes for the algorithm to work
69218         if (!keyNodes.length) {
69219             keyNodes = [nodes[0]];
69220             keyPoints = [points[0]];
69221         }
69222
69223         if (keyNodes.length === 1) {
69224             var index = nodes.indexOf(keyNodes[0]),
69225                 oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
69226
69227             keyNodes.push(nodes[oppositeIndex]);
69228             keyPoints.push(points[oppositeIndex]);
69229         }
69230
69231         // key points and nodes are those connected to the ways,
69232         // they are projected onto the circle, inbetween nodes are moved
69233         // to constant intervals between key nodes, extra inbetween nodes are
69234         // added if necessary.
69235         for (var i = 0; i < keyPoints.length; i++) {
69236             var nextKeyNodeIndex = (i + 1) % keyNodes.length,
69237                 startNode = keyNodes[i],
69238                 endNode = keyNodes[nextKeyNodeIndex],
69239                 startNodeIndex = nodes.indexOf(startNode),
69240                 endNodeIndex = nodes.indexOf(endNode),
69241                 numberNewPoints = -1,
69242                 indexRange = endNodeIndex - startNodeIndex,
69243                 nearNodes = {},
69244                 inBetweenNodes = [],
69245                 startAngle, endAngle, totalAngle, eachAngle,
69246                 angle, loc, node, origNode, j;
69247
69248             if (indexRange < 0) {
69249                 indexRange += nodes.length;
69250             }
69251
69252             // position this key node
69253             var distance = geoEuclideanDistance(centroid, keyPoints[i]);
69254             if (distance === 0) { distance = 1e-4; }
69255             keyPoints[i] = [
69256                 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
69257                 centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
69258             ];
69259             loc = projection.invert(keyPoints[i]);
69260             node = keyNodes[i];
69261             origNode = origNodes[node.id];
69262             node = node.move(geoInterp(origNode.loc, loc, t));
69263             graph = graph.replace(node);
69264
69265             // figure out the between delta angle we want to match to
69266             startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
69267             endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
69268             totalAngle = endAngle - startAngle;
69269
69270             // detects looping around -pi/pi
69271             if (totalAngle * sign > 0) {
69272                 totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
69273             }
69274
69275             do {
69276                 numberNewPoints++;
69277                 eachAngle = totalAngle / (indexRange + numberNewPoints);
69278             } while (Math.abs(eachAngle) > maxAngle);
69279
69280
69281             // move existing nodes
69282             for (j = 1; j < indexRange; j++) {
69283                 angle = startAngle + j * eachAngle;
69284                 loc = projection.invert([
69285                     centroid[0] + Math.cos(angle) * radius,
69286                     centroid[1] + Math.sin(angle) * radius
69287                 ]);
69288
69289                 node = nodes[(j + startNodeIndex) % nodes.length];
69290                 origNode = origNodes[node.id];
69291                 nearNodes[node.id] = angle;
69292
69293                 node = node.move(geoInterp(origNode.loc, loc, t));
69294                 graph = graph.replace(node);
69295             }
69296
69297             // add new inbetween nodes if necessary
69298             for (j = 0; j < numberNewPoints; j++) {
69299                 angle = startAngle + (indexRange + j) * eachAngle;
69300                 loc = projection.invert([
69301                     centroid[0] + Math.cos(angle) * radius,
69302                     centroid[1] + Math.sin(angle) * radius
69303                 ]);
69304
69305                 // choose a nearnode to use as the original
69306                 var min$$1 = Infinity;
69307                 for (var nodeId in nearNodes) {
69308                     var nearAngle = nearNodes[nodeId],
69309                         dist = Math.abs(nearAngle - angle);
69310                     if (dist < min$$1) {
69311                         dist = min$$1;
69312                         origNode = origNodes[nodeId];
69313                     }
69314                 }
69315
69316                 node = osmNode({ loc: geoInterp(origNode.loc, loc, t) });
69317                 graph = graph.replace(node);
69318
69319                 nodes.splice(endNodeIndex + j, 0, node);
69320                 inBetweenNodes.push(node.id);
69321             }
69322
69323             // Check for other ways that share these keyNodes..
69324             // If keyNodes are adjacent in both ways,
69325             // we can add inBetween nodes to that shared way too..
69326             if (indexRange === 1 && inBetweenNodes.length) {
69327                 var startIndex1 = way.nodes.lastIndexOf(startNode.id),
69328                     endIndex1 = way.nodes.lastIndexOf(endNode.id),
69329                     wayDirection1 = (endIndex1 - startIndex1);
69330                 if (wayDirection1 < -1) { wayDirection1 = 1; }
69331
69332                 /* eslint-disable no-loop-func */
69333                 forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
69334                     if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
69335                         var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
69336                             endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
69337                             wayDirection2 = (endIndex2 - startIndex2),
69338                             insertAt = endIndex2;
69339                         if (wayDirection2 < -1) { wayDirection2 = 1; }
69340
69341                         if (wayDirection1 !== wayDirection2) {
69342                             inBetweenNodes.reverse();
69343                             insertAt = startIndex2;
69344                         }
69345                         for (j = 0; j < inBetweenNodes.length; j++) {
69346                             sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
69347                         }
69348                         graph = graph.replace(sharedWay);
69349                     }
69350                 });
69351                 /* eslint-enable no-loop-func */
69352             }
69353
69354         }
69355
69356         // update the way to have all the new nodes
69357         ids = nodes.map(function(n) { return n.id; });
69358         ids.push(ids[0]);
69359
69360         way = way.update({nodes: ids});
69361         graph = graph.replace(way);
69362
69363         return graph;
69364     };
69365
69366
69367     action.makeConvex = function(graph) {
69368         var way = graph.entity(wayId),
69369             nodes = uniq(graph.childNodes(way)),
69370             points = nodes.map(function(n) { return projection(n.loc); }),
69371             sign = d3_polygonArea(points) > 0 ? 1 : -1,
69372             hull = d3_polygonHull(points);
69373
69374         // D3 convex hulls go counterclockwise..
69375         if (sign === -1) {
69376             nodes.reverse();
69377             points.reverse();
69378         }
69379
69380         for (var i = 0; i < hull.length - 1; i++) {
69381             var startIndex = points.indexOf(hull[i]),
69382                 endIndex = points.indexOf(hull[i+1]),
69383                 indexRange = (endIndex - startIndex);
69384
69385             if (indexRange < 0) {
69386                 indexRange += nodes.length;
69387             }
69388
69389             // move interior nodes to the surface of the convex hull..
69390             for (var j = 1; j < indexRange; j++) {
69391                 var point = geoInterp(hull[i], hull[i+1], j / indexRange),
69392                     node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
69393                 graph = graph.replace(node);
69394             }
69395         }
69396         return graph;
69397     };
69398
69399
69400     action.disabled = function(graph) {
69401         if (!graph.entity(wayId).isClosed())
69402             return 'not_closed';
69403     };
69404
69405
69406     action.transitionable = true;
69407
69408
69409     return action;
69410 }
69411
69412 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
69413 function actionDeleteWay(wayId) {
69414
69415
69416     function canDeleteNode(node, graph) {
69417         return !graph.parentWays(node).length &&
69418             !graph.parentRelations(node).length &&
69419             !node.hasInterestingTags();
69420     }
69421
69422
69423     var action = function(graph) {
69424         var way = graph.entity(wayId);
69425
69426         graph.parentRelations(way)
69427             .forEach(function(parent) {
69428                 parent = parent.removeMembersWithID(wayId);
69429                 graph = graph.replace(parent);
69430
69431                 if (parent.isDegenerate()) {
69432                     graph = actionDeleteRelation(parent.id)(graph);
69433                 }
69434             });
69435
69436         uniq(way.nodes).forEach(function(nodeId) {
69437             graph = graph.replace(way.removeNode(nodeId));
69438
69439             var node = graph.entity(nodeId);
69440             if (canDeleteNode(node, graph)) {
69441                 graph = graph.remove(node);
69442             }
69443         });
69444
69445         return graph.remove(way);
69446     };
69447
69448
69449     return action;
69450 }
69451
69452 function actionDeleteMultiple(ids) {
69453     var actions = {
69454         way: actionDeleteWay,
69455         node: actionDeleteNode,
69456         relation: actionDeleteRelation
69457     };
69458
69459
69460     var action = function(graph) {
69461         ids.forEach(function(id) {
69462             if (graph.hasEntity(id)) { // It may have been deleted aready.
69463                 graph = actions[graph.entity(id).type](id)(graph);
69464             }
69465         });
69466
69467         return graph;
69468     };
69469
69470
69471     return action;
69472 }
69473
69474 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
69475 function actionDeleteRelation(relationId) {
69476
69477
69478     function canDeleteEntity(entity, graph) {
69479         return !graph.parentWays(entity).length &&
69480             !graph.parentRelations(entity).length &&
69481             !entity.hasInterestingTags();
69482     }
69483
69484
69485     var action = function(graph) {
69486         var relation = graph.entity(relationId);
69487
69488         graph.parentRelations(relation)
69489             .forEach(function(parent) {
69490                 parent = parent.removeMembersWithID(relationId);
69491                 graph = graph.replace(parent);
69492
69493                 if (parent.isDegenerate()) {
69494                     graph = actionDeleteRelation(parent.id)(graph);
69495                 }
69496             });
69497
69498         uniq(map$4(relation.members, 'id')).forEach(function(memberId) {
69499             graph = graph.replace(relation.removeMembersWithID(memberId));
69500
69501             var entity = graph.entity(memberId);
69502             if (canDeleteEntity(entity, graph)) {
69503                 graph = actionDeleteMultiple([memberId])(graph);
69504             }
69505         });
69506
69507         return graph.remove(relation);
69508     };
69509
69510
69511     return action;
69512 }
69513
69514 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
69515 function actionDeleteNode(nodeId) {
69516     var action = function(graph) {
69517         var node = graph.entity(nodeId);
69518
69519         graph.parentWays(node)
69520             .forEach(function(parent) {
69521                 parent = parent.removeNode(nodeId);
69522                 graph = graph.replace(parent);
69523
69524                 if (parent.isDegenerate()) {
69525                     graph = actionDeleteWay(parent.id)(graph);
69526                 }
69527             });
69528
69529         graph.parentRelations(node)
69530             .forEach(function(parent) {
69531                 parent = parent.removeMembersWithID(nodeId);
69532                 graph = graph.replace(parent);
69533
69534                 if (parent.isDegenerate()) {
69535                     graph = actionDeleteRelation(parent.id)(graph);
69536                 }
69537             });
69538
69539         return graph.remove(node);
69540     };
69541
69542
69543     return action;
69544 }
69545
69546 // Connect the ways at the given nodes.
69547 //
69548 // The last node will survive. All other nodes will be replaced with
69549 // the surviving node in parent ways, and then removed.
69550 //
69551 // Tags and relation memberships of of non-surviving nodes are merged
69552 // to the survivor.
69553 //
69554 // This is the inverse of `iD.actionDisconnect`.
69555 //
69556 // Reference:
69557 //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
69558 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
69559 //
69560 function actionConnect(nodeIds) {
69561     return function(graph) {
69562         var last = nodeIds[nodeIds.length - 1];
69563         var survivor = graph.entity(last);
69564
69565         for (var i = 0; i < nodeIds.length - 1; i++) {
69566             var node = graph.entity(nodeIds[i]);
69567
69568             /* eslint-disable no-loop-func */
69569             graph.parentWays(node).forEach(function(parent) {
69570                 if (!parent.areAdjacent(node.id, survivor.id)) {
69571                     graph = graph.replace(parent.replaceNode(node.id, survivor.id));
69572                 }
69573             });
69574
69575             graph.parentRelations(node).forEach(function(parent) {
69576                 graph = graph.replace(parent.replaceMember(node, survivor));
69577             });
69578             /* eslint-enable no-loop-func */
69579
69580             survivor = survivor.mergeTags(node.tags);
69581             graph = actionDeleteNode(node.id)(graph);
69582         }
69583
69584         graph = graph.replace(survivor);
69585
69586         return graph;
69587     };
69588 }
69589
69590 function actionCopyEntities(ids, fromGraph) {
69591     var copies = {};
69592
69593
69594     var action = function(graph) {
69595         ids.forEach(function(id) {
69596             fromGraph.entity(id).copy(fromGraph, copies);
69597         });
69598
69599         for (var id in copies) {
69600             graph = graph.replace(copies[id]);
69601         }
69602
69603         return graph;
69604     };
69605
69606
69607     action.copies = function() {
69608         return copies;
69609     };
69610
69611
69612     return action;
69613 }
69614
69615 function actionDeleteMember(relationId, memberIndex) {
69616     return function(graph) {
69617         var relation = graph.entity(relationId)
69618             .removeMember(memberIndex);
69619
69620         graph = graph.replace(relation);
69621
69622         if (relation.isDegenerate())
69623             graph = actionDeleteRelation(relation.id)(graph);
69624
69625         return graph;
69626     };
69627 }
69628
69629 function actionDeprecateTags(entityId) {
69630
69631     return function(graph) {
69632         var entity = graph.entity(entityId),
69633             newtags = clone(entity.tags),
69634             change = false,
69635             rule;
69636
69637         // This handles dataDeprecated tags with a single condition
69638         for (var i = 0; i < dataDeprecated.length; i++) {
69639
69640             rule = dataDeprecated[i];
69641             var match = toPairs(rule.old)[0],
69642                 replacements = rule.replace ? toPairs(rule.replace) : null;
69643
69644             if (entity.tags[match[0]] && match[1] === '*') {
69645
69646                 var value = entity.tags[match[0]];
69647                 if (replacements && !newtags[replacements[0][0]]) {
69648                     newtags[replacements[0][0]] = value;
69649                 }
69650                 delete newtags[match[0]];
69651                 change = true;
69652
69653             } else if (entity.tags[match[0]] === match[1]) {
69654                 newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
69655                 change = true;
69656             }
69657         }
69658
69659         if (change) {
69660             return graph.replace(entity.update({tags: newtags}));
69661         } else {
69662             return graph;
69663         }
69664     };
69665 }
69666
69667 function actionDiscardTags(difference) {
69668
69669     return function(graph) {
69670         function discardTags(entity) {
69671             if (!isEmpty(entity.tags)) {
69672                 var tags = {};
69673                 forEach(entity.tags, function(v, k) {
69674                     if (v) tags[k] = v;
69675                 });
69676
69677                 graph = graph.replace(entity.update({
69678                     tags: omit(tags, dataDiscarded)
69679                 }));
69680             }
69681         }
69682
69683         difference.modified().forEach(discardTags);
69684         difference.created().forEach(discardTags);
69685
69686         return graph;
69687     };
69688 }
69689
69690 // Disconect the ways at the given node.
69691 //
69692 // Optionally, disconnect only the given ways.
69693 //
69694 // For testing convenience, accepts an ID to assign to the (first) new node.
69695 // Normally, this will be undefined and the way will automatically
69696 // be assigned a new ID.
69697 //
69698 // This is the inverse of `iD.actionConnect`.
69699 //
69700 // Reference:
69701 //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
69702 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
69703 //
69704 function actionDisconnect(nodeId, newNodeId) {
69705     var wayIds;
69706
69707
69708     var action = function(graph) {
69709         var node = graph.entity(nodeId),
69710             connections = action.connections(graph);
69711
69712         connections.forEach(function(connection) {
69713             var way = graph.entity(connection.wayID),
69714                 newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
69715
69716             graph = graph.replace(newNode);
69717             if (connection.index === 0 && way.isArea()) {
69718                 // replace shared node with shared node..
69719                 graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
69720             } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
69721                 // replace closing node with new new node..
69722                 graph = graph.replace(way.unclose().addNode(newNode.id));
69723             } else {
69724                 // replace shared node with multiple new nodes..
69725                 graph = graph.replace(way.updateNode(newNode.id, connection.index));
69726             }
69727         });
69728
69729         return graph;
69730     };
69731
69732
69733     action.connections = function(graph) {
69734         var candidates = [],
69735             keeping = false,
69736             parentWays = graph.parentWays(graph.entity(nodeId));
69737
69738         parentWays.forEach(function(way) {
69739             if (wayIds && wayIds.indexOf(way.id) === -1) {
69740                 keeping = true;
69741                 return;
69742             }
69743             if (way.isArea() && (way.nodes[0] === nodeId)) {
69744                 candidates.push({ wayID: way.id, index: 0 });
69745             } else {
69746                 way.nodes.forEach(function(waynode, index) {
69747                     if (waynode === nodeId) {
69748                         candidates.push({ wayID: way.id, index: index });
69749                     }
69750                 });
69751             }
69752         });
69753
69754         return keeping ? candidates : candidates.slice(1);
69755     };
69756
69757
69758     action.disabled = function(graph) {
69759         var connections = action.connections(graph);
69760         if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
69761             return 'not_connected';
69762
69763         var parentWays = graph.parentWays(graph.entity(nodeId)),
69764             seenRelationIds = {},
69765             sharedRelation;
69766
69767         parentWays.forEach(function(way) {
69768             if (wayIds && wayIds.indexOf(way.id) === -1)
69769                 return;
69770
69771             var relations = graph.parentRelations(way);
69772             relations.forEach(function(relation) {
69773                 if (relation.id in seenRelationIds) {
69774                     sharedRelation = relation;
69775                 } else {
69776                     seenRelationIds[relation.id] = true;
69777                 }
69778             });
69779         });
69780
69781         if (sharedRelation)
69782             return 'relation';
69783     };
69784
69785
69786     action.limitWays = function(_) {
69787         if (!arguments.length) return wayIds;
69788         wayIds = _;
69789         return action;
69790     };
69791
69792
69793     return action;
69794 }
69795
69796 // Join ways at the end node they share.
69797 //
69798 // This is the inverse of `iD.actionSplit`.
69799 //
69800 // Reference:
69801 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
69802 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
69803 //
69804 function actionJoin(ids) {
69805
69806     function groupEntitiesByGeometry(graph) {
69807         var entities = ids.map(function(id) { return graph.entity(id); });
69808         return assignIn$1({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
69809     }
69810
69811
69812     var action = function(graph) {
69813         var ways = ids.map(graph.entity, graph),
69814             survivor = ways[0];
69815
69816         // Prefer to keep an existing way.
69817         for (var i = 0; i < ways.length; i++) {
69818             if (!ways[i].isNew()) {
69819                 survivor = ways[i];
69820                 break;
69821             }
69822         }
69823
69824         var joined = osmJoinWays(ways, graph)[0];
69825
69826         survivor = survivor.update({nodes: map$4(joined.nodes, 'id')});
69827         graph = graph.replace(survivor);
69828
69829         joined.forEach(function(way) {
69830             if (way.id === survivor.id)
69831                 return;
69832
69833             graph.parentRelations(way).forEach(function(parent) {
69834                 graph = graph.replace(parent.replaceMember(way, survivor));
69835             });
69836
69837             survivor = survivor.mergeTags(way.tags);
69838
69839             graph = graph.replace(survivor);
69840             graph = actionDeleteWay(way.id)(graph);
69841         });
69842
69843         return graph;
69844     };
69845
69846
69847     action.disabled = function(graph) {
69848         var geometries = groupEntitiesByGeometry(graph);
69849         if (ids.length < 2 || ids.length !== geometries.line.length)
69850             return 'not_eligible';
69851
69852         var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
69853         if (joined.length > 1)
69854             return 'not_adjacent';
69855
69856         var nodeIds = map$4(joined[0].nodes, 'id').slice(1, -1),
69857             relation,
69858             tags = {},
69859             conflicting = false;
69860
69861         joined[0].forEach(function(way) {
69862             var parents = graph.parentRelations(way);
69863             parents.forEach(function(parent) {
69864                 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
69865                     relation = parent;
69866             });
69867
69868             for (var k in way.tags) {
69869                 if (!(k in tags)) {
69870                     tags[k] = way.tags[k];
69871                 } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
69872                     conflicting = true;
69873                 }
69874             }
69875         });
69876
69877         if (relation)
69878             return 'restriction';
69879
69880         if (conflicting)
69881             return 'conflicting_tags';
69882     };
69883
69884
69885     return action;
69886 }
69887
69888 function actionMerge(ids) {
69889
69890     function groupEntitiesByGeometry(graph) {
69891         var entities = ids.map(function(id) { return graph.entity(id); });
69892         return assignIn$1({point: [], area: [], line: [], relation: []},
69893             groupBy(entities, function(entity) { return entity.geometry(graph); }));
69894     }
69895
69896
69897     var action = function(graph) {
69898         var geometries = groupEntitiesByGeometry(graph),
69899             target = geometries.area[0] || geometries.line[0],
69900             points = geometries.point;
69901
69902         points.forEach(function(point) {
69903             target = target.mergeTags(point.tags);
69904             graph = graph.replace(target);
69905
69906             graph.parentRelations(point).forEach(function(parent) {
69907                 graph = graph.replace(parent.replaceMember(point, target));
69908             });
69909
69910             var nodes = uniq(graph.childNodes(target)),
69911                 removeNode = point;
69912
69913             for (var i = 0; i < nodes.length; i++) {
69914                 var node = nodes[i];
69915                 if (graph.parentWays(node).length > 1 ||
69916                     graph.parentRelations(node).length ||
69917                     node.hasInterestingTags()) {
69918                     continue;
69919                 }
69920
69921                 // Found an uninteresting child node on the target way.
69922                 // Move orig point into its place to preserve point's history. #3683
69923                 graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
69924                 target = target.replaceNode(node.id, point.id);
69925                 graph = graph.replace(target);
69926                 removeNode = node;
69927                 break;
69928             }
69929
69930             graph = graph.remove(removeNode);
69931         });
69932
69933         return graph;
69934     };
69935
69936
69937     action.disabled = function(graph) {
69938         var geometries = groupEntitiesByGeometry(graph);
69939         if (geometries.point.length === 0 ||
69940             (geometries.area.length + geometries.line.length) !== 1 ||
69941             geometries.relation.length !== 0)
69942             return 'not_eligible';
69943     };
69944
69945
69946     return action;
69947 }
69948
69949 function actionMergePolygon(ids, newRelationId) {
69950
69951     function groupEntities(graph) {
69952         var entities = ids.map(function (id) { return graph.entity(id); });
69953         return assignIn$1({
69954                 closedWay: [],
69955                 multipolygon: [],
69956                 other: []
69957             }, groupBy(entities, function(entity) {
69958                 if (entity.type === 'way' && entity.isClosed()) {
69959                     return 'closedWay';
69960                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
69961                     return 'multipolygon';
69962                 } else {
69963                     return 'other';
69964                 }
69965             }));
69966     }
69967
69968
69969     var action = function(graph) {
69970         var entities = groupEntities(graph);
69971
69972         // An array representing all the polygons that are part of the multipolygon.
69973         //
69974         // Each element is itself an array of objects with an id property, and has a
69975         // locs property which is an array of the locations forming the polygon.
69976         var polygons = entities.multipolygon.reduce(function(polygons, m) {
69977             return polygons.concat(osmJoinWays(m.members, graph));
69978         }, []).concat(entities.closedWay.map(function(d) {
69979             var member = [{id: d.id}];
69980             member.nodes = graph.childNodes(d);
69981             return member;
69982         }));
69983
69984         // contained is an array of arrays of boolean values,
69985         // where contained[j][k] is true iff the jth way is
69986         // contained by the kth way.
69987         var contained = polygons.map(function(w, i) {
69988             return polygons.map(function(d, n) {
69989                 if (i === n) return null;
69990                 return geoPolygonContainsPolygon(
69991                     map$4(d.nodes, 'loc'),
69992                     map$4(w.nodes, 'loc'));
69993             });
69994         });
69995
69996         // Sort all polygons as either outer or inner ways
69997         var members = [],
69998             outer = true;
69999
70000         while (polygons.length) {
70001             extractUncontained(polygons);
70002             polygons = polygons.filter(isContained);
70003             contained = contained.filter(isContained).map(filterContained);
70004         }
70005
70006         function isContained(d, i) {
70007             return some(contained[i]);
70008         }
70009
70010         function filterContained(d) {
70011             return d.filter(isContained);
70012         }
70013
70014         function extractUncontained(polygons) {
70015             polygons.forEach(function(d, i) {
70016                 if (!isContained(d, i)) {
70017                     d.forEach(function(member) {
70018                         members.push({
70019                             type: 'way',
70020                             id: member.id,
70021                             role: outer ? 'outer' : 'inner'
70022                         });
70023                     });
70024                 }
70025             });
70026             outer = !outer;
70027         }
70028
70029         // Move all tags to one relation
70030         var relation = entities.multipolygon[0] ||
70031             osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
70032
70033         entities.multipolygon.slice(1).forEach(function(m) {
70034             relation = relation.mergeTags(m.tags);
70035             graph = graph.remove(m);
70036         });
70037
70038         entities.closedWay.forEach(function(way) {
70039             function isThisOuter(m) {
70040                 return m.id === way.id && m.role !== 'inner';
70041             }
70042             if (members.some(isThisOuter)) {
70043                 relation = relation.mergeTags(way.tags);
70044                 graph = graph.replace(way.update({ tags: {} }));
70045             }
70046         });
70047
70048         return graph.replace(relation.update({
70049             members: members,
70050             tags: omit(relation.tags, 'area')
70051         }));
70052     };
70053
70054
70055     action.disabled = function(graph) {
70056         var entities = groupEntities(graph);
70057         if (entities.other.length > 0 ||
70058             entities.closedWay.length + entities.multipolygon.length < 2)
70059             return 'not_eligible';
70060         if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
70061             return 'incomplete_relation';
70062     };
70063
70064
70065     return action;
70066 }
70067
70068 // Text diff algorithm following Hunt and McIlroy 1976.
70069 // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
70070 // comparison, Bell Telephone Laboratories CSTR #41 (1976)
70071 // http://www.cs.dartmouth.edu/~doug/
70072 //
70073 // Expects two arrays of strings.
70074 function LCS(file1, file2) {
70075   var equivalenceClasses;
70076   var file2indices;
70077   var newCandidate;
70078   var candidates;
70079   var line;
70080   var c, i, j, jX, r, s;
70081
70082   equivalenceClasses = {};
70083   for (j = 0; j < file2.length; j++) {
70084     line = file2[j];
70085     if (equivalenceClasses[line]) {
70086       equivalenceClasses[line].push(j);
70087     } else {
70088       equivalenceClasses[line] = [j];
70089     }
70090   }
70091
70092   candidates = [
70093     { file1index: -1, file2index: -1, chain: null }
70094   ];
70095
70096   for (i = 0; i < file1.length; i++) {
70097     line = file1[i];
70098     file2indices = equivalenceClasses[line] || [];
70099
70100     r = 0;
70101     c = candidates[0];
70102
70103     for (jX = 0; jX < file2indices.length; jX++) {
70104       j = file2indices[jX];
70105
70106       for (s = r; s < candidates.length; s++) {
70107         if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
70108           break;
70109         }
70110       }
70111
70112       if (s < candidates.length) {
70113         newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
70114         if (r === candidates.length) {
70115           candidates.push(c);
70116         } else {
70117           candidates[r] = c;
70118         }
70119         r = s + 1;
70120         c = newCandidate;
70121         if (r === candidates.length) {
70122           break; // no point in examining further (j)s
70123         }
70124       }
70125     }
70126
70127     candidates[r] = c;
70128   }
70129
70130   // At this point, we know the LCS: it's in the reverse of the
70131   // linked-list through .chain of candidates[candidates.length - 1].
70132
70133   return candidates[candidates.length - 1];
70134 }
70135
70136
70137 // We apply the LCS to give a simple representation of the
70138 // offsets and lengths of mismatched chunks in the input
70139 // files. This is used by diff3MergeIndices below.
70140 function diffIndices(file1, file2) {
70141   var result = [];
70142   var tail1 = file1.length;
70143   var tail2 = file2.length;
70144
70145   for (var candidate = LCS(file1, file2);
70146      candidate !== null;
70147      candidate = candidate.chain)
70148   {
70149     var mismatchLength1 = tail1 - candidate.file1index - 1;
70150     var mismatchLength2 = tail2 - candidate.file2index - 1;
70151     tail1 = candidate.file1index;
70152     tail2 = candidate.file2index;
70153
70154     if (mismatchLength1 || mismatchLength2) {
70155       result.push({
70156         file1: [tail1 + 1, mismatchLength1],
70157         file2: [tail2 + 1, mismatchLength2]
70158       });
70159     }
70160   }
70161
70162   result.reverse();
70163   return result;
70164 }
70165
70166
70167 // Given three files, A, O, and B, where both A and B are
70168 // independently derived from O, returns a fairly complicated
70169 // internal representation of merge decisions it's taken. The
70170 // interested reader may wish to consult
70171 //
70172 // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
70173 // 'A Formal Investigation of ' In Arvind and Prasad,
70174 // editors, Foundations of Software Technology and Theoretical
70175 // Computer Science (FSTTCS), December 2007.
70176 //
70177 // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
70178 function diff3MergeIndices(a, o, b) {
70179   var i;
70180   var m1 = diffIndices(o, a);
70181   var m2 = diffIndices(o, b);
70182
70183   var hunks = [];
70184   function addHunk(h, side) {
70185     hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
70186   }
70187   for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
70188   for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
70189   hunks.sort(function (x, y) { return x[0] - y[0]; });
70190
70191   var result = [];
70192   var commonOffset = 0;
70193   function copyCommon(targetOffset) {
70194     if (targetOffset > commonOffset) {
70195       result.push([1, commonOffset, targetOffset - commonOffset]);
70196       commonOffset = targetOffset;
70197     }
70198   }
70199
70200   for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
70201     var firstHunkIndex = hunkIndex;
70202     var hunk = hunks[hunkIndex];
70203     var regionLhs = hunk[0];
70204     var regionRhs = regionLhs + hunk[2];
70205     while (hunkIndex < hunks.length - 1) {
70206       var maybeOverlapping = hunks[hunkIndex + 1];
70207       var maybeLhs = maybeOverlapping[0];
70208       if (maybeLhs > regionRhs) {
70209         break;
70210       }
70211       regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
70212       hunkIndex++;
70213     }
70214
70215     copyCommon(regionLhs);
70216     if (firstHunkIndex === hunkIndex) {
70217       // The 'overlap' was only one hunk long, meaning that
70218       // there's no conflict here. Either a and o were the
70219       // same, or b and o were the same.
70220       if (hunk[4] > 0) {
70221         result.push([hunk[1], hunk[3], hunk[4]]);
70222       }
70223     } else {
70224       // A proper conflict. Determine the extents of the
70225       // regions involved from a, o and b. Effectively merge
70226       // all the hunks on the left into one giant hunk, and
70227       // do the same for the right; then, correct for skew
70228       // in the regions of o that each side changed, and
70229       // report appropriate spans for the three sides.
70230       var regions = {
70231         0: [a.length, -1, o.length, -1],
70232         2: [b.length, -1, o.length, -1]
70233       };
70234       for (i = firstHunkIndex; i <= hunkIndex; i++) {
70235         hunk = hunks[i];
70236         var side = hunk[1];
70237         var r = regions[side];
70238         var oLhs = hunk[0];
70239         var oRhs = oLhs + hunk[2];
70240         var abLhs = hunk[3];
70241         var abRhs = abLhs + hunk[4];
70242         r[0] = Math.min(abLhs, r[0]);
70243         r[1] = Math.max(abRhs, r[1]);
70244         r[2] = Math.min(oLhs, r[2]);
70245         r[3] = Math.max(oRhs, r[3]);
70246       }
70247       var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
70248       var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
70249       var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
70250       var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
70251       result.push([-1,
70252                    aLhs,      aRhs      - aLhs,
70253                    regionLhs, regionRhs - regionLhs,
70254                    bLhs,      bRhs      - bLhs]);
70255     }
70256     commonOffset = regionRhs;
70257   }
70258
70259   copyCommon(o.length);
70260   return result;
70261 }
70262
70263
70264 // Applies the output of diff3MergeIndices to actually
70265 // construct the merged file; the returned result alternates
70266 // between 'ok' and 'conflict' blocks.
70267 function diff3Merge(a, o, b, excludeFalseConflicts) {
70268   var result = [];
70269   var files = [a, o, b];
70270   var indices = diff3MergeIndices(a, o, b);
70271
70272   var okLines = [];
70273   function flushOk() {
70274     if (okLines.length) {
70275       result.push({ok: okLines});
70276     }
70277     okLines = [];
70278   }
70279   function pushOk(xs) {
70280     for (var j = 0; j < xs.length; j++) {
70281       okLines.push(xs[j]);
70282     }
70283   }
70284
70285   function isTrueConflict(rec) {
70286     if (rec[2] !== rec[6]) return true;
70287     var aoff = rec[1];
70288     var boff = rec[5];
70289     for (var j = 0; j < rec[2]; j++) {
70290       if (a[j + aoff] !== b[j + boff]) {
70291         return true;
70292       }
70293     }
70294     return false;
70295   }
70296
70297   for (var i = 0; i < indices.length; i++) {
70298     var x = indices[i];
70299     var side = x[0];
70300     if (side === -1) {
70301       if (excludeFalseConflicts && !isTrueConflict(x)) {
70302         pushOk(files[0].slice(x[1], x[1] + x[2]));
70303       } else {
70304         flushOk();
70305         result.push({
70306           conflict: {
70307             a: a.slice(x[1], x[1] + x[2]),
70308             aIndex: x[1],
70309             o: o.slice(x[3], x[3] + x[4]),
70310             oIndex: x[3],
70311             b: b.slice(x[5], x[5] + x[6]),
70312             bIndex: x[5]
70313           }
70314         });
70315       }
70316     } else {
70317       pushOk(files[side].slice(x[1], x[1] + x[2]));
70318     }
70319   }
70320
70321   flushOk();
70322   return result;
70323 }
70324
70325 function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
70326     var option = 'safe',  // 'safe', 'force_local', 'force_remote'
70327         conflicts = [];
70328
70329
70330     function user(d) {
70331         return isFunction(formatUser) ? formatUser(d) : d;
70332     }
70333
70334
70335     function mergeLocation(remote, target) {
70336         function pointEqual(a, b) {
70337             var epsilon = 1e-6;
70338             return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
70339         }
70340
70341         if (option === 'force_local' || pointEqual(target.loc, remote.loc)) {
70342             return target;
70343         }
70344         if (option === 'force_remote') {
70345             return target.update({loc: remote.loc});
70346         }
70347
70348         conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
70349         return target;
70350     }
70351
70352
70353     function mergeNodes(base, remote, target) {
70354         if (option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
70355             return target;
70356         }
70357         if (option === 'force_remote') {
70358             return target.update({nodes: remote.nodes});
70359         }
70360
70361         var ccount = conflicts.length,
70362             o = base.nodes || [],
70363             a = target.nodes || [],
70364             b = remote.nodes || [],
70365             nodes = [],
70366             hunks = diff3Merge(a, o, b, true);
70367
70368         for (var i = 0; i < hunks.length; i++) {
70369             var hunk = hunks[i];
70370             if (hunk.ok) {
70371                 nodes.push.apply(nodes, hunk.ok);
70372             } else {
70373                 // for all conflicts, we can assume c.a !== c.b
70374                 // because `diff3Merge` called with `true` option to exclude false conflicts..
70375                 var c = hunk.conflict;
70376                 if (isEqual(c.o, c.a)) {  // only changed remotely
70377                     nodes.push.apply(nodes, c.b);
70378                 } else if (isEqual(c.o, c.b)) {  // only changed locally
70379                     nodes.push.apply(nodes, c.a);
70380                 } else {       // changed both locally and remotely
70381                     conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
70382                     break;
70383                 }
70384             }
70385         }
70386
70387         return (conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
70388     }
70389
70390
70391     function mergeChildren(targetWay, children, updates, graph) {
70392         function isUsed(node, targetWay) {
70393             var parentWays = map$4(graph.parentWays(node), 'id');
70394             return node.hasInterestingTags() ||
70395                 without(parentWays, targetWay.id).length > 0 ||
70396                 graph.parentRelations(node).length > 0;
70397         }
70398
70399         var ccount = conflicts.length;
70400
70401         for (var i = 0; i < children.length; i++) {
70402             var id = children[i],
70403                 node = graph.hasEntity(id);
70404
70405             // remove unused childNodes..
70406             if (targetWay.nodes.indexOf(id) === -1) {
70407                 if (node && !isUsed(node, targetWay)) {
70408                     updates.removeIds.push(id);
70409                 }
70410                 continue;
70411             }
70412
70413             // restore used childNodes..
70414             var local = localGraph.hasEntity(id),
70415                 remote = remoteGraph.hasEntity(id),
70416                 target;
70417
70418             if (option === 'force_remote' && remote && remote.visible) {
70419                 updates.replacements.push(remote);
70420
70421             } else if (option === 'force_local' && local) {
70422                 target = osmEntity$$1(local);
70423                 if (remote) {
70424                     target = target.update({ version: remote.version });
70425                 }
70426                 updates.replacements.push(target);
70427
70428             } else if (option === 'safe' && local && remote && local.version !== remote.version) {
70429                 target = osmEntity$$1(local, { version: remote.version });
70430                 if (remote.visible) {
70431                     target = mergeLocation(remote, target);
70432                 } else {
70433                     conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
70434                 }
70435
70436                 if (conflicts.length !== ccount) break;
70437                 updates.replacements.push(target);
70438             }
70439         }
70440
70441         return targetWay;
70442     }
70443
70444
70445     function updateChildren(updates, graph) {
70446         for (var i = 0; i < updates.replacements.length; i++) {
70447             graph = graph.replace(updates.replacements[i]);
70448         }
70449         if (updates.removeIds.length) {
70450             graph = actionDeleteMultiple(updates.removeIds)(graph);
70451         }
70452         return graph;
70453     }
70454
70455
70456     function mergeMembers(remote, target) {
70457         if (option === 'force_local' || isEqual(target.members, remote.members)) {
70458             return target;
70459         }
70460         if (option === 'force_remote') {
70461             return target.update({members: remote.members});
70462         }
70463
70464         conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
70465         return target;
70466     }
70467
70468
70469     function mergeTags(base, remote, target) {
70470         function ignoreKey(k) {
70471             return includes(dataDiscarded, k);
70472         }
70473
70474         if (option === 'force_local' || isEqual(target.tags, remote.tags)) {
70475             return target;
70476         }
70477         if (option === 'force_remote') {
70478             return target.update({tags: remote.tags});
70479         }
70480
70481         var ccount = conflicts.length,
70482             o = base.tags || {},
70483             a = target.tags || {},
70484             b = remote.tags || {},
70485             keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey),
70486             tags = clone(a),
70487             changed = false;
70488
70489         for (var i = 0; i < keys.length; i++) {
70490             var k = keys[i];
70491
70492             if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
70493                 if (o[k] !== a[k]) {      // changed locally..
70494                     conflicts.push(t('merge_remote_changes.conflict.tags',
70495                         { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
70496
70497                 } else {                  // unchanged locally, accept remote change..
70498                     if (b.hasOwnProperty(k)) {
70499                         tags[k] = b[k];
70500                     } else {
70501                         delete tags[k];
70502                     }
70503                     changed = true;
70504                 }
70505             }
70506         }
70507
70508         return (changed && conflicts.length === ccount) ? target.update({tags: tags}) : target;
70509     }
70510
70511
70512     //  `graph.base()` is the common ancestor of the two graphs.
70513     //  `localGraph` contains user's edits up to saving
70514     //  `remoteGraph` contains remote edits to modified nodes
70515     //  `graph` must be a descendent of `localGraph` and may include
70516     //      some conflict resolution actions performed on it.
70517     //
70518     //                  --- ... --- `localGraph` -- ... -- `graph`
70519     //                 /
70520     //  `graph.base()` --- ... --- `remoteGraph`
70521     //
70522     var action = function(graph) {
70523         var updates = { replacements: [], removeIds: [] },
70524             base = graph.base().entities[id],
70525             local = localGraph.entity(id),
70526             remote = remoteGraph.entity(id),
70527             target = osmEntity$$1(local, { version: remote.version });
70528
70529         // delete/undelete
70530         if (!remote.visible) {
70531             if (option === 'force_remote') {
70532                 return actionDeleteMultiple([id])(graph);
70533
70534             } else if (option === 'force_local') {
70535                 if (target.type === 'way') {
70536                     target = mergeChildren(target, uniq(local.nodes), updates, graph);
70537                     graph = updateChildren(updates, graph);
70538                 }
70539                 return graph.replace(target);
70540
70541             } else {
70542                 conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
70543                 return graph;  // do nothing
70544             }
70545         }
70546
70547         // merge
70548         if (target.type === 'node') {
70549             target = mergeLocation(remote, target);
70550
70551         } else if (target.type === 'way') {
70552             // pull in any child nodes that may not be present locally..
70553             graph.rebase(remoteGraph.childNodes(remote), [graph], false);
70554             target = mergeNodes(base, remote, target);
70555             target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
70556
70557         } else if (target.type === 'relation') {
70558             target = mergeMembers(remote, target);
70559         }
70560
70561         target = mergeTags(base, remote, target);
70562
70563         if (!conflicts.length) {
70564             graph = updateChildren(updates, graph).replace(target);
70565         }
70566
70567         return graph;
70568     };
70569
70570
70571     action.withOption = function(opt) {
70572         option = opt;
70573         return action;
70574     };
70575
70576
70577     action.conflicts = function() {
70578         return conflicts;
70579     };
70580
70581
70582     return action;
70583 }
70584
70585 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
70586 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
70587 function actionMove(moveIds, tryDelta, projection, cache) {
70588     var delta = tryDelta;
70589
70590     function vecAdd(a, b) { return [a[0] + b[0], a[1] + b[1]]; }
70591     function vecSub(a, b) { return [a[0] - b[0], a[1] - b[1]]; }
70592
70593     function setupCache(graph) {
70594         function canMove(nodeId) {
70595             // Allow movement of any node that is in the selectedIDs list..
70596             if (moveIds.indexOf(nodeId) !== -1) return true;
70597
70598             // Allow movement of a vertex where 2 ways meet..
70599             var parents = map$4(graph.parentWays(graph.entity(nodeId)), 'id');
70600             if (parents.length < 3) return true;
70601
70602             // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
70603             var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
70604             if (!parentsMoving) delete cache.moving[nodeId];
70605
70606             return parentsMoving;
70607         }
70608
70609         function cacheEntities(ids) {
70610             ids.forEach(function(id) {
70611                 if (cache.moving[id]) return;
70612                 cache.moving[id] = true;
70613
70614                 var entity = graph.hasEntity(id);
70615                 if (!entity) return;
70616
70617                 if (entity.type === 'node') {
70618                     cache.nodes.push(id);
70619                     cache.startLoc[id] = entity.loc;
70620                 } else if (entity.type === 'way') {
70621                     cache.ways.push(id);
70622                     cacheEntities(entity.nodes);
70623                 } else {
70624                     cacheEntities(entity.members.map(function(member) {
70625                         return member.id;
70626                     }));
70627                 }
70628             });
70629         }
70630
70631         function cacheIntersections(ids) {
70632             function isEndpoint(way, id) { return !way.isClosed() && !!way.affix(id); }
70633
70634             ids.forEach(function(id) {
70635                 // consider only intersections with 1 moved and 1 unmoved way.
70636                 var childNodes = graph.childNodes(graph.entity(id));
70637                 childNodes.forEach(function(node) {
70638                     var parents = graph.parentWays(node);
70639                     if (parents.length !== 2) return;
70640
70641                     var moved = graph.entity(id),
70642                         unmoved = find$1(parents, function(way) { return !cache.moving[way.id]; });
70643                     if (!unmoved) return;
70644
70645                     // exclude ways that are overly connected..
70646                     if (intersection(moved.nodes, unmoved.nodes).length > 2) return;
70647
70648                     if (moved.isArea() || unmoved.isArea()) return;
70649
70650                     cache.intersection[node.id] = {
70651                         nodeId: node.id,
70652                         movedId: moved.id,
70653                         unmovedId: unmoved.id,
70654                         movedIsEP: isEndpoint(moved, node.id),
70655                         unmovedIsEP: isEndpoint(unmoved, node.id)
70656                     };
70657                 });
70658             });
70659         }
70660
70661
70662         if (!cache) {
70663             cache = {};
70664         }
70665         if (!cache.ok) {
70666             cache.moving = {};
70667             cache.intersection = {};
70668             cache.replacedVertex = {};
70669             cache.startLoc = {};
70670             cache.nodes = [];
70671             cache.ways = [];
70672
70673             cacheEntities(moveIds);
70674             cacheIntersections(cache.ways);
70675             cache.nodes = filter(cache.nodes, canMove);
70676
70677             cache.ok = true;
70678         }
70679     }
70680
70681
70682     // Place a vertex where the moved vertex used to be, to preserve way shape..
70683     function replaceMovedVertex(nodeId, wayId, graph, delta) {
70684         var way = graph.entity(wayId),
70685             moved = graph.entity(nodeId),
70686             movedIndex = way.nodes.indexOf(nodeId),
70687             len, prevIndex, nextIndex;
70688
70689         if (way.isClosed()) {
70690             len = way.nodes.length - 1;
70691             prevIndex = (movedIndex + len - 1) % len;
70692             nextIndex = (movedIndex + len + 1) % len;
70693         } else {
70694             len = way.nodes.length;
70695             prevIndex = movedIndex - 1;
70696             nextIndex = movedIndex + 1;
70697         }
70698
70699         var prev = graph.hasEntity(way.nodes[prevIndex]),
70700             next = graph.hasEntity(way.nodes[nextIndex]);
70701
70702         // Don't add orig vertex at endpoint..
70703         if (!prev || !next) return graph;
70704
70705         var key = wayId + '_' + nodeId,
70706             orig = cache.replacedVertex[key];
70707         if (!orig) {
70708             orig = osmNode();
70709             cache.replacedVertex[key] = orig;
70710             cache.startLoc[orig.id] = cache.startLoc[nodeId];
70711         }
70712
70713         var start, end;
70714         if (delta) {
70715             start = projection(cache.startLoc[nodeId]);
70716             end = projection.invert(vecAdd(start, delta));
70717         } else {
70718             end = cache.startLoc[nodeId];
70719         }
70720         orig = orig.move(end);
70721
70722         var angle = Math.abs(geoAngle(orig, prev, projection) -
70723                 geoAngle(orig, next, projection)) * 180 / Math.PI;
70724
70725         // Don't add orig vertex if it would just make a straight line..
70726         if (angle > 175 && angle < 185) return graph;
70727
70728         // Don't add orig vertex if another point is already nearby (within 10m)
70729         if (geoSphericalDistance(prev.loc, orig.loc) < 10 ||
70730             geoSphericalDistance(orig.loc, next.loc) < 10) return graph;
70731
70732         // moving forward or backward along way?
70733         var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection),
70734             p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection),
70735             d1 = geoPathLength(p1),
70736             d2 = geoPathLength(p2),
70737             insertAt = (d1 < d2) ? movedIndex : nextIndex;
70738
70739         // moving around closed loop?
70740         if (way.isClosed() && insertAt === 0) insertAt = len;
70741
70742         way = way.addNode(orig.id, insertAt);
70743         return graph.replace(orig).replace(way);
70744     }
70745
70746
70747     // Reorder nodes around intersections that have moved..
70748     function unZorroIntersection(intersection$$1, graph) {
70749         var vertex = graph.entity(intersection$$1.nodeId),
70750             way1 = graph.entity(intersection$$1.movedId),
70751             way2 = graph.entity(intersection$$1.unmovedId),
70752             isEP1 = intersection$$1.movedIsEP,
70753             isEP2 = intersection$$1.unmovedIsEP;
70754
70755         // don't move the vertex if it is the endpoint of both ways.
70756         if (isEP1 && isEP2) return graph;
70757
70758         var nodes1 = without(graph.childNodes(way1), vertex),
70759             nodes2 = without(graph.childNodes(way2), vertex);
70760
70761         if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
70762         if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
70763
70764         var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection),
70765             edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection),
70766             loc;
70767
70768         // snap vertex to nearest edge (or some point between them)..
70769         if (!isEP1 && !isEP2) {
70770             var epsilon = 1e-4, maxIter = 10;
70771             for (var i = 0; i < maxIter; i++) {
70772                 loc = geoInterp(edge1.loc, edge2.loc, 0.5);
70773                 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
70774                 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
70775                 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
70776             }
70777         } else if (!isEP1) {
70778             loc = edge1.loc;
70779         } else {
70780             loc = edge2.loc;
70781         }
70782
70783         graph = graph.replace(vertex.move(loc));
70784
70785         // if zorro happened, reorder nodes..
70786         if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
70787             way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
70788             graph = graph.replace(way1);
70789         }
70790         if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
70791             way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
70792             graph = graph.replace(way2);
70793         }
70794
70795         return graph;
70796     }
70797
70798
70799     function cleanupIntersections(graph) {
70800         forEach(cache.intersection, function(obj) {
70801             graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, delta);
70802             graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
70803             graph = unZorroIntersection(obj, graph);
70804         });
70805
70806         return graph;
70807     }
70808
70809
70810     // check if moving way endpoint can cross an unmoved way, if so limit delta..
70811     function limitDelta(graph) {
70812         forEach(cache.intersection, function(obj) {
70813             // Don't limit movement if this is vertex joins 2 endpoints..
70814             if (obj.movedIsEP && obj.unmovedIsEP) return;
70815             // Don't limit movement if this vertex is not an endpoint anyway..
70816             if (!obj.movedIsEP) return;
70817
70818             var node = graph.entity(obj.nodeId),
70819                 start = projection(node.loc),
70820                 end = vecAdd(start, delta),
70821                 movedNodes = graph.childNodes(graph.entity(obj.movedId)),
70822                 movedPath = map$4(map$4(movedNodes, 'loc'),
70823                     function(loc) { return vecAdd(projection(loc), delta); }),
70824                 unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId)),
70825                 unmovedPath = map$4(map$4(unmovedNodes, 'loc'), projection),
70826                 hits = geoPathIntersections(movedPath, unmovedPath);
70827
70828             for (var i = 0; i < hits.length; i++) {
70829                 if (isEqual(hits[i], end)) continue;
70830                 var edge = geoChooseEdge(unmovedNodes, end, projection);
70831                 delta = vecSub(projection(edge.loc), start);
70832             }
70833         });
70834     }
70835
70836
70837     var action = function(graph) {
70838         if (delta[0] === 0 && delta[1] === 0) return graph;
70839
70840         setupCache(graph);
70841
70842         if (!isEmpty(cache.intersection)) {
70843             limitDelta(graph);
70844         }
70845
70846         forEach(cache.nodes, function(id) {
70847             var node = graph.entity(id),
70848                 start = projection(node.loc),
70849                 end = vecAdd(start, delta);
70850             graph = graph.replace(node.move(projection.invert(end)));
70851         });
70852
70853         if (!isEmpty(cache.intersection)) {
70854             graph = cleanupIntersections(graph);
70855         }
70856
70857         return graph;
70858     };
70859
70860
70861     action.delta = function() {
70862         return delta;
70863     };
70864
70865
70866     return action;
70867 }
70868
70869 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
70870 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
70871 function actionMoveNode(nodeId, loc) {
70872     return function(graph) {
70873         return graph.replace(graph.entity(nodeId).move(loc));
70874     };
70875 }
70876
70877 function actionNoop() {
70878     return function(graph) {
70879         return graph;
70880     };
70881 }
70882
70883 /*
70884  * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
70885  */
70886 function actionOrthogonalize(wayId, projection) {
70887     var threshold = 12, // degrees within right or straight to alter
70888         lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
70889         upperThreshold = Math.cos(threshold * Math.PI / 180);
70890
70891
70892     var action = function(graph, t) {
70893         if (t === null || !isFinite(t)) t = 1;
70894         t = Math.min(Math.max(+t, 0), 1);
70895
70896         var way = graph.entity(wayId),
70897             nodes = graph.childNodes(way),
70898             points = uniq(nodes).map(function(n) { return projection(n.loc); }),
70899             corner = {i: 0, dotp: 1},
70900             epsilon = 1e-4,
70901             node, loc, score, motions, i, j;
70902
70903         if (points.length === 3) {   // move only one vertex for right triangle
70904             for (i = 0; i < 1000; i++) {
70905                 motions = points.map(calcMotion);
70906                 points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
70907                 score = corner.dotp;
70908                 if (score < epsilon) {
70909                     break;
70910                 }
70911             }
70912
70913             node = graph.entity(nodes[corner.i].id);
70914             loc = projection.invert(points[corner.i]);
70915             graph = graph.replace(node.move(geoInterp(node.loc, loc, t)));
70916
70917         } else {
70918             var best,
70919                 originalPoints = clone(points);
70920             score = Infinity;
70921
70922             for (i = 0; i < 1000; i++) {
70923                 motions = points.map(calcMotion);
70924                 for (j = 0; j < motions.length; j++) {
70925                     points[j] = addPoints(points[j],motions[j]);
70926                 }
70927                 var newScore = squareness(points);
70928                 if (newScore < score) {
70929                     best = clone(points);
70930                     score = newScore;
70931                 }
70932                 if (score < epsilon) {
70933                     break;
70934                 }
70935             }
70936
70937             points = best;
70938
70939             for (i = 0; i < points.length; i++) {
70940                 // only move the points that actually moved
70941                 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
70942                     loc = projection.invert(points[i]);
70943                     node = graph.entity(nodes[i].id);
70944                     graph = graph.replace(node.move(geoInterp(node.loc, loc, t)));
70945                 }
70946             }
70947
70948             // remove empty nodes on straight sections
70949             for (i = 0; t === 1 && i < points.length; i++) {
70950                 node = graph.entity(nodes[i].id);
70951
70952                 if (graph.parentWays(node).length > 1 ||
70953                     graph.parentRelations(node).length ||
70954                     node.hasInterestingTags()) {
70955                     continue;
70956                 }
70957
70958                 var dotp = normalizedDotProduct(i, points);
70959                 if (dotp < -1 + epsilon) {
70960                     graph = actionDeleteNode(node.id)(graph);
70961                 }
70962             }
70963         }
70964
70965         return graph;
70966
70967
70968         function calcMotion(b, i, array) {
70969             var a = array[(i - 1 + array.length) % array.length],
70970                 c = array[(i + 1) % array.length],
70971                 p = subtractPoints(a, b),
70972                 q = subtractPoints(c, b),
70973                 scale, dotp;
70974
70975             scale = 2 * Math.min(geoEuclideanDistance(p, [0, 0]), geoEuclideanDistance(q, [0, 0]));
70976             p = normalizePoint(p, 1.0);
70977             q = normalizePoint(q, 1.0);
70978
70979             dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
70980
70981             // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
70982             if (array.length > 3) {
70983                 if (dotp < -0.707106781186547) {
70984                     dotp += 1.0;
70985                 }
70986             } else if (dotp && Math.abs(dotp) < corner.dotp) {
70987                 corner.i = i;
70988                 corner.dotp = Math.abs(dotp);
70989             }
70990
70991             return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
70992         }
70993     };
70994
70995
70996     function squareness(points) {
70997         return points.reduce(function(sum, val, i, array) {
70998             var dotp = normalizedDotProduct(i, array);
70999
71000             dotp = filterDotProduct(dotp);
71001             return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
71002         }, 0);
71003     }
71004
71005
71006     function normalizedDotProduct(i, points) {
71007         var a = points[(i - 1 + points.length) % points.length],
71008             b = points[i],
71009             c = points[(i + 1) % points.length],
71010             p = subtractPoints(a, b),
71011             q = subtractPoints(c, b);
71012
71013         p = normalizePoint(p, 1.0);
71014         q = normalizePoint(q, 1.0);
71015
71016         return p[0] * q[0] + p[1] * q[1];
71017     }
71018
71019
71020     function subtractPoints(a, b) {
71021         return [a[0] - b[0], a[1] - b[1]];
71022     }
71023
71024
71025     function addPoints(a, b) {
71026         return [a[0] + b[0], a[1] + b[1]];
71027     }
71028
71029
71030     function normalizePoint(point, scale) {
71031         var vector = [0, 0];
71032         var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
71033         if (length !== 0) {
71034             vector[0] = point[0] / length;
71035             vector[1] = point[1] / length;
71036         }
71037
71038         vector[0] *= scale;
71039         vector[1] *= scale;
71040
71041         return vector;
71042     }
71043
71044
71045     function filterDotProduct(dotp) {
71046         if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
71047             return dotp;
71048         }
71049
71050         return 0;
71051     }
71052
71053
71054     action.disabled = function(graph) {
71055         var way = graph.entity(wayId),
71056             nodes = graph.childNodes(way),
71057             points = uniq(nodes).map(function(n) { return projection(n.loc); });
71058
71059         if (squareness(points)) {
71060             return false;
71061         }
71062
71063         return 'not_squarish';
71064     };
71065
71066
71067     action.transitionable = true;
71068
71069
71070     return action;
71071 }
71072
71073 // Split a way at the given node.
71074 //
71075 // Optionally, split only the given ways, if multiple ways share
71076 // the given node.
71077 //
71078 // This is the inverse of `iD.actionJoin`.
71079 //
71080 // For testing convenience, accepts an ID to assign to the new way.
71081 // Normally, this will be undefined and the way will automatically
71082 // be assigned a new ID.
71083 //
71084 // Reference:
71085 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
71086 //
71087 function actionSplit(nodeId, newWayIds) {
71088     var wayIds;
71089
71090     // if the way is closed, we need to search for a partner node
71091     // to split the way at.
71092     //
71093     // The following looks for a node that is both far away from
71094     // the initial node in terms of way segment length and nearby
71095     // in terms of beeline-distance. This assures that areas get
71096     // split on the most "natural" points (independent of the number
71097     // of nodes).
71098     // For example: bone-shaped areas get split across their waist
71099     // line, circles across the diameter.
71100     function splitArea(nodes, idxA, graph) {
71101         var lengths = new Array(nodes.length),
71102             length,
71103             i,
71104             best = 0,
71105             idxB;
71106
71107         function wrap(index) {
71108             return utilWrap(index, nodes.length);
71109         }
71110
71111         function dist(nA, nB) {
71112             return geoSphericalDistance(graph.entity(nA).loc, graph.entity(nB).loc);
71113         }
71114
71115         // calculate lengths
71116         length = 0;
71117         for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
71118             length += dist(nodes[i], nodes[wrap(i-1)]);
71119             lengths[i] = length;
71120         }
71121
71122         length = 0;
71123         for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
71124             length += dist(nodes[i], nodes[wrap(i+1)]);
71125             if (length < lengths[i])
71126                 lengths[i] = length;
71127         }
71128
71129         // determine best opposite node to split
71130         for (i = 0; i < nodes.length; i++) {
71131             var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
71132             if (cost > best) {
71133                 idxB = i;
71134                 best = cost;
71135             }
71136         }
71137
71138         return idxB;
71139     }
71140
71141
71142     function split(graph, wayA, newWayId) {
71143         var wayB = osmWay({id: newWayId, tags: wayA.tags}),
71144             nodesA,
71145             nodesB,
71146             isArea = wayA.isArea(),
71147             isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
71148
71149         if (wayA.isClosed()) {
71150             var nodes = wayA.nodes.slice(0, -1),
71151                 idxA = indexOf(nodes, nodeId),
71152                 idxB = splitArea(nodes, idxA, graph);
71153
71154             if (idxB < idxA) {
71155                 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
71156                 nodesB = nodes.slice(idxB, idxA + 1);
71157             } else {
71158                 nodesA = nodes.slice(idxA, idxB + 1);
71159                 nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
71160             }
71161         } else {
71162             var idx = indexOf(wayA.nodes, nodeId, 1);
71163             nodesA = wayA.nodes.slice(0, idx + 1);
71164             nodesB = wayA.nodes.slice(idx);
71165         }
71166
71167         wayA = wayA.update({nodes: nodesA});
71168         wayB = wayB.update({nodes: nodesB});
71169
71170         graph = graph.replace(wayA);
71171         graph = graph.replace(wayB);
71172
71173         graph.parentRelations(wayA).forEach(function(relation) {
71174             if (relation.isRestriction()) {
71175                 var via = relation.memberByRole('via');
71176                 if (via && wayB.contains(via.id)) {
71177                     relation = relation.replaceMember(wayA, wayB);
71178                     graph = graph.replace(relation);
71179                 }
71180             } else {
71181                 if (relation === isOuter) {
71182                     graph = graph.replace(relation.mergeTags(wayA.tags));
71183                     graph = graph.replace(wayA.update({tags: {}}));
71184                     graph = graph.replace(wayB.update({tags: {}}));
71185                 }
71186
71187                 var member = {
71188                     id: wayB.id,
71189                     type: 'way',
71190                     role: relation.memberById(wayA.id).role
71191                 };
71192
71193                 graph = actionAddMember(relation.id, member)(graph);
71194             }
71195         });
71196
71197         if (!isOuter && isArea) {
71198             var multipolygon = osmRelation({
71199                 tags: assignIn$1({}, wayA.tags, {type: 'multipolygon'}),
71200                 members: [
71201                     {id: wayA.id, role: 'outer', type: 'way'},
71202                     {id: wayB.id, role: 'outer', type: 'way'}
71203                 ]});
71204
71205             graph = graph.replace(multipolygon);
71206             graph = graph.replace(wayA.update({tags: {}}));
71207             graph = graph.replace(wayB.update({tags: {}}));
71208         }
71209
71210         return graph;
71211     }
71212
71213
71214     var action = function(graph) {
71215         var candidates = action.ways(graph);
71216         for (var i = 0; i < candidates.length; i++) {
71217             graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
71218         }
71219         return graph;
71220     };
71221
71222
71223     action.ways = function(graph) {
71224         var node = graph.entity(nodeId),
71225             parents = graph.parentWays(node),
71226             hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
71227
71228         return parents.filter(function(parent) {
71229             if (wayIds && wayIds.indexOf(parent.id) === -1)
71230                 return false;
71231
71232             if (!wayIds && hasLines && parent.geometry(graph) !== 'line')
71233                 return false;
71234
71235             if (parent.isClosed()) {
71236                 return true;
71237             }
71238
71239             for (var i = 1; i < parent.nodes.length - 1; i++) {
71240                 if (parent.nodes[i] === nodeId) {
71241                     return true;
71242                 }
71243             }
71244
71245             return false;
71246         });
71247     };
71248
71249
71250     action.disabled = function(graph) {
71251         var candidates = action.ways(graph);
71252         if (candidates.length === 0 || (wayIds && wayIds.length !== candidates.length))
71253             return 'not_eligible';
71254     };
71255
71256
71257     action.limitWays = function(_) {
71258         if (!arguments.length) return wayIds;
71259         wayIds = _;
71260         return action;
71261     };
71262
71263
71264     return action;
71265 }
71266
71267 // Create a restriction relation for `turn`, which must have the following structure:
71268 //
71269 //     {
71270 //         from: { node: <node ID>, way: <way ID> },
71271 //         via:  { node: <node ID> },
71272 //         to:   { node: <node ID>, way: <way ID> },
71273 //         restriction: <'no_right_turn', 'no_left_turn', etc.>
71274 //     }
71275 //
71276 // This specifies a restriction of type `restriction` when traveling from
71277 // `from.node` in `from.way` toward `to.node` in `to.way` via `via.node`.
71278 // (The action does not check that these entities form a valid intersection.)
71279 //
71280 // If `restriction` is not provided, it is automatically determined by
71281 // osmInferRestriction.
71282 //
71283 // If necessary, the `from` and `to` ways are split. In these cases, `from.node`
71284 // and `to.node` are used to determine which portion of the split ways become
71285 // members of the restriction.
71286 //
71287 // For testing convenience, accepts an ID to assign to the new relation.
71288 // Normally, this will be undefined and the relation will automatically
71289 // be assigned a new ID.
71290 //
71291 function actionRestrictTurn(turn, projection, restrictionId) {
71292
71293     return function(graph) {
71294         var from = graph.entity(turn.from.way),
71295             via  = graph.entity(turn.via.node),
71296             to   = graph.entity(turn.to.way);
71297
71298         function isClosingNode(way, nodeId) {
71299             return nodeId === way.first() && nodeId === way.last();
71300         }
71301
71302         function split(toOrFrom) {
71303             var newID = toOrFrom.newID || osmWay().id;
71304             graph = actionSplit(via.id, [newID])
71305                 .limitWays([toOrFrom.way])(graph);
71306
71307             var a = graph.entity(newID),
71308                 b = graph.entity(toOrFrom.way);
71309
71310             if (a.nodes.indexOf(toOrFrom.node) !== -1) {
71311                 return [a, b];
71312             } else {
71313                 return [b, a];
71314             }
71315         }
71316
71317         if (!from.affix(via.id) || isClosingNode(from, via.id)) {
71318             if (turn.from.node === turn.to.node) {
71319                 // U-turn
71320                 from = to = split(turn.from)[0];
71321             } else if (turn.from.way === turn.to.way) {
71322                 // Straight-on or circular
71323                 var s = split(turn.from);
71324                 from = s[0];
71325                 to   = s[1];
71326             } else {
71327                 // Other
71328                 from = split(turn.from)[0];
71329             }
71330         }
71331
71332         if (!to.affix(via.id) || isClosingNode(to, via.id)) {
71333             to = split(turn.to)[0];
71334         }
71335
71336         return graph.replace(osmRelation({
71337             id: restrictionId,
71338             tags: {
71339                 type: 'restriction',
71340                 restriction: turn.restriction ||
71341                     osmInferRestriction(
71342                         graph,
71343                         turn.from,
71344                         turn.via,
71345                         turn.to,
71346                         projection)
71347             },
71348             members: [
71349                 {id: from.id, type: 'way',  role: 'from'},
71350                 {id: via.id,  type: 'node', role: 'via'},
71351                 {id: to.id,   type: 'way',  role: 'to'}
71352             ]
71353         }));
71354     };
71355 }
71356
71357 function actionRevert(id) {
71358     var action = function(graph) {
71359         var entity = graph.hasEntity(id),
71360             base = graph.base().entities[id];
71361
71362         if (entity && !base) {    // entity will be removed..
71363             if (entity.type === 'node') {
71364                 graph.parentWays(entity)
71365                     .forEach(function(parent) {
71366                         parent = parent.removeNode(id);
71367                         graph = graph.replace(parent);
71368
71369                         if (parent.isDegenerate()) {
71370                             graph = actionDeleteWay(parent.id)(graph);
71371                         }
71372                     });
71373             }
71374
71375             graph.parentRelations(entity)
71376                 .forEach(function(parent) {
71377                     parent = parent.removeMembersWithID(id);
71378                     graph = graph.replace(parent);
71379
71380                     if (parent.isDegenerate()) {
71381                         graph = actionDeleteRelation(parent.id)(graph);
71382                     }
71383                 });
71384         }
71385
71386         return graph.revert(id);
71387     };
71388
71389     return action;
71390 }
71391
71392 function actionRotate(rotateIds, pivot, angle, projection) {
71393
71394     var action = function(graph) {
71395         return graph.update(function(graph) {
71396             utilGetAllNodes(rotateIds, graph).forEach(function(node) {
71397                 var point = geoRotate([projection(node.loc)], angle, pivot)[0];
71398                 graph = graph.replace(node.move(projection.invert(point)));
71399             });
71400         });
71401     };
71402
71403     return action;
71404 }
71405
71406 /*
71407  * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
71408  */
71409 function actionStraighten(wayId, projection) {
71410
71411     function positionAlongWay(n, s, e) {
71412         return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
71413                 (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
71414     }
71415
71416
71417     var action = function(graph, t) {
71418         if (t === null || !isFinite(t)) t = 1;
71419         t = Math.min(Math.max(+t, 0), 1);
71420
71421         var way = graph.entity(wayId),
71422             nodes = graph.childNodes(way),
71423             points = nodes.map(function(n) { return projection(n.loc); }),
71424             startPoint = points[0],
71425             endPoint = points[points.length-1],
71426             toDelete = [],
71427             i;
71428
71429         for (i = 1; i < points.length-1; i++) {
71430             var node = nodes[i],
71431                 point = points[i];
71432
71433             if (t < 1 || graph.parentWays(node).length > 1 ||
71434                 graph.parentRelations(node).length ||
71435                 node.hasInterestingTags()) {
71436
71437                 var u = positionAlongWay(point, startPoint, endPoint),
71438                     p = [
71439                         startPoint[0] + u * (endPoint[0] - startPoint[0]),
71440                         startPoint[1] + u * (endPoint[1] - startPoint[1])
71441                     ],
71442                     loc2 = projection.invert(p);
71443
71444                 graph = graph.replace(node.move(geoInterp(node.loc, loc2, t)));
71445
71446             } else {
71447                 // safe to delete
71448                 if (toDelete.indexOf(node) === -1) {
71449                     toDelete.push(node);
71450                 }
71451             }
71452         }
71453
71454         for (i = 0; i < toDelete.length; i++) {
71455             graph = actionDeleteNode(toDelete[i].id)(graph);
71456         }
71457
71458         return graph;
71459     };
71460
71461
71462     action.disabled = function(graph) {
71463         // check way isn't too bendy
71464         var way = graph.entity(wayId),
71465             nodes = graph.childNodes(way),
71466             points = nodes.map(function(n) { return projection(n.loc); }),
71467             startPoint = points[0],
71468             endPoint = points[points.length-1],
71469             threshold = 0.2 * geoEuclideanDistance(startPoint, endPoint),
71470             i;
71471
71472         if (threshold === 0) {
71473             return 'too_bendy';
71474         }
71475
71476         for (i = 1; i < points.length-1; i++) {
71477             var point = points[i],
71478                 u = positionAlongWay(point, startPoint, endPoint),
71479                 p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
71480                 p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
71481                 dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
71482
71483             // to bendy if point is off by 20% of total start/end distance in projected space
71484             if (isNaN(dist) || dist > threshold) {
71485                 return 'too_bendy';
71486             }
71487         }
71488     };
71489
71490
71491     action.transitionable = true;
71492
71493
71494     return action;
71495 }
71496
71497 // Remove the effects of `turn.restriction` on `turn`, which must have the
71498 // following structure:
71499 //
71500 //     {
71501 //         from: { node: <node ID>, way: <way ID> },
71502 //         via:  { node: <node ID> },
71503 //         to:   { node: <node ID>, way: <way ID> },
71504 //         restriction: <relation ID>
71505 //     }
71506 //
71507 // In the simple case, `restriction` is a reference to a `no_*` restriction
71508 // on the turn itself. In this case, it is simply deleted.
71509 //
71510 // The more complex case is where `restriction` references an `only_*`
71511 // restriction on a different turn in the same intersection. In that case,
71512 // that restriction is also deleted, but at the same time restrictions on
71513 // the turns other than the first two are created.
71514 //
71515 function actionUnrestrictTurn(turn) {
71516     return function(graph) {
71517         return actionDeleteRelation(turn.restriction)(graph);
71518     };
71519 }
71520
71521 /* Reflect the given area around its axis of symmetry */
71522 function actionReflect(reflectIds, projection) {
71523     var useLongAxis = true;
71524
71525
71526     // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
71527     // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
71528     function getSmallestSurroundingRectangle(graph, nodes) {
71529         var points = nodes.map(function(n) { return projection(n.loc); }),
71530             hull = d3_polygonHull(points),
71531             centroid = d3_polygonCentroid(hull),
71532             minArea = Infinity,
71533             ssrExtent = [],
71534             ssrAngle = 0,
71535             c1 = hull[0];
71536
71537         for (var i = 0; i <= hull.length - 1; i++) {
71538             var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
71539                 angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
71540                 poly = geoRotate(hull, -angle, centroid),
71541                 extent = poly.reduce(function(extent, point) {
71542                         return extent.extend(geoExtent$$1(point));
71543                     }, geoExtent$$1()),
71544                 area = extent.area();
71545
71546             if (area < minArea) {
71547                 minArea = area;
71548                 ssrExtent = extent;
71549                 ssrAngle = angle;
71550             }
71551             c1 = c2;
71552         }
71553
71554         return {
71555             poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
71556             angle: ssrAngle
71557         };
71558     }
71559
71560
71561     var action = function(graph, t) {
71562         if (t === null || !isFinite(t)) t = 1;
71563         t = Math.min(Math.max(+t, 0), 1);
71564
71565         var nodes = utilGetAllNodes(reflectIds, graph),
71566             ssr = getSmallestSurroundingRectangle(graph, nodes);
71567
71568         // Choose line pq = axis of symmetry.
71569         // The shape's surrounding rectangle has 2 axes of symmetry.
71570         // Reflect across the longer axis by default.
71571         var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
71572             q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
71573             p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
71574             q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
71575             p, q;
71576
71577         var isLong = (geoEuclideanDistance(p1, q1) > geoEuclideanDistance(p2, q2));
71578         if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
71579             p = p1;
71580             q = q1;
71581         } else {
71582             p = p2;
71583             q = q2;
71584         }
71585
71586         // reflect c across pq
71587         // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
71588         var dx = q[0] - p[0];
71589         var dy = q[1] - p[1];
71590         var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
71591         var b = 2 * dx * dy / (dx * dx + dy * dy);
71592         for (var i = 0; i < nodes.length; i++) {
71593             var node = nodes[i];
71594             var c = projection(node.loc);
71595             var c2 = [
71596                 a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
71597                 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
71598             ];
71599             var loc2 = projection.invert(c2);
71600             node = node.move(geoInterp(node.loc, loc2, t));
71601             graph = graph.replace(node);
71602         }
71603
71604         return graph;
71605     };
71606
71607
71608     action.useLongAxis = function(_) {
71609         if (!arguments.length) return useLongAxis;
71610         useLongAxis = _;
71611         return action;
71612     };
71613
71614
71615     action.transitionable = true;
71616
71617
71618     return action;
71619 }
71620
71621
71622
71623 var index$4 = Object.freeze({
71624         d3combobox: d3combobox,
71625         d3geoTile: d3geoTile,
71626         d3keybinding: d3keybinding
71627 });
71628
71629 /* export some legacy symbols: */
71630 var Connection = services.osm;
71631 var debug = false;
71632
71633
71634
71635
71636 var iD = Object.freeze({
71637         Connection: Connection,
71638         debug: debug,
71639         lib: index$4,
71640         d3: index,
71641         Context: coreContext,
71642         setAreaKeys: setAreaKeys,
71643         Difference: coreDifference,
71644         Graph: coreGraph$$1,
71645         History: coreHistory,
71646         Tree: coreTree,
71647         Entity: osmEntity$$1,
71648         Node: osmNode,
71649         Relation: osmRelation,
71650         Way: osmWay,
71651         BackgroundSource: rendererBackgroundSource,
71652         Background: rendererBackground,
71653         Features: rendererFeatures,
71654         Map: rendererMap,
71655         TileLayer: rendererTileLayer,
71656         Detect: utilDetect,
71657         uiPreset: uiPresetEditor,
71658         actionAddEntity: actionAddEntity,
71659         actionAddMember: actionAddMember,
71660         actionAddMidpoint: actionAddMidpoint,
71661         actionAddVertex: actionAddVertex,
71662         actionChangeMember: actionChangeMember,
71663         actionChangePreset: actionChangePreset,
71664         actionChangeTags: actionChangeTags,
71665         actionCircularize: actionCircularize,
71666         actionConnect: actionConnect,
71667         actionCopyEntities: actionCopyEntities,
71668         actionDeleteMember: actionDeleteMember,
71669         actionDeleteMultiple: actionDeleteMultiple,
71670         actionDeleteNode: actionDeleteNode,
71671         actionDeleteRelation: actionDeleteRelation,
71672         actionDeleteWay: actionDeleteWay,
71673         actionDeprecateTags: actionDeprecateTags,
71674         actionDiscardTags: actionDiscardTags,
71675         actionDisconnect: actionDisconnect,
71676         actionJoin: actionJoin,
71677         actionMerge: actionMerge,
71678         actionMergePolygon: actionMergePolygon,
71679         actionMergeRemoteChanges: actionMergeRemoteChanges,
71680         actionMove: actionMove,
71681         actionMoveNode: actionMoveNode,
71682         actionNoop: actionNoop,
71683         actionOrthogonalize: actionOrthogonalize,
71684         actionRestrictTurn: actionRestrictTurn,
71685         actionReverse: actionReverse,
71686         actionRevert: actionRevert,
71687         actionRotate: actionRotate,
71688         actionSplit: actionSplit,
71689         actionStraighten: actionStraighten,
71690         actionUnrestrictTurn: actionUnrestrictTurn,
71691         actionReflect: actionReflect,
71692         behaviorAddWay: behaviorAddWay,
71693         behaviorBreathe: behaviorBreathe,
71694         behaviorCopy: behaviorCopy,
71695         behaviorDrag: behaviorDrag,
71696         behaviorDrawWay: behaviorDrawWay,
71697         behaviorDraw: behaviorDraw,
71698         behaviorEdit: behaviorEdit,
71699         behaviorHash: behaviorHash,
71700         behaviorHover: behaviorHover,
71701         behaviorLasso: behaviorLasso,
71702         behaviorOperation: behaviorOperation,
71703         behaviorPaste: behaviorPaste,
71704         behaviorSelect: behaviorSelect,
71705         behaviorTail: behaviorTail,
71706         coreContext: coreContext,
71707         coreDifference: coreDifference,
71708         coreGraph: coreGraph$$1,
71709         coreHistory: coreHistory,
71710         coreTree: coreTree,
71711         dataFeatureIcons: dataFeatureIcons,
71712         data: data,
71713         dataWikipedia: dataWikipedia,
71714         dataSuggestions: dataSuggestions,
71715         dataAddressFormats: dataAddressFormats,
71716         dataDeprecated: dataDeprecated,
71717         dataDiscarded: dataDiscarded,
71718         dataLocales: dataLocales,
71719         dataPhoneFormats: dataPhoneFormats,
71720         dataShortcuts: dataShortcuts,
71721         dataImperial: dataImperial,
71722         dataDriveLeft: dataDriveLeft,
71723         dataEn: en,
71724         geoAngle: geoAngle,
71725         geoChooseEdge: geoChooseEdge,
71726         geoCross: geoCross,
71727         geoEdgeEqual: geoEdgeEqual,
71728         geoEuclideanDistance: geoEuclideanDistance,
71729         geoExtent: geoExtent$$1,
71730         geoInterp: geoInterp,
71731         geoRawMercator: geoRawMercator,
71732         geoRoundCoords: geoRoundCoords,
71733         geoRotate: geoRotate,
71734         geoLatToMeters: geoLatToMeters,
71735         geoLineIntersection: geoLineIntersection,
71736         geoLonToMeters: geoLonToMeters,
71737         geoMetersToLat: geoMetersToLat,
71738         geoMetersToLon: geoMetersToLon,
71739         geoMetersToOffset: geoMetersToOffset,
71740         geoOffsetToMeters: geoOffsetToMeters,
71741         geoPathIntersections: geoPathIntersections,
71742         geoPathLength: geoPathLength,
71743         geoPointInPolygon: geoPointInPolygon,
71744         geoPolygonContainsPolygon: geoPolygonContainsPolygon,
71745         geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
71746         geoSphericalDistance: geoSphericalDistance,
71747         modeAddArea: modeAddArea$$1,
71748         modeAddLine: modeAddLine$$1,
71749         modeAddPoint: modeAddPoint$$1,
71750         modeBrowse: modeBrowse,
71751         modeDragNode: modeDragNode$$1,
71752         modeDrawArea: modeDrawArea,
71753         modeDrawLine: modeDrawLine,
71754         modeMove: modeMove$$1,
71755         modeRotate: modeRotate$$1,
71756         modeSave: modeSave$$1,
71757         modeSelect: modeSelect,
71758         operationCircularize: operationCircularize,
71759         operationContinue: operationContinue,
71760         operationDelete: operationDelete,
71761         operationDisconnect: operationDisconnect,
71762         operationMerge: operationMerge,
71763         operationMove: operationMove,
71764         operationOrthogonalize: operationOrthogonalize,
71765         operationReflectShort: operationReflectShort,
71766         operationReflectLong: operationReflectLong,
71767         operationReverse: operationReverse,
71768         operationRotate: operationRotate,
71769         operationSplit: operationSplit,
71770         operationStraighten: operationStraighten,
71771         osmChangeset: osmChangeset,
71772         osmEntity: osmEntity$$1,
71773         osmNode: osmNode,
71774         osmRelation: osmRelation,
71775         osmWay: osmWay,
71776         osmIntersection: osmIntersection,
71777         osmTurn: osmTurn,
71778         osmInferRestriction: osmInferRestriction,
71779         osmLanes: osmLanes,
71780         osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
71781         osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
71782         osmJoinWays: osmJoinWays,
71783         osmOneWayTags: osmOneWayTags,
71784         osmPavedTags: osmPavedTags,
71785         osmIsInterestingTag: osmIsInterestingTag,
71786         presetCategory: presetCategory,
71787         presetCollection: presetCollection,
71788         presetField: presetField,
71789         presetPreset: presetPreset,
71790         presetIndex: presetIndex,
71791         rendererBackgroundSource: rendererBackgroundSource,
71792         rendererBackground: rendererBackground,
71793         rendererFeatures: rendererFeatures,
71794         rendererMap: rendererMap,
71795         rendererTileLayer: rendererTileLayer,
71796         services: services,
71797         serviceMapillary: serviceMapillary,
71798         serviceNominatim: serviceNominatim,
71799         serviceOpenstreetcam: serviceOpenstreetcam,
71800         serviceOsm: serviceOsm,
71801         serviceTaginfo: serviceTaginfo,
71802         serviceWikidata: serviceWikidata,
71803         serviceWikipedia: serviceWikipedia,
71804         svgAreas: svgAreas$$1,
71805         svgDebug: svgDebug,
71806         svgDefs: svgDefs,
71807         svgGpx: svgGpx,
71808         svgIcon: svgIcon,
71809         svgLabels: svgLabels,
71810         svgLayers: svgLayers,
71811         svgLines: svgLines$$1,
71812         svgMapillaryImages: svgMapillaryImages,
71813         svgMapillarySigns: svgMapillarySigns,
71814         svgMidpoints: svgMidpoints$$1,
71815         svgOneWaySegments: svgOneWaySegments,
71816         svgOpenstreetcamImages: svgOpenstreetcamImages,
71817         svgOsm: svgOsm,
71818         svgPath: svgPath,
71819         svgPointTransform: svgPointTransform,
71820         svgPoints: svgPoints$$1,
71821         svgRelationMemberTags: svgRelationMemberTags,
71822         svgTagClasses: svgTagClasses,
71823         svgTurns: svgTurns,
71824         svgVertices: svgVertices$$1,
71825         uiFields: uiFields,
71826         uiFieldDefaultCheck: uiFieldCheck,
71827         uiFieldOnewayCheck: uiFieldCheck,
71828         uiFieldCheck: uiFieldCheck,
71829         uiFieldMultiCombo: uiFieldCombo,
71830         uiFieldNetworkCombo: uiFieldCombo,
71831         uiFieldSemiCombo: uiFieldCombo,
71832         uiFieldTypeCombo: uiFieldCombo,
71833         uiFieldCombo: uiFieldCombo,
71834         uiFieldUrl: uiFieldText,
71835         uiFieldNumber: uiFieldText,
71836         uiFieldTel: uiFieldText,
71837         uiFieldEmail: uiFieldText,
71838         uiFieldText: uiFieldText,
71839         uiFieldAccess: uiFieldAccess,
71840         uiFieldAddress: uiFieldAddress,
71841         uiFieldCycleway: uiFieldCycleway,
71842         uiFieldLanes: uiFieldLanes,
71843         uiFieldLocalized: uiFieldLocalized,
71844         uiFieldMaxspeed: uiFieldMaxspeed,
71845         uiFieldStructureRadio: uiFieldRadio,
71846         uiFieldRadio: uiFieldRadio,
71847         uiFieldRestrictions: uiFieldRestrictions,
71848         uiFieldTextarea: uiFieldTextarea,
71849         uiFieldWikipedia: uiFieldWikipedia,
71850         uiIntro: uiIntro,
71851         uiInfoPanels: uiInfoPanels,
71852         uiPanelBackground: uiPanelBackground,
71853         uiPanelHistory: uiPanelHistory,
71854         uiPanelLocation: uiPanelLocation,
71855         uiPanelMeasurement: uiPanelMeasurement,
71856         uiInit: uiInit,
71857         uiAccount: uiAccount,
71858         uiAttribution: uiAttribution,
71859         uiBackground: uiBackground,
71860         uiChangesetEditor: uiChangesetEditor,
71861         uiCmd: uiCmd,
71862         uiCommit: uiCommit,
71863         uiCommitChanges: uiCommitChanges,
71864         uiCommitWarnings: uiCommitWarnings,
71865         uiConfirm: uiConfirm,
71866         uiConflicts: uiConflicts,
71867         uiContributors: uiContributors,
71868         uiCurtain: uiCurtain,
71869         uiDisclosure: uiDisclosure,
71870         uiEditMenu: uiEditMenu,
71871         uiEntityEditor: uiEntityEditor,
71872         uiFeatureInfo: uiFeatureInfo,
71873         uiFeatureList: uiFeatureList,
71874         uiField: uiField,
71875         uiFlash: uiFlash,
71876         uiFormFields: uiFormFields,
71877         uiFullScreen: uiFullScreen,
71878         uiGeolocate: uiGeolocate,
71879         uiHelp: uiHelp,
71880         uiInfo: uiInfo,
71881         uiInspector: uiInspector,
71882         uiLasso: uiLasso,
71883         uiLoading: uiLoading,
71884         uiMapData: uiMapData,
71885         uiMapInMap: uiMapInMap,
71886         uiModal: uiModal,
71887         uiModes: uiModes,
71888         uiNotice: uiNotice,
71889         uiPresetEditor: uiPresetEditor,
71890         uiPresetIcon: uiPresetIcon,
71891         uiPresetList: uiPresetList,
71892         uiRadialMenu: uiRadialMenu,
71893         uiRawMemberEditor: uiRawMemberEditor,
71894         uiRawMembershipEditor: uiRawMembershipEditor,
71895         uiRawTagEditor: uiRawTagEditor,
71896         uiRestore: uiRestore,
71897         uiSave: uiSave,
71898         uiScale: uiScale,
71899         uiSelectionList: uiSelectionList,
71900         uiSidebar: uiSidebar,
71901         uiSourceSwitch: uiSourceSwitch,
71902         uiSpinner: uiSpinner,
71903         uiSplash: uiSplash,
71904         uiStatus: uiStatus,
71905         uiSuccess: uiSuccess,
71906         uiTagReference: uiTagReference,
71907         uiToggle: uiToggle,
71908         uiTooltipHtml: uiTooltipHtml,
71909         uiUndoRedo: uiUndoRedo,
71910         uiVersion: uiVersion,
71911         uiViewOnOSM: uiViewOnOSM,
71912         uiZoom: uiZoom,
71913         utilAsyncMap: utilAsyncMap,
71914         utilCallWhenIdle: utilCallWhenIdle,
71915         utilDisplayName: utilDisplayName,
71916         utilDisplayNameForPath: utilDisplayNameForPath,
71917         utilDisplayType: utilDisplayType,
71918         utilEditDistance: utilEditDistance,
71919         utilEntitySelector: utilEntitySelector,
71920         utilEntityOrMemberSelector: utilEntityOrMemberSelector,
71921         utilFastMouse: utilFastMouse,
71922         utilFunctor: utilFunctor,
71923         utilGetAllNodes: utilGetAllNodes,
71924         utilGetPrototypeOf: utilGetPrototypeOf,
71925         utilGetSetValue: utilGetSetValue,
71926         utilIdleWorker: utilIdleWorker,
71927         utilNoAuto: utilNoAuto,
71928         utilPrefixCSSProperty: utilPrefixCSSProperty,
71929         utilPrefixDOMProperty: utilPrefixDOMProperty,
71930         utilQsString: utilQsString,
71931         utilRebind: utilRebind,
71932         utilSetTransform: utilSetTransform,
71933         utilSessionMutex: utilSessionMutex,
71934         utilStringQs: utilStringQs,
71935         utilSuggestNames: utilSuggestNames,
71936         utilTagText: utilTagText,
71937         utilTriggerEvent: utilTriggerEvent,
71938         utilWrap: utilWrap,
71939         d3combobox: d3combobox,
71940         d3geoTile: d3geoTile,
71941         d3keybinding: d3keybinding,
71942         validationDeprecatedTag: validationDeprecatedTag,
71943         validationDisconnectedHighway: validationDisconnectedHighway,
71944         validationManyDeletions: validationManyDeletions,
71945         validationMissingTag: validationMissingTag,
71946         validationOldMultipolygon: validationOldMultipolygon,
71947         validationTagSuggestsArea: validationTagSuggestsArea
71948 });
71949
71950 window.iD = iD;
71951
71952 }());
71953 //# sourceMappingURL=iD.js.map